From 12b5fa5f6e42eb8849d8b3bc7b1dbe676a6d8326 Mon Sep 17 00:00:00 2001 From: Jingyue Wu Date: Wed, 13 May 2015 18:12:24 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237269 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/NaryReassociate.cpp | 12 ++++++++---- test/Transforms/NaryReassociate/nary-add.ll | 11 +++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/Transforms/Scalar/NaryReassociate.cpp b/lib/Transforms/Scalar/NaryReassociate.cpp index 7d3080dcd9b..af61068c97b 100644 --- a/lib/Transforms/Scalar/NaryReassociate.cpp +++ b/lib/Transforms/Scalar/NaryReassociate.cpp @@ -217,10 +217,14 @@ Instruction *NaryReassociate::tryReassociateAdd(Value *LHS, Value *RHS, // = (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; } diff --git a/test/Transforms/NaryReassociate/nary-add.ll b/test/Transforms/NaryReassociate/nary-add.ll index 39d7c59ef9d..b3093ff6ecd 100644 --- a/test/Transforms/NaryReassociate/nary-add.ll +++ b/test/Transforms/NaryReassociate/nary-add.ll @@ -196,3 +196,14 @@ define void @iterative(i32 %a, i32 %b, i32 %c) { 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 +}