From ac146657fc2dc63e9856e0090fd0bec4ba9befd3 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Fri, 20 Nov 2009 01:09:34 +0000 Subject: [PATCH] Teach getSmallConstantTripMultiple about Shl operators. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@89426 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/LoopInfo.cpp | 5 ++++ .../LoopUnroll/shifted-tripcount.ll | 28 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 test/Transforms/LoopUnroll/shifted-tripcount.ll diff --git a/lib/Analysis/LoopInfo.cpp b/lib/Analysis/LoopInfo.cpp index 1c614b0e06b..4de756c41b0 100644 --- a/lib/Analysis/LoopInfo.cpp +++ b/lib/Analysis/LoopInfo.cpp @@ -243,6 +243,11 @@ unsigned Loop::getSmallConstantTripMultiple() const { case BinaryOperator::Mul: Result = dyn_cast(BO->getOperand(1)); break; + case BinaryOperator::Shl: + if (ConstantInt *CI = dyn_cast(BO->getOperand(1))) + if (CI->getValue().getActiveBits() <= 5) + return 1u << CI->getZExtValue(); + break; default: break; } diff --git a/test/Transforms/LoopUnroll/shifted-tripcount.ll b/test/Transforms/LoopUnroll/shifted-tripcount.ll new file mode 100644 index 00000000000..a118a463172 --- /dev/null +++ b/test/Transforms/LoopUnroll/shifted-tripcount.ll @@ -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 ; [#uses=2] + br label %for.body + +for.body: ; preds = %entry, %for.body + %i.013 = phi i64 [ %tmp16, %for.body ], [ 0, %entry ] ; [#uses=2] + %arrayidx7 = getelementptr double* %p, i64 %i.013 ; [#uses=2] + %tmp16 = add i64 %i.013, 1 ; [#uses=3] + %arrayidx = getelementptr double* %p, i64 %tmp16 ; [#uses=1] + %tmp4 = load double* %arrayidx ; [#uses=1] + %tmp8 = load double* %arrayidx7 ; [#uses=1] + %mul9 = fmul double %tmp8, %tmp4 ; [#uses=1] + store double %mul9, double* %arrayidx7 + %exitcond = icmp eq i64 %tmp16, %mul10 ; [#uses=1] + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +}