Commit 1047e423 authored by Tobias Tebbi's avatar Tobias Tebbi Committed by V8 LUCI CQ

[turboshaft] restructure MachineRepresentation and MachineType

Bug: v8:12783
Change-Id: I5de98493d67c7c797d4a1b2dcd18c0347821f0f8
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3870471Reviewed-by: 's avatarNico Hartmann <nicohartmann@chromium.org>
Commit-Queue: Tobias Tebbi <tebbi@chromium.org>
Auto-Submit: Tobias Tebbi <tebbi@chromium.org>
Cr-Commit-Position: refs/heads/main@{#83262}
parent 52f55f38
...@@ -2878,6 +2878,8 @@ filegroup( ...@@ -2878,6 +2878,8 @@ filegroup(
"src/compiler/turboshaft/optimization-phase.h", "src/compiler/turboshaft/optimization-phase.h",
"src/compiler/turboshaft/recreate-schedule.cc", "src/compiler/turboshaft/recreate-schedule.cc",
"src/compiler/turboshaft/recreate-schedule.h", "src/compiler/turboshaft/recreate-schedule.h",
"src/compiler/turboshaft/representations.cc",
"src/compiler/turboshaft/representations.h",
"src/compiler/turboshaft/sidetable.h", "src/compiler/turboshaft/sidetable.h",
"src/compiler/turboshaft/utils.h", "src/compiler/turboshaft/utils.h",
"src/compiler/turboshaft/value-numbering-assembler.h", "src/compiler/turboshaft/value-numbering-assembler.h",
......
...@@ -2933,6 +2933,7 @@ v8_header_set("v8_internal_headers") { ...@@ -2933,6 +2933,7 @@ v8_header_set("v8_internal_headers") {
"src/compiler/turboshaft/operations.h", "src/compiler/turboshaft/operations.h",
"src/compiler/turboshaft/optimization-phase.h", "src/compiler/turboshaft/optimization-phase.h",
"src/compiler/turboshaft/recreate-schedule.h", "src/compiler/turboshaft/recreate-schedule.h",
"src/compiler/turboshaft/representations.h",
"src/compiler/turboshaft/sidetable.h", "src/compiler/turboshaft/sidetable.h",
"src/compiler/turboshaft/utils.h", "src/compiler/turboshaft/utils.h",
"src/compiler/turboshaft/value-numbering-assembler.h", "src/compiler/turboshaft/value-numbering-assembler.h",
...@@ -4229,6 +4230,7 @@ v8_source_set("v8_turboshaft") { ...@@ -4229,6 +4230,7 @@ v8_source_set("v8_turboshaft") {
"src/compiler/turboshaft/operations.cc", "src/compiler/turboshaft/operations.cc",
"src/compiler/turboshaft/optimization-phase.cc", "src/compiler/turboshaft/optimization-phase.cc",
"src/compiler/turboshaft/recreate-schedule.cc", "src/compiler/turboshaft/recreate-schedule.cc",
"src/compiler/turboshaft/representations.cc",
] ]
public_deps = [ public_deps = [
......
...@@ -152,10 +152,6 @@ class MachineType { ...@@ -152,10 +152,6 @@ class MachineType {
constexpr bool IsCompressedPointer() const { constexpr bool IsCompressedPointer() const {
return representation() == MachineRepresentation::kCompressedPointer; return representation() == MachineRepresentation::kCompressedPointer;
} }
constexpr static MachineRepresentation TaggedRepresentation() {
return (kTaggedSize == 4) ? MachineRepresentation::kWord32
: MachineRepresentation::kWord64;
}
constexpr static MachineRepresentation PointerRepresentation() { constexpr static MachineRepresentation PointerRepresentation() {
return (kSystemPointerSize == 4) ? MachineRepresentation::kWord32 return (kSystemPointerSize == 4) ? MachineRepresentation::kWord32
: MachineRepresentation::kWord64; : MachineRepresentation::kWord64;
......
This diff is collapsed.
...@@ -77,21 +77,22 @@ void DecompressionAnalyzer::ProcessOperation(const Operation& op) { ...@@ -77,21 +77,22 @@ void DecompressionAnalyzer::ProcessOperation(const Operation& op) {
case Opcode::kStore: { case Opcode::kStore: {
auto& store = op.Cast<StoreOp>(); auto& store = op.Cast<StoreOp>();
MarkAsNeedsDecompression(store.base()); MarkAsNeedsDecompression(store.base());
if (!IsAnyTagged(store.stored_rep)) if (!store.stored_rep.IsTagged()) {
MarkAsNeedsDecompression(store.value()); MarkAsNeedsDecompression(store.value());
}
break; break;
} }
case Opcode::kIndexedStore: { case Opcode::kIndexedStore: {
auto& store = op.Cast<IndexedStoreOp>(); auto& store = op.Cast<IndexedStoreOp>();
MarkAsNeedsDecompression(store.base()); MarkAsNeedsDecompression(store.base());
MarkAsNeedsDecompression(store.index()); MarkAsNeedsDecompression(store.index());
if (!IsAnyTagged(store.stored_rep)) if (!store.stored_rep.IsTagged()) {
MarkAsNeedsDecompression(store.value()); MarkAsNeedsDecompression(store.value());
}
break; break;
} }
case Opcode::kFrameState: case Opcode::kFrameState:
// The deopt code knows how to handle Compressed inputs, both // The deopt code knows how to handle compressed inputs.
// MachineRepresentation kCompressed values and CompressedHeapConstants.
break; break;
case Opcode::kPhi: { case Opcode::kPhi: {
// Replicate the phi's state for its inputs. // Replicate the phi's state for its inputs.
...@@ -107,7 +108,7 @@ void DecompressionAnalyzer::ProcessOperation(const Operation& op) { ...@@ -107,7 +108,7 @@ void DecompressionAnalyzer::ProcessOperation(const Operation& op) {
} }
case Opcode::kEqual: { case Opcode::kEqual: {
auto& equal = op.Cast<EqualOp>(); auto& equal = op.Cast<EqualOp>();
if (equal.rep == MachineRepresentation::kWord64) { if (equal.rep == WordRepresentation::Word64()) {
MarkAsNeedsDecompression(equal.left()); MarkAsNeedsDecompression(equal.left());
MarkAsNeedsDecompression(equal.right()); MarkAsNeedsDecompression(equal.right());
} }
...@@ -115,7 +116,7 @@ void DecompressionAnalyzer::ProcessOperation(const Operation& op) { ...@@ -115,7 +116,7 @@ void DecompressionAnalyzer::ProcessOperation(const Operation& op) {
} }
case Opcode::kComparison: { case Opcode::kComparison: {
auto& comp = op.Cast<ComparisonOp>(); auto& comp = op.Cast<ComparisonOp>();
if (comp.rep == MachineRepresentation::kWord64) { if (comp.rep == WordRepresentation::Word64()) {
MarkAsNeedsDecompression(comp.left()); MarkAsNeedsDecompression(comp.left());
MarkAsNeedsDecompression(comp.right()); MarkAsNeedsDecompression(comp.right());
} }
...@@ -123,7 +124,7 @@ void DecompressionAnalyzer::ProcessOperation(const Operation& op) { ...@@ -123,7 +124,7 @@ void DecompressionAnalyzer::ProcessOperation(const Operation& op) {
} }
case Opcode::kWordBinop: { case Opcode::kWordBinop: {
auto& binary_op = op.Cast<WordBinopOp>(); auto& binary_op = op.Cast<WordBinopOp>();
if (binary_op.rep == MachineRepresentation::kWord64) { if (binary_op.rep == WordRepresentation::Word64()) {
MarkAsNeedsDecompression(binary_op.left()); MarkAsNeedsDecompression(binary_op.left());
MarkAsNeedsDecompression(binary_op.right()); MarkAsNeedsDecompression(binary_op.right());
} }
...@@ -131,15 +132,14 @@ void DecompressionAnalyzer::ProcessOperation(const Operation& op) { ...@@ -131,15 +132,14 @@ void DecompressionAnalyzer::ProcessOperation(const Operation& op) {
} }
case Opcode::kShift: { case Opcode::kShift: {
auto& shift_op = op.Cast<ShiftOp>(); auto& shift_op = op.Cast<ShiftOp>();
if (shift_op.rep == MachineRepresentation::kWord64) { if (shift_op.rep == WordRepresentation::Word64()) {
MarkAsNeedsDecompression(shift_op.left()); MarkAsNeedsDecompression(shift_op.left());
} }
break; break;
} }
case Opcode::kChange: { case Opcode::kChange: {
auto& change = op.Cast<ChangeOp>(); auto& change = op.Cast<ChangeOp>();
if (change.to == MachineRepresentation::kWord64 && if (change.to == WordRepresentation::Word64() && NeedsDecompression(op)) {
NeedsDecompression(op)) {
MarkAsNeedsDecompression(change.input()); MarkAsNeedsDecompression(change.input());
} }
break; break;
...@@ -187,28 +187,28 @@ void RunDecompressionOptimization(Graph& graph, Zone* phase_zone) { ...@@ -187,28 +187,28 @@ void RunDecompressionOptimization(Graph& graph, Zone* phase_zone) {
} }
case Opcode::kPhi: { case Opcode::kPhi: {
auto& phi = op.Cast<PhiOp>(); auto& phi = op.Cast<PhiOp>();
if (phi.rep == MachineRepresentation::kTagged) { if (phi.rep == RegisterRepresentation::Tagged()) {
phi.rep = MachineRepresentation::kCompressed; phi.rep = RegisterRepresentation::Tagged();
} else if (phi.rep == MachineRepresentation::kTaggedPointer) {
phi.rep = MachineRepresentation::kCompressedPointer;
} }
break; break;
} }
case Opcode::kLoad: { case Opcode::kLoad: {
auto& load = op.Cast<LoadOp>(); auto& load = op.Cast<LoadOp>();
if (load.loaded_rep == MachineType::AnyTagged()) { if (load.loaded_rep.IsTagged()) {
load.loaded_rep = MachineType::AnyCompressed(); DCHECK_EQ(load.result_rep,
} else if (load.loaded_rep == MachineType::TaggedPointer()) { any_of(RegisterRepresentation::Tagged(),
load.loaded_rep = MachineType::CompressedPointer(); RegisterRepresentation::Compressed()));
load.result_rep = RegisterRepresentation::Compressed();
} }
break; break;
} }
case Opcode::kIndexedLoad: { case Opcode::kIndexedLoad: {
auto& load = op.Cast<IndexedLoadOp>(); auto& load = op.Cast<IndexedLoadOp>();
if (load.loaded_rep == MachineType::AnyTagged()) { if (load.loaded_rep.IsTagged()) {
load.loaded_rep = MachineType::AnyCompressed(); DCHECK_EQ(load.result_rep,
} else if (load.loaded_rep == MachineType::TaggedPointer()) { any_of(RegisterRepresentation::Tagged(),
load.loaded_rep = MachineType::CompressedPointer(); RegisterRepresentation::Compressed()));
load.result_rep = RegisterRepresentation::Compressed();
} }
break; break;
} }
......
...@@ -287,7 +287,9 @@ OpIndex GraphBuilder::Process( ...@@ -287,7 +287,9 @@ OpIndex GraphBuilder::Process(
case IrOpcode::kPhi: { case IrOpcode::kPhi: {
int input_count = op->ValueInputCount(); int input_count = op->ValueInputCount();
MachineRepresentation rep = PhiRepresentationOf(op); RegisterRepresentation rep =
RegisterRepresentation::FromMachineRepresentation(
PhiRepresentationOf(op));
if (assembler.current_block()->IsLoop()) { if (assembler.current_block()->IsLoop()) {
DCHECK_EQ(input_count, 2); DCHECK_EQ(input_count, 2);
return assembler.PendingLoopPhi(Map(node->InputAt(0)), rep, return assembler.PendingLoopPhi(Map(node->InputAt(0)), rep,
...@@ -405,9 +407,9 @@ OpIndex GraphBuilder::Process( ...@@ -405,9 +407,9 @@ OpIndex GraphBuilder::Process(
case IrOpcode::kWord64Sar: case IrOpcode::kWord64Sar:
case IrOpcode::kWord32Sar: { case IrOpcode::kWord32Sar: {
MachineRepresentation rep = opcode == IrOpcode::kWord64Sar WordRepresentation rep = opcode == IrOpcode::kWord64Sar
? MachineRepresentation::kWord64 ? WordRepresentation::Word64()
: MachineRepresentation::kWord32; : WordRepresentation::Word32();
ShiftOp::Kind kind; ShiftOp::Kind kind;
switch (ShiftKindOf(op)) { switch (ShiftKindOf(op)) {
case ShiftKind::kShiftOutZeros: case ShiftKind::kShiftOutZeros:
...@@ -463,8 +465,8 @@ OpIndex GraphBuilder::Process( ...@@ -463,8 +465,8 @@ OpIndex GraphBuilder::Process(
#define CHANGE_CASE(opcode, kind, from, to) \ #define CHANGE_CASE(opcode, kind, from, to) \
case IrOpcode::k##opcode: \ case IrOpcode::k##opcode: \
return assembler.Change(Map(node->InputAt(0)), ChangeOp::Kind::k##kind, \ return assembler.Change(Map(node->InputAt(0)), ChangeOp::Kind::k##kind, \
MachineRepresentation::k##from, \ RegisterRepresentation::from(), \
MachineRepresentation::k##to); RegisterRepresentation::to());
CHANGE_CASE(BitcastWord32ToWord64, Bitcast, Word32, Word64) CHANGE_CASE(BitcastWord32ToWord64, Bitcast, Word32, Word64)
CHANGE_CASE(BitcastFloat32ToInt32, Bitcast, Float32, Word32) CHANGE_CASE(BitcastFloat32ToInt32, Bitcast, Float32, Word32)
...@@ -501,8 +503,8 @@ OpIndex GraphBuilder::Process( ...@@ -501,8 +503,8 @@ OpIndex GraphBuilder::Process(
break; break;
} }
return assembler.Change(Map(node->InputAt(0)), kind, return assembler.Change(Map(node->InputAt(0)), kind,
MachineRepresentation::kFloat64, RegisterRepresentation::Float64(),
MachineRepresentation::kWord64); RegisterRepresentation::Word64());
} }
case IrOpcode::kFloat64InsertLowWord32: case IrOpcode::kFloat64InsertLowWord32:
...@@ -516,16 +518,18 @@ OpIndex GraphBuilder::Process( ...@@ -516,16 +518,18 @@ OpIndex GraphBuilder::Process(
case IrOpcode::kBitcastTaggedToWord: case IrOpcode::kBitcastTaggedToWord:
return assembler.TaggedBitcast(Map(node->InputAt(0)), return assembler.TaggedBitcast(Map(node->InputAt(0)),
MachineRepresentation::kTagged, RegisterRepresentation::Tagged(),
MachineType::PointerRepresentation()); RegisterRepresentation::PointerSized());
case IrOpcode::kBitcastWordToTagged: case IrOpcode::kBitcastWordToTagged:
return assembler.TaggedBitcast(Map(node->InputAt(0)), return assembler.TaggedBitcast(Map(node->InputAt(0)),
MachineType::PointerRepresentation(), RegisterRepresentation::PointerSized(),
MachineRepresentation::kTagged); RegisterRepresentation::Tagged());
case IrOpcode::kLoad: case IrOpcode::kLoad:
case IrOpcode::kUnalignedLoad: { case IrOpcode::kUnalignedLoad: {
MachineType loaded_rep = LoadRepresentationOf(op); MemoryRepresentation loaded_rep =
MemoryRepresentation::FromMachineType(LoadRepresentationOf(op));
RegisterRepresentation result_rep = loaded_rep.ToRegisterRepresentation();
Node* base = node->InputAt(0); Node* base = node->InputAt(0);
Node* index = node->InputAt(1); Node* index = node->InputAt(1);
LoadOp::Kind kind = opcode == IrOpcode::kLoad LoadOp::Kind kind = opcode == IrOpcode::kLoad
...@@ -533,19 +537,19 @@ OpIndex GraphBuilder::Process( ...@@ -533,19 +537,19 @@ OpIndex GraphBuilder::Process(
: LoadOp::Kind::kRawUnaligned; : LoadOp::Kind::kRawUnaligned;
if (index->opcode() == IrOpcode::kInt32Constant) { if (index->opcode() == IrOpcode::kInt32Constant) {
int32_t offset = OpParameter<int32_t>(index->op()); int32_t offset = OpParameter<int32_t>(index->op());
return assembler.Load(Map(base), kind, loaded_rep, offset); return assembler.Load(Map(base), kind, loaded_rep, result_rep, offset);
} }
if (index->opcode() == IrOpcode::kInt64Constant) { if (index->opcode() == IrOpcode::kInt64Constant) {
int64_t offset = OpParameter<int64_t>(index->op()); int64_t offset = OpParameter<int64_t>(index->op());
if (base::IsValueInRangeForNumericType<int32_t>(offset)) { if (base::IsValueInRangeForNumericType<int32_t>(offset)) {
return assembler.Load(Map(base), kind, loaded_rep, return assembler.Load(Map(base), kind, loaded_rep, result_rep,
static_cast<int32_t>(offset)); static_cast<int32_t>(offset));
} }
} }
int32_t offset = 0; int32_t offset = 0;
uint8_t element_size_log2 = 0; uint8_t element_size_log2 = 0;
return assembler.IndexedLoad(Map(base), Map(index), kind, loaded_rep, return assembler.IndexedLoad(Map(base), Map(index), kind, loaded_rep,
offset, element_size_log2); result_rep, offset, element_size_log2);
} }
case IrOpcode::kStore: case IrOpcode::kStore:
...@@ -563,21 +567,26 @@ OpIndex GraphBuilder::Process( ...@@ -563,21 +567,26 @@ OpIndex GraphBuilder::Process(
if (index->opcode() == IrOpcode::kInt32Constant) { if (index->opcode() == IrOpcode::kInt32Constant) {
int32_t offset = OpParameter<int32_t>(index->op()); int32_t offset = OpParameter<int32_t>(index->op());
return assembler.Store(Map(base), Map(value), kind, return assembler.Store(Map(base), Map(value), kind,
store_rep.representation(), MemoryRepresentation::FromMachineRepresentation(
store_rep.representation()),
store_rep.write_barrier_kind(), offset); store_rep.write_barrier_kind(), offset);
} }
if (index->opcode() == IrOpcode::kInt64Constant) { if (index->opcode() == IrOpcode::kInt64Constant) {
int64_t offset = OpParameter<int64_t>(index->op()); int64_t offset = OpParameter<int64_t>(index->op());
if (base::IsValueInRangeForNumericType<int32_t>(offset)) { if (base::IsValueInRangeForNumericType<int32_t>(offset)) {
return assembler.Store( return assembler.Store(
Map(base), Map(value), kind, store_rep.representation(), Map(base), Map(value), kind,
MemoryRepresentation::FromMachineRepresentation(
store_rep.representation()),
store_rep.write_barrier_kind(), static_cast<int32_t>(offset)); store_rep.write_barrier_kind(), static_cast<int32_t>(offset));
} }
} }
int32_t offset = 0; int32_t offset = 0;
uint8_t element_size_log2 = 0; uint8_t element_size_log2 = 0;
return assembler.IndexedStore( return assembler.IndexedStore(
Map(base), Map(index), Map(value), kind, store_rep.representation(), Map(base), Map(index), Map(value), kind,
MemoryRepresentation::FromMachineRepresentation(
store_rep.representation()),
store_rep.write_barrier_kind(), offset, element_size_log2); store_rep.write_barrier_kind(), offset, element_size_log2);
} }
......
...@@ -100,26 +100,34 @@ std::ostream& operator<<(std::ostream& os, FloatUnaryOp::Kind kind) { ...@@ -100,26 +100,34 @@ std::ostream& operator<<(std::ostream& os, FloatUnaryOp::Kind kind) {
} }
// static // static
bool FloatUnaryOp::IsSupported(Kind kind, MachineRepresentation rep) { bool FloatUnaryOp::IsSupported(Kind kind, FloatRepresentation rep) {
switch (kind) { switch (rep) {
case Kind::kRoundDown: case FloatRepresentation::Float32():
return rep == MachineRepresentation::kFloat32 switch (kind) {
? SupportedOperations::float32_round_down() case Kind::kRoundDown:
: SupportedOperations::float64_round_down(); return SupportedOperations::float32_round_down();
case Kind::kRoundUp: case Kind::kRoundUp:
return rep == MachineRepresentation::kFloat32 return SupportedOperations::float32_round_up();
? SupportedOperations::float32_round_up() case Kind::kRoundToZero:
: SupportedOperations::float64_round_up(); return SupportedOperations::float32_round_to_zero();
case Kind::kRoundToZero: case Kind::kRoundTiesEven:
return rep == MachineRepresentation::kFloat32 return SupportedOperations::float32_round_ties_even();
? SupportedOperations::float32_round_to_zero() default:
: SupportedOperations::float64_round_to_zero(); return true;
case Kind::kRoundTiesEven: }
return rep == MachineRepresentation::kFloat32 case FloatRepresentation::Float64():
? SupportedOperations::float32_round_ties_even() switch (kind) {
: SupportedOperations::float64_round_ties_even(); case Kind::kRoundDown:
default: return SupportedOperations::float64_round_down();
return true; case Kind::kRoundUp:
return SupportedOperations::float64_round_up();
case Kind::kRoundToZero:
return SupportedOperations::float64_round_to_zero();
case Kind::kRoundTiesEven:
return SupportedOperations::float64_round_ties_even();
default:
return true;
}
} }
} }
......
This diff is collapsed.
...@@ -445,12 +445,12 @@ struct OptimizationPhase<Analyzer, Assembler>::Impl { ...@@ -445,12 +445,12 @@ struct OptimizationPhase<Analyzer, Assembler>::Impl {
} }
OpIndex ReduceLoad(const LoadOp& op) { OpIndex ReduceLoad(const LoadOp& op) {
return assembler.Load(MapToNewGraph(op.base()), op.kind, op.loaded_rep, return assembler.Load(MapToNewGraph(op.base()), op.kind, op.loaded_rep,
op.offset); op.result_rep, op.offset);
} }
OpIndex ReduceIndexedLoad(const IndexedLoadOp& op) { OpIndex ReduceIndexedLoad(const IndexedLoadOp& op) {
return assembler.IndexedLoad( return assembler.IndexedLoad(
MapToNewGraph(op.base()), MapToNewGraph(op.index()), op.kind, MapToNewGraph(op.base()), MapToNewGraph(op.index()), op.kind,
op.loaded_rep, op.offset, op.element_size_log2); op.loaded_rep, op.result_rep, op.offset, op.element_size_log2);
} }
OpIndex ReduceStore(const StoreOp& op) { OpIndex ReduceStore(const StoreOp& op) {
return assembler.Store(MapToNewGraph(op.base()), MapToNewGraph(op.value()), return assembler.Store(MapToNewGraph(op.base()), MapToNewGraph(op.value()),
......
// Copyright 2022 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/compiler/turboshaft/representations.h"
namespace v8::internal::compiler::turboshaft {
std::ostream& operator<<(std::ostream& os, RegisterRepresentation rep) {
switch (rep) {
case RegisterRepresentation::Word32():
return os << "Word32";
case RegisterRepresentation::Word64():
return os << "Word64";
case RegisterRepresentation::Float32():
return os << "Float32";
case RegisterRepresentation::Float64():
return os << "Float64";
case RegisterRepresentation::Tagged():
return os << "Tagged";
case RegisterRepresentation::Compressed():
return os << "Compressed";
}
}
std::ostream& operator<<(std::ostream& os, MemoryRepresentation rep) {
switch (rep) {
case MemoryRepresentation::Int8():
return os << "Int8";
case MemoryRepresentation::Uint8():
return os << "Uint8";
case MemoryRepresentation::Int16():
return os << "Int16";
case MemoryRepresentation::Uint16():
return os << "Uint16";
case MemoryRepresentation::Int32():
return os << "Int32";
case MemoryRepresentation::Uint32():
return os << "Uint32";
case MemoryRepresentation::Int64():
return os << "Int64";
case MemoryRepresentation::Uint64():
return os << "Uint64";
case MemoryRepresentation::Float32():
return os << "Float32";
case MemoryRepresentation::Float64():
return os << "Float64";
case MemoryRepresentation::AnyTagged():
return os << "AnyTagged";
case MemoryRepresentation::TaggedPointer():
return os << "TaggedPointer";
case MemoryRepresentation::TaggedSigned():
return os << "TaggedSigned";
case MemoryRepresentation::SandboxedPointer():
return os << "SandboxedPointer";
}
}
} // namespace v8::internal::compiler::turboshaft
This diff is collapsed.
...@@ -86,6 +86,11 @@ std::ostream& operator<<(std::ostream& os, all_of<Ts...> all) { ...@@ -86,6 +86,11 @@ std::ostream& operator<<(std::ostream& os, all_of<Ts...> all) {
return all.PrintTo(os, std::index_sequence_for<Ts...>{}); return all.PrintTo(os, std::index_sequence_for<Ts...>{});
} }
class Uninstantiable {
private:
constexpr Uninstantiable() = default;
};
} // namespace v8::internal::compiler::turboshaft } // namespace v8::internal::compiler::turboshaft
#endif // V8_COMPILER_TURBOSHAFT_UTILS_H_ #endif // V8_COMPILER_TURBOSHAFT_UTILS_H_
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment