From b0573547f68078ac72d0c0cd639d53fa98f91264 Mon Sep 17 00:00:00 2001 From: Geoff Berry Date: Wed, 28 Jun 2017 17:01:15 +0000 Subject: [PATCH] [LoopUnroll] Fix bug in computeUnrollCount causing it to not honor MaxCount Reviewers: sanjoy, anna, reames, apilipenko, igor-laevsky, mkuper Subscribers: mcrosier, llvm-commits, mzolotukhin Differential Revision: https://reviews.llvm.org/D34532 llvm-svn: 306564 --- llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp | 2 ++ .../Transforms/LoopUnroll/unroll-maxcount.ll | 31 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 llvm/test/Transforms/LoopUnroll/unroll-maxcount.ll diff --git a/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp b/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp index 8bdbb3ff01f0..530a68424d5c 100644 --- a/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp +++ b/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp @@ -836,6 +836,8 @@ static bool computeUnrollCount( } else { UP.Count = TripCount; } + if (UP.Count > UP.MaxCount) + UP.Count = UP.MaxCount; if ((PragmaFullUnroll || PragmaEnableUnroll) && TripCount && UP.Count != TripCount) ORE->emit( diff --git a/llvm/test/Transforms/LoopUnroll/unroll-maxcount.ll b/llvm/test/Transforms/LoopUnroll/unroll-maxcount.ll new file mode 100644 index 000000000000..4cbd757aec22 --- /dev/null +++ b/llvm/test/Transforms/LoopUnroll/unroll-maxcount.ll @@ -0,0 +1,31 @@ +; RUN: opt < %s -S -loop-unroll -unroll-allow-partial -unroll-max-count=1 | FileCheck %s +; Checks that unroll MaxCount is honored. +; +; CHECK-LABEL: @foo( +; CHECK-LABEL: for.body: +; CHECK-NEXT: phi +; CHECK-NEXT: getelementptr +; CHECK-NEXT: load +; CHECK-NEXT: add +; CHECK-NEXT: store +; CHECK-NEXT: add +; CHECK-NEXT: icmp +; CHECK-NEXT: br +define void @foo(i32* nocapture %a) { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv + %0 = load i32, i32* %arrayidx, align 4 + %inc = add nsw i32 %0, 1 + store i32 %inc, i32* %arrayidx, align 4 + %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 + %exitcond = icmp eq i64 %indvars.iv.next, 1024 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret void +} +