HomePhabricator

[IndVars] Fix PR25576

Authored by sanjoy on Jan 17 2016, 10:12 AM.

Description

[IndVars] Fix PR25576

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

Details

Committed
sanjoyJan 17 2016, 10:12 AM
Parents
rG7a8a705c9d45: [IndVars] Use emplace_back; NFC
Branches
Unknown
Tags
Unknown