diff options
author | Dan Gohman <dan433584@gmail.com> | 2015-11-23 16:19:56 +0000 |
---|---|---|
committer | Dan Gohman <dan433584@gmail.com> | 2015-11-23 16:19:56 +0000 |
commit | 3280793234d1feb348596726ef2ee0cf1e6593d2 (patch) | |
tree | 72d491fc7ff5ed4fae536e2b18dcea4a3d68ade3 /llvm/test/CodeGen/WebAssembly/cfg-stackify.ll | |
parent | 2b561336d92ffcdfa37fb31ac2219975a1998a41 (diff) | |
download | bcm5719-llvm-3280793234d1feb348596726ef2ee0cf1e6593d2.tar.gz bcm5719-llvm-3280793234d1feb348596726ef2ee0cf1e6593d2.zip |
[WebAssembly] Use dominator information to improve BLOCK placement
Always starting blocks at the top of their containing loops works, but creates
unnecessarily deep nesting because it makes all blocks in a loop overlap.
Refine the BLOCK placement algorithm to start blocks at nearest common
dominating points instead, which significantly shrinks them and reduces
overlapping.
llvm-svn: 253876
Diffstat (limited to 'llvm/test/CodeGen/WebAssembly/cfg-stackify.ll')
-rw-r--r-- | llvm/test/CodeGen/WebAssembly/cfg-stackify.ll | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/llvm/test/CodeGen/WebAssembly/cfg-stackify.ll b/llvm/test/CodeGen/WebAssembly/cfg-stackify.ll index 9d1ef58796b..cac98199215 100644 --- a/llvm/test/CodeGen/WebAssembly/cfg-stackify.ll +++ b/llvm/test/CodeGen/WebAssembly/cfg-stackify.ll @@ -99,9 +99,9 @@ for.end: ; CHECK-LABEL: doublediamond: ; CHECK: block BB3_5{{$}} -; CHECK: block BB3_4{{$}} ; CHECK: block BB3_2{{$}} ; CHECK: br_if $pop{{[0-9]+}}, BB3_2{{$}} +; CHECK: block BB3_4{{$}} ; CHECK: br_if $pop{{[0-9]+}}, BB3_4{{$}} ; CHECK: br BB3_5{{$}} ; CHECK: BB3_4: @@ -216,8 +216,8 @@ exit: ; CHECK-LABEL: doubletriangle: ; CHECK: block BB9_4{{$}} -; CHECK: block BB9_3{{$}} ; CHECK: br_if $pop{{[0-9]+}}, BB9_4{{$}} +; CHECK: block BB9_3{{$}} ; CHECK: br_if $pop{{[0-9]+}}, BB9_3{{$}} ; CHECK: BB9_3: ; CHECK: BB9_4: @@ -271,6 +271,45 @@ exit: ret i32 0 } +; CHECK-LABEL: doublediamond_in_a_loop: +; CHECK: BB11_1: +; CHECK: loop BB11_7{{$}} +; CHECK: block BB11_6{{$}} +; CHECK: block BB11_3{{$}} +; CHECK: br_if $pop{{.*}}, BB11_3{{$}} +; CHECK: br BB11_6{{$}} +; CHECK: BB11_3: +; CHECK: block BB11_5{{$}} +; CHECK: br_if $pop{{.*}}, BB11_5{{$}} +; CHECK: br BB11_6{{$}} +; CHECK: BB11_5: +; CHECK: BB11_6: +; CHECK: br BB11_1{{$}} +define i32 @doublediamond_in_a_loop(i32 %a, i32 %b, i32* %p) { +entry: + br label %header +header: + %c = icmp eq i32 %a, 0 + %d = icmp eq i32 %b, 0 + store volatile i32 0, i32* %p + br i1 %c, label %true, label %false +true: + store volatile i32 1, i32* %p + br label %exit +false: + store volatile i32 2, i32* %p + br i1 %d, label %ft, label %ff +ft: + store volatile i32 3, i32* %p + br label %exit +ff: + store volatile i32 4, i32* %p + br label %exit +exit: + store volatile i32 5, i32* %p + br label %header +} + ; Test that nested loops are handled. declare void @bar() |