Skip to content

Commit

Permalink
[ARM] Enable Unroll UpperBound
Browse files Browse the repository at this point in the history
This option allows loops with small max trip counts to be fully unrolled. This
can help with code like the remainder loops from manually unrolled loops like
those that appear in the cmsis dsp library. We would apparently previously
runtime unroll them with the default unroll count (4).

Differential Revision: https://reviews.llvm.org/D63064

llvm-svn: 362928
  • Loading branch information
davemgreen committed Jun 10, 2019
1 parent c6a930e commit d847aa5
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 0 deletions.
1 change: 1 addition & 0 deletions llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -683,6 +683,7 @@ void ARMTTIImpl::getUnrollingPreferences(Loop *L, ScalarEvolution &SE,

UP.Partial = true;
UP.Runtime = true;
UP.UpperBound = true;
UP.UnrollRemainder = true;
UP.DefaultUnrollRuntimeCount = 4;
UP.UnrollAndJam = true;
Expand Down
38 changes: 38 additions & 0 deletions llvm/test/Transforms/LoopUnroll/ARM/upperbound.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
; RUN: opt -loop-unroll -S -mtriple arm-none-eabi -mcpu=cortex-m7 %s | FileCheck %s -check-prefix=UNROLL

; This test is meant to check that this loop is unrolled into three iterations.

; UNROLL-LABEL: @test
; UNROLL: load i32, i32*
; UNROLL: load i32, i32*
; UNROLL: load i32, i32*
; UNROLL-NOT: load i32, i32*

define void @test(i32* %x, i32 %n) {
entry:
%sub = add nsw i32 %n, -1
%rem = srem i32 %sub, 4
%cmp7 = icmp sgt i32 %rem, 0
br i1 %cmp7, label %while.body, label %while.end

while.body: ; preds = %entry, %if.end
%x.addr.09 = phi i32* [ %incdec.ptr, %if.end ], [ %x, %entry ]
%n.addr.08 = phi i32 [ %dec, %if.end ], [ %rem, %entry ]
%0 = load i32, i32* %x.addr.09, align 4
%cmp1 = icmp slt i32 %0, 10
br i1 %cmp1, label %if.then, label %if.end

if.then: ; preds = %while.body
store i32 0, i32* %x.addr.09, align 4
br label %if.end

if.end: ; preds = %if.then, %while.body
%incdec.ptr = getelementptr inbounds i32, i32* %x.addr.09, i32 1
%dec = add nsw i32 %n.addr.08, -1
%cmp = icmp sgt i32 %dec, 0
br i1 %cmp, label %while.body, label %while.end

while.end: ; preds = %if.end, %entry
ret void
}

0 comments on commit d847aa5

Please sign in to comment.