Skip to content

Commit c919ade

Browse files
alexmarkovCommit Queue
authored andcommitted
[vm/compiler] Remove speculative inputs from IL instructions
All inputs of IL instructions are now non-speculative, SelectRepresentations pass now always inserts non-speculative unboxing instructions. In call specializer, where JIT compiler speculates, speculative Unbox instructions are now explicitly added for inputs which may have incorrect type. Unbox instructions now have 'value_mode' (either kHasValidType or kCheckType) instead of speculative mode. Added canonicalization rule to change value mode if compiler can prove that value has correct type. Also, cleaned up speculations around UnboxedInt32 representation in JIT mode, which aligns this representation with other unboxed representations. TEST=ci Change-Id: I52f5c959c3f6515b1a7c9e8ab15b420beed0e3f5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/391492 Commit-Queue: Alexander Markov <[email protected]> Reviewed-by: Slava Egorov <[email protected]>
1 parent 5b9d75f commit c919ade

19 files changed

+399
-676
lines changed

runtime/vm/compiler/aot/aot_call_specializer.cc

Lines changed: 27 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -290,8 +290,7 @@ Value* AotCallSpecializer::PrepareStaticOpInput(Value* input,
290290
if (input->Type()->ToNullableCid() == kSmiCid) {
291291
conversion = new (Z) SmiToDoubleInstr(input, call->source());
292292
} else if (FlowGraphCompiler::CanConvertInt64ToDouble()) {
293-
conversion = new (Z) Int64ToDoubleInstr(input, DeoptId::kNone,
294-
Instruction::kNotSpeculative);
293+
conversion = new (Z) Int64ToDoubleInstr(input, DeoptId::kNone);
295294
} else {
296295
UNREACHABLE();
297296
}
@@ -443,9 +442,8 @@ Definition* AotCallSpecializer::TryOptimizeDivisionOperation(
443442
if (magnitude == 1) return right_definition;
444443
InsertBefore(instr, right_definition, /*env=*/nullptr, FlowGraph::kValue);
445444
right_value = new (Z) Value(right_definition);
446-
return new (Z)
447-
BinaryInt64OpInstr(Token::kBIT_AND, left_value, right_value,
448-
DeoptId::kNone, Instruction::kNotSpeculative);
445+
return new (Z) BinaryInt64OpInstr(Token::kBIT_AND, left_value, right_value,
446+
DeoptId::kNone);
449447
} else {
450448
ASSERT_EQUAL(op_kind, Token::kTRUNCDIV);
451449
#if !defined(TARGET_ARCH_IS_32_BIT)
@@ -484,16 +482,14 @@ Definition* AotCallSpecializer::TryOptimizeDivisionOperation(
484482
auto* rounding_adjustment = unboxed_constant(magnitude - 1);
485483
InsertBefore(instr, rounding_adjustment, /*env=*/nullptr,
486484
FlowGraph::kValue);
487-
rounding_adjustment = new (Z)
488-
BinaryInt64OpInstr(Token::kBIT_AND, new (Z) Value(sign_bit_extended),
489-
new (Z) Value(rounding_adjustment), DeoptId::kNone,
490-
Instruction::kNotSpeculative);
485+
rounding_adjustment = new (Z) BinaryInt64OpInstr(
486+
Token::kBIT_AND, new (Z) Value(sign_bit_extended),
487+
new (Z) Value(rounding_adjustment), DeoptId::kNone);
491488
InsertBefore(instr, rounding_adjustment, /*env=*/nullptr,
492489
FlowGraph::kValue);
493-
auto* const left_definition = new (Z)
494-
BinaryInt64OpInstr(Token::kADD, left_value->CopyWithType(Z),
495-
new (Z) Value(rounding_adjustment), DeoptId::kNone,
496-
Instruction::kNotSpeculative);
490+
auto* const left_definition = new (Z) BinaryInt64OpInstr(
491+
Token::kADD, left_value->CopyWithType(Z),
492+
new (Z) Value(rounding_adjustment), DeoptId::kNone);
497493
InsertBefore(instr, left_definition, /*env=*/nullptr, FlowGraph::kValue);
498494
left_value = new (Z) Value(left_definition);
499495
auto* const right_definition =
@@ -553,7 +549,7 @@ bool AotCallSpecializer::TryOptimizeIntegerOperation(TemplateDartCall<0>* instr,
553549
replacement = new (Z) EqualityCompareInstr(
554550
instr->source(), op_kind, left_value->CopyWithType(Z),
555551
right_value->CopyWithType(Z), kMintCid, DeoptId::kNone,
556-
/*null_aware=*/either_can_be_null, Instruction::kNotSpeculative);
552+
/*null_aware=*/either_can_be_null);
557553
break;
558554
}
559555
case Token::kLT:
@@ -562,9 +558,9 @@ bool AotCallSpecializer::TryOptimizeIntegerOperation(TemplateDartCall<0>* instr,
562558
case Token::kGTE:
563559
left_value = PrepareStaticOpInput(left_value, kMintCid, instr);
564560
right_value = PrepareStaticOpInput(right_value, kMintCid, instr);
565-
replacement = new (Z) RelationalOpInstr(
566-
instr->source(), op_kind, left_value, right_value, kMintCid,
567-
DeoptId::kNone, Instruction::kNotSpeculative);
561+
replacement =
562+
new (Z) RelationalOpInstr(instr->source(), op_kind, left_value,
563+
right_value, kMintCid, DeoptId::kNone);
568564
break;
569565
case Token::kMOD:
570566
case Token::kTRUNCDIV:
@@ -605,9 +601,8 @@ bool AotCallSpecializer::TryOptimizeIntegerOperation(TemplateDartCall<0>* instr,
605601
} else {
606602
left_value = PrepareStaticOpInput(left_value, kMintCid, instr);
607603
right_value = PrepareStaticOpInput(right_value, kMintCid, instr);
608-
replacement = new (Z)
609-
BinaryInt64OpInstr(op_kind, left_value, right_value,
610-
DeoptId::kNone, Instruction::kNotSpeculative);
604+
replacement = new (Z) BinaryInt64OpInstr(op_kind, left_value,
605+
right_value, DeoptId::kNone);
611606
}
612607
break;
613608
}
@@ -626,8 +621,8 @@ bool AotCallSpecializer::TryOptimizeIntegerOperation(TemplateDartCall<0>* instr,
626621

627622
if (op_kind == Token::kNEGATE || op_kind == Token::kBIT_NOT) {
628623
left_value = PrepareStaticOpInput(left_value, kMintCid, instr);
629-
replacement = new (Z) UnaryInt64OpInstr(
630-
op_kind, left_value, DeoptId::kNone, Instruction::kNotSpeculative);
624+
replacement =
625+
new (Z) UnaryInt64OpInstr(op_kind, left_value, DeoptId::kNone);
631626
}
632627
}
633628

@@ -679,8 +674,7 @@ bool AotCallSpecializer::TryOptimizeDoubleOperation(TemplateDartCall<0>* instr,
679674
right_value = PrepareStaticOpInput(right_value, kDoubleCid, instr);
680675
replacement = new (Z) EqualityCompareInstr(
681676
instr->source(), op_kind, left_value, right_value, kDoubleCid,
682-
DeoptId::kNone, /*null_aware=*/false,
683-
Instruction::kNotSpeculative);
677+
DeoptId::kNone, /*null_aware=*/false);
684678
break;
685679
}
686680
break;
@@ -694,9 +688,9 @@ bool AotCallSpecializer::TryOptimizeDoubleOperation(TemplateDartCall<0>* instr,
694688
case Token::kGTE: {
695689
left_value = PrepareStaticOpInput(left_value, kDoubleCid, instr);
696690
right_value = PrepareStaticOpInput(right_value, kDoubleCid, instr);
697-
replacement = new (Z) RelationalOpInstr(
698-
instr->source(), op_kind, left_value, right_value, kDoubleCid,
699-
DeoptId::kNone, Instruction::kNotSpeculative);
691+
replacement =
692+
new (Z) RelationalOpInstr(instr->source(), op_kind, left_value,
693+
right_value, kDoubleCid, DeoptId::kNone);
700694
break;
701695
}
702696
case Token::kADD:
@@ -709,8 +703,7 @@ bool AotCallSpecializer::TryOptimizeDoubleOperation(TemplateDartCall<0>* instr,
709703
left_value = PrepareStaticOpInput(left_value, kDoubleCid, instr);
710704
right_value = PrepareStaticOpInput(right_value, kDoubleCid, instr);
711705
replacement = new (Z) BinaryDoubleOpInstr(
712-
op_kind, left_value, right_value, DeoptId::kNone, instr->source(),
713-
Instruction::kNotSpeculative);
706+
op_kind, left_value, right_value, DeoptId::kNone, instr->source());
714707
break;
715708
}
716709

@@ -739,8 +732,7 @@ bool AotCallSpecializer::TryOptimizeDoubleOperation(TemplateDartCall<0>* instr,
739732
if (op_kind == Token::kNEGATE) {
740733
left_value = PrepareStaticOpInput(left_value, kDoubleCid, instr);
741734
replacement = new (Z)
742-
UnaryDoubleOpInstr(Token::kNEGATE, left_value, instr->deopt_id(),
743-
Instruction::kNotSpeculative);
735+
UnaryDoubleOpInstr(Token::kNEGATE, left_value, instr->deopt_id());
744736
}
745737
}
746738

@@ -1139,10 +1131,10 @@ bool AotCallSpecializer::TryReplaceInstanceOfWithRangeCheck(
11391131
if (lower_limit == upper_limit) {
11401132
ConstantInstr* cid_constant = flow_graph()->GetConstant(
11411133
Smi::Handle(Z, Smi::New(lower_limit)), kUnboxedUword);
1142-
check_range = new (Z) EqualityCompareInstr(
1143-
call->source(), Token::kEQ, new Value(load_cid),
1144-
new Value(cid_constant), kIntegerCid, DeoptId::kNone, false,
1145-
Instruction::kNotSpeculative);
1134+
check_range = new (Z)
1135+
EqualityCompareInstr(call->source(), Token::kEQ, new Value(load_cid),
1136+
new Value(cid_constant), kIntegerCid,
1137+
DeoptId::kNone, /*null_aware=*/false);
11461138
} else {
11471139
check_range =
11481140
new (Z) TestRangeInstr(call->source(), new (Z) Value(load_cid),

runtime/vm/compiler/backend/block_builder.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,20 +100,22 @@ class BlockBuilder : public ValueObject {
100100
return flow_graph_->GetConstant(Object::ZoneHandle());
101101
}
102102

103-
Definition* AddUnboxInstr(Representation rep, Value* value, bool is_checked) {
103+
Definition* AddUnboxInstr(Representation rep,
104+
Value* value,
105+
UnboxInstr::ValueMode value_mode) {
104106
// Unbox floats by first unboxing a double then converting it to a float.
105107
auto const unbox_rep = rep == kUnboxedFloat
106108
? kUnboxedDouble
107109
: Boxing::NativeRepresentation(rep);
108-
Definition* unboxed_value =
109-
AddDefinition(UnboxInstr::Create(unbox_rep, value, DeoptId::kNone));
110+
Definition* unboxed_value = AddDefinition(
111+
UnboxInstr::Create(unbox_rep, value, DeoptId::kNone, value_mode));
110112
if (rep != unbox_rep && unboxed_value->IsUnboxInteger()) {
111113
ASSERT(RepresentationUtils::ValueSize(rep) <
112114
RepresentationUtils::ValueSize(unbox_rep));
113115
// Mark unboxing of small unboxed integer representations as truncating.
114116
unboxed_value->AsUnboxInteger()->mark_truncating();
115117
}
116-
if (is_checked) {
118+
if (value_mode == UnboxInstr::ValueMode::kHasValidType) {
117119
// The type of |value| has already been checked and it is safe to
118120
// adjust reaching type. This is done manually because there is no type
119121
// propagation when building intrinsics.
@@ -129,8 +131,8 @@ class BlockBuilder : public ValueObject {
129131

130132
Definition* AddUnboxInstr(Representation rep,
131133
Definition* boxed,
132-
bool is_checked) {
133-
return AddUnboxInstr(rep, new Value(boxed), is_checked);
134+
UnboxInstr::ValueMode value_mode) {
135+
return AddUnboxInstr(rep, new Value(boxed), value_mode);
134136
}
135137

136138
BranchInstr* AddBranch(ComparisonInstr* comp,

runtime/vm/compiler/backend/constant_propagator_test.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,9 @@ ISOLATE_UNIT_TEST_CASE(ConstantPropagation_PhiUnwrappingAndConvergence) {
5454
BlockBuilder builder(H.flow_graph(), b2);
5555
v1 = H.Phi(b2, {{b1, v0}, {b3, &v1}});
5656
builder.AddPhi(v1);
57-
auto v2 = builder.AddDefinition(
58-
new EqualityCompareInstr(InstructionSource(), Token::kEQ, new Value(v1),
59-
new Value(v0), kSmiCid, S.GetNextDeoptId()));
57+
auto v2 = builder.AddDefinition(new EqualityCompareInstr(
58+
InstructionSource(), Token::kEQ, new Value(v1), new Value(v0), kSmiCid,
59+
S.GetNextDeoptId(), /*null_aware=*/false));
6060
builder.AddBranch(new StrictCompareInstr(
6161
InstructionSource(), Token::kEQ_STRICT, new Value(v2),
6262
new Value(H.flow_graph()->GetConstant(Bool::True())),
@@ -245,7 +245,7 @@ ISOLATE_UNIT_TEST_CASE(ConstantPropagator_Regress35371) {
245245
auto make_int64_add = [](Definition* lhs, Definition* rhs,
246246
intptr_t deopt_id) {
247247
return new BinaryInt64OpInstr(Token::kADD, new Value(lhs), new Value(rhs),
248-
deopt_id, Instruction::kNotSpeculative);
248+
deopt_id);
249249
};
250250

251251
auto make_int32_add = [](Definition* lhs, Definition* rhs,

runtime/vm/compiler/backend/flow_graph.cc

Lines changed: 10 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1971,34 +1971,19 @@ void FlowGraph::InsertConversion(Representation from,
19711971
} else {
19721972
insert_before = use->instruction();
19731973
}
1974-
const Instruction::SpeculativeMode speculative_mode =
1975-
use->instruction()->SpeculativeModeOfInput(use->use_index());
1976-
Instruction* deopt_target = nullptr;
1977-
if (speculative_mode == Instruction::kGuardInputs || to == kUnboxedInt32) {
1978-
deopt_target = insert_before;
1979-
}
19801974

19811975
Definition* converted = nullptr;
19821976
if (IsUnboxedInteger(from) && IsUnboxedInteger(to)) {
1983-
const intptr_t deopt_id = (to == kUnboxedInt32) && (deopt_target != nullptr)
1984-
? deopt_target->DeoptimizationTarget()
1985-
: DeoptId::kNone;
1986-
converted =
1987-
new (Z) IntConverterInstr(from, to, use->CopyWithType(), deopt_id);
1977+
converted = new (Z)
1978+
IntConverterInstr(from, to, use->CopyWithType(), DeoptId::kNone);
19881979
} else if ((from == kUnboxedInt32) && (to == kUnboxedDouble)) {
19891980
converted = new Int32ToDoubleInstr(use->CopyWithType());
19901981
} else if ((from == kUnboxedInt64) && (to == kUnboxedDouble) &&
19911982
CanConvertInt64ToDouble()) {
1992-
const intptr_t deopt_id = (deopt_target != nullptr)
1993-
? deopt_target->DeoptimizationTarget()
1994-
: DeoptId::kNone;
1995-
converted = new Int64ToDoubleInstr(use->CopyWithType(), deopt_id);
1983+
converted = new Int64ToDoubleInstr(use->CopyWithType(), DeoptId::kNone);
19961984
} else if ((from == kTagged) && Boxing::Supports(to)) {
1997-
const intptr_t deopt_id = (deopt_target != nullptr)
1998-
? deopt_target->DeoptimizationTarget()
1999-
: DeoptId::kNone;
2000-
converted =
2001-
UnboxInstr::Create(to, use->CopyWithType(), deopt_id, speculative_mode);
1985+
converted = UnboxInstr::Create(to, use->CopyWithType(), DeoptId::kNone,
1986+
UnboxInstr::ValueMode::kHasValidType);
20021987
} else if ((to == kTagged) && Boxing::Supports(from)) {
20031988
converted = BoxInstr::Create(from, use->CopyWithType());
20041989
} else if ((to == kPairOfTagged) && (from == kTagged)) {
@@ -2042,23 +2027,16 @@ void FlowGraph::InsertConversion(Representation from,
20422027
// trigger a deoptimization if executed. See #12417 for a discussion.
20432028
// If the use is not speculative, then this code should be unreachable.
20442029
// Insert Stop for a graceful error and aid unreachable code elimination.
2045-
if (speculative_mode == Instruction::kNotSpeculative) {
2046-
StopInstr* stop = new (Z) StopInstr("Incompatible conversion.");
2047-
InsertBefore(insert_before, stop, nullptr, FlowGraph::kEffect);
2048-
}
2049-
const intptr_t deopt_id = (deopt_target != nullptr)
2050-
? deopt_target->DeoptimizationTarget()
2051-
: DeoptId::kNone;
2030+
StopInstr* stop = new (Z) StopInstr("Incompatible conversion.");
2031+
InsertBefore(insert_before, stop, nullptr, FlowGraph::kEffect);
20522032
Definition* boxed = BoxInstr::Create(from, use->CopyWithType());
20532033
use->BindTo(boxed);
20542034
InsertBefore(insert_before, boxed, nullptr, FlowGraph::kValue);
2055-
converted = UnboxInstr::Create(to, new (Z) Value(boxed), deopt_id,
2056-
speculative_mode);
2035+
converted = UnboxInstr::Create(to, new (Z) Value(boxed), DeoptId::kNone,
2036+
UnboxInstr::ValueMode::kHasValidType);
20572037
}
20582038
ASSERT(converted != nullptr);
2059-
InsertBefore(insert_before, converted,
2060-
(deopt_target != nullptr) ? deopt_target->env() : nullptr,
2061-
FlowGraph::kValue);
2039+
InsertBefore(insert_before, converted, nullptr, FlowGraph::kValue);
20622040
if (is_environment_use) {
20632041
use->BindToEnvironment(converted);
20642042
} else {
@@ -2492,13 +2470,6 @@ bool FlowGraph::Canonicalize() {
24922470
if (auto join = block->AsJoinEntry()) {
24932471
for (PhiIterator it(join); !it.Done(); it.Advance()) {
24942472
PhiInstr* current = it.Current();
2495-
if (current->HasUnmatchedInputRepresentations() &&
2496-
(current->SpeculativeModeOfInputs() == Instruction::kGuardInputs)) {
2497-
// Can't canonicalize this instruction until all conversions for its
2498-
// speculative inputs are inserted.
2499-
continue;
2500-
}
2501-
25022473
Definition* replacement = current->Canonicalize(this);
25032474
ASSERT(replacement != nullptr);
25042475
RELEASE_ASSERT(unmatched_representations_allowed() ||
@@ -2512,13 +2483,6 @@ bool FlowGraph::Canonicalize() {
25122483
}
25132484
for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
25142485
Instruction* current = it.Current();
2515-
if (current->HasUnmatchedInputRepresentations() &&
2516-
(current->SpeculativeModeOfInputs() == Instruction::kGuardInputs)) {
2517-
// Can't canonicalize this instruction until all conversions for its
2518-
// speculative inputs are inserted.
2519-
continue;
2520-
}
2521-
25222486
Instruction* replacement = current->Canonicalize(this);
25232487

25242488
if (replacement != current) {

runtime/vm/compiler/backend/flow_graph_compiler.cc

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1794,17 +1794,13 @@ void FlowGraphCompiler::AllocateRegistersLocally(Instruction* instr) {
17941794
switch (instr->RequiredInputRepresentation(i)) {
17951795
case kUnboxedDouble:
17961796
ASSERT(fpu_reg != kNoFpuRegister);
1797-
ASSERT(instr->SpeculativeModeOfInput(i) ==
1798-
Instruction::kNotSpeculative);
17991797
assembler()->LoadUnboxedDouble(
18001798
fpu_reg, reg,
18011799
compiler::target::Double::value_offset() - kHeapObjectTag);
18021800
break;
18031801
case kUnboxedFloat32x4:
18041802
case kUnboxedFloat64x2:
18051803
ASSERT(fpu_reg != kNoFpuRegister);
1806-
ASSERT(instr->SpeculativeModeOfInput(i) ==
1807-
Instruction::kNotSpeculative);
18081804
assembler()->LoadUnboxedSimd128(
18091805
fpu_reg, reg,
18101806
compiler::target::Float32x4::value_offset() - kHeapObjectTag);

runtime/vm/compiler/backend/flow_graph_test.cc

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,18 @@ ISOLATE_UNIT_TEST_CASE(FlowGraph_UnboxInt64Phi) {
4646
BlockBuilder builder(H.flow_graph(), loop_header);
4747
loop_var = H.Phi(loop_header, {{normal_entry, v0}, {loop_body, &add1}});
4848
builder.AddPhi(loop_var);
49-
builder.AddBranch(new RelationalOpInstr(
50-
InstructionSource(), Token::kLT, new Value(loop_var),
51-
new Value(H.IntConstant(50)), kMintCid,
52-
S.GetNextDeoptId(), Instruction::kNotSpeculative),
53-
loop_body, loop_exit);
49+
builder.AddBranch(
50+
new RelationalOpInstr(InstructionSource(), Token::kLT,
51+
new Value(loop_var), new Value(H.IntConstant(50)),
52+
kMintCid, S.GetNextDeoptId()),
53+
loop_body, loop_exit);
5454
}
5555

5656
{
5757
BlockBuilder builder(H.flow_graph(), loop_body);
5858
add1 = builder.AddDefinition(new BinaryInt64OpInstr(
5959
Token::kADD, new Value(loop_var), new Value(H.IntConstant(1)),
60-
S.GetNextDeoptId(), Instruction::kNotSpeculative));
60+
S.GetNextDeoptId()));
6161
builder.AddInstruction(new GotoInstr(loop_header, S.GetNextDeoptId()));
6262
}
6363

@@ -109,18 +109,18 @@ ISOLATE_UNIT_TEST_CASE(FlowGraph_LateVariablePhiUnboxing) {
109109
late_var =
110110
H.Phi(loop_header, {{normal_entry, sentinel}, {loop_body, &add1}});
111111
builder.AddPhi(late_var);
112-
builder.AddBranch(new RelationalOpInstr(
113-
InstructionSource(), Token::kLT, new Value(loop_var),
114-
new Value(H.IntConstant(10)), kMintCid,
115-
S.GetNextDeoptId(), Instruction::kNotSpeculative),
116-
loop_body, loop_exit);
112+
builder.AddBranch(
113+
new RelationalOpInstr(InstructionSource(), Token::kLT,
114+
new Value(loop_var), new Value(H.IntConstant(10)),
115+
kMintCid, S.GetNextDeoptId()),
116+
loop_body, loop_exit);
117117
}
118118

119119
{
120120
BlockBuilder builder(H.flow_graph(), loop_body);
121121
add1 = builder.AddDefinition(new BinaryInt64OpInstr(
122122
Token::kADD, new Value(loop_var), new Value(H.IntConstant(1)),
123-
S.GetNextDeoptId(), Instruction::kNotSpeculative));
123+
S.GetNextDeoptId()));
124124
builder.AddInstruction(new GotoInstr(loop_header, S.GetNextDeoptId()));
125125
}
126126

@@ -168,16 +168,14 @@ ISOLATE_UNIT_TEST_CASE(FlowGraph_UnboxedFloatPhi) {
168168
{
169169
BlockBuilder builder(H.flow_graph(), then_body);
170170
double_to_float_1 = builder.AddDefinition(new DoubleToFloatInstr(
171-
new Value(H.DoubleConstant(1)), S.GetNextDeoptId(),
172-
Instruction::kNotSpeculative));
171+
new Value(H.DoubleConstant(1)), S.GetNextDeoptId()));
173172
builder.AddInstruction(new GotoInstr(join_exit, S.GetNextDeoptId()));
174173
}
175174

176175
{
177176
BlockBuilder builder(H.flow_graph(), else_body);
178177
double_to_float_2 = builder.AddDefinition(new DoubleToFloatInstr(
179-
new Value(H.DoubleConstant(2)), S.GetNextDeoptId(),
180-
Instruction::kNotSpeculative));
178+
new Value(H.DoubleConstant(2)), S.GetNextDeoptId()));
181179
builder.AddInstruction(new GotoInstr(join_exit, S.GetNextDeoptId()));
182180
}
183181

0 commit comments

Comments
 (0)