summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp7
-rw-r--r--llvm/test/CodeGen/WebAssembly/cfg-stackify.ll65
2 files changed, 32 insertions, 40 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
index 2e2a1194502..ac185890903 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
@@ -58,9 +58,9 @@ WebAssemblyTargetMachine::WebAssemblyTargetMachine(
initAsmInfo();
- // We need a reducible CFG, so disable some optimizations which tend to
- // introduce irreducibility.
- setRequiresStructuredCFG(true);
+ // Note that we don't use setRequiresStructuredCFG(true). It disables
+ // optimizations than we're ok with, and want, such as critical edge
+ // splitting and tail merging.
}
WebAssemblyTargetMachine::~WebAssemblyTargetMachine() {}
@@ -184,6 +184,7 @@ void WebAssemblyPassConfig::addPostRegAlloc() {
disablePass(&PrologEpilogCodeInserterID);
// Fails with: should be run after register allocation.
disablePass(&MachineCopyPropagationID);
+ disablePass(&TailDuplicateID);
if (getOptLevel() != CodeGenOpt::None) {
// Mark registers as representing wasm's expression stack.
diff --git a/llvm/test/CodeGen/WebAssembly/cfg-stackify.ll b/llvm/test/CodeGen/WebAssembly/cfg-stackify.ll
index 58d099414ad..e831b534990 100644
--- a/llvm/test/CodeGen/WebAssembly/cfg-stackify.ll
+++ b/llvm/test/CodeGen/WebAssembly/cfg-stackify.ll
@@ -459,9 +459,7 @@ exit:
; OPT-LABEL: test3:
; OPT: block
; OPT: br_if
-; OPT-NEXT: return
-; OPT-NEXT: .LBB{{[0-9]+}}_{{[0-9]+}}:
-; OPT-NEXT: end_block
+; OPT: .LBB{{[0-9]+}}_{{[0-9]+}}:
; OPT-NEXT: loop
; OPT-NEXT: block
; OPT-NEXT: block
@@ -513,44 +511,35 @@ if.end:
; CHECK: block{{$}}
; CHECK-NEXT: block{{$}}
; CHECK: br_if 0, $pop{{[0-9]+}}{{$}}
-; CHECK-NEXT: block{{$}}
-; CHECK: br_if 0, $pop{{[0-9]+}}{{$}}
-; CHECK: br_if 2, $pop{{[0-9]+}}{{$}}
+; CHECK: br_if 1, $pop{{[0-9]+}}{{$}}
+; CHECK: br 1{{$}}
; CHECK-NEXT: .LBB13_3:
; CHECK-NEXT: end_block{{$}}
-; CHECK-NEXT: return{{$}}
-; CHECK-NEXT: .LBB13_4:
-; CHECK-NEXT: end_block{{$}}
; CHECK-NEXT: block{{$}}
-; CHECK: br_if 0, $pop{{[0-9]+}}{{$}}
-; CHECK: br_if 1, $pop{{[0-9]+}}{{$}}
-; CHECK-NEXT: return{{$}}
-; CHECK-NEXT: .LBB13_7:
+; CHECK: br_if 0, $pop{{[0-9]+}}{{$}}
+; CHECK: br_if 1, $pop{{[0-9]+}}{{$}}
+; CHECK-NEXT: .LBB13_5:
; CHECK-NEXT: end_block{{$}}
; CHECK-NEXT: return{{$}}
-; CHECK-NEXT: .LBB13_8:
+; CHECK-NEXT: .LBB13_6:
; CHECK-NEXT: end_block{{$}}
; CHECK-NEXT: return{{$}}
; OPT-LABEL: test4:
; OPT-NEXT: .param i32{{$}}
; OPT: block{{$}}
; OPT-NEXT: block{{$}}
-; OPT-NEXT: block{{$}}
-; OPT: br_if 0, $pop{{[0-9]+}}{{$}}
-; OPT-NEXT: block{{$}}
; OPT: br_if 0, $pop{{[0-9]+}}{{$}}
-; OPT: br_if 2, $pop{{[0-9]+}}{{$}}
+; OPT: br_if 1, $pop{{[0-9]+}}{{$}}
+; OPT: br 1{{$}}
; OPT-NEXT: .LBB13_3:
; OPT-NEXT: end_block{{$}}
-; OPT-NEXT: return{{$}}
-; OPT-NEXT: .LBB13_4:
-; OPT: br_if 1, $pop{{[0-9]+}}{{$}}
+; OPT-NEXT: block{{$}}
; OPT: br_if 0, $pop{{[0-9]+}}{{$}}
-; OPT-NEXT: return{{$}}
-; OPT-NEXT: .LBB13_7:
+; OPT: br_if 1, $pop{{[0-9]+}}{{$}}
+; OPT-NEXT: .LBB13_5:
; OPT-NEXT: end_block{{$}}
; OPT-NEXT: return{{$}}
-; OPT-NEXT: .LBB13_8:
+; OPT-NEXT: .LBB13_6:
; OPT-NEXT: end_block{{$}}
; OPT-NEXT: return{{$}}
define void @test4(i32 %t) {
@@ -826,13 +815,13 @@ bb3:
; CHECK-NOT: block
; CHECK: br_if 0, {{[^,]+}}{{$}}
; CHECK-NOT: block
-; CHECK: br_if 1, {{[^,]+}}{{$}}
-; CHECK-NEXT: br 3{{$}}
+; CHECK: br_if 3, {{[^,]+}}{{$}}
+; CHECK-NEXT: br 1{{$}}
; CHECK-NEXT: .LBB18_4:
; CHECK-NEXT: end_block{{$}}
; CHECK-NOT: block
-; CHECK: br_if 0, {{[^,]+}}{{$}}
-; CHECK-NEXT: br 2{{$}}
+; CHECK: br_if 2, {{[^,]+}}{{$}}
+; CHECK-NEXT: br 0{{$}}
; CHECK-NEXT: .LBB18_5:
; CHECK-NOT: block
; CHECK: return{{$}}
@@ -1267,34 +1256,36 @@ bb50:
; CHECK: block
; CHECK-NEXT: block
; CHECK: br_if 0, $pop{{.*}}{{$}}
-; CHECK-NEXT: .LBB24_1:
+; CHECK: .LBB24_2:
; CHECK-NEXT: block{{$}}
; CHECK-NEXT: loop{{$}}
; CHECK: br_if 1, $pop{{.*}}{{$}}
-; CHECK: br_if 2, $pop{{.*}}{{$}}
-; CHECK-NEXT: br 0{{$}}
-; CHECK-NEXT: .LBB24_3:
+; CHECK: br_if 0, ${{.*}}{{$}}
+; CHECK-NEXT: br 2{{$}}
+; CHECK-NEXT: .LBB24_4:
; CHECK-NEXT: end_loop{{$}}
-; CHECK: .LBB24_4:
+; CHECK: .LBB24_5:
; CHECK-NEXT: end_block{{$}}
; CHECK: br_if 1, $pop{{.*}}{{$}}
; CHECK: return{{$}}
-; CHECK: .LBB24_6:
-; CHECK-NEXT: end_block{{$}}
-; CHECK: return{{$}}
; CHECK: .LBB24_7:
; CHECK-NEXT: end_block{{$}}
+; CHECK: .LBB24_8:
+; CHECK-NEXT: end_block{{$}}
; CHECK-NEXT: return{{$}}
; OPT-LABEL: test15:
; OPT: block
+; OPT: block
; OPT-NEXT: i32.const $push
; OPT-NEXT: i32.const $push
; OPT-NEXT: i32.eq $push{{.*}}=, $pop{{.*}}, $pop{{.*}}{{$}}
; OPT-NEXT: br_if 0, $pop{{.*}}{{$}}
; OPT-NEXT: call test15_callee1@FUNCTION{{$}}
-; OPT-NEXT: return{{$}}
+; OPT-NEXT: br 1{{$}}
; OPT-NEXT: .LBB24_2:
; OPT-NEXT: end_block
+; OPT-NEXT: i32.const
+; OPT-NEXT: .LBB24_3:
; OPT-NEXT: block
; OPT-NEXT: loop
%0 = type { i8, i32 }
OpenPOWER on IntegriCloud