diff options
author | Aart Bik <ajcbik@google.com> | 2017-06-05 14:05:09 -0700 |
---|---|---|
committer | Aart Bik <ajcbik@google.com> | 2017-06-05 14:05:09 -0700 |
commit | 6e92fb33dea9846ad03bd538d02d055fa96f5240 (patch) | |
tree | 91c359d459a99f2c7f847c2e4d73a28a681612f7 /compiler/optimizing/loop_optimization.cc | |
parent | 81c769436a89b25c781eb2da882f11fd8d11f84d (diff) |
Pass through inputs beyond arguments in invoke.
Rationale:
Refinement requested by vmarko.
Test: test-art-host
Change-Id: I850466ebd5ad99bb617bc71c279159862e18e6ec
Diffstat (limited to 'compiler/optimizing/loop_optimization.cc')
-rw-r--r-- | compiler/optimizing/loop_optimization.cc | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/compiler/optimizing/loop_optimization.cc b/compiler/optimizing/loop_optimization.cc index ae102f7fc5..c3aa976d49 100644 --- a/compiler/optimizing/loop_optimization.cc +++ b/compiler/optimizing/loop_optimization.cc @@ -1302,9 +1302,10 @@ void HLoopOptimization::GenerateVecOp(HInstruction* org, // corresponding new scalar instructions in the loop. The instruction will get an // environment while being inserted from the instruction map in original program order. DCHECK(vector_mode_ == kSequential); + size_t num_args = invoke->GetNumberOfArguments(); HInvokeStaticOrDirect* new_invoke = new (global_allocator_) HInvokeStaticOrDirect( global_allocator_, - invoke->GetNumberOfArguments(), + num_args, invoke->GetType(), invoke->GetDexPc(), invoke->GetDexMethodIndex(), @@ -1314,8 +1315,14 @@ void HLoopOptimization::GenerateVecOp(HInstruction* org, invoke->GetTargetMethod(), invoke->GetClinitCheckRequirement()); HInputsRef inputs = invoke->GetInputs(); - for (size_t index = 0; index < inputs.size(); ++index) { - new_invoke->SetArgumentAt(index, vector_map_->Get(inputs[index])); + size_t num_inputs = inputs.size(); + DCHECK_LE(num_args, num_inputs); + DCHECK_EQ(num_inputs, new_invoke->GetInputs().size()); // both invokes agree + for (size_t index = 0; index < num_inputs; ++index) { + HInstruction* new_input = index < num_args + ? vector_map_->Get(inputs[index]) + : inputs[index]; // beyond arguments: just pass through + new_invoke->SetArgumentAt(index, new_input); } new_invoke->SetIntrinsic(invoke->GetIntrinsic(), kNeedsEnvironmentOrCache, |