diff options
Diffstat (limited to 'test/CodeGen/WebAssembly/cfg-stackify.ll')
-rw-r--r-- | test/CodeGen/WebAssembly/cfg-stackify.ll | 817 |
1 files changed, 466 insertions, 351 deletions
diff --git a/test/CodeGen/WebAssembly/cfg-stackify.ll b/test/CodeGen/WebAssembly/cfg-stackify.ll index 71f3551..f0e5f44 100644 --- a/test/CodeGen/WebAssembly/cfg-stackify.ll +++ b/test/CodeGen/WebAssembly/cfg-stackify.ll @@ -3,7 +3,7 @@ ; Test the CFG stackifier pass. -target datalayout = "e-p:32:32-i64:64-n32:64-S128" +target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32-unknown-unknown" declare void @something() @@ -18,7 +18,7 @@ declare void @something() ; CHECK-NEXT: br_if ; CHECK-NOT: br ; CHECK: call -; CHECK: br BB0_1{{$}} +; CHECK: br 0{{$}} ; CHECK: return{{$}} ; OPT-LABEL: test0: ; OPT: loop @@ -28,7 +28,7 @@ declare void @something() ; OPT-NEXT: br_if ; OPT-NOT: br ; OPT: call -; OPT: br BB0_1{{$}} +; OPT: br 0{{$}} ; OPT: return{{$}} define void @test0(i32 %n) { entry: @@ -59,7 +59,7 @@ back: ; CHECK-NEXT: br_if ; CHECK-NOT: br ; CHECK: call -; CHECK: br BB1_1{{$}} +; CHECK: br 0{{$}} ; CHECK: return{{$}} ; OPT-LABEL: test1: ; OPT: loop @@ -69,7 +69,7 @@ back: ; OPT-NEXT: br_if ; OPT-NOT: br ; OPT: call -; OPT: br BB1_1{{$}} +; OPT: br 0{{$}} ; OPT: return{{$}} define void @test1(i32 %n) { entry: @@ -93,18 +93,20 @@ back: ; Test that a simple loop is handled as expected. ; CHECK-LABEL: test2: -; CHECK: block BB2_2{{$}} -; CHECK: br_if {{[^,]*}}, BB2_2{{$}} -; CHECK: BB2_1: -; CHECK: br_if ${{[0-9]+}}, BB2_1{{$}} -; CHECK: BB2_2: +; CHECK-NOT: local +; CHECK: block{{$}} +; CHECK: br_if {{[^,]*}}, 0{{$}} +; CHECK: .LBB2_1: +; CHECK: br_if ${{[0-9]+}}, 0{{$}} +; CHECK: .LBB2_2: ; CHECK: return{{$}} ; OPT-LABEL: test2: -; OPT: block BB2_2{{$}} -; OPT: br_if {{[^,]*}}, BB2_2{{$}} -; OPT: BB2_1: -; OPT: br_if ${{[0-9]+}}, BB2_1{{$}} -; OPT: BB2_2: +; OPT-NOT: local +; OPT: block{{$}} +; OPT: br_if {{[^,]*}}, 0{{$}} +; OPT: .LBB2_1: +; OPT: br_if ${{[0-9]+}}, 0{{$}} +; OPT: .LBB2_2: ; OPT: return{{$}} define void @test2(double* nocapture %p, i32 %n) { entry: @@ -132,24 +134,29 @@ for.end: } ; CHECK-LABEL: doublediamond: -; CHECK: block BB3_5{{$}} -; CHECK: block BB3_2{{$}} -; CHECK: br_if $0, BB3_2{{$}} -; CHECK: block BB3_4{{$}} -; CHECK: br_if $1, BB3_4{{$}} -; CHECK: br BB3_5{{$}} -; CHECK: BB3_4: -; CHECK: BB3_5: +; CHECK: block{{$}} +; CHECK-NEXT: block{{$}} +; CHECK: br_if ${{[^,]*}}, 0{{$}} +; CHECK: br 1{{$}} +; CHECK: .LBB3_2: +; CHECK-NEXT: end_block{{$}} +; CHECK: block{{$}} +; CHECK: br_if ${{[^,]*}}, 0{{$}} +; CHECK: br 1{{$}} +; CHECK: .LBB3_4: +; CHECK-NEXT: end_block{{$}} +; CHECK: .LBB3_5: +; CHECK-NEXT: end_block{{$}} ; CHECK: return ${{[0-9]+}}{{$}} ; OPT-LABEL: doublediamond: -; OPT: block BB3_5{{$}} -; OPT: block BB3_4{{$}} -; OPT: br_if {{[^,]*}}, BB3_4{{$}} -; OPT: block BB3_3{{$}} -; OPT: br_if {{[^,]*}}, BB3_3{{$}} -; OPT: br BB3_5{{$}} -; OPT: BB3_4: -; OPT: BB3_5: +; OPT: block{{$}} +; OPT-NEXT: block{{$}} +; OPT: br_if ${{[^,]*}}, 0{{$}} +; OPT: block{{$}} +; OPT: br_if ${{[^,]*}}, 0{{$}} +; OPT: br 1{{$}} +; OPT: .LBB3_4: +; OPT: .LBB3_5: ; OPT: return ${{[0-9]+}}{{$}} define i32 @doublediamond(i32 %a, i32 %b, i32* %p) { entry: @@ -175,14 +182,14 @@ exit: } ; CHECK-LABEL: triangle: -; CHECK: block BB4_2{{$}} -; CHECK: br_if $1, BB4_2{{$}} -; CHECK: BB4_2: +; CHECK: block{{$}} +; CHECK: br_if $1, 0{{$}} +; CHECK: .LBB4_2: ; CHECK: return ${{[0-9]+}}{{$}} ; OPT-LABEL: triangle: -; OPT: block BB4_2{{$}} -; OPT: br_if $1, BB4_2{{$}} -; OPT: BB4_2: +; OPT: block{{$}} +; OPT: br_if $1, 0{{$}} +; OPT: .LBB4_2: ; OPT: return ${{[0-9]+}}{{$}} define i32 @triangle(i32* %p, i32 %a) { entry: @@ -198,20 +205,20 @@ exit: } ; CHECK-LABEL: diamond: -; CHECK: block BB5_3{{$}} -; CHECK: block BB5_2{{$}} -; CHECK: br_if $1, BB5_2{{$}} -; CHECK: br BB5_3{{$}} -; CHECK: BB5_2: -; CHECK: BB5_3: +; CHECK: block{{$}} +; CHECK: block{{$}} +; CHECK: br_if $1, 0{{$}} +; CHECK: br 1{{$}} +; CHECK: .LBB5_2: +; CHECK: .LBB5_3: ; CHECK: return ${{[0-9]+}}{{$}} ; OPT-LABEL: diamond: -; OPT: block BB5_3{{$}} -; OPT: block BB5_2{{$}} -; OPT: br_if {{[^,]*}}, BB5_2{{$}} -; OPT: br BB5_3{{$}} -; OPT: BB5_2: -; OPT: BB5_3: +; OPT: block{{$}} +; OPT: block{{$}} +; OPT: br_if {{[^,]*}}, 0{{$}} +; OPT: br 1{{$}} +; OPT: .LBB5_2: +; OPT: .LBB5_3: ; OPT: return ${{[0-9]+}}{{$}} define i32 @diamond(i32* %p, i32 %a) { entry: @@ -243,16 +250,16 @@ entry: ; CHECK-LABEL: minimal_loop: ; CHECK-NOT: br -; CHECK: BB7_1: +; CHECK: .LBB7_1: ; CHECK: i32.store $discard=, 0($0), $pop{{[0-9]+}}{{$}} -; CHECK: br BB7_1{{$}} -; CHECK: BB7_2: +; CHECK: br 0{{$}} +; CHECK: .LBB7_2: ; OPT-LABEL: minimal_loop: ; OPT-NOT: br -; OPT: BB7_1: +; OPT: .LBB7_1: ; OPT: i32.store $discard=, 0($0), $pop{{[0-9]+}}{{$}} -; OPT: br BB7_1{{$}} -; OPT: BB7_2: +; OPT: br 0{{$}} +; OPT: .LBB7_2: define i32 @minimal_loop(i32* %p) { entry: store volatile i32 0, i32* %p @@ -264,17 +271,17 @@ loop: ; CHECK-LABEL: simple_loop: ; CHECK-NOT: br -; CHECK: BB8_1: -; CHECK: loop BB8_2{{$}} -; CHECK: br_if $pop{{[0-9]+}}, BB8_1{{$}} -; CHECK: BB8_2: +; CHECK: .LBB8_1: +; CHECK: loop{{$}} +; CHECK: br_if $pop{{[0-9]+}}, 0{{$}} +; CHECK-NEXT: end_loop{{$}} ; CHECK: return ${{[0-9]+}}{{$}} ; OPT-LABEL: simple_loop: ; OPT-NOT: br -; OPT: BB8_1: -; OPT: loop BB8_2{{$}} -; OPT: br_if {{[^,]*}}, BB8_1{{$}} -; OPT: BB8_2: +; OPT: .LBB8_1: +; OPT: loop{{$}} +; OPT: br_if {{[^,]*}}, 0{{$}} +; OPT-NEXT: end_loop{{$}} ; OPT: return ${{[0-9]+}}{{$}} define i32 @simple_loop(i32* %p, i32 %a) { entry: @@ -290,20 +297,20 @@ exit: } ; CHECK-LABEL: doubletriangle: -; CHECK: block BB9_4{{$}} -; CHECK: br_if $0, BB9_4{{$}} -; CHECK: block BB9_3{{$}} -; CHECK: br_if $1, BB9_3{{$}} -; CHECK: BB9_3: -; CHECK: BB9_4: +; CHECK: block{{$}} +; CHECK: br_if $0, 0{{$}} +; CHECK: block{{$}} +; CHECK: br_if $1, 0{{$}} +; CHECK: .LBB9_3: +; CHECK: .LBB9_4: ; CHECK: return ${{[0-9]+}}{{$}} ; OPT-LABEL: doubletriangle: -; OPT: block BB9_4{{$}} -; OPT: br_if $0, BB9_4{{$}} -; OPT: block BB9_3{{$}} -; OPT: br_if $1, BB9_3{{$}} -; OPT: BB9_3: -; OPT: BB9_4: +; OPT: block{{$}} +; OPT: br_if $0, 0{{$}} +; OPT: block{{$}} +; OPT: br_if $1, 0{{$}} +; OPT: .LBB9_3: +; OPT: .LBB9_4: ; OPT: return ${{[0-9]+}}{{$}} define i32 @doubletriangle(i32 %a, i32 %b, i32* %p) { entry: @@ -326,22 +333,22 @@ exit: } ; CHECK-LABEL: ifelse_earlyexits: -; CHECK: block BB10_4{{$}} -; CHECK: block BB10_2{{$}} -; CHECK: br_if $0, BB10_2{{$}} -; CHECK: br BB10_4{{$}} -; CHECK: BB10_2: -; CHECK: br_if $1, BB10_4{{$}} -; CHECK: BB10_4: +; CHECK: block{{$}} +; CHECK: block{{$}} +; CHECK: br_if $0, 0{{$}} +; CHECK: br 1{{$}} +; CHECK: .LBB10_2: +; CHECK: br_if $1, 0{{$}} +; CHECK: .LBB10_4: ; CHECK: return ${{[0-9]+}}{{$}} ; OPT-LABEL: ifelse_earlyexits: -; OPT: block BB10_4{{$}} -; OPT: block BB10_3{{$}} -; OPT: br_if {{[^,]*}}, BB10_3{{$}} -; OPT: br_if $1, BB10_4{{$}} -; OPT: br BB10_4{{$}} -; OPT: BB10_3: -; OPT: BB10_4: +; OPT: block{{$}} +; OPT: block{{$}} +; OPT: br_if {{[^,]*}}, 0{{$}} +; OPT: br_if $1, 1{{$}} +; OPT: br 1{{$}} +; OPT: .LBB10_3: +; OPT: .LBB10_4: ; OPT: return ${{[0-9]+}}{{$}} define i32 @ifelse_earlyexits(i32 %a, i32 %b, i32* %p) { entry: @@ -364,35 +371,40 @@ exit: } ; CHECK-LABEL: doublediamond_in_a_loop: -; CHECK: BB11_1: -; CHECK: loop BB11_7{{$}} -; CHECK: block BB11_6{{$}} -; CHECK: block BB11_3{{$}} -; CHECK: br_if $0, BB11_3{{$}} -; CHECK: br BB11_6{{$}} -; CHECK: BB11_3: -; CHECK: block BB11_5{{$}} -; CHECK: br_if $1, BB11_5{{$}} -; CHECK: br BB11_6{{$}} -; CHECK: BB11_5: -; CHECK: BB11_6: -; CHECK: br BB11_1{{$}} -; CHECK: BB11_7: +; CHECK: .LBB11_1: +; CHECK: loop{{$}} +; CHECK: block{{$}} +; CHECK: block{{$}} +; CHECK: br_if $0, 0{{$}} +; CHECK: br 1{{$}} +; CHECK: .LBB11_3: +; CHECK: block{{$}} +; CHECK: br_if $1, 0{{$}} +; CHECK: br 1{{$}} +; CHECK: .LBB11_5: +; CHECK: .LBB11_6: +; CHECK: br 0{{$}} +; CHECK: .LBB11_7: +; CHECK-NEXT: end_loop{{$}} ; OPT-LABEL: doublediamond_in_a_loop: -; OPT: BB11_1: -; OPT: loop BB11_7{{$}} -; OPT: block BB11_6{{$}} -; OPT: block BB11_5{{$}} -; OPT: br_if {{[^,]*}}, BB11_5{{$}} -; OPT: block BB11_4{{$}} -; OPT: br_if {{[^,]*}}, BB11_4{{$}} -; OPT: br BB11_6{{$}} -; OPT: BB11_4: -; OPT: br BB11_6{{$}} -; OPT: BB11_5: -; OPT: BB11_6: -; OPT: br BB11_1{{$}} -; OPT: BB11_7: +; OPT: .LBB11_1: +; OPT: loop{{$}} +; OPT: block{{$}} +; OPT: block{{$}} +; OPT: br_if {{[^,]*}}, 0{{$}} +; OPT: block{{$}} +; OPT: br_if {{[^,]*}}, 0{{$}} +; OPT: br 2{{$}} +; OPT: .LBB11_4: +; OPT-NEXT: end_block{{$}} +; OPT: br 1{{$}} +; OPT: .LBB11_5: +; OPT-NEXT: end_block{{$}} +; OPT: .LBB11_6: +; OPT-NEXT: end_block{{$}} +; OPT: br 0{{$}} +; OPT: .LBB11_7: +; OPT-NEXT: end_loop{{$}} define i32 @doublediamond_in_a_loop(i32 %a, i32 %b, i32* %p) { entry: br label %header @@ -423,12 +435,12 @@ exit: ; CHECK-LABEL: test3: ; CHECK: loop ; CHECK-NEXT: br_if -; CHECK-NEXT: BB{{[0-9]+}}_{{[0-9]+}}: +; CHECK-NEXT: .LBB{{[0-9]+}}_{{[0-9]+}}: ; CHECK-NEXT: loop ; OPT-LABEL: test3: ; OPT: loop ; OPT-NEXT: br_if -; OPT-NEXT: BB{{[0-9]+}}_{{[0-9]+}}: +; OPT-NEXT: .LBB{{[0-9]+}}_{{[0-9]+}}: ; OPT-NEXT: loop declare void @bar() define void @test3(i32 %w) { @@ -460,42 +472,48 @@ if.end: ; Test switch lowering and block placement. ; CHECK-LABEL: test4: -; CHECK-NEXT: .param i32{{$}} -; CHECK: block BB13_8{{$}} -; CHECK-NEXT: block BB13_7{{$}} -; CHECK-NEXT: block BB13_4{{$}} -; CHECK: br_if $pop{{[0-9]*}}, BB13_4{{$}} -; CHECK-NEXT: block BB13_3{{$}} -; CHECK: br_if $pop{{[0-9]*}}, BB13_3{{$}} -; CHECK: br_if $pop{{[0-9]*}}, BB13_7{{$}} -; CHECK-NEXT: BB13_3: +; CHECK-NEXT: .param i32{{$}} +; CHECK: block{{$}} +; CHECK-NEXT: block{{$}} +; CHECK-NEXT: block{{$}} +; CHECK: br_if $pop{{[0-9]*}}, 0{{$}} +; CHECK-NEXT: block{{$}} +; CHECK: br_if $pop{{[0-9]*}}, 0{{$}} +; CHECK: br_if $pop{{[0-9]*}}, 2{{$}} +; CHECK-NEXT: .LBB13_3: +; CHECK-NEXT: end_block{{$}} ; CHECK-NEXT: return{{$}} -; CHECK-NEXT: BB13_4: -; CHECK: br_if $pop{{[0-9]*}}, BB13_8{{$}} -; CHECK: br_if $pop{{[0-9]*}}, BB13_7{{$}} +; CHECK-NEXT: .LBB13_4: +; CHECK: br_if $pop{{[0-9]*}}, 1{{$}} +; CHECK: br_if $pop{{[0-9]*}}, 0{{$}} ; CHECK-NEXT: return{{$}} -; CHECK-NEXT: BB13_7: +; CHECK-NEXT: .LBB13_7: +; CHECK-NEXT: end_block{{$}} ; CHECK-NEXT: return{{$}} -; CHECK-NEXT: BB13_8: +; CHECK-NEXT: .LBB13_8: +; CHECK-NEXT: end_block{{$}} ; CHECK-NEXT: return{{$}} ; OPT-LABEL: test4: -; OPT-NEXT: .param i32{{$}} -; OPT: block BB13_8{{$}} -; OPT-NEXT: block BB13_7{{$}} -; OPT-NEXT: block BB13_4{{$}} -; OPT: br_if $pop{{[0-9]*}}, BB13_4{{$}} -; OPT-NEXT: block BB13_3{{$}} -; OPT: br_if $pop{{[0-9]*}}, BB13_3{{$}} -; OPT: br_if $pop{{[0-9]*}}, BB13_7{{$}} -; OPT-NEXT: BB13_3: +; OPT-NEXT: .param i32{{$}} +; OPT: block{{$}} +; OPT-NEXT: block{{$}} +; OPT-NEXT: block{{$}} +; OPT: br_if $pop{{[0-9]*}}, 0{{$}} +; OPT-NEXT: block{{$}} +; OPT: br_if $pop{{[0-9]*}}, 0{{$}} +; OPT: br_if $pop{{[0-9]*}}, 2{{$}} +; OPT-NEXT: .LBB13_3: +; OPT-NEXT: end_block{{$}} ; OPT-NEXT: return{{$}} -; OPT-NEXT: BB13_4: -; OPT: br_if $pop{{[0-9]*}}, BB13_8{{$}} -; OPT: br_if $pop{{[0-9]*}}, BB13_7{{$}} +; OPT-NEXT: .LBB13_4: +; OPT: br_if $pop{{[0-9]*}}, 1{{$}} +; OPT: br_if $pop{{[0-9]*}}, 0{{$}} ; OPT-NEXT: return{{$}} -; OPT-NEXT: BB13_7: +; OPT-NEXT: .LBB13_7: +; OPT-NEXT: end_block{{$}} ; OPT-NEXT: return{{$}} -; OPT-NEXT: BB13_8: +; OPT-NEXT: .LBB13_8: +; OPT-NEXT: end_block{{$}} ; OPT-NEXT: return{{$}} define void @test4(i32 %t) { entry: @@ -523,24 +541,24 @@ default: ; same basic block. ; CHECK-LABEL: test5: -; CHECK: BB14_1: -; CHECK-NEXT: block BB14_4{{$}} -; CHECK-NEXT: loop BB14_3{{$}} -; CHECK: br_if {{[^,]*}}, BB14_4{{$}} -; CHECK: br_if {{[^,]*}}, BB14_1{{$}} -; CHECK-NEXT: BB14_3: +; CHECK: .LBB14_1: +; CHECK-NEXT: block{{$}} +; CHECK-NEXT: loop{{$}} +; CHECK: br_if {{[^,]*}}, 2{{$}} +; CHECK: br_if {{[^,]*}}, 0{{$}} +; CHECK-NEXT: end_loop{{$}} ; CHECK: return{{$}} -; CHECK-NEXT: BB14_4: +; CHECK-NEXT: .LBB14_4: ; CHECK: return{{$}} ; OPT-LABEL: test5: -; OPT: BB14_1: -; OPT-NEXT: block BB14_4{{$}} -; OPT-NEXT: loop BB14_3{{$}} -; OPT: br_if {{[^,]*}}, BB14_4{{$}} -; OPT: br_if {{[^,]*}}, BB14_1{{$}} -; OPT-NEXT: BB14_3: +; OPT: .LBB14_1: +; OPT-NEXT: block{{$}} +; OPT-NEXT: loop{{$}} +; OPT: br_if {{[^,]*}}, 2{{$}} +; OPT: br_if {{[^,]*}}, 0{{$}} +; OPT-NEXT: end_loop{{$}} ; OPT: return{{$}} -; OPT-NEXT: BB14_4: +; OPT-NEXT: .LBB14_4: ; OPT: return{{$}} define void @test5(i1 %p, i1 %q) { entry: @@ -568,41 +586,45 @@ return: ; which has another predecessor. ; CHECK-LABEL: test6: -; CHECK: BB15_1: -; CHECK-NEXT: block BB15_6{{$}} -; CHECK-NEXT: block BB15_5{{$}} -; CHECK-NEXT: loop BB15_4{{$}} +; CHECK: .LBB15_1: +; CHECK-NEXT: block{{$}} +; CHECK-NEXT: block{{$}} +; CHECK-NEXT: loop{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB15_6{{$}} +; CHECK: br_if {{[^,]*}}, 3{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB15_5{{$}} +; CHECK: br_if {{[^,]*}}, 2{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB15_1{{$}} -; CHECK-NEXT: BB15_4: +; CHECK: br_if {{[^,]*}}, 0{{$}} +; CHECK-NEXT: end_loop{{$}} ; CHECK-NOT: block ; CHECK: return{{$}} -; CHECK-NEXT: BB15_5: +; CHECK-NEXT: .LBB15_5: +; CHECK-NEXT: end_block{{$}} ; CHECK-NOT: block -; CHECK: BB15_6: +; CHECK: .LBB15_6: +; CHECK-NEXT: end_block{{$}} ; CHECK-NOT: block ; CHECK: return{{$}} ; OPT-LABEL: test6: -; OPT: BB15_1: -; OPT-NEXT: block BB15_6{{$}} -; OPT-NEXT: block BB15_5{{$}} -; OPT-NEXT: loop BB15_4{{$}} +; OPT: .LBB15_1: +; OPT-NEXT: block{{$}} +; OPT-NEXT: block{{$}} +; OPT-NEXT: loop{{$}} ; OPT-NOT: block -; OPT: br_if {{[^,]*}}, BB15_6{{$}} +; OPT: br_if {{[^,]*}}, 3{{$}} ; OPT-NOT: block -; OPT: br_if {{[^,]*}}, BB15_5{{$}} +; OPT: br_if {{[^,]*}}, 2{{$}} ; OPT-NOT: block -; OPT: br_if {{[^,]*}}, BB15_1{{$}} -; OPT-NEXT: BB15_4: +; OPT: br_if {{[^,]*}}, 0{{$}} +; OPT-NEXT: end_loop{{$}} ; OPT-NOT: block ; OPT: return{{$}} -; OPT-NEXT: BB15_5: +; OPT-NEXT: .LBB15_5: +; OPT-NEXT: end_block{{$}} ; OPT-NOT: block -; OPT: BB15_6: +; OPT: .LBB15_6: +; OPT-NEXT: end_block{{$}} ; OPT-NOT: block ; OPT: return{{$}} define void @test6(i1 %p, i1 %q) { @@ -638,36 +660,38 @@ second: ; that end in unreachable. ; CHECK-LABEL: test7: -; CHECK: BB16_1: -; CHECK-NEXT: loop BB16_5{{$}} +; CHECK: .LBB16_1: +; CHECK-NEXT: loop{{$}} ; CHECK-NOT: block -; CHECK: block BB16_4{{$}} -; CHECK: br_if {{[^,]*}}, BB16_4{{$}} +; CHECK: block{{$}} +; CHECK: br_if {{[^,]*}}, 0{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB16_1{{$}} +; CHECK: br_if {{[^,]*}}, 1{{$}} ; CHECK-NOT: block ; CHECK: unreachable -; CHECK_NEXT: BB16_4: +; CHECK-NEXT: .LBB16_4: +; CHECK-NEXT: end_block{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB16_1{{$}} -; CHECK-NEXT: BB16_5: +; CHECK: br_if {{[^,]*}}, 0{{$}} +; CHECK-NEXT: end_loop{{$}} ; CHECK-NOT: block ; CHECK: unreachable ; OPT-LABEL: test7: -; OPT: BB16_1: -; OPT-NEXT: loop BB16_5{{$}} +; OPT: .LBB16_1: +; OPT-NEXT: loop{{$}} ; OPT-NOT: block -; OPT: block BB16_4{{$}} +; OPT: block{{$}} ; OPT-NOT: block -; OPT: br_if {{[^,]*}}, BB16_4{{$}} +; OPT: br_if {{[^,]*}}, 0{{$}} ; OPT-NOT: block -; OPT: br_if {{[^,]*}}, BB16_1{{$}} +; OPT: br_if {{[^,]*}}, 1{{$}} ; OPT-NOT: block ; OPT: unreachable -; OPT_NEXT: BB16_4: +; OPT-NEXT: .LBB16_4: +; OPT-NEXT: end_block{{$}} ; OPT-NOT: block -; OPT: br_if {{[^,]*}}, BB16_1{{$}} -; OPT-NEXT: BB16_5: +; OPT: br_if {{[^,]*}}, 0{{$}} +; OPT-NEXT: end_loop{{$}} ; OPT-NOT: block ; OPT: unreachable define void @test7(i1 %tobool2, i1 %tobool9) { @@ -699,31 +723,33 @@ u1: ; Test an interesting case using nested loops and switches. ; CHECK-LABEL: test8: -; CHECK: BB17_1: -; CHECK-NEXT: loop BB17_4{{$}} -; CHECK-NEXT: block BB17_3{{$}} +; CHECK: .LBB17_1: +; CHECK-NEXT: loop{{$}} +; CHECK-NEXT: block{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB17_3{{$}} +; CHECK: br_if {{[^,]*}}, 0{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB17_1{{$}} -; CHECK-NEXT: BB17_3: -; CHECK-NEXT: loop BB17_4{{$}} -; CHECK-NEXT: br_if {{[^,]*}}, BB17_3{{$}} -; CHECK-NEXT: br BB17_1{{$}} -; CHECK-NEXT: BB17_4: +; CHECK: br_if {{[^,]*}}, 1{{$}} +; CHECK-NEXT: .LBB17_3: +; CHECK-NEXT: end_block{{$}} +; CHECK-NEXT: loop{{$}} +; CHECK-NEXT: br_if {{[^,]*}}, 0{{$}} +; CHECK-NEXT: br 2{{$}} +; CHECK-NEXT: .LBB17_4: ; OPT-LABEL: test8: -; OPT: BB17_1: -; OPT-NEXT: loop BB17_4{{$}} -; OPT-NEXT: block BB17_3{{$}} +; OPT: .LBB17_1: +; OPT-NEXT: loop{{$}} +; OPT-NEXT: block{{$}} ; OPT-NOT: block -; OPT: br_if {{[^,]*}}, BB17_3{{$}} +; OPT: br_if {{[^,]*}}, 0{{$}} ; OPT-NOT: block -; OPT: br_if {{[^,]*}}, BB17_1{{$}} -; OPT-NEXT: BB17_3: -; OPT-NEXT: loop BB17_4{{$}} -; OPT-NEXT: br_if {{[^,]*}}, BB17_3{{$}} -; OPT-NEXT: br BB17_1{{$}} -; OPT-NEXT: BB17_4: +; OPT: br_if {{[^,]*}}, 1{{$}} +; OPT-NEXT: .LBB17_3: +; OPT-NEXT: end_block{{$}} +; OPT-NEXT: loop{{$}} +; OPT-NEXT: br_if {{[^,]*}}, 0{{$}} +; OPT-NEXT: br 2{{$}} +; OPT-NEXT: .LBB17_4: define i32 @test8() { bb: br label %bb1 @@ -745,45 +771,47 @@ bb3: ; Test an interesting case using nested loops that share a bottom block. ; CHECK-LABEL: test9: -; CHECK: BB18_1: -; CHECK-NEXT: loop BB18_5{{$}} +; CHECK: .LBB18_1: +; CHECK-NEXT: loop{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB18_5{{$}} -; CHECK-NEXT: BB18_2: -; CHECK-NEXT: loop BB18_5{{$}} +; CHECK: br_if {{[^,]*}}, 1{{$}} +; CHECK-NEXT: .LBB18_2: +; CHECK-NEXT: loop{{$}} ; CHECK-NOT: block -; CHECK: block BB18_4{{$}} +; CHECK: block{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB18_4{{$}} +; CHECK: br_if {{[^,]*}}, 0{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB18_2{{$}} -; CHECK-NEXT: br BB18_1{{$}} -; CHECK-NEXT: BB18_4: +; CHECK: br_if {{[^,]*}}, 1{{$}} +; CHECK-NEXT: br 3{{$}} +; CHECK-NEXT: .LBB18_4: +; CHECK-NEXT: end_block{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB18_2{{$}} -; CHECK-NEXT: br BB18_1{{$}} -; CHECK-NEXT: BB18_5: +; CHECK: br_if {{[^,]*}}, 0{{$}} +; CHECK-NEXT: br 2{{$}} +; CHECK-NEXT: .LBB18_5: ; CHECK-NOT: block ; CHECK: return{{$}} ; OPT-LABEL: test9: -; OPT: BB18_1: -; OPT-NEXT: loop BB18_5{{$}} +; OPT: .LBB18_1: +; OPT-NEXT: loop{{$}} ; OPT-NOT: block -; OPT: br_if {{[^,]*}}, BB18_5{{$}} -; OPT-NEXT: BB18_2: -; OPT-NEXT: loop BB18_5{{$}} +; OPT: br_if {{[^,]*}}, 1{{$}} +; OPT-NEXT: .LBB18_2: +; OPT-NEXT: loop{{$}} ; OPT-NOT: block -; OPT: block BB18_4{{$}} +; OPT: block{{$}} ; OPT-NOT: block -; OPT: br_if {{[^,]*}}, BB18_4{{$}} +; OPT: br_if {{[^,]*}}, 0{{$}} ; OPT-NOT: block -; OPT: br_if {{[^,]*}}, BB18_2{{$}} -; OPT-NEXT: br BB18_1{{$}} -; OPT-NEXT: BB18_4: +; OPT: br_if {{[^,]*}}, 1{{$}} +; OPT-NEXT: br 3{{$}} +; OPT-NEXT: .LBB18_4: +; OPT-NEXT: end_block{{$}} ; OPT-NOT: block -; OPT: br_if {{[^,]*}}, BB18_2{{$}} -; OPT-NEXT: br BB18_1{{$}} -; OPT-NEXT: BB18_5: +; OPT: br_if {{[^,]*}}, 0{{$}} +; OPT-NEXT: br 2{{$}} +; OPT-NEXT: .LBB18_5: ; OPT-NOT: block ; OPT: return{{$}} declare i1 @a() @@ -821,47 +849,53 @@ end: ; and loop exits to a block with unreachable. ; CHECK-LABEL: test10: -; CHECK: BB19_1: -; CHECK-NEXT: loop BB19_7{{$}} +; CHECK: .LBB19_1: +; CHECK-NEXT: loop{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB19_1{{$}} -; CHECK-NEXT: BB19_2: -; CHECK-NEXT: block BB19_6{{$}} -; CHECK-NEXT: loop BB19_5{{$}} +; CHECK: br_if {{[^,]*}}, 0{{$}} +; CHECK-NEXT: .LBB19_2: +; CHECK-NEXT: block{{$}} +; CHECK-NEXT: loop{{$}} ; CHECK-NOT: block -; CHECK: BB19_3: -; CHECK-NEXT: loop BB19_5{{$}} +; CHECK: .LBB19_3: +; CHECK-NEXT: loop{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB19_1{{$}} +; CHECK: br_if {{[^,]*}}, 5{{$}} ; CHECK-NOT: block -; CHECK: tableswitch {{[^,]*}}, BB19_3, BB19_3, BB19_5, BB19_1, BB19_2, BB19_6{{$}} -; CHECK-NEXT: BB19_5: +; CHECK: tableswitch {{[^,]*}}, 0, 0, 1, 5, 2, 4{{$}} +; CHECK-NEXT: .LBB19_5: +; CHECK-NEXT: end_loop{{$}} +; CHECK-NEXT: end_loop{{$}} ; CHECK-NEXT: return{{$}} -; CHECK-NEXT: BB19_6: +; CHECK-NEXT: .LBB19_6: +; CHECK-NEXT: end_block{{$}} ; CHECK-NOT: block -; CHECK: br BB19_1{{$}} -; CHECK-NEXT: BB19_7: +; CHECK: br 0{{$}} +; CHECK-NEXT: .LBB19_7: ; OPT-LABEL: test10: -; OPT: BB19_1: -; OPT-NEXT: loop BB19_7{{$}} +; OPT: .LBB19_1: +; OPT-NEXT: loop{{$}} ; OPT-NOT: block -; OPT: br_if {{[^,]*}}, BB19_1{{$}} -; OPT-NEXT: BB19_2: -; OPT-NEXT: block BB19_6{{$}} -; OPT-NEXT: loop BB19_5{{$}} +; OPT: br_if {{[^,]*}}, 0{{$}} +; OPT-NEXT: .LBB19_2: +; OPT-NEXT: block{{$}} +; OPT-NEXT: loop{{$}} ; OPT-NOT: block -; OPT: BB19_3: -; OPT-NEXT: loop BB19_5{{$}} +; OPT: .LBB19_3: +; OPT-NEXT: loop{{$}} ; OPT-NOT: block -; OPT: br_if {{[^,]*}}, BB19_1{{$}} +; OPT: br_if {{[^,]*}}, 5{{$}} ; OPT-NOT: block -; OPT: tableswitch {{[^,]*}}, BB19_3, BB19_3, BB19_5, BB19_1, BB19_2, BB19_6{{$}} -; OPT-NEXT: BB19_5: +; OPT: tableswitch {{[^,]*}}, 0, 0, 1, 5, 2, 4{{$}} +; OPT-NEXT: .LBB19_5: +; OPT-NEXT: end_loop{{$}} +; OPT-NEXT: end_loop{{$}} ; OPT-NEXT: return{{$}} -; OPT-NEXT: BB19_6: +; OPT-NEXT: .LBB19_6: +; OPT-NEXT: end_block{{$}} ; OPT-NOT: block -; OPT: br BB19_1{{$}} -; OPT-NEXT: BB19_7: +; OPT: br 0{{$}} +; OPT-NEXT: .LBB19_7: define void @test10() { bb0: br label %bb1 @@ -900,58 +934,67 @@ bb6: ; Test a CFG DAG with interesting merging. ; CHECK-LABEL: test11: -; CHECK: block BB20_8{{$}} -; CHECK-NEXT: block BB20_7{{$}} -; CHECK-NEXT: block BB20_6{{$}} -; CHECK-NEXT: block BB20_4{{$}} -; CHECK-NEXT: br_if {{[^,]*}}, BB20_4{{$}} +; CHECK: block{{$}} +; CHECK-NEXT: block{{$}} +; CHECK-NEXT: block{{$}} +; CHECK-NEXT: block{{$}} +; CHECK-NEXT: br_if {{[^,]*}}, 0{{$}} +; CHECK-NEXT: block{{$}} ; CHECK-NOT: block -; CHECK: block BB20_3{{$}} -; CHECK: br_if {{[^,]*}}, BB20_3{{$}} +; CHECK: br_if {{[^,]*}}, 0{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB20_6{{$}} -; CHECK-NEXT: BB20_3: +; CHECK: br_if {{[^,]*}}, 2{{$}} +; CHECK-NEXT: .LBB20_3: +; CHECK-NEXT: end_block{{$}} ; CHECK-NOT: block ; CHECK: return{{$}} -; CHECK-NEXT: BB20_4: +; CHECK-NEXT: .LBB20_4: +; CHECK-NEXT: end_block{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB20_8{{$}} +; CHECK: br_if {{[^,]*}}, 2{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB20_7{{$}} -; CHECK-NEXT: BB20_6: +; CHECK: br_if {{[^,]*}}, 1{{$}} +; CHECK-NEXT: .LBB20_6: +; CHECK-NEXT: end_block{{$}} ; CHECK-NOT: block ; CHECK: return{{$}} -; CHECK-NEXT: BB20_7: +; CHECK-NEXT: .LBB20_7: +; CHECK-NEXT: end_block{{$}} ; CHECK-NOT: block ; CHECK: return{{$}} -; CHECK-NEXT: BB20_8: +; CHECK-NEXT: .LBB20_8: +; CHECK-NEXT: end_block{{$}} ; CHECK-NOT: block ; CHECK: return{{$}} ; OPT-LABEL: test11: -; OPT: block BB20_8{{$}} -; OPT-NEXT: block BB20_4{{$}} -; OPT-NEXT: br_if $0, BB20_4{{$}} +; OPT: block{{$}} +; OPT-NEXT: block{{$}} +; OPT-NEXT: br_if $0, 0{{$}} +; OPT-NEXT: block{{$}} ; OPT-NOT: block -; OPT: block BB20_3{{$}} -; OPT: br_if $0, BB20_3{{$}} +; OPT: br_if $0, 0{{$}} ; OPT-NOT: block -; OPT: br_if $0, BB20_8{{$}} -; OPT-NEXT: BB20_3: +; OPT: br_if $0, 2{{$}} +; OPT-NEXT: .LBB20_3: +; OPT-NEXT: end_block{{$}} ; OPT-NOT: block ; OPT: return{{$}} -; OPT-NEXT: BB20_4: +; OPT-NEXT: .LBB20_4: +; OPT-NEXT: end_block{{$}} ; OPT-NOT: block -; OPT: block BB20_6{{$}} +; OPT: block{{$}} ; OPT-NOT: block -; OPT: br_if $pop9, BB20_6{{$}} +; OPT: br_if $pop9, 0{{$}} ; OPT-NOT: block ; OPT: return{{$}} -; OPT-NEXT: BB20_6: +; OPT-NEXT: .LBB20_6: +; OPT-NEXT: end_block{{$}} ; OPT-NOT: block -; OPT: br_if $0, BB20_8{{$}} +; OPT: br_if $0, 0{{$}} ; OPT-NOT: block ; OPT: return{{$}} -; OPT-NEXT: BB20_8: +; OPT-NEXT: .LBB20_8: +; OPT-NEXT: end_block{{$}} ; OPT-NOT: block ; OPT: return{{$}} define void @test11() { @@ -985,53 +1028,59 @@ bb8: } ; CHECK-LABEL: test12: -; CHECK: BB21_1: -; CHECK-NEXT: loop BB21_8{{$}} +; CHECK: .LBB21_1: +; CHECK-NEXT: loop{{$}} ; CHECK-NOT: block -; CHECK: block BB21_7{{$}} -; CHECK-NEXT: block BB21_6{{$}} -; CHECK-NEXT: block BB21_4{{$}} -; CHECK: br_if {{[^,]*}}, BB21_4{{$}} +; CHECK: block{{$}} +; CHECK-NEXT: block{{$}} +; CHECK-NEXT: block{{$}} +; CHECK: br_if {{[^,]*}}, 0{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB21_7{{$}} +; CHECK: br_if {{[^,]*}}, 2{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB21_7{{$}} -; CHECK-NEXT: br BB21_6{{$}} -; CHECK-NEXT: BB21_4: +; CHECK: br_if {{[^,]*}}, 2{{$}} +; CHECK-NEXT: br 1{{$}} +; CHECK-NEXT: .LBB21_4: +; CHECK-NEXT: end_block{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB21_7{{$}} +; CHECK: br_if {{[^,]*}}, 1{{$}} ; CHECK-NOT: block -; CHECK: br_if {{[^,]*}}, BB21_7{{$}} -; CHECK-NEXT: BB21_6: +; CHECK: br_if {{[^,]*}}, 1{{$}} +; CHECK-NEXT: .LBB21_6: +; CHECK-NEXT: end_block{{$}} ; CHECK-NEXT: return{{$}} -; CHECK-NEXT: BB21_7: +; CHECK-NEXT: .LBB21_7: +; CHECK-NEXT: end_block{{$}} ; CHECK-NOT: block -; CHECK: br BB21_1{{$}} -; CHECK-NEXT: BB21_8: +; CHECK: br 0{{$}} +; CHECK-NEXT: .LBB21_8: ; OPT-LABEL: test12: -; OPT: BB21_1: -; OPT-NEXT: loop BB21_8{{$}} +; OPT: .LBB21_1: +; OPT-NEXT: loop{{$}} ; OPT-NOT: block -; OPT: block BB21_7{{$}} -; OPT-NEXT: block BB21_6{{$}} -; OPT-NEXT: block BB21_4{{$}} -; OPT: br_if {{[^,]*}}, BB21_4{{$}} +; OPT: block{{$}} +; OPT-NEXT: block{{$}} +; OPT-NEXT: block{{$}} +; OPT: br_if {{[^,]*}}, 0{{$}} ; OPT-NOT: block -; OPT: br_if {{[^,]*}}, BB21_7{{$}} +; OPT: br_if {{[^,]*}}, 2{{$}} ; OPT-NOT: block -; OPT: br_if {{[^,]*}}, BB21_7{{$}} -; OPT-NEXT: br BB21_6{{$}} -; OPT-NEXT: BB21_4: +; OPT: br_if {{[^,]*}}, 2{{$}} +; OPT-NEXT: br 1{{$}} +; OPT-NEXT: .LBB21_4: +; OPT-NEXT: end_block{{$}} ; OPT-NOT: block -; OPT: br_if {{[^,]*}}, BB21_7{{$}} +; OPT: br_if {{[^,]*}}, 1{{$}} ; OPT-NOT: block -; OPT: br_if {{[^,]*}}, BB21_7{{$}} -; OPT-NEXT: BB21_6: +; OPT: br_if {{[^,]*}}, 1{{$}} +; OPT-NEXT: .LBB21_6: +; OPT-NEXT: end_block{{$}} ; OPT-NEXT: return{{$}} -; OPT-NEXT: BB21_7: +; OPT-NEXT: .LBB21_7: +; OPT-NEXT: end_block{{$}} ; OPT-NOT: block -; OPT: br BB21_1{{$}} -; OPT-NEXT: BB21_8: +; OPT: br 0{{$}} +; OPT-NEXT: .LBB21_8: define void @test12(i8* %arg) { bb: br label %bb1 @@ -1060,30 +1109,34 @@ bb7: ; optnone to disable optimizations to test this case. ; CHECK-LABEL: test13: -; CHECK-NEXT: .local i32{{$}} -; CHECK: block BB22_2{{$}} -; CHECK: br_if $pop4, BB22_2{{$}} +; CHECK-NEXT: local i32{{$}} +; CHECK: block{{$}} +; CHECK: br_if $pop4, 0{{$}} ; CHECK-NEXT: return{{$}} -; CHECK-NEXT: BB22_2: -; CHECK: block BB22_4{{$}} -; CHECK-NEXT: br_if $0, BB22_4{{$}} -; CHECK: BB22_4: -; CHECK: block BB22_5{{$}} -; CHECK: br_if $pop6, BB22_5{{$}} -; CHECK-NEXT: BB22_5: +; CHECK-NEXT: .LBB22_2: +; CHECK-NEXT: end_block{{$}} +; CHECK: block{{$}} +; CHECK-NEXT: br_if $0, 0{{$}} +; CHECK: .LBB22_4: +; CHECK-NEXT: end_block{{$}} +; CHECK: block{{$}} +; CHECK: br_if $pop6, 0{{$}} +; CHECK-NEXT: end_block{{$}} ; CHECK-NEXT: unreachable{{$}} ; OPT-LABEL: test13: -; OPT-NEXT: .local i32{{$}} -; OPT: block BB22_2{{$}} -; OPT: br_if $pop4, BB22_2{{$}} +; OPT-NEXT: local i32{{$}} +; OPT: block{{$}} +; OPT: br_if $pop4, 0{{$}} ; OPT-NEXT: return{{$}} -; OPT-NEXT: BB22_2: -; OPT: block BB22_4{{$}} -; OPT-NEXT: br_if $0, BB22_4{{$}} -; OPT: BB22_4: -; OPT: block BB22_5{{$}} -; OPT: br_if $pop6, BB22_5{{$}} -; OPT-NEXT: BB22_5: +; OPT-NEXT: .LBB22_2: +; OPT-NEXT: end_block{{$}} +; OPT: block{{$}} +; OPT-NEXT: br_if $0, 0{{$}} +; OPT: .LBB22_4: +; OPT-NEXT: end_block{{$}} +; OPT: block{{$}} +; OPT: br_if $pop6, 0{{$}} +; OPT-NEXT: end_block{{$}} ; OPT-NEXT: unreachable{{$}} define void @test13() noinline optnone { bb: @@ -1100,3 +1153,65 @@ bb4: bb5: ret void } + +; Test a case with a single-block loop that has another loop +; as a successor. The end_loop for the first loop should go +; before the loop for the second. + +; CHECK-LABEL: test14: +; CHECK-NEXT: local i32{{$}} +; CHECK-NEXT: i32.const $0=, 0{{$}} +; CHECK-NEXT: .LBB23_1:{{$}} +; CHECK-NEXT: loop{{$}} +; CHECK-NEXT: br_if $0, 0{{$}} +; CHECK-NEXT: .LBB23_2:{{$}} +; CHECK-NEXT: end_loop{{$}} +; CHECK-NEXT: loop{{$}} +; CHECK-NEXT: br_if $0, 0{{$}} +; CHECK-NEXT: end_loop{{$}} +; CHECK-NEXT: return{{$}} +define void @test14() { +bb: + br label %bb1 + +bb1: + %tmp = bitcast i1 undef to i1 + br i1 %tmp, label %bb3, label %bb1 + +bb3: + br label %bb4 + +bb4: + br i1 undef, label %bb7, label %bb48 + +bb7: + br i1 undef, label %bb12, label %bb12 + +bb12: + br i1 undef, label %bb17, label %bb17 + +bb17: + br i1 undef, label %bb22, label %bb22 + +bb22: + br i1 undef, label %bb27, label %bb27 + +bb27: + br i1 undef, label %bb30, label %bb30 + +bb30: + br i1 undef, label %bb35, label %bb35 + +bb35: + br i1 undef, label %bb38, label %bb38 + +bb38: + br i1 undef, label %bb48, label %bb48 + +bb48: + %tmp49 = bitcast i1 undef to i1 + br i1 %tmp49, label %bb3, label %bb50 + +bb50: + ret void +} |