[llvm] r237269 - [NaryReassociate] avoid running forever
Jingyue Wu
jingyue at google.com
Wed May 13 11:12:25 PDT 2015
Author: jingyue
Date: Wed May 13 13:12:24 2015
New Revision: 237269
URL: http://llvm.org/viewvc/llvm-project?rev=237269&view=rev
Log:
[NaryReassociate] avoid running forever
Avoid running forever by checking we are not reassociating an expression into
the same form.
Tested with @avoid_infinite_loops in nary-add.ll
Modified:
llvm/trunk/lib/Transforms/Scalar/NaryReassociate.cpp
llvm/trunk/test/Transforms/NaryReassociate/nary-add.ll
Modified: llvm/trunk/lib/Transforms/Scalar/NaryReassociate.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/NaryReassociate.cpp?rev=237269&r1=237268&r2=237269&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/NaryReassociate.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/NaryReassociate.cpp Wed May 13 13:12:24 2015
@@ -217,10 +217,14 @@ Instruction *NaryReassociate::tryReassoc
// = (A + RHS) + B or (B + RHS) + A
const SCEV *AExpr = SE->getSCEV(A), *BExpr = SE->getSCEV(B);
const SCEV *RHSExpr = SE->getSCEV(RHS);
- if (auto *NewI = tryReassociatedAdd(SE->getAddExpr(AExpr, RHSExpr), B, I))
- return NewI;
- if (auto *NewI = tryReassociatedAdd(SE->getAddExpr(BExpr, RHSExpr), A, I))
- return NewI;
+ if (BExpr != RHSExpr) {
+ if (auto *NewI = tryReassociatedAdd(SE->getAddExpr(AExpr, RHSExpr), B, I))
+ return NewI;
+ }
+ if (AExpr != RHSExpr) {
+ if (auto *NewI = tryReassociatedAdd(SE->getAddExpr(BExpr, RHSExpr), A, I))
+ return NewI;
+ }
}
return nullptr;
}
Modified: llvm/trunk/test/Transforms/NaryReassociate/nary-add.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/NaryReassociate/nary-add.ll?rev=237269&r1=237268&r2=237269&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/NaryReassociate/nary-add.ll (original)
+++ llvm/trunk/test/Transforms/NaryReassociate/nary-add.ll Wed May 13 13:12:24 2015
@@ -196,3 +196,14 @@ define void @iterative(i32 %a, i32 %b, i
ret void
}
+
+define void @avoid_infinite_loop(i32 %a, i32 %b) {
+; CHECK-LABEL: @avoid_infinite_loop
+ %ab = add i32 %a, %b
+; CHECK-NEXT: %ab
+ %ab2 = add i32 %ab, %b
+; CHECK-NEXT: %ab2
+ call void @foo(i32 %ab2)
+; CHECK-NEXT: @foo(i32 %ab2)
+ ret void
+}
More information about the llvm-commits
mailing list