diff options
Diffstat (limited to 'llvm/test')
-rw-r--r-- | llvm/test/CodeGen/WebAssembly/cfg-stackify.ll | 2 | ||||
-rw-r--r-- | llvm/test/CodeGen/WebAssembly/global.ll | 4 | ||||
-rw-r--r-- | llvm/test/CodeGen/WebAssembly/load-ext.ll | 40 | ||||
-rw-r--r-- | llvm/test/CodeGen/WebAssembly/load-store-i1.ll | 16 | ||||
-rw-r--r-- | llvm/test/CodeGen/WebAssembly/load.ll | 19 | ||||
-rw-r--r-- | llvm/test/CodeGen/WebAssembly/memory-addr32.ll | 5 | ||||
-rw-r--r-- | llvm/test/CodeGen/WebAssembly/memory-addr64.ll | 5 | ||||
-rw-r--r-- | llvm/test/CodeGen/WebAssembly/reg-stackify.ll | 47 | ||||
-rw-r--r-- | llvm/test/CodeGen/WebAssembly/returned.ll | 35 |
9 files changed, 125 insertions, 48 deletions
diff --git a/llvm/test/CodeGen/WebAssembly/cfg-stackify.ll b/llvm/test/CodeGen/WebAssembly/cfg-stackify.ll index 4f912f32924..4a53f6e4bb9 100644 --- a/llvm/test/CodeGen/WebAssembly/cfg-stackify.ll +++ b/llvm/test/CodeGen/WebAssembly/cfg-stackify.ll @@ -174,7 +174,7 @@ exit: ; CHECK-LABEL: single_block: ; CHECK-NOT: br -; CHECK: return ${{[0-9]+}}{{$}} +; CHECK: return $pop{{[0-9]+}}{{$}} define i32 @single_block(i32* %p) { entry: store volatile i32 0, i32* %p diff --git a/llvm/test/CodeGen/WebAssembly/global.ll b/llvm/test/CodeGen/WebAssembly/global.ll index 4fd1b083591..818c454a491 100644 --- a/llvm/test/CodeGen/WebAssembly/global.ll +++ b/llvm/test/CodeGen/WebAssembly/global.ll @@ -11,8 +11,8 @@ target triple = "wasm32-unknown-unknown" ; CHECK: foo: ; CHECK: i32.const $push0=, answer{{$}} -; CHECK-NEXT: i32.load $0=, $pop0{{$}} -; CHECK-NEXT: return $0{{$}} +; CHECK-NEXT: i32.load $push1=, $pop0{{$}} +; CHECK-NEXT: return $pop1{{$}} define i32 @foo() { %a = load i32, i32* @answer ret i32 %a diff --git a/llvm/test/CodeGen/WebAssembly/load-ext.ll b/llvm/test/CodeGen/WebAssembly/load-ext.ll index 8630baa2f3d..bdccfff1d16 100644 --- a/llvm/test/CodeGen/WebAssembly/load-ext.ll +++ b/llvm/test/CodeGen/WebAssembly/load-ext.ll @@ -6,8 +6,8 @@ target datalayout = "e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32-unknown-unknown" ; CHECK-LABEL: sext_i8_i32: -; CHECK: i32.load8_s $0=, $0{{$}} -; CHECK-NEXT: return $0{{$}} +; CHECK: i32.load8_s $push0=, $0{{$}} +; CHECK-NEXT: return $pop0{{$}} define i32 @sext_i8_i32(i8 *%p) { %v = load i8, i8* %p %e = sext i8 %v to i32 @@ -15,8 +15,8 @@ define i32 @sext_i8_i32(i8 *%p) { } ; CHECK-LABEL: zext_i8_i32: -; CHECK: i32.load8_u $0=, $0{{$}} -; CHECK-NEXT: return $0{{$}} +; CHECK: i32.load8_u $push0=, $0{{$}} +; CHECK-NEXT: return $pop0{{$}} define i32 @zext_i8_i32(i8 *%p) { %v = load i8, i8* %p %e = zext i8 %v to i32 @@ -24,8 +24,8 @@ define i32 @zext_i8_i32(i8 *%p) { } ; CHECK-LABEL: sext_i16_i32: -; CHECK: i32.load16_s $0=, $0{{$}} -; CHECK-NEXT: return $0{{$}} +; CHECK: i32.load16_s $push0=, $0{{$}} +; CHECK-NEXT: return $pop0{{$}} define i32 @sext_i16_i32(i16 *%p) { %v = load i16, i16* %p %e = sext i16 %v to i32 @@ -33,8 +33,8 @@ define i32 @sext_i16_i32(i16 *%p) { } ; CHECK-LABEL: zext_i16_i32: -; CHECK: i32.load16_u $0=, $0{{$}} -; CHECK-NEXT: return $0{{$}} +; CHECK: i32.load16_u $push0=, $0{{$}} +; CHECK-NEXT: return $pop0{{$}} define i32 @zext_i16_i32(i16 *%p) { %v = load i16, i16* %p %e = zext i16 %v to i32 @@ -42,8 +42,8 @@ define i32 @zext_i16_i32(i16 *%p) { } ; CHECK-LABEL: sext_i8_i64: -; CHECK: i64.load8_s $1=, $0{{$}} -; CHECK-NEXT: return $1{{$}} +; CHECK: i64.load8_s $push0=, $0{{$}} +; CHECK-NEXT: return $pop0{{$}} define i64 @sext_i8_i64(i8 *%p) { %v = load i8, i8* %p %e = sext i8 %v to i64 @@ -51,8 +51,8 @@ define i64 @sext_i8_i64(i8 *%p) { } ; CHECK-LABEL: zext_i8_i64: -; CHECK: i64.load8_u $1=, $0{{$}} -; CHECK-NEXT: return $1{{$}} +; CHECK: i64.load8_u $push0=, $0{{$}} +; CHECK-NEXT: return $pop0{{$}} define i64 @zext_i8_i64(i8 *%p) { %v = load i8, i8* %p %e = zext i8 %v to i64 @@ -60,8 +60,8 @@ define i64 @zext_i8_i64(i8 *%p) { } ; CHECK-LABEL: sext_i16_i64: -; CHECK: i64.load16_s $1=, $0{{$}} -; CHECK-NEXT: return $1{{$}} +; CHECK: i64.load16_s $push0=, $0{{$}} +; CHECK-NEXT: return $pop0{{$}} define i64 @sext_i16_i64(i16 *%p) { %v = load i16, i16* %p %e = sext i16 %v to i64 @@ -69,8 +69,8 @@ define i64 @sext_i16_i64(i16 *%p) { } ; CHECK-LABEL: zext_i16_i64: -; CHECK: i64.load16_u $1=, $0{{$}} -; CHECK-NEXT: return $1{{$}} +; CHECK: i64.load16_u $push0=, $0{{$}} +; CHECK-NEXT: return $pop0{{$}} define i64 @zext_i16_i64(i16 *%p) { %v = load i16, i16* %p %e = zext i16 %v to i64 @@ -78,8 +78,8 @@ define i64 @zext_i16_i64(i16 *%p) { } ; CHECK-LABEL: sext_i32_i64: -; CHECK: i64.load32_s $1=, $0{{$}} -; CHECK-NEXT: return $1{{$}} +; CHECK: i64.load32_s $push0=, $0{{$}} +; CHECK-NEXT: return $pop0{{$}} define i64 @sext_i32_i64(i32 *%p) { %v = load i32, i32* %p %e = sext i32 %v to i64 @@ -87,8 +87,8 @@ define i64 @sext_i32_i64(i32 *%p) { } ; CHECK-LABEL: zext_i32_i64: -; CHECK: i64.load32_u $1=, $0{{$}} -; CHECK: return $1{{$}} +; CHECK: i64.load32_u $push0=, $0{{$}} +; CHECK: return $pop0{{$}} define i64 @zext_i32_i64(i32 *%p) { %v = load i32, i32* %p %e = zext i32 %v to i64 diff --git a/llvm/test/CodeGen/WebAssembly/load-store-i1.ll b/llvm/test/CodeGen/WebAssembly/load-store-i1.ll index baaff019a5e..33d3aeecc58 100644 --- a/llvm/test/CodeGen/WebAssembly/load-store-i1.ll +++ b/llvm/test/CodeGen/WebAssembly/load-store-i1.ll @@ -6,8 +6,8 @@ target datalayout = "e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32-unknown-unknown" ; CHECK-LABEL: load_u_i1_i32: -; CHECK: i32.load8_u $[[NUM0:[0-9]+]]=, $0{{$}} -; CHECK-NEXT: return $[[NUM0]]{{$}} +; CHECK: i32.load8_u $push[[NUM0:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM0]]{{$}} define i32 @load_u_i1_i32(i1* %p) { %v = load i1, i1* %p %e = zext i1 %v to i32 @@ -15,9 +15,9 @@ define i32 @load_u_i1_i32(i1* %p) { } ; CHECK-LABEL: load_s_i1_i32: -; CHECK: i32.load8_u $[[NUM0:[0-9]+]]=, $0{{$}} +; CHECK: i32.load8_u $push[[NUM0:[0-9]+]]=, $0{{$}} ; CHECK-NEXT: i32.const $[[NUM1:[0-9]+]]=, 31{{$}} -; CHECK-NEXT: shl $push[[NUM2:[0-9]+]]=, $[[NUM0]], $[[NUM1]]{{$}} +; CHECK-NEXT: shl $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $[[NUM1]]{{$}} ; CHECK-NEXT: shr_s $push[[NUM3:[0-9]+]]=, $pop[[NUM2]], $[[NUM1]]{{$}} ; CHECK-NEXT: return $pop[[NUM3]]{{$}} define i32 @load_s_i1_i32(i1* %p) { @@ -27,8 +27,8 @@ define i32 @load_s_i1_i32(i1* %p) { } ; CHECK-LABEL: load_u_i1_i64: -; CHECK: i64.load8_u $[[NUM0:[0-9]+]]=, $0{{$}} -; CHECK-NEXT: return $[[NUM0]]{{$}} +; CHECK: i64.load8_u $push[[NUM0:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM0]]{{$}} define i64 @load_u_i1_i64(i1* %p) { %v = load i1, i1* %p %e = zext i1 %v to i64 @@ -36,9 +36,9 @@ define i64 @load_u_i1_i64(i1* %p) { } ; CHECK-LABEL: load_s_i1_i64: -; CHECK: i64.load8_u $[[NUM0:[0-9]+]]=, $0{{$}} +; CHECK: i64.load8_u $push[[NUM0:[0-9]+]]=, $0{{$}} ; CHECK-NEXT: i64.const $[[NUM1:[0-9]+]]=, 63{{$}} -; CHECK-NEXT: shl $push[[NUM2:[0-9]+]]=, $[[NUM0]], $[[NUM1]]{{$}} +; CHECK-NEXT: shl $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $[[NUM1]]{{$}} ; CHECK-NEXT: shr_s $push[[NUM3:[0-9]+]]=, $pop[[NUM2]], $[[NUM1]]{{$}} ; CHECK-NEXT: return $pop[[NUM3]]{{$}} define i64 @load_s_i1_i64(i1* %p) { diff --git a/llvm/test/CodeGen/WebAssembly/load.ll b/llvm/test/CodeGen/WebAssembly/load.ll index 707897b9da5..1017167d522 100644 --- a/llvm/test/CodeGen/WebAssembly/load.ll +++ b/llvm/test/CodeGen/WebAssembly/load.ll @@ -8,8 +8,8 @@ target triple = "wasm32-unknown-unknown" ; CHECK-LABEL: ldi32: ; CHECK-NEXT: .param i32{{$}} ; CHECK-NEXT: .result i32{{$}} -; CHECK-NEXT: i32.load $[[NUM:[0-9]+]]=, $0{{$}} -; CHECK-NEXT: return $[[NUM]]{{$}} +; CHECK-NEXT: i32.load $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} define i32 @ldi32(i32 *%p) { %v = load i32, i32* %p ret i32 %v @@ -18,9 +18,8 @@ define i32 @ldi32(i32 *%p) { ; CHECK-LABEL: ldi64: ; CHECK-NEXT: .param i32{{$}} ; CHECK-NEXT: .result i64{{$}} -; CHECK-NEXT: .local i64{{$}} -; CHECK-NEXT: i64.load $[[NUM:[0-9]+]]=, $0{{$}} -; CHECK-NEXT: return $[[NUM]]{{$}} +; CHECK-NEXT: i64.load $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} define i64 @ldi64(i64 *%p) { %v = load i64, i64* %p ret i64 %v @@ -29,9 +28,8 @@ define i64 @ldi64(i64 *%p) { ; CHECK-LABEL: ldf32: ; CHECK-NEXT: .param i32{{$}} ; CHECK-NEXT: .result f32{{$}} -; CHECK-NEXT: .local f32{{$}} -; CHECK-NEXT: f32.load $[[NUM:[0-9]+]]=, $0{{$}} -; CHECK-NEXT: return $[[NUM]]{{$}} +; CHECK-NEXT: f32.load $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} define float @ldf32(float *%p) { %v = load float, float* %p ret float %v @@ -40,9 +38,8 @@ define float @ldf32(float *%p) { ; CHECK-LABEL: ldf64: ; CHECK-NEXT: .param i32{{$}} ; CHECK-NEXT: .result f64{{$}} -; CHECK-NEXT: .local f64{{$}} -; CHECK-NEXT: f64.load $[[NUM:[0-9]+]]=, $0{{$}} -; CHECK-NEXT: return $[[NUM]]{{$}} +; CHECK-NEXT: f64.load $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} define double @ldf64(double *%p) { %v = load double, double* %p ret double %v diff --git a/llvm/test/CodeGen/WebAssembly/memory-addr32.ll b/llvm/test/CodeGen/WebAssembly/memory-addr32.ll index 674131b2bce..4b3aba92245 100644 --- a/llvm/test/CodeGen/WebAssembly/memory-addr32.ll +++ b/llvm/test/CodeGen/WebAssembly/memory-addr32.ll @@ -10,9 +10,8 @@ declare void @llvm.wasm.grow.memory.i32(i32) nounwind ; CHECK-LABEL: memory_size: ; CHECK-NEXT: .result i32{{$}} -; CHECK-NEXT: .local i32{{$}} -; CHECK-NEXT: memory_size $0={{$}} -; CHECK-NEXT: return $0{{$}} +; CHECK-NEXT: memory_size $push0={{$}} +; CHECK-NEXT: return $pop0{{$}} define i32 @memory_size() { %a = call i32 @llvm.wasm.memory.size.i32() ret i32 %a diff --git a/llvm/test/CodeGen/WebAssembly/memory-addr64.ll b/llvm/test/CodeGen/WebAssembly/memory-addr64.ll index bb3fc271994..a44c5f044e1 100644 --- a/llvm/test/CodeGen/WebAssembly/memory-addr64.ll +++ b/llvm/test/CodeGen/WebAssembly/memory-addr64.ll @@ -10,9 +10,8 @@ declare void @llvm.wasm.grow.memory.i64(i64) nounwind ; CHECK-LABEL: memory_size: ; CHECK-NEXT: .result i64{{$}} -; CHECK-NEXT: .local i64{{$}} -; CHECK-NEXT: memory_size $0={{$}} -; CHECK-NEXT: return $0{{$}} +; CHECK-NEXT: memory_size $push0={{$}} +; CHECK-NEXT: return $pop0{{$}} define i64 @memory_size() { %a = call i64 @llvm.wasm.memory.size.i64() ret i64 %a diff --git a/llvm/test/CodeGen/WebAssembly/reg-stackify.ll b/llvm/test/CodeGen/WebAssembly/reg-stackify.ll new file mode 100644 index 00000000000..f3000aab70a --- /dev/null +++ b/llvm/test/CodeGen/WebAssembly/reg-stackify.ll @@ -0,0 +1,47 @@ +; RUN: llc < %s -asm-verbose=false | FileCheck %s + +; Test the register stackifier pass. + +target datalayout = "e-p:32:32-i64:64-n32:64-S128" +target triple = "wasm32-unknown-unknown" + +; No because of pointer aliasing. + +; CHECK-LABEL: no0: +; CHECK: return $1{{$}} +define i32 @no0(i32* %p, i32* %q) { + %t = load i32, i32* %q + store i32 0, i32* %p + ret i32 %t +} + +; No because of side effects. + +; CHECK-LABEL: no1: +; CHECK: return $1{{$}} +define i32 @no1(i32* %p, i32* dereferenceable(4) %q) { + %t = load volatile i32, i32* %q, !invariant.load !0 + store volatile i32 0, i32* %p + ret i32 %t +} + +; Yes because of invariant load and no side effects. + +; CHECK-LABEL: yes0: +; CHECK: return $pop0{{$}} +define i32 @yes0(i32* %p, i32* dereferenceable(4) %q) { + %t = load i32, i32* %q, !invariant.load !0 + store i32 0, i32* %p + ret i32 %t +} + +; Yes because of no intervening side effects. + +; CHECK-LABEL: yes1: +; CHECK: return $pop0{{$}} +define i32 @yes1(i32* %q) { + %t = load volatile i32, i32* %q + ret i32 %t +} + +!0 = !{} diff --git a/llvm/test/CodeGen/WebAssembly/returned.ll b/llvm/test/CodeGen/WebAssembly/returned.ll new file mode 100644 index 00000000000..d65e2a8bc3e --- /dev/null +++ b/llvm/test/CodeGen/WebAssembly/returned.ll @@ -0,0 +1,35 @@ +; RUN: llc < %s -asm-verbose=false | FileCheck %s + +; Test that the "returned" attribute is optimized effectively. + +target datalayout = "e-p:32:32-i64:64-n32:64-S128" +target triple = "wasm32-unknown-unknown" + +; CHECK-LABEL: _Z3foov: +; CHECK-NEXT: .result i32{{$}} +; CHECK-NEXT: i32.const $push0=, 1{{$}} +; CHECK-NEXT: call $push1=, _Znwm, $pop0{{$}} +; CHECK-NEXT: call $push2=, _ZN5AppleC1Ev, $pop1{{$}} +; CHECK-NEXT: return $pop2{{$}} +%class.Apple = type { i8 } +declare noalias i8* @_Znwm(i32) +declare %class.Apple* @_ZN5AppleC1Ev(%class.Apple* returned) +define %class.Apple* @_Z3foov() { +entry: + %call = tail call noalias i8* @_Znwm(i32 1) + %0 = bitcast i8* %call to %class.Apple* + %call1 = tail call %class.Apple* @_ZN5AppleC1Ev(%class.Apple* %0) + ret %class.Apple* %0 +} + +; CHECK-LABEL: _Z3barPvS_l: +; CHECK-NEXT: .param i32, i32, i32{{$}} +; CHECK-NEXT: .result i32{{$}} +; CHECK-NEXT: call $push0=, memcpy, $0, $1, $2{{$}} +; CHECK-NEXT: return $pop0{{$}} +declare i8* @memcpy(i8* returned, i8*, i32) +define i8* @_Z3barPvS_l(i8* %p, i8* %s, i32 %n) { +entry: + %call = tail call i8* @memcpy(i8* %p, i8* %s, i32 %n) + ret i8* %p +} |