[indvars] Fix PR10946: SCEV cannot handle Vector IVs.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140026 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Andrew Trick 2011-09-19 17:54:39 +00:00
parent 9883acd2a6
commit 24f48ece52
2 changed files with 22 additions and 0 deletions

View File

@ -85,6 +85,8 @@ namespace {
/// foldIVUser - Fold an IV operand into its use. This removes increments of an
/// aligned IV when used by a instruction that ignores the low bits.
///
/// IVOperand is guaranteed SCEVable, but UseInst may not be.
///
/// Return the operand of IVOperand for this induction variable if IVOperand can
/// be folded (in case more folding opportunities have been exposed).
/// Otherwise return null.
@ -241,6 +243,7 @@ void SimplifyIndvar::eliminateIVRemainder(BinaryOperator *Rem,
/// eliminateIVUser - Eliminate an operation that consumes a simple IV and has
/// no observable side-effect given the range of IV values.
/// IVOperand is guaranteed SCEVable, but UseInst may not be.
bool SimplifyIndvar::eliminateIVUser(Instruction *UseInst,
Instruction *IVOperand) {
if (ICmpInst *ICmp = dyn_cast<ICmpInst>(UseInst)) {
@ -324,6 +327,9 @@ static bool isSimpleIVUser(Instruction *I, const Loop *L, ScalarEvolution *SE) {
/// Once DisableIVRewrite is default, LSR will be the only client of IVUsers.
///
void SimplifyIndvar::simplifyUsers(PHINode *CurrIV, IVVisitor *V) {
if (!SE->isSCEVable(CurrIV->getType()))
return;
// Instructions processed by SimplifyIndvar for CurrIV.
SmallPtrSet<Instruction*,16> Simplified;

View File

@ -0,0 +1,16 @@
; RUN: opt < %s -indvars -S | FileCheck %s
; PR10946: Vector IVs are not SCEVable.
; CHECK-NOT: phi
define void @test() nounwind {
allocas:
br i1 undef, label %cif_done, label %for_loop398
cif_done: ; preds = %allocas
ret void
for_loop398: ; preds = %for_loop398, %allocas
%storemerge35 = phi <4 x i32> [ %storemerge, %for_loop398 ], [ undef, %allocas ]
%bincmp431 = icmp sge <4 x i32> %storemerge35, <i32 5, i32 5, i32 5, i32 5>
%storemerge = bitcast <4 x float> undef to <4 x i32>
br label %for_loop398
}