[llvm] 79c09d5 - [tests] Add some basic coverage of multiple exit unrolling

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Wed May 26 15:51:38 PDT 2021


Author: Philip Reames
Date: 2021-05-26T15:51:26-07:00
New Revision: 79c09d5ee1e97fc132b1f2087878d5c5d7a77888

URL: https://github.com/llvm/llvm-project/commit/79c09d5ee1e97fc132b1f2087878d5c5d7a77888
DIFF: https://github.com/llvm/llvm-project/commit/79c09d5ee1e97fc132b1f2087878d5c5d7a77888.diff

LOG: [tests] Add some basic coverage of multiple exit unrolling

Added: 
    llvm/test/Transforms/LoopUnroll/multiple-exits.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/LoopUnroll/multiple-exits.ll b/llvm/test/Transforms/LoopUnroll/multiple-exits.ll
new file mode 100644
index 000000000000..39dfe32d24bf
--- /dev/null
+++ b/llvm/test/Transforms/LoopUnroll/multiple-exits.ll
@@ -0,0 +1,188 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -loop-unroll -S < %s | FileCheck %s
+
+declare void @bar()
+
+; TODO: We should unroll by 10, not 20 here
+define void @test1() {
+; CHECK-LABEL: @test1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br label [[LOOP:%.*]]
+; CHECK:       loop:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 true, label [[LATCH:%.*]], label [[EXIT:%.*]]
+; CHECK:       latch:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 true, label [[LATCH_1:%.*]], label [[EXIT]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+; CHECK:       latch.1:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 true, label [[LATCH_2:%.*]], label [[EXIT]]
+; CHECK:       latch.2:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 true, label [[LATCH_3:%.*]], label [[EXIT]]
+; CHECK:       latch.3:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 true, label [[LATCH_4:%.*]], label [[EXIT]]
+; CHECK:       latch.4:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 true, label [[LATCH_5:%.*]], label [[EXIT]]
+; CHECK:       latch.5:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 true, label [[LATCH_6:%.*]], label [[EXIT]]
+; CHECK:       latch.6:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 true, label [[LATCH_7:%.*]], label [[EXIT]]
+; CHECK:       latch.7:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 true, label [[LATCH_8:%.*]], label [[EXIT]]
+; CHECK:       latch.8:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 true, label [[LATCH_9:%.*]], label [[EXIT]]
+; CHECK:       latch.9:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 false, label [[LATCH_10:%.*]], label [[EXIT]]
+; CHECK:       latch.10:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 false, label [[LATCH_11:%.*]], label [[EXIT]]
+; CHECK:       latch.11:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 false, label [[LATCH_12:%.*]], label [[EXIT]]
+; CHECK:       latch.12:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 false, label [[LATCH_13:%.*]], label [[EXIT]]
+; CHECK:       latch.13:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 false, label [[LATCH_14:%.*]], label [[EXIT]]
+; CHECK:       latch.14:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 false, label [[LATCH_15:%.*]], label [[EXIT]]
+; CHECK:       latch.15:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 false, label [[LATCH_16:%.*]], label [[EXIT]]
+; CHECK:       latch.16:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 false, label [[LATCH_17:%.*]], label [[EXIT]]
+; CHECK:       latch.17:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 false, label [[LATCH_18:%.*]], label [[EXIT]]
+; CHECK:       latch.18:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 false, label [[LATCH_19:%.*]], label [[EXIT]]
+; CHECK:       latch.19:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br i1 false, label [[LATCH_20:%.*]], label [[EXIT]]
+; CHECK:       latch.20:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br label [[EXIT]]
+;
+entry:
+  br label %loop
+loop:
+  %iv = phi i64 [0, %entry], [%iv.next, %latch]
+  %iv.next = add i64 %iv, 1
+  call void @bar()
+  %cmp1 = icmp ult i64 %iv, 10
+  br i1 %cmp1, label %latch, label %exit
+latch:
+  call void @bar()
+  %cmp2 = icmp ult i64 %iv, 20
+  br i1 %cmp2, label %loop, label %exit
+exit:
+  ret void
+}
+
+; TODO: We should fully unroll this by 10, leave the unrolled latch
+; tests since we don't know if %N < 10, and break the backedge.
+define void @test2(i64 %N) {
+; CHECK-LABEL: @test2(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br label [[LOOP:%.*]]
+; CHECK:       loop:
+; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LATCH:%.*]] ]
+; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    [[CMP1:%.*]] = icmp ule i64 [[IV]], 10
+; CHECK-NEXT:    br i1 [[CMP1]], label [[LATCH]], label [[EXIT:%.*]]
+; CHECK:       latch:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp ule i64 [[IV]], [[N:%.*]]
+; CHECK-NEXT:    br i1 [[CMP2]], label [[LOOP]], label [[EXIT]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+entry:
+  br label %loop
+loop:
+  %iv = phi i64 [0, %entry], [%iv.next, %latch]
+  %iv.next = add i64 %iv, 1
+  call void @bar()
+  %cmp1 = icmp ule i64 %iv, 10
+  br i1 %cmp1, label %latch, label %exit
+latch:
+  call void @bar()
+  %cmp2 = icmp ule i64 %iv, %N
+  br i1 %cmp2, label %loop, label %exit
+exit:
+  ret void
+}
+
+
+; TODO: We could partially unroll this by 2.
+define void @test3(i64 %N, i64 %M) {
+; CHECK-LABEL: @test3(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[N_MASKED:%.*]] = and i64 [[N:%.*]], 65520
+; CHECK-NEXT:    [[M_MASKED:%.*]] = and i64 [[M:%.*]], 65520
+; CHECK-NEXT:    br label [[LOOP:%.*]]
+; CHECK:       loop:
+; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LATCH:%.*]] ]
+; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    [[CMP1:%.*]] = icmp ule i64 [[IV]], [[N_MASKED]]
+; CHECK-NEXT:    br i1 [[CMP1]], label [[LATCH]], label [[EXIT:%.*]]
+; CHECK:       latch:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp ule i64 [[IV]], [[M_MASKED]]
+; CHECK-NEXT:    br i1 [[CMP2]], label [[LOOP]], label [[EXIT]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %N.masked = and i64 %N, 65520 ; 0xfff0
+  %M.masked = and i64 %M, 65520 ; 0xfff0
+  br label %loop
+loop:
+  %iv = phi i64 [0, %entry], [%iv.next, %latch]
+  %iv.next = add i64 %iv, 1
+  call void @bar()
+  %cmp1 = icmp ule i64 %iv, %N.masked
+  br i1 %cmp1, label %latch, label %exit
+latch:
+  call void @bar()
+  %cmp2 = icmp ule i64 %iv, %M.masked
+  br i1 %cmp2, label %loop, label %exit
+exit:
+  ret void
+}


        


More information about the llvm-commits mailing list