summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/WebAssembly/cfg-stackify.ll
diff options
context:
space:
mode:
authorDan Gohman <dan433584@gmail.com>2015-11-23 16:19:56 +0000
committerDan Gohman <dan433584@gmail.com>2015-11-23 16:19:56 +0000
commit3280793234d1feb348596726ef2ee0cf1e6593d2 (patch)
tree72d491fc7ff5ed4fae536e2b18dcea4a3d68ade3 /llvm/test/CodeGen/WebAssembly/cfg-stackify.ll
parent2b561336d92ffcdfa37fb31ac2219975a1998a41 (diff)
downloadbcm5719-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.ll43
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()
OpenPOWER on IntegriCloud