Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(135)

Unified Diff: runtime/vm/flow_graph_inliner.cc

Issue 2709093003: Fixup redefinitions before doing code motion (Closed)
Patch Set: fix build Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/flow_graph.cc ('k') | runtime/vm/flow_graph_type_propagator.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/flow_graph_inliner.cc
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index f07e7cd1f2e5bf0cf2591d91301594b0fa571be5..08a2f03d29163a03077bab4d395c29f7ee8601e1 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -2310,12 +2310,13 @@ static bool InlineSetIndexed(FlowGraph* flow_graph,
static bool InlineDoubleOp(FlowGraph* flow_graph,
Token::Kind op_kind,
Instruction* call,
+ Definition* receiver,
TargetEntryInstr** entry,
Definition** last) {
if (!CanUnboxDouble()) {
return false;
}
- Definition* left = call->ArgumentAt(0);
+ Definition* left = receiver;
Definition* right = call->ArgumentAt(1);
*entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
@@ -2334,13 +2335,13 @@ static bool InlineDoubleOp(FlowGraph* flow_graph,
static bool InlineDoubleTestOp(FlowGraph* flow_graph,
Instruction* call,
+ Definition* receiver,
MethodRecognizer::Kind kind,
TargetEntryInstr** entry,
Definition** last) {
if (!CanUnboxDouble()) {
return false;
}
- Definition* d = call->ArgumentAt(0);
*entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
call->GetBlock()->try_index());
@@ -2348,7 +2349,7 @@ static bool InlineDoubleTestOp(FlowGraph* flow_graph,
// Arguments are checked. No need for class check.
DoubleTestOpInstr* double_test_op = new (Z) DoubleTestOpInstr(
- kind, new (Z) Value(d), call->deopt_id(), call->token_pos());
+ kind, new (Z) Value(receiver), call->deopt_id(), call->token_pos());
flow_graph->AppendTo(*entry, double_test_op, call->env(), FlowGraph::kValue);
*last = double_test_op;
@@ -2358,9 +2359,10 @@ static bool InlineDoubleTestOp(FlowGraph* flow_graph,
static bool InlineSmiBitAndFromSmi(FlowGraph* flow_graph,
Instruction* call,
+ Definition* receiver,
TargetEntryInstr** entry,
Definition** last) {
- Definition* left = call->ArgumentAt(0);
+ Definition* left = receiver;
Definition* right = call->ArgumentAt(1);
*entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
@@ -2381,9 +2383,10 @@ static bool InlineGrowableArraySetter(FlowGraph* flow_graph,
intptr_t offset,
StoreBarrierType store_barrier_type,
Instruction* call,
+ Definition* receiver,
TargetEntryInstr** entry,
Definition** last) {
- Definition* array = call->ArgumentAt(0);
+ Definition* array = receiver;
Definition* value = call->ArgumentAt(1);
*entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
@@ -2687,13 +2690,14 @@ static Definition* PrepareInlineStringIndexOp(FlowGraph* flow_graph,
static bool InlineStringBaseCharAt(FlowGraph* flow_graph,
Instruction* call,
+ Definition* receiver,
intptr_t cid,
TargetEntryInstr** entry,
Definition** last) {
if ((cid != kOneByteStringCid) && (cid != kExternalOneByteStringCid)) {
return false;
}
- Definition* str = call->ArgumentAt(0);
+ Definition* str = receiver;
Definition* index = call->ArgumentAt(1);
*entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
@@ -2714,13 +2718,14 @@ static bool InlineStringBaseCharAt(FlowGraph* flow_graph,
static bool InlineStringCodeUnitAt(FlowGraph* flow_graph,
Instruction* call,
+ Definition* receiver,
intptr_t cid,
TargetEntryInstr** entry,
Definition** last) {
ASSERT((cid == kOneByteStringCid) || (cid == kTwoByteStringCid) ||
(cid == kExternalOneByteStringCid) ||
(cid == kExternalTwoByteStringCid));
- Definition* str = call->ArgumentAt(0);
+ Definition* str = receiver;
Definition* index = call->ArgumentAt(1);
*entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
@@ -2794,7 +2799,7 @@ bool FlowGraphInliner::TryReplaceStaticCallWithInline(
TargetEntryInstr* entry;
Definition* last;
if (FlowGraphInliner::TryInlineRecognizedMethod(
- flow_graph, kIllegalCid, call->function(), call, call->ArgumentAt(0),
+ flow_graph, kIllegalCid, call->function(), call, NULL,
call->token_pos(), *call->ic_data(), &entry, &last)) {
// Remove the original push arguments.
for (intptr_t i = 0; i < call->ArgumentCount(); ++i) {
@@ -2828,12 +2833,14 @@ bool FlowGraphInliner::TryReplaceStaticCallWithInline(
static bool InlineFloat32x4Method(FlowGraph* flow_graph,
Instruction* call,
+ Definition* receiver,
MethodRecognizer::Kind kind,
TargetEntryInstr** entry,
Definition** last) {
if (!ShouldInlineSimd()) {
return false;
}
+
*entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
call->GetBlock()->try_index());
(*entry)->InheritDeoptTarget(Z, call);
@@ -2843,15 +2850,14 @@ static bool InlineFloat32x4Method(FlowGraph* flow_graph,
case MethodRecognizer::kFloat32x4ShuffleY:
case MethodRecognizer::kFloat32x4ShuffleZ:
case MethodRecognizer::kFloat32x4ShuffleW: {
- *last =
- new (Z) Simd32x4ShuffleInstr(kind, new (Z) Value(call->ArgumentAt(0)),
- 0, // mask ignored.
- call->deopt_id());
+ *last = new (Z) Simd32x4ShuffleInstr(kind, new (Z) Value(receiver),
+ 0, // mask ignored.
+ call->deopt_id());
break;
}
case MethodRecognizer::kFloat32x4GetSignMask: {
- *last = new (Z) Simd32x4GetSignMaskInstr(
- kind, new (Z) Value(call->ArgumentAt(0)), call->deopt_id());
+ *last = new (Z) Simd32x4GetSignMaskInstr(kind, new (Z) Value(receiver),
+ call->deopt_id());
break;
}
case MethodRecognizer::kFloat32x4Equal:
@@ -2860,7 +2866,7 @@ static bool InlineFloat32x4Method(FlowGraph* flow_graph,
case MethodRecognizer::kFloat32x4LessThan:
case MethodRecognizer::kFloat32x4LessThanOrEqual:
case MethodRecognizer::kFloat32x4NotEqual: {
- Definition* left = call->ArgumentAt(0);
+ Definition* left = receiver;
Definition* right = call->ArgumentAt(1);
*last = new (Z) Float32x4ComparisonInstr(
kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
@@ -2868,14 +2874,14 @@ static bool InlineFloat32x4Method(FlowGraph* flow_graph,
}
case MethodRecognizer::kFloat32x4Min:
case MethodRecognizer::kFloat32x4Max: {
- Definition* left = call->ArgumentAt(0);
+ Definition* left = receiver;
Definition* right = call->ArgumentAt(1);
*last = new (Z) Float32x4MinMaxInstr(
kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
break;
}
case MethodRecognizer::kFloat32x4Scale: {
- Definition* left = call->ArgumentAt(0);
+ Definition* left = receiver;
Definition* right = call->ArgumentAt(1);
// Left and right values are swapped when handed to the instruction,
// this is done so that the double value is loaded into the output
@@ -2887,7 +2893,7 @@ static bool InlineFloat32x4Method(FlowGraph* flow_graph,
case MethodRecognizer::kFloat32x4Sqrt:
case MethodRecognizer::kFloat32x4ReciprocalSqrt:
case MethodRecognizer::kFloat32x4Reciprocal: {
- Definition* left = call->ArgumentAt(0);
+ Definition* left = receiver;
*last = new (Z)
Float32x4SqrtInstr(kind, new (Z) Value(left), call->deopt_id());
break;
@@ -2896,7 +2902,7 @@ static bool InlineFloat32x4Method(FlowGraph* flow_graph,
case MethodRecognizer::kFloat32x4WithY:
case MethodRecognizer::kFloat32x4WithZ:
case MethodRecognizer::kFloat32x4WithW: {
- Definition* left = call->ArgumentAt(0);
+ Definition* left = receiver;
Definition* right = call->ArgumentAt(1);
*last = new (Z) Float32x4WithInstr(
kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
@@ -2904,13 +2910,13 @@ static bool InlineFloat32x4Method(FlowGraph* flow_graph,
}
case MethodRecognizer::kFloat32x4Absolute:
case MethodRecognizer::kFloat32x4Negate: {
- Definition* left = call->ArgumentAt(0);
+ Definition* left = receiver;
*last = new (Z)
Float32x4ZeroArgInstr(kind, new (Z) Value(left), call->deopt_id());
break;
}
case MethodRecognizer::kFloat32x4Clamp: {
- Definition* left = call->ArgumentAt(0);
+ Definition* left = receiver;
Definition* lower = call->ArgumentAt(1);
Definition* upper = call->ArgumentAt(2);
*last =
@@ -2946,6 +2952,7 @@ static bool CheckMask(Definition* definition, intptr_t* mask_ptr) {
static bool InlineSimdShuffleMethod(FlowGraph* flow_graph,
Instruction* call,
+ Definition* receiver,
MethodRecognizer::Kind kind,
TargetEntryInstr** entry,
Definition** last) {
@@ -2973,6 +2980,7 @@ static bool InlineSimdShuffleMethod(FlowGraph* flow_graph,
static bool InlineSimdShuffleMixMethod(FlowGraph* flow_graph,
Instruction* call,
+ Definition* receiver,
MethodRecognizer::Kind kind,
TargetEntryInstr** entry,
Definition** last) {
@@ -2988,9 +2996,9 @@ static bool InlineSimdShuffleMixMethod(FlowGraph* flow_graph,
if (!CheckMask(mask_definition, &mask)) {
return false;
}
- *last = new (Z) Simd32x4ShuffleMixInstr(
- kind, new (Z) Value(call->ArgumentAt(0)),
- new (Z) Value(call->ArgumentAt(1)), mask, call->deopt_id());
+ *last = new (Z) Simd32x4ShuffleMixInstr(kind, new (Z) Value(receiver),
+ new (Z) Value(call->ArgumentAt(1)),
+ mask, call->deopt_id());
flow_graph->AppendTo(
cursor, *last,
call->deopt_id() != Thread::kNoDeoptId ? call->env() : NULL,
@@ -3001,6 +3009,7 @@ static bool InlineSimdShuffleMixMethod(FlowGraph* flow_graph,
static bool InlineInt32x4Method(FlowGraph* flow_graph,
Instruction* call,
+ Definition* receiver,
MethodRecognizer::Kind kind,
TargetEntryInstr** entry,
Definition** last) {
@@ -3016,17 +3025,17 @@ static bool InlineInt32x4Method(FlowGraph* flow_graph,
case MethodRecognizer::kInt32x4GetFlagY:
case MethodRecognizer::kInt32x4GetFlagZ:
case MethodRecognizer::kInt32x4GetFlagW: {
- *last = new (Z) Int32x4GetFlagInstr(
- kind, new (Z) Value(call->ArgumentAt(0)), call->deopt_id());
+ *last = new (Z)
+ Int32x4GetFlagInstr(kind, new (Z) Value(receiver), call->deopt_id());
break;
}
case MethodRecognizer::kInt32x4GetSignMask: {
- *last = new (Z) Simd32x4GetSignMaskInstr(
- kind, new (Z) Value(call->ArgumentAt(0)), call->deopt_id());
+ *last = new (Z) Simd32x4GetSignMaskInstr(kind, new (Z) Value(receiver),
+ call->deopt_id());
break;
}
case MethodRecognizer::kInt32x4Select: {
- Definition* mask = call->ArgumentAt(0);
+ Definition* mask = receiver;
Definition* trueValue = call->ArgumentAt(1);
Definition* falseValue = call->ArgumentAt(2);
*last = new (Z)
@@ -3038,9 +3047,9 @@ static bool InlineInt32x4Method(FlowGraph* flow_graph,
case MethodRecognizer::kInt32x4WithFlagY:
case MethodRecognizer::kInt32x4WithFlagZ:
case MethodRecognizer::kInt32x4WithFlagW: {
- *last = new (Z) Int32x4SetFlagInstr(
- kind, new (Z) Value(call->ArgumentAt(0)),
- new (Z) Value(call->ArgumentAt(1)), call->deopt_id());
+ *last = new (Z) Int32x4SetFlagInstr(kind, new (Z) Value(receiver),
+ new (Z) Value(call->ArgumentAt(1)),
+ call->deopt_id());
break;
}
default:
@@ -3056,6 +3065,7 @@ static bool InlineInt32x4Method(FlowGraph* flow_graph,
static bool InlineFloat64x2Method(FlowGraph* flow_graph,
Instruction* call,
+ Definition* receiver,
MethodRecognizer::Kind kind,
TargetEntryInstr** entry,
Definition** last) {
@@ -3069,18 +3079,17 @@ static bool InlineFloat64x2Method(FlowGraph* flow_graph,
switch (kind) {
case MethodRecognizer::kFloat64x2GetX:
case MethodRecognizer::kFloat64x2GetY: {
- *last =
- new (Z) Simd64x2ShuffleInstr(kind, new (Z) Value(call->ArgumentAt(0)),
- 0, // mask is ignored.
- call->deopt_id());
+ *last = new (Z) Simd64x2ShuffleInstr(kind, new (Z) Value(receiver),
+ 0, // mask is ignored.
+ call->deopt_id());
break;
}
case MethodRecognizer::kFloat64x2Negate:
case MethodRecognizer::kFloat64x2Abs:
case MethodRecognizer::kFloat64x2Sqrt:
case MethodRecognizer::kFloat64x2GetSignMask: {
- *last = new (Z) Float64x2ZeroArgInstr(
- kind, new (Z) Value(call->ArgumentAt(0)), call->deopt_id());
+ *last = new (Z) Float64x2ZeroArgInstr(kind, new (Z) Value(receiver),
+ call->deopt_id());
break;
}
case MethodRecognizer::kFloat64x2Scale:
@@ -3088,7 +3097,7 @@ static bool InlineFloat64x2Method(FlowGraph* flow_graph,
case MethodRecognizer::kFloat64x2WithY:
case MethodRecognizer::kFloat64x2Min:
case MethodRecognizer::kFloat64x2Max: {
- Definition* left = call->ArgumentAt(0);
+ Definition* left = receiver;
Definition* right = call->ArgumentAt(1);
*last = new (Z) Float64x2OneArgInstr(
kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
@@ -3433,36 +3442,40 @@ bool FlowGraphInliner::TryInlineRecognizedMethod(FlowGraph* flow_graph,
case MethodRecognizer::kTwoByteStringCodeUnitAt:
case MethodRecognizer::kExternalOneByteStringCodeUnitAt:
case MethodRecognizer::kExternalTwoByteStringCodeUnitAt:
- return InlineStringCodeUnitAt(flow_graph, call, receiver_cid, entry,
- last);
+ return InlineStringCodeUnitAt(flow_graph, call, receiver, receiver_cid,
+ entry, last);
case MethodRecognizer::kStringBaseCharAt:
- return InlineStringBaseCharAt(flow_graph, call, receiver_cid, entry,
- last);
+ return InlineStringBaseCharAt(flow_graph, call, receiver, receiver_cid,
+ entry, last);
case MethodRecognizer::kDoubleAdd:
- return InlineDoubleOp(flow_graph, Token::kADD, call, entry, last);
+ return InlineDoubleOp(flow_graph, Token::kADD, call, receiver, entry,
+ last);
case MethodRecognizer::kDoubleSub:
- return InlineDoubleOp(flow_graph, Token::kSUB, call, entry, last);
+ return InlineDoubleOp(flow_graph, Token::kSUB, call, receiver, entry,
+ last);
case MethodRecognizer::kDoubleMul:
- return InlineDoubleOp(flow_graph, Token::kMUL, call, entry, last);
+ return InlineDoubleOp(flow_graph, Token::kMUL, call, receiver, entry,
+ last);
case MethodRecognizer::kDoubleDiv:
- return InlineDoubleOp(flow_graph, Token::kDIV, call, entry, last);
+ return InlineDoubleOp(flow_graph, Token::kDIV, call, receiver, entry,
+ last);
case MethodRecognizer::kDouble_getIsNaN:
case MethodRecognizer::kDouble_getIsInfinite:
- return InlineDoubleTestOp(flow_graph, call, kind, entry, last);
+ return InlineDoubleTestOp(flow_graph, call, receiver, kind, entry, last);
case MethodRecognizer::kGrowableArraySetData:
ASSERT(receiver_cid == kGrowableObjectArrayCid);
ASSERT(ic_data.NumberOfChecks() == 1);
- return InlineGrowableArraySetter(flow_graph,
- GrowableObjectArray::data_offset(),
- kEmitStoreBarrier, call, entry, last);
+ return InlineGrowableArraySetter(
+ flow_graph, GrowableObjectArray::data_offset(), kEmitStoreBarrier,
+ call, receiver, entry, last);
case MethodRecognizer::kGrowableArraySetLength:
ASSERT(receiver_cid == kGrowableObjectArrayCid);
ASSERT(ic_data.NumberOfChecks() == 1);
- return InlineGrowableArraySetter(flow_graph,
- GrowableObjectArray::length_offset(),
- kNoStoreBarrier, call, entry, last);
+ return InlineGrowableArraySetter(
+ flow_graph, GrowableObjectArray::length_offset(), kNoStoreBarrier,
+ call, receiver, entry, last);
case MethodRecognizer::kSmi_bitAndFromSmi:
- return InlineSmiBitAndFromSmi(flow_graph, call, entry, last);
+ return InlineSmiBitAndFromSmi(flow_graph, call, receiver, entry, last);
case MethodRecognizer::kFloat32x4ShuffleX:
case MethodRecognizer::kFloat32x4ShuffleY:
@@ -3488,15 +3501,18 @@ bool FlowGraphInliner::TryInlineRecognizedMethod(FlowGraph* flow_graph,
case MethodRecognizer::kFloat32x4Absolute:
case MethodRecognizer::kFloat32x4Negate:
case MethodRecognizer::kFloat32x4Clamp:
- return InlineFloat32x4Method(flow_graph, call, kind, entry, last);
+ return InlineFloat32x4Method(flow_graph, call, receiver, kind, entry,
+ last);
case MethodRecognizer::kFloat32x4ShuffleMix:
case MethodRecognizer::kInt32x4ShuffleMix:
- return InlineSimdShuffleMixMethod(flow_graph, call, kind, entry, last);
+ return InlineSimdShuffleMixMethod(flow_graph, call, receiver, kind, entry,
+ last);
case MethodRecognizer::kFloat32x4Shuffle:
case MethodRecognizer::kInt32x4Shuffle:
- return InlineSimdShuffleMethod(flow_graph, call, kind, entry, last);
+ return InlineSimdShuffleMethod(flow_graph, call, receiver, kind, entry,
+ last);
case MethodRecognizer::kInt32x4GetFlagX:
case MethodRecognizer::kInt32x4GetFlagY:
@@ -3508,7 +3524,7 @@ bool FlowGraphInliner::TryInlineRecognizedMethod(FlowGraph* flow_graph,
case MethodRecognizer::kInt32x4WithFlagY:
case MethodRecognizer::kInt32x4WithFlagZ:
case MethodRecognizer::kInt32x4WithFlagW:
- return InlineInt32x4Method(flow_graph, call, kind, entry, last);
+ return InlineInt32x4Method(flow_graph, call, receiver, kind, entry, last);
case MethodRecognizer::kFloat64x2GetX:
case MethodRecognizer::kFloat64x2GetY:
@@ -3521,7 +3537,8 @@ bool FlowGraphInliner::TryInlineRecognizedMethod(FlowGraph* flow_graph,
case MethodRecognizer::kFloat64x2WithY:
case MethodRecognizer::kFloat64x2Min:
case MethodRecognizer::kFloat64x2Max:
- return InlineFloat64x2Method(flow_graph, call, kind, entry, last);
+ return InlineFloat64x2Method(flow_graph, call, receiver, kind, entry,
+ last);
case MethodRecognizer::kFloat32x4Zero:
case MethodRecognizer::kFloat32x4Splat:
« no previous file with comments | « runtime/vm/flow_graph.cc ('k') | runtime/vm/flow_graph_type_propagator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698