diff options
author | Georgia Kouveli <georgia.kouveli@linaro.org> | 2019-01-31 16:12:16 +0000 |
---|---|---|
committer | Treehugger Robot <treehugger-gerrit@google.com> | 2019-08-13 00:43:36 +0000 |
commit | bac080b0beec961671a7753c88780d8bf700fa40 (patch) | |
tree | 101965980dec12c1355077dd9699822211b265e4 /compiler/optimizing/loop_optimization.cc | |
parent | 44b977d9e2974cdbd8ef11f35919166dada92bda (diff) |
Loop vectorizer should not remove instructions that can throw
Instructions that are not used outside of the inner loop were
inadvertently being removed. Make sure this does not happen.
Original author: Georgia Kouveli <georgia.kouveli@linaro.org>
Committed by: David Horstmann <david.horstmann@linaro.org>
Test: 1961-checker-loop-vectorizer
Test: test-art-target
Change-Id: I3af9e861e75669457e5925dd1d655db784a55287
Diffstat (limited to 'compiler/optimizing/loop_optimization.cc')
-rw-r--r-- | compiler/optimizing/loop_optimization.cc | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/compiler/optimizing/loop_optimization.cc b/compiler/optimizing/loop_optimization.cc index 3e1c42c8d9..9c4e9d25f7 100644 --- a/compiler/optimizing/loop_optimization.cc +++ b/compiler/optimizing/loop_optimization.cc @@ -1283,6 +1283,10 @@ bool HLoopOptimization::VectorizeDef(LoopNode* node, // (3) unit stride index, // (4) vectorizable right-hand-side value. uint64_t restrictions = kNone; + // Don't accept expressions that can throw. + if (instruction->CanThrow()) { + return false; + } if (instruction->IsArraySet()) { DataType::Type type = instruction->AsArraySet()->GetComponentType(); HInstruction* base = instruction->InputAt(0); @@ -1334,7 +1338,8 @@ bool HLoopOptimization::VectorizeDef(LoopNode* node, } // Otherwise accept only expressions with no effects outside the immediate loop-body. // Note that actual uses are inspected during right-hand-side tree traversal. - return !IsUsedOutsideLoop(node->loop_info, instruction) && !instruction->DoesAnyWrite(); + return !IsUsedOutsideLoop(node->loop_info, instruction) + && !instruction->DoesAnyWrite(); } bool HLoopOptimization::VectorizeUse(LoopNode* node, |