diff options
| author | Derek Schuff <dschuff@google.com> | 2016-03-17 17:00:29 +0000 |
|---|---|---|
| committer | Derek Schuff <dschuff@google.com> | 2016-03-17 17:00:29 +0000 |
| commit | d4207ba0f6d5f110f5d0def0d1f675c6a3b05668 (patch) | |
| tree | 609cd049cfbd5255e9125b9cd50cffffbc8f6d32 /llvm/test | |
| parent | 93bbc7cd66aa98120a8b0411d90a619aec8df6e3 (diff) | |
| download | bcm5719-llvm-d4207ba0f6d5f110f5d0def0d1f675c6a3b05668.tar.gz bcm5719-llvm-d4207ba0f6d5f110f5d0def0d1f675c6a3b05668.zip | |
[WebAssembly] Stackify code emitted by eliminateFrameIndex and SP writeback
Summary:
MRI::eliminateFrameIndex can emit several instructions to do address
calculations; these can usually be stackified. Because instructions with
FI operands can have subsequent operands which may be expression trees,
find the top of the leftmost tree and insert the code before it, to keep
the LIFO property.
Also use stackified registers when writing back the SP value to memory
in the epilog; it's unnecessary because SP will not be used after the
epilog, and it results in better code.
Differential Revision: http://reviews.llvm.org/D18234
llvm-svn: 263725
Diffstat (limited to 'llvm/test')
| -rw-r--r-- | llvm/test/CodeGen/WebAssembly/byval.ll | 18 | ||||
| -rw-r--r-- | llvm/test/CodeGen/WebAssembly/mem-intrinsics.ll | 4 | ||||
| -rw-r--r-- | llvm/test/CodeGen/WebAssembly/userstack.ll | 60 |
3 files changed, 41 insertions, 41 deletions
diff --git a/llvm/test/CodeGen/WebAssembly/byval.ll b/llvm/test/CodeGen/WebAssembly/byval.ll index e3dd37e46e9..35ec4e351ed 100644 --- a/llvm/test/CodeGen/WebAssembly/byval.ll +++ b/llvm/test/CodeGen/WebAssembly/byval.ll @@ -35,15 +35,15 @@ define void @byval_arg(%SmallStruct* %ptr) { ; CHECK-NEXT: i32.load $push[[L4:.+]]=, 0($0) ; CHECK-NEXT: i32.store {{.*}}=, 12([[SP]]), $pop[[L4]] ; Pass a pointer to the stack slot to the function - ; CHECK-NEXT: i32.const [[L5:.+]]=, 12 - ; CHECK-NEXT: i32.add [[ARG:.+]]=, [[SP]], [[L5]] - ; CHECK-NEXT: call ext_byval_func@FUNCTION, [[L5]] + ; CHECK-NEXT: i32.const $push[[L5:.+]]=, 12 + ; CHECK-NEXT: i32.add $push[[ARG:.+]]=, [[SP]], $pop[[L5]] + ; CHECK-NEXT: call ext_byval_func@FUNCTION, $pop[[ARG]] call void @ext_byval_func(%SmallStruct* byval %ptr) ; Restore the stack - ; CHECK-NEXT: i32.const $push[[L6:.+]]=, 16 - ; CHECK-NEXT: i32.add [[SP]]=, [[SP]], $pop[[L6]] ; CHECK-NEXT: i32.const $push[[L7:.+]]=, __stack_pointer - ; CHECK-NEXT: i32.store {{.*}}=, 0($pop[[L7]]), [[SP]] + ; CHECK-NEXT: i32.const $push[[L6:.+]]=, 16 + ; CHECK-NEXT: i32.add $push[[L8:.+]]=, [[SP]], $pop[[L6]] + ; CHECK-NEXT: i32.store {{.*}}=, 0($pop[[L7]]), $pop[[L8]] ; CHECK-NEXT: return ret void } @@ -58,9 +58,9 @@ define void @byval_arg_align8(%SmallStruct* %ptr) { ; CHECK: i32.load $push[[L4:.+]]=, 0($0):p2align=3 ; CHECK-NEXT: i32.store {{.*}}=, 8([[SP]]):p2align=3, $pop[[L4]] ; Pass a pointer to the stack slot to the function - ; CHECK-NEXT: i32.const [[L5:.+]]=, 8 - ; CHECK-NEXT: i32.add [[ARG:.+]]=, [[SP]], [[L5]] - ; CHECK-NEXT: call ext_byval_func_align8@FUNCTION, [[L5]] + ; CHECK-NEXT: i32.const $push[[L5:.+]]=, 8 + ; CHECK-NEXT: i32.add $push[[ARG:.+]]=, [[SP]], $pop[[L5]] + ; CHECK-NEXT: call ext_byval_func_align8@FUNCTION, $pop[[ARG]] call void @ext_byval_func_align8(%SmallStruct* byval align 8 %ptr) ret void } diff --git a/llvm/test/CodeGen/WebAssembly/mem-intrinsics.ll b/llvm/test/CodeGen/WebAssembly/mem-intrinsics.ll index 2c097849dd2..f71903c6eb2 100644 --- a/llvm/test/CodeGen/WebAssembly/mem-intrinsics.ll +++ b/llvm/test/CodeGen/WebAssembly/mem-intrinsics.ll @@ -61,8 +61,8 @@ define void @set_no(i8* %dst, i8 %src, i32 %len) { ; CHECK-LABEL: frame_index: -; CHECK: i32.call $discard=, memset@FUNCTION, $0, $pop1, $pop0{{$}} -; CHECK: i32.call $discard=, memset@FUNCTION, $1, $pop3, $pop2{{$}} +; CHECK: i32.call $discard=, memset@FUNCTION, $pop12, $pop1, $pop0{{$}} +; CHECK: i32.call $discard=, memset@FUNCTION, $0, $pop3, $pop2{{$}} ; CHECK: return{{$}} define void @frame_index() { entry: diff --git a/llvm/test/CodeGen/WebAssembly/userstack.ll b/llvm/test/CodeGen/WebAssembly/userstack.ll index 15581f99061..09748e6403c 100644 --- a/llvm/test/CodeGen/WebAssembly/userstack.ll +++ b/llvm/test/CodeGen/WebAssembly/userstack.ll @@ -22,10 +22,10 @@ define void @alloca32() noredzone { ; CHECK: i32.const $push[[L0:.+]]=, 0 ; CHECK: i32.store {{.*}}=, 12([[SP]]), $pop[[L0]] store i32 0, i32* %retval - ; CHECK: i32.const $push[[L5:.+]]=, 16 - ; CHECK-NEXT: i32.add [[SP]]=, [[SP]], $pop[[L5]] - ; CHECK-NEXT: i32.const $push[[L6:.+]]=, __stack_pointer - ; CHECK-NEXT: i32.store $discard=, 0($pop[[L6]]), [[SP]] + ; CHECK: i32.const $push[[L6:.+]]=, __stack_pointer + ; CHECK-NEXT: i32.const $push[[L5:.+]]=, 16 + ; CHECK-NEXT: i32.add $push[[L7:.+]]=, [[SP]], $pop[[L5]] + ; CHECK-NEXT: i32.store $discard=, 0($pop[[L6]]), $pop[[L7]] ret void } @@ -49,7 +49,7 @@ define void @alloca3264() { } ; CHECK-LABEL: allocarray: -; CHECK: .local i32, i32{{$}} +; CHECK: .local i32{{$}} define void @allocarray() { ; CHECK: i32.const $push[[L1:.+]]=, __stack_pointer ; CHECK-NEXT: i32.load $push[[L2:.+]]=, 0($pop[[L1]]) @@ -59,10 +59,10 @@ define void @allocarray() { ; CHECK-NEXT: i32.store $discard=, 0($pop[[L4]]), [[SP]] %r = alloca [33 x i32] + ; CHECK-NEXT: i32.const $push[[L5:.+]]=, 12 + ; CHECK-NEXT: i32.add $push[[L7:.+]]=, [[SP]], $pop[[L5]] ; CHECK-NEXT: i32.const $push[[L4:.+]]=, 12 - ; CHECK-NEXT: i32.const [[L5:.+]]=, 12 - ; CHECK-NEXT: i32.add [[L5]]=, [[SP]], [[L5]] - ; CHECK-NEXT: i32.add $push[[L6:.+]]=, [[L5]], $pop[[L4]] + ; CHECK-NEXT: i32.add $push[[L6:.+]]=, $pop[[L7]], $pop[[L4]] ; CHECK-NEXT: i32.const $push[[L9:.+]]=, 1{{$}} ; CHECK-NEXT: i32.store $push[[L10:.+]]=, 12([[SP]]), $pop[[L9]]{{$}} ; CHECK-NEXT: i32.store $discard=, 0($pop3), $pop[[L10]]{{$}} @@ -71,10 +71,10 @@ define void @allocarray() { %p2 = getelementptr [33 x i32], [33 x i32]* %r, i32 0, i32 3 store i32 1, i32* %p2 - ; CHECK: i32.const $push[[L11:.+]]=, 144 - ; CHECK-NEXT: i32.add [[SP]]=, [[SP]], $pop[[L11]] - ; CHECK-NEXT: i32.const $push[[L12:.+]]=, __stack_pointer - ; CHECK-NEXT: i32.store $discard=, 0($pop[[L12]]), [[SP]] + ; CHECK: i32.const $push[[L12:.+]]=, __stack_pointer + ; CHECK-NEXT: i32.const $push[[L11:.+]]=, 144 + ; CHECK-NEXT: i32.add $push[[L13:.+]]=, [[SP]], $pop[[L11]] + ; CHECK-NEXT: i32.store $discard=, 0($pop[[L12]]), $pop[[L13]] ret void } @@ -86,18 +86,18 @@ define void @non_mem_use(i8** %addr) { %r = alloca i64 %r2 = alloca i64 ; %r is at SP+8 - ; CHECK: i32.const [[OFF:.+]]=, 8 - ; CHECK-NEXT: i32.add [[ARG1:.+]]=, [[SP]], [[OFF]] - ; CHECK-NEXT: call ext_func@FUNCTION, [[ARG1]] + ; CHECK: i32.const $push[[OFF:.+]]=, 8 + ; CHECK-NEXT: i32.add $push[[ARG1:.+]]=, [[SP]], $pop[[OFF]] + ; CHECK-NEXT: call ext_func@FUNCTION, $pop[[ARG1]] call void @ext_func(i64* %r) ; %r2 is at SP+0, no add needed ; CHECK-NEXT: call ext_func@FUNCTION, [[SP]] call void @ext_func(i64* %r2) ; Use as a value, but in a store ; %buf is at SP+16 - ; CHECK: i32.const [[OFF:.+]]=, 16 - ; CHECK-NEXT: i32.add [[VAL:.+]]=, [[SP]], [[OFF]] - ; CHECK-NEXT: i32.store {{.*}}=, 0($0), [[VAL]] + ; CHECK: i32.const $push[[OFF:.+]]=, 16 + ; CHECK-NEXT: i32.add $push[[VAL:.+]]=, [[SP]], $pop[[OFF]] + ; CHECK-NEXT: i32.store {{.*}}=, 0($0), $pop[[VAL]] %gep = getelementptr inbounds [27 x i8], [27 x i8]* %buf, i32 0, i32 0 store i8* %gep, i8** %addr ret void @@ -120,10 +120,10 @@ define void @allocarray_inbounds() { %p2 = getelementptr inbounds [5 x i32], [5 x i32]* %r, i32 0, i32 3 store i32 1, i32* %p2 call void @ext_func(i64* null); - ; CHECK: i32.const $push[[L5:.+]]=, 32 - ; CHECK-NEXT: i32.add [[SP]]=, [[SP]], $pop[[L5]] - ; CHECK-NEXT: i32.const $push[[L6:.+]]=, __stack_pointer - ; CHECK-NEXT: i32.store $discard=, 0($pop[[L6]]), [[SP]] + ; CHECK: i32.const $push[[L6:.+]]=, __stack_pointer + ; CHECK-NEXT: i32.const $push[[L5:.+]]=, 32 + ; CHECK-NEXT: i32.add $push[[L7:.+]]=, [[SP]], $pop[[L5]] + ; CHECK-NEXT: i32.store $discard=, 0($pop[[L6]]), $pop[[L7]] ret void } @@ -143,7 +143,7 @@ define void @dynamic_alloca(i32 %alloc) { ; CHECK: call ext_func_i32@FUNCTION call void @ext_func_i32(i32* %r) ; CHECK: i32.const $push[[L3:.+]]=, __stack_pointer - ; CHECK-NEXT: i32.store [[SP]]=, 0($pop[[L3]]), [[FP]] + ; CHECK-NEXT: i32.store $discard=, 0($pop[[L3]]), [[FP]] ret void } @@ -183,10 +183,10 @@ define void @dynamic_static_alloca(i32 %alloc) noredzone { %r1 = alloca i32 %r = alloca i32, i32 %alloc store i32 0, i32* %r - ; CHECK: i32.const $push[[L5:.+]]=, 16 - ; CHECK-NEXT: i32.add [[SP]]=, [[FP]], $pop[[L5]] - ; CHECK-NEXT: i32.const $push[[L6:.+]]=, __stack_pointer - ; CHECK-NEXT: i32.store $discard=, 0($pop[[L6]]), [[SP]] + ; CHECK: i32.const $push[[L6:.+]]=, __stack_pointer + ; CHECK-NEXT: i32.const $push[[L5:.+]]=, 16 + ; CHECK-NEXT: i32.add $push[[L7:.+]]=, [[FP]], $pop[[L5]] + ; CHECK-NEXT: i32.store $discard=, 0($pop[[L6]]), $pop[[L7]] ret void } @@ -198,9 +198,9 @@ entry: ; CHECK: i32.const $push[[L1:.+]]=, 16 ; CHECK-NEXT: i32.sub [[SP:.+]]=, {{.+}}, $pop[[L1]] %addr = alloca i32 - ; CHECK: i32.const [[OFF:.+]]=, 12 - ; CHECK-NEXT: i32.add [[ADDR:.+]]=, [[SP]], [[OFF]] - ; CHECK-NEXT: copy_local [[COPY:.+]]=, [[ADDR]] + ; CHECK: i32.const $push[[OFF:.+]]=, 12 + ; CHECK-NEXT: i32.add $push[[ADDR:.+]]=, [[SP]], $pop[[OFF]] + ; CHECK-NEXT: copy_local [[COPY:.+]]=, $pop[[ADDR]] br label %body body: %a = phi i32* [%addr, %entry], [%b, %body] |

