| Index: tests_lit/llvm2ice_tests/loop-nest-depth.ll
|
| diff --git a/tests_lit/llvm2ice_tests/loop-nest-depth.ll b/tests_lit/llvm2ice_tests/loop-nest-depth.ll
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..16a017e42ce0b8038744415b232cbdd5901e2677
|
| --- /dev/null
|
| +++ b/tests_lit/llvm2ice_tests/loop-nest-depth.ll
|
| @@ -0,0 +1,280 @@
|
| +; Test the the loop nest depth is correctly calculated for basic blocks.
|
| +
|
| +; REQUIRES: allow_dump
|
| +
|
| +; Single threaded so that the dumps used for checking happen in order
|
| +; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 --verbose=loop \
|
| +; RUN: --threads=0 | FileCheck %s
|
| +
|
| +define void @test_single_loop(i32 %a32) {
|
| +entry:
|
| + %a = trunc i32 %a32 to i1
|
| + br label %loop0
|
| +
|
| +loop0: ; <-+
|
| + br label %loop1 ; |
|
| +loop1: ; |
|
| + br i1 %a, label %loop0, label %out ; --+
|
| +
|
| +out:
|
| + ret void
|
| +}
|
| +
|
| +; CHECK-LABEL: After loop nest depth analysis
|
| +; CHECK-NEXT: entry:
|
| +; CHECK-NEXT: LoopNestDepth = 0
|
| +; CHECK-NEXT: loop0:
|
| +; CHECK-NEXT: LoopNestDepth = 1
|
| +; CHECK-NEXT: loop1:
|
| +; CHECK-NEXT: LoopNestDepth = 1
|
| +; CHECK-NEXT: out:
|
| +; CHECK-NEXT: LoopNestDepth = 0
|
| +; CHECK-LABEL: Before RMW
|
| +
|
| +define void @test_single_loop_with_continue(i32 %a32, i32 %b32) {
|
| +entry:
|
| + %a = trunc i32 %a32 to i1
|
| + %b = trunc i32 %b32 to i1
|
| + br label %loop0
|
| +
|
| +loop0: ; <-+
|
| + br label %loop1 ; |
|
| +loop1: ; |
|
| + br i1 %a, label %loop0, label %loop2 ; --+
|
| +loop2: ; |
|
| + br i1 %b, label %loop0, label %out ; --+
|
| +
|
| +out:
|
| + ret void
|
| +}
|
| +
|
| +; CHECK-LABEL: After loop nest depth analysis
|
| +; CHECK-NEXT: entry:
|
| +; CHECK-NEXT: LoopNestDepth = 0
|
| +; CHECK-NEXT: loop0:
|
| +; CHECK-NEXT: LoopNestDepth = 1
|
| +; CHECK-NEXT: loop1:
|
| +; CHECK-NEXT: LoopNestDepth = 1
|
| +; CHECK-NEXT: loop2:
|
| +; CHECK-NEXT: LoopNestDepth = 1
|
| +; CHECK-NEXT: out:
|
| +; CHECK-NEXT: LoopNestDepth = 0
|
| +; CHECK-LABEL: Before RMW
|
| +
|
| +define void @test_multiple_exits(i32 %a32, i32 %b32) {
|
| +entry:
|
| + %a = trunc i32 %a32 to i1
|
| + %b = trunc i32 %b32 to i1
|
| + br label %loop0
|
| +
|
| +loop0: ; <-+
|
| + br label %loop1 ; |
|
| +loop1: ; |
|
| + br i1 %a, label %loop2, label %out ; --+-+
|
| +loop2: ; | |
|
| + br i1 %b, label %loop0, label %out ; --+ |
|
| + ; |
|
| +out: ; <---+
|
| + ret void
|
| +}
|
| +
|
| +; CHECK-LABEL: After loop nest depth analysis
|
| +; CHECK-NEXT: entry:
|
| +; CHECK-NEXT: LoopNestDepth = 0
|
| +; CHECK-NEXT: loop0:
|
| +; CHECK-NEXT: LoopNestDepth = 1
|
| +; CHECK-NEXT: loop1:
|
| +; CHECK-NEXT: LoopNestDepth = 1
|
| +; CHECK-NEXT: loop2:
|
| +; CHECK-NEXT: LoopNestDepth = 1
|
| +; CHECK-NEXT: out:
|
| +; CHECK-NEXT: LoopNestDepth = 0
|
| +; CHECK-LABEL: Before RMW
|
| +
|
| +define void @test_two_nested_loops(i32 %a32, i32 %b32) {
|
| +entry:
|
| + %a = trunc i32 %a32 to i1
|
| + %b = trunc i32 %b32 to i1
|
| + br label %loop0_0
|
| +
|
| +loop0_0: ; <---+
|
| + br label %loop1_0 ; |
|
| +loop1_0: ; <-+ |
|
| + br label %loop1_1 ; | |
|
| +loop1_1: ; | |
|
| + br i1 %a, label %loop1_0, label %loop0_1 ; --+ |
|
| +loop0_1: ; |
|
| + br i1 %b, label %loop0_0, label %out ; ----+
|
| +
|
| +out:
|
| + ret void
|
| +}
|
| +
|
| +; CHECK-LABEL: After loop nest depth analysis
|
| +; CHECK-NEXT: entry:
|
| +; CHECK-NEXT: LoopNestDepth = 0
|
| +; CHECK-NEXT: loop0_0:
|
| +; CHECK-NEXT: LoopNestDepth = 1
|
| +; CHECK-NEXT: loop1_0:
|
| +; CHECK-NEXT: LoopNestDepth = 2
|
| +; CHECK-NEXT: loop1_1:
|
| +; CHECK-NEXT: LoopNestDepth = 2
|
| +; CHECK-NEXT: loop0_1:
|
| +; CHECK-NEXT: LoopNestDepth = 1
|
| +; CHECK-NEXT: out:
|
| +; CHECK-NEXT: LoopNestDepth = 0
|
| +; CHECK-LABEL: Before RMW
|
| +
|
| +define void @test_two_nested_loops_with_continue(i32 %a32, i32 %b32, i32 %c32) {
|
| +entry:
|
| + %a = trunc i32 %a32 to i1
|
| + %b = trunc i32 %b32 to i1
|
| + %c = trunc i32 %c32 to i1
|
| + br label %loop0_0
|
| +
|
| +loop0_0: ; <---+
|
| + br label %loop1_0 ; |
|
| +loop1_0: ; <-+ |
|
| + br label %loop1_1 ; | |
|
| +loop1_1: ; | |
|
| + br i1 %a, label %loop1_0, label %loop1_2 ; --+ |
|
| +loop1_2: ; | |
|
| + br i1 %a, label %loop1_0, label %loop0_1 ; --+ |
|
| +loop0_1: ; |
|
| + br i1 %b, label %loop0_0, label %out ; ----+
|
| +
|
| +out:
|
| + ret void
|
| +}
|
| +
|
| +; CHECK-LABEL: After loop nest depth analysis
|
| +; CHECK-NEXT: entry:
|
| +; CHECK-NEXT: LoopNestDepth = 0
|
| +; CHECK-NEXT: loop0_0:
|
| +; CHECK-NEXT: LoopNestDepth = 1
|
| +; CHECK-NEXT: loop1_0:
|
| +; CHECK-NEXT: LoopNestDepth = 2
|
| +; CHECK-NEXT: loop1_1:
|
| +; CHECK-NEXT: LoopNestDepth = 2
|
| +; CHECK-NEXT: loop1_2:
|
| +; CHECK-NEXT: LoopNestDepth = 2
|
| +; CHECK-NEXT: loop0_1:
|
| +; CHECK-NEXT: LoopNestDepth = 1
|
| +; CHECK-NEXT: out:
|
| +; CHECK-NEXT: LoopNestDepth = 0
|
| +; CHECK-LABEL: Before RMW
|
| +
|
| +define void @test_multiple_nested_loops(i32 %a32, i32 %b32) {
|
| +entry:
|
| + %a = trunc i32 %a32 to i1
|
| + %b = trunc i32 %b32 to i1
|
| + br label %loop0_0
|
| +
|
| +loop0_0: ; <---+
|
| + br label %loop1_0 ; |
|
| +loop1_0: ; <-+ |
|
| + br label %loop1_1 ; | |
|
| +loop1_1: ; | |
|
| + br i1 %a, label %loop1_0, label %loop0_1 ; --+ |
|
| +loop0_1: ; |
|
| + br label %loop2_0 ; |
|
| +loop2_0: ; <-+ |
|
| + br label %loop2_1 ; | |
|
| +loop2_1: ; | |
|
| + br i1 %a, label %loop2_0, label %loop0_2 ; --+ |
|
| +loop0_2: ; |
|
| + br i1 %b, label %loop0_0, label %out ; ----+
|
| +
|
| +out:
|
| + ret void
|
| +}
|
| +
|
| +; CHECK-LABEL: After loop nest depth analysis
|
| +; CHECK-NEXT: entry:
|
| +; CHECK-NEXT: LoopNestDepth = 0
|
| +; CHECK-NEXT: loop0_0:
|
| +; CHECK-NEXT: LoopNestDepth = 1
|
| +; CHECK-NEXT: loop1_0:
|
| +; CHECK-NEXT: LoopNestDepth = 2
|
| +; CHECK-NEXT: loop1_1:
|
| +; CHECK-NEXT: LoopNestDepth = 2
|
| +; CHECK-NEXT: loop0_1:
|
| +; CHECK-NEXT: LoopNestDepth = 1
|
| +; CHECK-NEXT: loop2_0:
|
| +; CHECK-NEXT: LoopNestDepth = 2
|
| +; CHECK-NEXT: loop2_1:
|
| +; CHECK-NEXT: LoopNestDepth = 2
|
| +; CHECK-NEXT: loop0_2:
|
| +; CHECK-NEXT: LoopNestDepth = 1
|
| +; CHECK-NEXT: out:
|
| +; CHECK-NEXT: LoopNestDepth = 0
|
| +; CHECK-LABEL: Before RMW
|
| +
|
| +define void @test_three_nested_loops(i32 %a32, i32 %b32, i32 %c32) {
|
| +entry:
|
| + %a = trunc i32 %a32 to i1
|
| + %b = trunc i32 %b32 to i1
|
| + %c = trunc i32 %c32 to i1
|
| + br label %loop0_0
|
| +
|
| +loop0_0: ; <-----+
|
| + br label %loop1_0 ; |
|
| +loop1_0: ; <---+ |
|
| + br label %loop2_0 ; | |
|
| +loop2_0: ; <-+ | |
|
| + br label %loop2_1 ; | | |
|
| +loop2_1: ; | | |
|
| + br i1 %a, label %loop2_0, label %loop1_1 ; --+ | |
|
| +loop1_1: ; | |
|
| + br i1 %b, label %loop1_0, label %loop0_1 ; ----+ |
|
| +loop0_1: ; |
|
| + br i1 %c, label %loop0_0, label %out ; ------+
|
| +
|
| +out:
|
| + ret void
|
| +}
|
| +
|
| +; CHECK-LABEL: After loop nest depth analysis
|
| +; CHECK-NEXT: entry:
|
| +; CHECK-NEXT: LoopNestDepth = 0
|
| +; CHECK-NEXT: loop0_0:
|
| +; CHECK-NEXT: LoopNestDepth = 1
|
| +; CHECK-NEXT: loop1_0:
|
| +; CHECK-NEXT: LoopNestDepth = 2
|
| +; CHECK-NEXT: loop2_0:
|
| +; CHECK-NEXT: LoopNestDepth = 3
|
| +; CHECK-NEXT: loop2_1:
|
| +; CHECK-NEXT: LoopNestDepth = 3
|
| +; CHECK-NEXT: loop1_1:
|
| +; CHECK-NEXT: LoopNestDepth = 2
|
| +; CHECK-NEXT: loop0_1:
|
| +; CHECK-NEXT: LoopNestDepth = 1
|
| +; CHECK-NEXT: out:
|
| +; CHECK-NEXT: LoopNestDepth = 0
|
| +; CHECK-LABEL: Before RMW
|
| +
|
| +define void @test_diamond(i32 %a32) {
|
| +entry:
|
| + %a = trunc i32 %a32 to i1
|
| + br i1 %a, label %left, label %right
|
| +
|
| +left:
|
| + br label %out
|
| +
|
| +right:
|
| + br label %out
|
| +
|
| +out:
|
| + ret void
|
| +}
|
| +
|
| +; CHECK-LABEL: After loop nest depth analysis
|
| +; CHECK-NEXT: entry:
|
| +; CHECK-NEXT: LoopNestDepth = 0
|
| +; CHECK-NEXT: left:
|
| +; CHECK-NEXT: LoopNestDepth = 0
|
| +; CHECK-NEXT: right:
|
| +; CHECK-NEXT: LoopNestDepth = 0
|
| +; CHECK-NEXT: out:
|
| +; CHECK-NEXT: LoopNestDepth = 0
|
| +; CHECK-LABEL: Before RMW
|
|
|