`LCSSASafePhiForRAUW` as computed was incorrect -- in cases like
these (this exact example does not actually trigger the bug):
define i32 @f(i32 %n, i1* %c) {
entry:
br label %outer.loop
outer.loop:
br label %inner.loop
inner.loop:
%iv = phi i32 [ 0, %outer.loop ], [ %iv.inc, %inner.loop ]
%iv.inc = add nuw nsw i32 %iv, 1
%tc = udiv i32 %n, 13
%be.cond = icmp ult i32 %iv, %tc
br i1 %be.cond, label %inner.loop, label %inner.exit
inner.exit:
%iv.lcssa = phi i32 [ %iv, %inner.loop ]
%outer.be.cond = load volatile i1, i1* %c
br i1 %outer.be.cond, label %outer.loop, label %leave
leave:
%iv.lcssa.lcssa = phi i32 [ %iv.lcssa, %inner.exit ]
ret i32 %iv.lcssa.lcssa
}
`LCSSASafePhiForRAUW` is true for `%iv.lcssa` when re-rewriting the exit
value of `%iv` for `%inner.loop` to `%tc` (this can happen due to
`SCEVExpander::findExistingExpansion`), but the RAUW breaks LCSSA.
To fix this, instead of computing `SafePhi` with special logic, decide
the safety of RAUW directly via `replacementPreservesLCSSAForm`.
llvm-svn: 258016
32 lines
1.2 KiB
LLVM
32 lines
1.2 KiB
LLVM
; RUN: opt -S -indvars < %s | FileCheck %s
|
|
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-unknown-linux-gnu"
|
|
|
|
define void @fn1() {
|
|
; CHECK-LABEL: @fn1(
|
|
entry:
|
|
br label %for.cond.loopexit
|
|
|
|
for.cond.loopexit: ; preds = %for.inc7, %for.cond.loopexit, %entry
|
|
%c.1.lcssa = phi i32 [ %inc8, %for.inc7 ], [ 0, %for.cond.loopexit ], [ 0, %entry ]
|
|
br i1 undef, label %for.cond.loopexit, label %for.cond4.preheader
|
|
|
|
for.cond4.preheader: ; preds = %for.inc7, %for.cond.loopexit
|
|
%c.17 = phi i32 [ %inc8, %for.inc7 ], [ 0, %for.cond.loopexit ]
|
|
br label %for.body6
|
|
|
|
for.body6: ; preds = %for.body6, %for.cond4.preheader
|
|
%inc14 = phi i32 [ 0, %for.cond4.preheader ], [ %inc, %for.body6 ]
|
|
%idxprom = zext i32 %inc14 to i64
|
|
%inc = add i32 %inc14, 1
|
|
%cmp5 = icmp ult i32 %inc, 2
|
|
br i1 %cmp5, label %for.body6, label %for.inc7
|
|
|
|
for.inc7: ; preds = %for.body6
|
|
%inc.lcssa = phi i32 [ %inc, %for.body6 ]
|
|
%inc8 = add i32 %c.17, 1
|
|
%cmp = icmp ult i32 %inc8, %inc.lcssa
|
|
br i1 %cmp, label %for.cond4.preheader, label %for.cond.loopexit
|
|
}
|