[llvm-commits] [llvm] r140026 - in /llvm/trunk: lib/Transforms/Utils/SimplifyIndVar.cpp test/Transforms/IndVarSimplify/2011-09-19-vectoriv.ll

Andrew Trick atrick at apple.com
Mon Sep 19 10:54:40 PDT 2011


Author: atrick
Date: Mon Sep 19 12:54:39 2011
New Revision: 140026

URL: http://llvm.org/viewvc/llvm-project?rev=140026&view=rev
Log:
[indvars] Fix PR10946: SCEV cannot handle Vector IVs.

Added:
    llvm/trunk/test/Transforms/IndVarSimplify/2011-09-19-vectoriv.ll
Modified:
    llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp

Modified: llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp?rev=140026&r1=140025&r2=140026&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp Mon Sep 19 12:54:39 2011
@@ -85,6 +85,8 @@
 /// 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 @@
 
 /// 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 @@
 /// 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;
 

Added: llvm/trunk/test/Transforms/IndVarSimplify/2011-09-19-vectoriv.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IndVarSimplify/2011-09-19-vectoriv.ll?rev=140026&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/IndVarSimplify/2011-09-19-vectoriv.ll (added)
+++ llvm/trunk/test/Transforms/IndVarSimplify/2011-09-19-vectoriv.ll Mon Sep 19 12:54:39 2011
@@ -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
+}





More information about the llvm-commits mailing list