| 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..0b0ace4e2760d8a0e3db715f3817fb9e1a9f037f
|
| --- /dev/null
|
| +++ b/tests_lit/llvm2ice_tests/loop-nest-depth.ll
|
| @@ -0,0 +1,232 @@
|
| +; 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: --verbose=inst --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: entry: // LoopNestDepth = 0
|
| +; CHECK: loop0: // LoopNestDepth = 1
|
| +; CHECK: loop1: // LoopNestDepth = 1
|
| +; CHECK: out: // 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: entry: // LoopNestDepth = 0
|
| +; CHECK: loop0: // LoopNestDepth = 1
|
| +; CHECK: loop1: // LoopNestDepth = 1
|
| +; CHECK: loop2: // LoopNestDepth = 1
|
| +; CHECK: out: // 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: entry: // LoopNestDepth = 0
|
| +; CHECK: loop0: // LoopNestDepth = 1
|
| +; CHECK: loop1: // LoopNestDepth = 1
|
| +; CHECK: loop2: // LoopNestDepth = 1
|
| +; CHECK: out: // 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: entry: // LoopNestDepth = 0
|
| +; CHECK: loop0_0: // LoopNestDepth = 1
|
| +; CHECK: loop1_0: // LoopNestDepth = 2
|
| +; CHECK: loop1_1: // LoopNestDepth = 2
|
| +; CHECK: loop0_1: // LoopNestDepth = 1
|
| +; CHECK: out: // 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: entry: // LoopNestDepth = 0
|
| +; CHECK: loop0_0: // LoopNestDepth = 1
|
| +; CHECK: loop1_0: // LoopNestDepth = 2
|
| +; CHECK: loop1_1: // LoopNestDepth = 2
|
| +; CHECK: loop1_2: // LoopNestDepth = 2
|
| +; CHECK: loop0_1: // LoopNestDepth = 1
|
| +; CHECK: out: // 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: entry: // LoopNestDepth = 0
|
| +; CHECK: loop0_0: // LoopNestDepth = 1
|
| +; CHECK: loop1_0: // LoopNestDepth = 2
|
| +; CHECK: loop1_1: // LoopNestDepth = 2
|
| +; CHECK: loop0_1: // LoopNestDepth = 1
|
| +; CHECK: loop2_0: // LoopNestDepth = 2
|
| +; CHECK: loop2_1: // LoopNestDepth = 2
|
| +; CHECK: loop0_2: // LoopNestDepth = 1
|
| +; CHECK: out: // 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: entry: // LoopNestDepth = 0
|
| +; CHECK: loop0_0: // LoopNestDepth = 1
|
| +; CHECK: loop1_0: // LoopNestDepth = 2
|
| +; CHECK: loop2_0: // LoopNestDepth = 3
|
| +; CHECK: loop2_1: // LoopNestDepth = 3
|
| +; CHECK: loop1_1: // LoopNestDepth = 2
|
| +; CHECK: loop0_1: // LoopNestDepth = 1
|
| +; CHECK: out: // 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: entry: // LoopNestDepth = 0
|
| +; CHECK: left: // LoopNestDepth = 0
|
| +; CHECK: right: // LoopNestDepth = 0
|
| +; CHECK: out: // LoopNestDepth = 0
|
| +; CHECK-LABEL: Before RMW
|
|
|