diff options
| author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2015-10-07 17:38:31 +0000 |
|---|---|---|
| committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2015-10-07 17:38:31 +0000 |
| commit | 0015e5a088b851dfd2405f05eb4c512f8089fc20 (patch) | |
| tree | 7bff8bc54fa5687139a4ffd0795d67bc757dc349 /llvm | |
| parent | 4493b4000237688fb32225450ee4d400fba2d643 (diff) | |
| download | bcm5719-llvm-0015e5a088b851dfd2405f05eb4c512f8089fc20.tar.gz bcm5719-llvm-0015e5a088b851dfd2405f05eb4c512f8089fc20.zip | |
[IndVars] Preserve LCSSA in `eliminateIdentitySCEV`
Summary:
After r249211, SCEV can see through some LCSSA phis. Add a
`replacementPreservesLCSSAForm` check before replacing uses of these phi
nodes with a simplified use of the induction variable to avoid breaking
LCSSA.
Fixes 25047.
Depends on D13460.
Reviewers: atrick, hfinkel
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D13461
llvm-svn: 249575
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyIndVar.cpp | 3 | ||||
| -rw-r--r-- | llvm/test/Transforms/IndVarSimplify/pr25047.ll | 49 |
2 files changed, 52 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp b/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp index c7ec1bc263d..58715fa4bef 100644 --- a/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp @@ -333,6 +333,9 @@ bool SimplifyIndvar::eliminateIdentitySCEV(Instruction *UseInst, if (!DT || !DT->dominates(IVOperand, UseInst)) return false; + if (!LI->replacementPreservesLCSSAForm(UseInst, IVOperand)) + return false; + DEBUG(dbgs() << "INDVARS: Eliminated identity: " << *UseInst << '\n'); UseInst->replaceAllUsesWith(IVOperand); diff --git a/llvm/test/Transforms/IndVarSimplify/pr25047.ll b/llvm/test/Transforms/IndVarSimplify/pr25047.ll new file mode 100644 index 00000000000..dc39a78c7eb --- /dev/null +++ b/llvm/test/Transforms/IndVarSimplify/pr25047.ll @@ -0,0 +1,49 @@ +; RUN: opt -indvars -S < %s | FileCheck %s + +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.11.0" + +define void @fn1(i1 %c0, i1 %c1) { +; CHECK-LABEL: @fn1( +entry: + br i1 %c0, label %for.end.34, label %for.cond.1thread-pre-split + +for.cond.loopexit: ; preds = %for.end.29, %for.end.7 + %f.lcssa = phi i32 [ %f.1, %for.end.29 ], [ %f.1, %for.end.7 ] + br i1 %c1, label %for.end.34, label %for.cond.1thread-pre-split + +for.cond.1thread-pre-split: ; preds = %for.cond.loopexit, %entry + %f.047 = phi i32 [ %f.lcssa, %for.cond.loopexit ], [ 0, %entry ] + br label %for.cond.1 + +for.cond.1: ; preds = %for.cond.1, %for.cond.1thread-pre-split + br i1 %c1, label %for.cond.4, label %for.cond.1 + +for.cond.4: ; preds = %for.end.29, %for.cond.1 + %f.1 = phi i32 [ 0, %for.end.29 ], [ %f.047, %for.cond.1 ] + br label %for.cond.5 + +for.cond.5: ; preds = %for.cond.5, %for.cond.4 + %h.0 = phi i32 [ 0, %for.cond.4 ], [ %inc, %for.cond.5 ] + %cmp = icmp slt i32 %h.0, 1 + %inc = add nsw i32 %h.0, 1 + br i1 %cmp, label %for.cond.5, label %for.end.7 + +for.end.7: ; preds = %for.cond.5 + %g.lcssa = phi i32 [ %h.0, %for.cond.5 ] + %tobool10 = icmp eq i32 %g.lcssa, 0 + br i1 %tobool10, label %for.end.8, label %for.cond.loopexit + +for.end.8: ; preds = %for.end.7 + br i1 %c1, label %for.cond.19, label %for.end.29 + +for.cond.19: ; preds = %for.cond.19, %for.end.8 + br label %for.cond.19 + +for.end.29: ; preds = %for.end.8 + %tobool30 = icmp eq i32 %f.1, 0 + br i1 %tobool30, label %for.cond.4, label %for.cond.loopexit + +for.end.34: ; preds = %for.cond.loopexit, %entry + ret void +} |

