Subzero. ARM32. Fixes infinite loop during address mode formation.
BUG= https://bugs.chromium.org/p/nativeclient/issues/detail?id=4076
R=kschimpf@google.com, sehr@chromium.org, stichnot@chromium.org
Review URL: https://codereview.chromium.org/1609753002 .
diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp
index 02097ed..0626902 100644
--- a/src/IceTargetLoweringARM32.cpp
+++ b/src/IceTargetLoweringARM32.cpp
@@ -4849,10 +4849,12 @@
return false;
Operand *SrcOp = VarAssign->getSrc(0);
+ bool Optimized = false;
if (auto *SrcVar = llvm::dyn_cast<Variable>(SrcOp)) {
if (!VMetadata->isMultiDef(SrcVar) ||
// TODO: ensure SrcVar stays single-BB
false) {
+ Optimized = true;
*Var = SrcVar;
} else if (auto *Const = llvm::dyn_cast<ConstantInteger32>(SrcOp)) {
int32_t MoreOffset = Const->getValue();
@@ -4861,13 +4863,15 @@
return false;
*Var = nullptr;
*Offset += NewOffset;
+ Optimized = true;
}
-
- *Reason = VarAssign;
- return true;
}
- return false;
+ if (Optimized) {
+ *Reason = VarAssign;
+ }
+
+ return Optimized;
}
bool isAddOrSub(const Inst *Inst, InstArithmetic::OpKind *Kind) {