summaryrefslogtreecommitdiff
path: root/compiler/optimizing/loop_optimization.cc
diff options
context:
space:
mode:
authorGeorgia Kouveli <georgia.kouveli@linaro.org>2019-01-31 16:12:16 +0000
committerTreehugger Robot <treehugger-gerrit@google.com>2019-08-13 00:43:36 +0000
commitbac080b0beec961671a7753c88780d8bf700fa40 (patch)
tree101965980dec12c1355077dd9699822211b265e4 /compiler/optimizing/loop_optimization.cc
parent44b977d9e2974cdbd8ef11f35919166dada92bda (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.cc7
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,