| Index: tests_lit/llvm2ice_tests/fused-alloca.ll
|
| diff --git a/tests_lit/llvm2ice_tests/fused-alloca.ll b/tests_lit/llvm2ice_tests/fused-alloca.ll
|
| index bf80fcd6f838580cb7ab3818a31fc76e98d346bc..8daec9c3107238658d9210fe79c029c9fa09f3c4 100644
|
| --- a/tests_lit/llvm2ice_tests/fused-alloca.ll
|
| +++ b/tests_lit/llvm2ice_tests/fused-alloca.ll
|
| @@ -19,14 +19,12 @@ entry:
|
| ret void
|
| }
|
| ; CHECK-LABEL: fused_small_align
|
| -; CHECK-NEXT: sub esp,0xc
|
| -; CHECK-NEXT: mov eax,DWORD PTR [esp+0x10]
|
| ; CHECK-NEXT: sub esp,0x30
|
| -; CHECK-NEXT: mov {{.*}},esp
|
| +; CHECK-NEXT: mov eax,DWORD PTR [esp+0x34]
|
| ; CHECK-NEXT: mov DWORD PTR [esp+0x10],eax
|
| ; CHECK-NEXT: mov DWORD PTR [esp+0x18],eax
|
| ; CHECK-NEXT: mov DWORD PTR [esp],eax
|
| -; CHECK-NEXT: add esp,0x3c
|
| +; CHECK-NEXT: add esp,0x30
|
|
|
| ; Test that a sequence of allocas with greater than stack alignment get fused.
|
| define internal void @fused_large_align(i32 %arg) {
|
| @@ -45,11 +43,9 @@ entry:
|
| ; CHECK-LABEL: fused_large_align
|
| ; CHECK-NEXT: push ebp
|
| ; CHECK-NEXT: mov ebp,esp
|
| -; CHECK-NEXT: sub esp,0x8
|
| -; CHECK-NEXT: mov eax,DWORD PTR [ebp+0x8]
|
| -; CHECK-NEXT: and esp,0xffffffc0
|
| ; CHECK-NEXT: sub esp,0x80
|
| -; CHECK-NEXT: mov ecx,esp
|
| +; CHECK-NEXT: and esp,0xffffffc0
|
| +; CHECK-NEXT: mov eax,DWORD PTR [ebp+0x8]
|
| ; CHECK-NEXT: mov DWORD PTR [esp+0x40],eax
|
| ; CHECK-NEXT: mov DWORD PTR [esp],eax
|
| ; CHECK-NEXT: mov DWORD PTR [esp+0x60],eax
|
| @@ -80,13 +76,88 @@ block2:
|
| br label %block1
|
| }
|
| ; CHECK-LABEL: fused_derived
|
| -; CHECK-NEXT: sub esp,0xc
|
| -; CHECK-NEXT: mov [[ARG:e..]],DWORD PTR [esp+0x10]
|
| ; CHECK-NEXT: sub esp,0x180
|
| -; CHECK-NEXT: mov {{.*}},esp
|
| +; CHECK-NEXT: mov [[ARG:e..]],DWORD PTR [esp+0x184]
|
| ; CHECK-NEXT: jmp
|
| ; CHECK-NEXT: mov DWORD PTR [esp+0x80],[[ARG]]
|
| ; CHECK-NEXT: mov DWORD PTR [esp+0x8c],[[ARG]]
|
| ; CHECK-NEXT: lea eax,[esp+0x81]
|
| -; CHECK-NEXT: add esp,0x18c
|
| +; CHECK-NEXT: add esp,0x180
|
| ; CHECK-NEXT: ret
|
| +
|
| +; Test that a fixed alloca gets referenced by the frame pointer.
|
| +define internal void @fused_small_align_with_dynamic(i32 %arg) {
|
| +entry:
|
| + %a1 = alloca i8, i32 8, align 16
|
| + br label %next
|
| +next:
|
| + %a2 = alloca i8, i32 12, align 1
|
| + %a3 = alloca i8, i32 16, align 1
|
| + %p1 = bitcast i8* %a1 to i32*
|
| + %p2 = bitcast i8* %a2 to i32*
|
| + %p3 = bitcast i8* %a3 to i32*
|
| + store i32 %arg, i32* %p1, align 1
|
| + store i32 %arg, i32* %p2, align 1
|
| + store i32 %arg, i32* %p3, align 1
|
| + ret void
|
| +}
|
| +; CHECK-LABEL: fused_small_align_with_dynamic
|
| +; CHECK-NEXT: push ebp
|
| +; CHECK-NEXT: mov ebp,esp
|
| +; CHECK-NEXT: sub esp,0x18
|
| +; CHECK-NEXT: mov eax,DWORD PTR [ebp+0x8]
|
| +; CHECK-NEXT: sub esp,0x10
|
| +; CHECK-NEXT: mov ecx,esp
|
| +; CHECK-NEXT: sub esp,0x10
|
| +; CHECK-NEXT: mov edx,esp
|
| +; CHECK-NEXT: mov DWORD PTR [ebp-0x18],eax
|
| +; CHECK-NEXT: mov DWORD PTR [ecx],eax
|
| +; CHECK-NEXT: mov DWORD PTR [edx],eax
|
| +; CHECK-NEXT: mov esp,ebp
|
| +; CHECK-NEXT: pop ebp
|
| +
|
| +; Test that a sequence with greater than stack alignment and dynamic size
|
| +; get folded and referenced correctly;
|
| +
|
| +define internal void @fused_large_align_with_dynamic(i32 %arg) {
|
| +entry:
|
| + %a1 = alloca i8, i32 8, align 32
|
| + %a2 = alloca i8, i32 12, align 32
|
| + %a3 = alloca i8, i32 16, align 1
|
| + %a4 = alloca i8, i32 16, align 1
|
| + br label %next
|
| +next:
|
| + %a5 = alloca i8, i32 16, align 1
|
| + %p1 = bitcast i8* %a1 to i32*
|
| + %p2 = bitcast i8* %a2 to i32*
|
| + %p3 = bitcast i8* %a3 to i32*
|
| + %p4 = bitcast i8* %a4 to i32*
|
| + %p5 = bitcast i8* %a5 to i32*
|
| + store i32 %arg, i32* %p1, align 1
|
| + store i32 %arg, i32* %p2, align 1
|
| + store i32 %arg, i32* %p3, align 1
|
| + store i32 %arg, i32* %p4, align 1
|
| + store i32 %arg, i32* %p5, align 1
|
| + ret void
|
| +}
|
| +; CHECK-LABEL: fused_large_align_with_dynamic
|
| +; CHECK-NEXT: push ebx
|
| +; CHECK-NEXT: push ebp
|
| +; CHECK-NEXT: mov ebp,esp
|
| +; CHECK-NEXT: sub esp,0x64
|
| +; CHECK-NEXT: mov eax,DWORD PTR [ebp+0xc]
|
| +; CHECK-NEXT: and esp,0xffffffe0
|
| +; CHECK-NEXT: sub esp,0x40
|
| +; CHECK-NEXT: mov ecx,esp
|
| +; CHECK-NEXT: mov edx,ecx
|
| +; CHECK-NEXT: add edx,0x20
|
| +; CHECK-NEXT: add ecx,0x0
|
| +; CHECK-NEXT: sub esp,0x10
|
| +; CHECK-NEXT: mov ebx,esp
|
| +; CHECK-NEXT: mov DWORD PTR [ecx],eax
|
| +; CHECK-NEXT: mov DWORD PTR [edx],eax
|
| +; CHECK-NEXT: mov DWORD PTR [ebp-0x14],eax
|
| +; CHECK-NEXT: mov DWORD PTR [ebp-0x24],eax
|
| +; CHECK-NEXT: mov DWORD PTR [ebx],eax
|
| +; CHECK-NEXT: mov esp,ebp
|
| +; CHECK-NEXT: pop ebp
|
|
|