[llvm-commits] [llvm] r89426 - in /llvm/trunk: lib/Analysis/LoopInfo.cpp test/Transforms/LoopUnroll/shifted-tripcount.ll

Dan Gohman gohman at apple.com
Thu Nov 19 17:09:34 PST 2009


Author: djg
Date: Thu Nov 19 19:09:34 2009
New Revision: 89426

URL: http://llvm.org/viewvc/llvm-project?rev=89426&view=rev
Log:
Teach getSmallConstantTripMultiple about Shl operators.

Added:
    llvm/trunk/test/Transforms/LoopUnroll/shifted-tripcount.ll
Modified:
    llvm/trunk/lib/Analysis/LoopInfo.cpp

Modified: llvm/trunk/lib/Analysis/LoopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopInfo.cpp?rev=89426&r1=89425&r2=89426&view=diff

==============================================================================
--- llvm/trunk/lib/Analysis/LoopInfo.cpp (original)
+++ llvm/trunk/lib/Analysis/LoopInfo.cpp Thu Nov 19 19:09:34 2009
@@ -243,6 +243,11 @@
         case BinaryOperator::Mul:
           Result = dyn_cast<ConstantInt>(BO->getOperand(1));
           break;
+        case BinaryOperator::Shl:
+          if (ConstantInt *CI = dyn_cast<ConstantInt>(BO->getOperand(1)))
+            if (CI->getValue().getActiveBits() <= 5)
+              return 1u << CI->getZExtValue();
+          break;
         default:
           break;
         }

Added: llvm/trunk/test/Transforms/LoopUnroll/shifted-tripcount.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopUnroll/shifted-tripcount.ll?rev=89426&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/LoopUnroll/shifted-tripcount.ll (added)
+++ llvm/trunk/test/Transforms/LoopUnroll/shifted-tripcount.ll Thu Nov 19 19:09:34 2009
@@ -0,0 +1,28 @@
+; RUN: opt < %s -loop-unroll -unroll-count=2 -S | FileCheck %s
+
+; LoopUnroll should unroll this loop into one big basic block.
+
+; CHECK: for.body:
+; CHECK: %i.013 = phi i64 [ 0, %entry ], [ %tmp16.1, %for.body ]
+; CHECK: br i1 %exitcond.1, label %for.end, label %for.body
+
+define void @foo(double* nocapture %p, i64 %n) nounwind {
+entry:
+  %mul10 = shl i64 %n, 1                          ; <i64> [#uses=2]
+  br label %for.body
+
+for.body:                                         ; preds = %entry, %for.body
+  %i.013 = phi i64 [ %tmp16, %for.body ], [ 0, %entry ] ; <i64> [#uses=2]
+  %arrayidx7 = getelementptr double* %p, i64 %i.013 ; <double*> [#uses=2]
+  %tmp16 = add i64 %i.013, 1                      ; <i64> [#uses=3]
+  %arrayidx = getelementptr double* %p, i64 %tmp16 ; <double*> [#uses=1]
+  %tmp4 = load double* %arrayidx                  ; <double> [#uses=1]
+  %tmp8 = load double* %arrayidx7                 ; <double> [#uses=1]
+  %mul9 = fmul double %tmp8, %tmp4                ; <double> [#uses=1]
+  store double %mul9, double* %arrayidx7
+  %exitcond = icmp eq i64 %tmp16, %mul10          ; <i1> [#uses=1]
+  br i1 %exitcond, label %for.end, label %for.body
+
+for.end:                                          ; preds = %for.body, %entry
+  ret void
+}





More information about the llvm-commits mailing list