Fix normalization and de-normalization of non-affine SCEVs.
authorDan Gohman <gohman@apple.com>
Fri, 4 Jun 2010 19:16:34 +0000 (19:16 +0000)
committerDan Gohman <gohman@apple.com>
Fri, 4 Jun 2010 19:16:34 +0000 (19:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@105480 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ScalarEvolutionNormalization.cpp
test/CodeGen/X86/lsr-nonaffine.ll [new file with mode: 0644]

index 75c381d5efabbde2d36ff5ac47e1b04eccd64f11..563fd2fa96e2e43fdf64bcbf1510bea9212273ae 100644 (file)
@@ -105,22 +105,25 @@ const SCEV *llvm::TransformForPostIncUse(TransformKind Kind,
       case NormalizeAutodetect:
         if (Instruction *OI = dyn_cast<Instruction>(OperandValToReplace))
           if (IVUseShouldUsePostIncValue(User, OI, L, &DT)) {
-            Result = SE.getMinusSCEV(Result, AR->getStepRecurrence(SE));
+            const SCEV *TransformedStep =
+              TransformForPostIncUse(Kind, AR->getStepRecurrence(SE),
+                                     User, OperandValToReplace, Loops, SE, DT);
+            Result = SE.getMinusSCEV(Result, TransformedStep);
             Loops.insert(L);
           }
         break;
       case Normalize:
-        if (Loops.count(L))
-          Result = SE.getMinusSCEV(Result, AR->getStepRecurrence(SE));
-        break;
-      case Denormalize:
         if (Loops.count(L)) {
           const SCEV *TransformedStep =
             TransformForPostIncUse(Kind, AR->getStepRecurrence(SE),
                                    User, OperandValToReplace, Loops, SE, DT);
-          Result = SE.getAddExpr(Result, TransformedStep);
+          Result = SE.getMinusSCEV(Result, TransformedStep);
         }
         break;
+      case Denormalize:
+        if (Loops.count(L))
+          Result = SE.getAddExpr(Result, AR->getStepRecurrence(SE));
+        break;
       }
       return Result;
     }
diff --git a/test/CodeGen/X86/lsr-nonaffine.ll b/test/CodeGen/X86/lsr-nonaffine.ll
new file mode 100644 (file)
index 0000000..b0d3064
--- /dev/null
@@ -0,0 +1,23 @@
+; RUN: llc -march=x86-64 < %s | FileCheck %s
+
+; LSR should compute the correct starting values for this loop. Note that
+; it's not necessarily LSR's job to compute loop exit expressions; that's
+; indvars' job.
+; CHECK: movl  $12
+; CHECK: movl  $42
+
+define i32 @real_symmetric_eigen(i32 %n) nounwind {
+while.body127:                                    ; preds = %while.cond122
+  br label %while.cond141
+
+while.cond141:                                    ; preds = %while.cond141, %while.body127
+  %0 = phi i32 [ 7, %while.body127 ], [ %indvar.next67, %while.cond141 ] ; <i32> [#uses=3]
+  %indvar.next67 = add i32 %0, 1                  ; <i32> [#uses=1]
+  %t = icmp slt i32 %indvar.next67, %n
+  br i1 %t, label %if.then171, label %while.cond141
+
+if.then171:                                       ; preds = %while.cond141
+  %mul150 = mul i32 %0, %0                 ; <i32> [#uses=1]
+  %add174 = add i32 %mul150, %0                 ; <i32> [#uses=1]
+  ret i32 %add174
+}