diff options
Diffstat (limited to 'compiler/optimizing/loop_optimization.cc')
-rw-r--r-- | compiler/optimizing/loop_optimization.cc | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/compiler/optimizing/loop_optimization.cc b/compiler/optimizing/loop_optimization.cc index 1a79601a93..cf7acb36d1 100644 --- a/compiler/optimizing/loop_optimization.cc +++ b/compiler/optimizing/loop_optimization.cc @@ -580,7 +580,7 @@ bool HLoopOptimization::VectorizeDef(LoopNode* node, HInstruction* offset = nullptr; if (TrySetVectorType(type, &restrictions) && node->loop_info->IsDefinedOutOfTheLoop(base) && - induction_range_.IsUnitStride(index, &offset) && + induction_range_.IsUnitStride(instruction, index, &offset) && VectorizeUse(node, value, generate_code, type, restrictions)) { if (generate_code) { GenerateVecSub(index, offset); @@ -623,6 +623,12 @@ bool HLoopOptimization::VectorizeUse(LoopNode* node, } return true; } else if (instruction->IsArrayGet()) { + // Strings are different, with a different offset to the actual data + // and some compressed to save memory. For now, all cases are rejected + // to avoid the complexity. + if (instruction->AsArrayGet()->IsStringCharAt()) { + return false; + } // Accept a right-hand-side array base[index] for // (1) exact matching vector type, // (2) loop-invariant base, @@ -633,7 +639,7 @@ bool HLoopOptimization::VectorizeUse(LoopNode* node, HInstruction* offset = nullptr; if (type == instruction->GetType() && node->loop_info->IsDefinedOutOfTheLoop(base) && - induction_range_.IsUnitStride(index, &offset)) { + induction_range_.IsUnitStride(instruction, index, &offset)) { if (generate_code) { GenerateVecSub(index, offset); GenerateVecMem(instruction, vector_map_->Get(index), nullptr, type); @@ -1011,6 +1017,10 @@ void HLoopOptimization::GenerateVecOp(HInstruction* org, for (size_t index = 0; index < inputs.size(); ++index) { new_invoke->SetArgumentAt(index, vector_map_->Get(inputs[index])); } + new_invoke->SetIntrinsic(invoke->GetIntrinsic(), + kNeedsEnvironmentOrCache, + kNoSideEffects, + kNoThrow); vector = new_invoke; } break; |