Commit 6f534717 by John Porto

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 .
parent 0c68bef8
...@@ -4849,10 +4849,12 @@ bool matchAssign(const VariablesMetadata *VMetadata, Variable **Var, ...@@ -4849,10 +4849,12 @@ bool matchAssign(const VariablesMetadata *VMetadata, Variable **Var,
return false; return false;
Operand *SrcOp = VarAssign->getSrc(0); Operand *SrcOp = VarAssign->getSrc(0);
bool Optimized = false;
if (auto *SrcVar = llvm::dyn_cast<Variable>(SrcOp)) { if (auto *SrcVar = llvm::dyn_cast<Variable>(SrcOp)) {
if (!VMetadata->isMultiDef(SrcVar) || if (!VMetadata->isMultiDef(SrcVar) ||
// TODO: ensure SrcVar stays single-BB // TODO: ensure SrcVar stays single-BB
false) { false) {
Optimized = true;
*Var = SrcVar; *Var = SrcVar;
} else if (auto *Const = llvm::dyn_cast<ConstantInteger32>(SrcOp)) { } else if (auto *Const = llvm::dyn_cast<ConstantInteger32>(SrcOp)) {
int32_t MoreOffset = Const->getValue(); int32_t MoreOffset = Const->getValue();
...@@ -4861,13 +4863,15 @@ bool matchAssign(const VariablesMetadata *VMetadata, Variable **Var, ...@@ -4861,13 +4863,15 @@ bool matchAssign(const VariablesMetadata *VMetadata, Variable **Var,
return false; return false;
*Var = nullptr; *Var = nullptr;
*Offset += NewOffset; *Offset += NewOffset;
Optimized = true;
} }
}
if (Optimized) {
*Reason = VarAssign; *Reason = VarAssign;
return true;
} }
return false; return Optimized;
} }
bool isAddOrSub(const Inst *Inst, InstArithmetic::OpKind *Kind) { bool isAddOrSub(const Inst *Inst, InstArithmetic::OpKind *Kind) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment