aboutsummaryrefslogtreecommitdiff
path: root/test/CodeGen/AArch64/aarch64-dynamic-stack-layout.ll
diff options
context:
space:
mode:
Diffstat (limited to 'test/CodeGen/AArch64/aarch64-dynamic-stack-layout.ll')
-rw-r--r--test/CodeGen/AArch64/aarch64-dynamic-stack-layout.ll706
1 files changed, 0 insertions, 706 deletions
diff --git a/test/CodeGen/AArch64/aarch64-dynamic-stack-layout.ll b/test/CodeGen/AArch64/aarch64-dynamic-stack-layout.ll
deleted file mode 100644
index 708ae083eb86..000000000000
--- a/test/CodeGen/AArch64/aarch64-dynamic-stack-layout.ll
+++ /dev/null
@@ -1,706 +0,0 @@
-; RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -disable-post-ra < %s | FileCheck %s
-; RUN: llc -verify-machineinstrs -mtriple=arm64-apple-ios -disable-fp-elim -disable-post-ra < %s | FileCheck %s --check-prefix=CHECK-MACHO
-
-; This test aims to check basic correctness of frame layout &
-; frame access code. There are 8 functions in this test file,
-; each function implements one element in the cartesian product
-; of:
-; . a function having a VLA/noVLA
-; . a function with dynamic stack realignment/no dynamic stack realignment.
-; . a function needing a frame pionter/no frame pointer,
-; since the presence/absence of these has influence on the frame
-; layout and which pointer to use to access various part of the
-; frame (bp,sp,fp).
-;
-; Furthermore: in every test function:
-; . there is always one integer and 1 floating point argument to be able
-; to check those are accessed correctly.
-; . there is always one local variable to check that is accessed
-; correctly
-;
-; The LLVM-IR below was produced by clang on the following C++ code:
-;extern "C" int g();
-;extern "C" int novla_nodynamicrealign_call(int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8, int i9, int i10,
-; double d1, double d2, double d3, double d4, double d5, double d6, double d7, double d8, double d9, double d10)
-;{
-; // use an argument passed on the stack.
-; volatile int l1;
-; return i10 + (int)d10 + l1 + g();
-;}
-;extern "C" int novla_nodynamicrealign_nocall(int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8, int i9, int i10,
-; double d1, double d2, double d3, double d4, double d5, double d6, double d7, double d8, double d9, double d10)
-;{
-; // use an argument passed on the stack.
-; volatile int l1;
-; return i10 + (int)d10 + l1;
-;}
-;extern "C" int novla_dynamicrealign_call(int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8, int i9, int i10,
-; double d1, double d2, double d3, double d4, double d5, double d6, double d7, double d8, double d9, double d10)
-;{
-; // use an argument passed on the stack.
-; alignas(128) volatile int l1;
-; return i10 + (int)d10 + l1 + g();
-;}
-;extern "C" int novla_dynamicrealign_nocall(int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8, int i9, int i10,
-; double d1, double d2, double d3, double d4, double d5, double d6, double d7, double d8, double d9, double d10)
-;{
-; // use an argument passed on the stack.
-; alignas(128) volatile int l1;
-; return i10 + (int)d10 + l1;
-;}
-;
-;extern "C" int vla_nodynamicrealign_call(int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8, int i9, int i10,
-; double d1, double d2, double d3, double d4, double d5, double d6, double d7, double d8, double d9, double d10)
-;{
-; // use an argument passed on the stack.
-; volatile int l1;
-; volatile int vla[i1];
-; return i10 + (int)d10 + l1 + g() + vla[0];
-;}
-;extern "C" int vla_nodynamicrealign_nocall(int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8, int i9, int i10,
-; double d1, double d2, double d3, double d4, double d5, double d6, double d7, double d8, double d9, double d10)
-;{
-; // use an argument passed on the stack.
-; volatile int l1;
-; volatile int vla[i1];
-; return i10 + (int)d10 + l1 + vla[0];
-;}
-;extern "C" int vla_dynamicrealign_call(int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8, int i9, int i10,
-; double d1, double d2, double d3, double d4, double d5, double d6, double d7, double d8, double d9, double d10)
-;{
-; // use an argument passed on the stack.
-; alignas(128) volatile int l1;
-; volatile int vla[i1];
-; return i10 + (int)d10 + l1 + g() + vla[0];
-;}
-;extern "C" int vla_dynamicrealign_nocall(int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8, int i9, int i10,
-; double d1, double d2, double d3, double d4, double d5, double d6, double d7, double d8, double d9, double d10)
-;{
-; // use an argument passed on the stack.
-; alignas(128) volatile int l1;
-; volatile int vla[i1];
-; return i10 + (int)d10 + l1 + vla[0];
-;}
-
-
-
-define i32 @novla_nodynamicrealign_call(i32 %i1, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, i32 %i10, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, double %d7, double %d8, double %d9, double %d10) #0 {
-entry:
- %l1 = alloca i32, align 4
- %conv = fptosi double %d10 to i32
- %add = add nsw i32 %conv, %i10
- %l1.0.l1.0. = load volatile i32, i32* %l1, align 4
- %add1 = add nsw i32 %add, %l1.0.l1.0.
- %call = tail call i32 @g()
- %add2 = add nsw i32 %add1, %call
- ret i32 %add2
-}
-; CHECK-LABEL: novla_nodynamicrealign_call
-; CHECK: .cfi_startproc
-; Check that used callee-saved registers are saved
-; CHECK: sub sp, sp, #32
-; CHECK: stp x19, x30, [sp, #16]
-; Check correctness of cfi pseudo-instructions
-; CHECK: .cfi_def_cfa_offset 32
-; CHECK: .cfi_offset w30, -8
-; CHECK: .cfi_offset w19, -16
-; Check correct access to arguments passed on the stack, through stack pointer
-; CHECK: ldr d[[DARG:[0-9]+]], [sp, #56]
-; CHECK: ldr w[[IARG:[0-9]+]], [sp, #40]
-; Check correct access to local variable on the stack, through stack pointer
-; CHECK: ldr w[[ILOC:[0-9]+]], [sp, #12]
-; Check epilogue:
-; CHECK: ldp x19, x30, [sp, #16]
-; CHECK: ret
-; CHECK: .cfi_endproc
-
-; CHECK-MACHO-LABEL: _novla_nodynamicrealign_call:
-; CHECK-MACHO: .cfi_startproc
-; Check that used callee-saved registers are saved
-; CHECK-MACHO: sub sp, sp, #48
-; CHECK-MACHO: stp x20, x19, [sp, #16]
-; Check that the frame pointer is created:
-; CHECK-MACHO: stp x29, x30, [sp, #32]
-; CHECK-MACHO: add x29, sp, #32
-; Check correctness of cfi pseudo-instructions
-; CHECK-MACHO: .cfi_def_cfa w29, 16
-; CHECK-MACHO: .cfi_offset w30, -8
-; CHECK-MACHO: .cfi_offset w29, -16
-; CHECK-MACHO: .cfi_offset w19, -24
-; CHECK-MACHO: .cfi_offset w20, -32
-; Check correct access to arguments passed on the stack, through frame pointer
-; CHECK-MACHO: ldr d[[DARG:[0-9]+]], [x29, #32]
-; CHECK-MACHO: ldr w[[IARG:[0-9]+]], [x29, #20]
-; Check correct access to local variable on the stack, through stack pointer
-; CHECK-MACHO: ldr w[[ILOC:[0-9]+]], [sp, #12]
-; Check epilogue:
-; CHECK-MACHO: ldp x29, x30, [sp, #32]
-; CHECK-MACHO: ldp x20, x19, [sp, #16]
-; CHECK-MACHO: ret
-; CHECK-MACHO: .cfi_endproc
-
-
-declare i32 @g() #0
-
-; Function Attrs: nounwind
-define i32 @novla_nodynamicrealign_nocall(i32 %i1, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, i32 %i10, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, double %d7, double %d8, double %d9, double %d10) #1 {
-entry:
- %l1 = alloca i32, align 4
- %conv = fptosi double %d10 to i32
- %add = add nsw i32 %conv, %i10
- %l1.0.l1.0. = load volatile i32, i32* %l1, align 4
- %add1 = add nsw i32 %add, %l1.0.l1.0.
- ret i32 %add1
-}
-; CHECK-LABEL: novla_nodynamicrealign_nocall
-; Check that space is reserved for one local variable on the stack.
-; CHECK: sub sp, sp, #16 // =16
-; Check correct access to arguments passed on the stack, through stack pointer
-; CHECK: ldr d[[DARG:[0-9]+]], [sp, #40]
-; CHECK: ldr w[[IARG:[0-9]+]], [sp, #24]
-; Check correct access to local variable on the stack, through stack pointer
-; CHECK: ldr w[[ILOC:[0-9]+]], [sp, #12]
-; Check epilogue:
-; CHECK: add sp, sp, #16 // =16
-; CHECK: ret
-
-
-define i32 @novla_dynamicrealign_call(i32 %i1, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, i32 %i10, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, double %d7, double %d8, double %d9, double %d10) #0 {
-entry:
- %l1 = alloca i32, align 128
- %conv = fptosi double %d10 to i32
- %add = add nsw i32 %conv, %i10
- %l1.0.l1.0. = load volatile i32, i32* %l1, align 128
- %add1 = add nsw i32 %add, %l1.0.l1.0.
- %call = tail call i32 @g()
- %add2 = add nsw i32 %add1, %call
- ret i32 %add2
-}
-
-; CHECK-LABEL: novla_dynamicrealign_call
-; CHECK: .cfi_startproc
-; Check that used callee-saved registers are saved
-; CHECK: str x19, [sp, #-32]!
-; Check that the frame pointer is created:
-; CHECK: stp x29, x30, [sp, #16]
-; CHECK: add x29, sp, #16
-; Check the dynamic realignment of the stack pointer to a 128-byte boundary
-; CHECK: sub x9, sp, #96
-; CHECK: and sp, x9, #0xffffffffffffff80
-; Check correctness of cfi pseudo-instructions
-; CHECK: .cfi_def_cfa w29, 16
-; CHECK: .cfi_offset w30, -8
-; CHECK: .cfi_offset w29, -16
-; CHECK: .cfi_offset w19, -32
-; Check correct access to arguments passed on the stack, through frame pointer
-; CHECK: ldr d[[DARG:[0-9]+]], [x29, #40]
-; CHECK: ldr w[[IARG:[0-9]+]], [x29, #24]
-; Check correct access to local variable on the stack, through re-aligned stack pointer
-; CHECK: ldr w[[ILOC:[0-9]+]], [sp]
-; Check epilogue:
-; Check that stack pointer get restored from frame pointer.
-; CHECK: sub sp, x29, #16 // =16
-; CHECK: ldp x29, x30, [sp, #16]
-; CHECK: ldr x19, [sp], #32
-; CHECK: ret
-; CHECK: .cfi_endproc
-
-; CHECK-MACHO-LABEL: _novla_dynamicrealign_call:
-; CHECK-MACHO: .cfi_startproc
-; Check that used callee-saved registers are saved
-; CHECK-MACHO: stp x20, x19, [sp, #-32]!
-; Check that the frame pointer is created:
-; CHECK-MACHO: stp x29, x30, [sp, #16]
-; CHECK-MACHO: add x29, sp, #16
-; Check the dynamic realignment of the stack pointer to a 128-byte boundary
-; CHECK-MACHO: sub x9, sp, #96
-; CHECK-MACHO: and sp, x9, #0xffffffffffffff80
-; Check correctness of cfi pseudo-instructions
-; CHECK-MACHO: .cfi_def_cfa w29, 16
-; CHECK-MACHO: .cfi_offset w30, -8
-; CHECK-MACHO: .cfi_offset w29, -16
-; CHECK-MACHO: .cfi_offset w19, -24
-; CHECK-MACHO: .cfi_offset w20, -32
-; Check correct access to arguments passed on the stack, through frame pointer
-; CHECK-MACHO: ldr d[[DARG:[0-9]+]], [x29, #32]
-; CHECK-MACHO: ldr w[[IARG:[0-9]+]], [x29, #20]
-; Check correct access to local variable on the stack, through re-aligned stack pointer
-; CHECK-MACHO: ldr w[[ILOC:[0-9]+]], [sp]
-; Check epilogue:
-; Check that stack pointer get restored from frame pointer.
-; CHECK-MACHO: sub sp, x29, #16
-; CHECK-MACHO: ldp x29, x30, [sp, #16]
-; CHECK-MACHO: ldp x20, x19, [sp], #32
-; CHECK-MACHO: ret
-; CHECK-MACHO: .cfi_endproc
-
-
-; Function Attrs: nounwind
-define i32 @novla_dynamicrealign_nocall(i32 %i1, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, i32 %i10, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, double %d7, double %d8, double %d9, double %d10) #1 {
-entry:
- %l1 = alloca i32, align 128
- %conv = fptosi double %d10 to i32
- %add = add nsw i32 %conv, %i10
- %l1.0.l1.0. = load volatile i32, i32* %l1, align 128
- %add1 = add nsw i32 %add, %l1.0.l1.0.
- ret i32 %add1
-}
-
-; CHECK-LABEL: novla_dynamicrealign_nocall
-; Check that the frame pointer is created:
-; CHECK: stp x29, x30, [sp, #-16]!
-; CHECK: mov x29, sp
-; Check the dynamic realignment of the stack pointer to a 128-byte boundary
-; CHECK: sub x9, sp, #112
-; CHECK: and sp, x9, #0xffffffffffffff80
-; Check correct access to arguments passed on the stack, through frame pointer
-; CHECK: ldr d[[DARG:[0-9]+]], [x29, #40]
-; CHECK: ldr w[[IARG:[0-9]+]], [x29, #24]
-; Check correct access to local variable on the stack, through re-aligned stack pointer
-; CHECK: ldr w[[ILOC:[0-9]+]], [sp]
-; Check epilogue:
-; Check that stack pointer get restored from frame pointer.
-; CHECK: mov sp, x29
-; CHECK: ldp x29, x30, [sp], #16
-; CHECK: ret
-
-
-define i32 @vla_nodynamicrealign_call(i32 %i1, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, i32 %i10, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, double %d7, double %d8, double %d9, double %d10) #0 {
-entry:
- %l1 = alloca i32, align 4
- %0 = zext i32 %i1 to i64
- %vla = alloca i32, i64 %0, align 4
- %conv = fptosi double %d10 to i32
- %add = add nsw i32 %conv, %i10
- %l1.0.l1.0. = load volatile i32, i32* %l1, align 4
- %add1 = add nsw i32 %add, %l1.0.l1.0.
- %call = tail call i32 @g()
- %add2 = add nsw i32 %add1, %call
- %1 = load volatile i32, i32* %vla, align 4, !tbaa !1
- %add3 = add nsw i32 %add2, %1
- ret i32 %add3
-}
-
-; CHECK-LABEL: vla_nodynamicrealign_call
-; CHECK: .cfi_startproc
-; Check that used callee-saved registers are saved
-; CHECK: stp x20, x19, [sp, #-32]!
-; Check that the frame pointer is created:
-; CHECK: stp x29, x30, [sp, #16]
-; CHECK: add x29, sp, #16
-; Check that space is reserved on the stack for the local variable,
-; rounded up to a multiple of 16 to keep the stack pointer 16-byte aligned.
-; CHECK: sub sp, sp, #16
-; Check correctness of cfi pseudo-instructions
-; CHECK: .cfi_def_cfa w29, 16
-; CHECK: .cfi_offset w30, -8
-; CHECK: .cfi_offset w29, -16
-; CHECK: .cfi_offset w19, -24
-; CHECK: .cfi_offset w20, -32
-; Check correct access to arguments passed on the stack, through frame pointer
-; CHECK: ldr w[[IARG:[0-9]+]], [x29, #24]
-; CHECK: ldr d[[DARG:[0-9]+]], [x29, #40]
-; Check correct reservation of 16-byte aligned VLA (size in w0) on stack
-; CHECK: mov w9, w0
-; CHECK: mov x10, sp
-; CHECK: lsl x9, x9, #2
-; CHECK: add x9, x9, #15
-; CHECK: and x9, x9, #0x7fffffff0
-; CHECK: sub x[[VLASPTMP:[0-9]+]], x10, x9
-; CHECK: mov sp, x[[VLASPTMP]]
-; Check correct access to local variable, through frame pointer
-; CHECK: ldur w[[ILOC:[0-9]+]], [x29, #-20]
-; Check correct accessing of the VLA variable through the base pointer
-; CHECK: ldr w[[VLA:[0-9]+]], [x[[VLASPTMP]]]
-; Check epilogue:
-; Check that stack pointer get restored from frame pointer.
-; CHECK: sub sp, x29, #16 // =16
-; CHECK: ldp x29, x30, [sp, #16]
-; CHECK: ldp x20, x19, [sp], #32
-; CHECK: ret
-; CHECK: .cfi_endproc
-
-
-; Function Attrs: nounwind
-define i32 @vla_nodynamicrealign_nocall(i32 %i1, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, i32 %i10, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, double %d7, double %d8, double %d9, double %d10) #1 {
-entry:
- %l1 = alloca i32, align 4
- %0 = zext i32 %i1 to i64
- %vla = alloca i32, i64 %0, align 4
- %conv = fptosi double %d10 to i32
- %add = add nsw i32 %conv, %i10
- %l1.0.l1.0. = load volatile i32, i32* %l1, align 4
- %add1 = add nsw i32 %add, %l1.0.l1.0.
- %1 = load volatile i32, i32* %vla, align 4, !tbaa !1
- %add2 = add nsw i32 %add1, %1
- ret i32 %add2
-}
-
-; CHECK-LABEL: vla_nodynamicrealign_nocall
-; Check that the frame pointer is created:
-; CHECK: stp x29, x30, [sp, #-16]!
-; CHECK: mov x29, sp
-; Check that space is reserved on the stack for the local variable,
-; rounded up to a multiple of 16 to keep the stack pointer 16-byte aligned.
-; CHECK: sub sp, sp, #16
-; Check correctness of cfi pseudo-instructions
-; Check correct access to arguments passed on the stack, through frame pointer
-; CHECK: ldr w[[IARG:[0-9]+]], [x29, #24]
-; CHECK: ldr d[[DARG:[0-9]+]], [x29, #40]
-; Check correct reservation of 16-byte aligned VLA (size in w0) on stack
-; CHECK: mov w9, w0
-; CHECK: mov x10, sp
-; CHECK: lsl x9, x9, #2
-; CHECK: add x9, x9, #15
-; CHECK: and x9, x9, #0x7fffffff0
-; CHECK: sub x[[VLASPTMP:[0-9]+]], x10, x9
-; CHECK: mov sp, x[[VLASPTMP]]
-; Check correct access to local variable, through frame pointer
-; CHECK: ldur w[[ILOC:[0-9]+]], [x29, #-4]
-; Check correct accessing of the VLA variable through the base pointer
-; CHECK: ldr w[[VLA:[0-9]+]], [x[[VLASPTMP]]]
-; Check epilogue:
-; Check that stack pointer get restored from frame pointer.
-; CHECK: mov sp, x29
-; CHECK: ldp x29, x30, [sp], #16
-; CHECK: ret
-
-
-define i32 @vla_dynamicrealign_call(i32 %i1, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, i32 %i10, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, double %d7, double %d8, double %d9, double %d10) #0 {
-entry:
- %l1 = alloca i32, align 128
- %0 = zext i32 %i1 to i64
- %vla = alloca i32, i64 %0, align 4
- %conv = fptosi double %d10 to i32
- %add = add nsw i32 %conv, %i10
- %l1.0.l1.0. = load volatile i32, i32* %l1, align 128
- %add1 = add nsw i32 %add, %l1.0.l1.0.
- %call = tail call i32 @g()
- %add2 = add nsw i32 %add1, %call
- %1 = load volatile i32, i32* %vla, align 4, !tbaa !1
- %add3 = add nsw i32 %add2, %1
- ret i32 %add3
-}
-
-; CHECK-LABEL: vla_dynamicrealign_call
-; CHECK: .cfi_startproc
-; Check that used callee-saved registers are saved
-; CHECK: str x21, [sp, #-48]!
-; CHECK: stp x20, x19, [sp, #16]
-; Check that the frame pointer is created:
-; CHECK: stp x29, x30, [sp, #32]
-; CHECK: add x29, sp, #32
-; Check that the stack pointer gets re-aligned to 128
-; bytes & the base pointer (x19) gets initialized to
-; this 128-byte aligned area for local variables &
-; spill slots
-; CHECK: sub x9, sp, #80 // =80
-; CHECK: and sp, x9, #0xffffffffffffff80
-; CHECK: mov x19, sp
-; Check correctness of cfi pseudo-instructions
-; CHECK: .cfi_def_cfa w29, 16
-; CHECK: .cfi_offset w30, -8
-; CHECK: .cfi_offset w29, -16
-; CHECK: .cfi_offset w19, -24
-; CHECK: .cfi_offset w20, -32
-; CHECK: .cfi_offset w21, -48
-; Check correct access to arguments passed on the stack, through frame pointer
-; CHECK: ldr w[[IARG:[0-9]+]], [x29, #24]
-; CHECK: ldr d[[DARG:[0-9]+]], [x29, #40]
-; Check correct reservation of 16-byte aligned VLA (size in w0) on stack
-; and set-up of base pointer (x19).
-; CHECK: mov w9, w0
-; CHECK: mov x10, sp
-; CHECK: lsl x9, x9, #2
-; CHECK: add x9, x9, #15
-; CHECK: and x9, x9, #0x7fffffff0
-; CHECK: sub x[[VLASPTMP:[0-9]+]], x10, x9
-; CHECK: mov sp, x[[VLASPTMP]]
-; Check correct access to local variable, through base pointer
-; CHECK: ldr w[[ILOC:[0-9]+]], [x19]
-; CHECK: ldr w[[VLA:[0-9]+]], [x[[VLASPTMP]]]
-; Check epilogue:
-; Check that stack pointer get restored from frame pointer.
-; CHECK: sub sp, x29, #32
-; CHECK: ldp x29, x30, [sp, #32]
-; CHECK: ldp x20, x19, [sp, #16]
-; CHECK: ldr x21, [sp], #48
-; CHECK: ret
-; CHECK: .cfi_endproc
-
-; CHECK-MACHO-LABEL: _vla_dynamicrealign_call:
-; CHECK-MACHO: .cfi_startproc
-; Check that used callee-saved registers are saved
-; CHECK-MACHO: stp x22, x21, [sp, #-48]!
-; CHECK-MACHO: stp x20, x19, [sp, #16]
-; Check that the frame pointer is created:
-; CHECK-MACHO: stp x29, x30, [sp, #32]
-; CHECK-MACHO: add x29, sp, #32
-; Check that the stack pointer gets re-aligned to 128
-; bytes & the base pointer (x19) gets initialized to
-; this 128-byte aligned area for local variables &
-; spill slots
-; CHECK-MACHO: sub x9, sp, #80
-; CHECK-MACHO: and sp, x9, #0xffffffffffffff80
-; CHECK-MACHO: mov x19, sp
-; Check correctness of cfi pseudo-instructions
-; CHECK-MACHO: .cfi_def_cfa w29, 16
-; CHECK-MACHO: .cfi_offset w30, -8
-; CHECK-MACHO: .cfi_offset w29, -16
-; CHECK-MACHO: .cfi_offset w19, -24
-; CHECK-MACHO: .cfi_offset w20, -32
-; CHECK-MACHO: .cfi_offset w21, -40
-; CHECK-MACHO: .cfi_offset w22, -48
-; Check correct access to arguments passed on the stack, through frame pointer
-; CHECK-MACHO: ldr w[[IARG:[0-9]+]], [x29, #20]
-; CHECK-MACHO: ldr d[[DARG:[0-9]+]], [x29, #32]
-; Check correct reservation of 16-byte aligned VLA (size in w0) on stack
-; and set-up of base pointer (x19).
-; CHECK-MACHO: mov w9, w0
-; CHECK-MACHO: mov x10, sp
-; CHECK-MACHO: lsl x9, x9, #2
-; CHECK-MACHO: add x9, x9, #15
-; CHECK-MACHO: and x9, x9, #0x7fffffff0
-; CHECK-MACHO: sub x[[VLASPTMP:[0-9]+]], x10, x9
-; CHECK-MACHO: mov sp, x[[VLASPTMP]]
-; Check correct access to local variable, through base pointer
-; CHECK-MACHO: ldr w[[ILOC:[0-9]+]], [x19]
-; CHECK-MACHO: ldr w[[VLA:[0-9]+]], [x[[VLASPTMP]]]
-; Check epilogue:
-; Check that stack pointer get restored from frame pointer.
-; CHECK-MACHO: sub sp, x29, #32
-; CHECK-MACHO: ldp x29, x30, [sp, #32]
-; CHECK-MACHO: ldp x20, x19, [sp, #16]
-; CHECK-MACHO: ldp x22, x21, [sp], #48
-; CHECK-MACHO: ret
-; CHECK-MACHO: .cfi_endproc
-
-
-; Function Attrs: nounwind
-define i32 @vla_dynamicrealign_nocall(i32 %i1, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, i32 %i10, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, double %d7, double %d8, double %d9, double %d10) #1 {
-entry:
- %l1 = alloca i32, align 128
- %0 = zext i32 %i1 to i64
- %vla = alloca i32, i64 %0, align 4
- %conv = fptosi double %d10 to i32
- %add = add nsw i32 %conv, %i10
- %l1.0.l1.0. = load volatile i32, i32* %l1, align 128
- %add1 = add nsw i32 %add, %l1.0.l1.0.
- %1 = load volatile i32, i32* %vla, align 4, !tbaa !1
- %add2 = add nsw i32 %add1, %1
- ret i32 %add2
-}
-
-; CHECK-LABEL: vla_dynamicrealign_nocall
-; Check that used callee-saved registers are saved
-; CHECK: str x19, [sp, #-32]!
-; Check that the frame pointer is created:
-; CHECK: stp x29, x30, [sp, #16]
-; CHECK: add x29, sp, #16
-; Check that the stack pointer gets re-aligned to 128
-; bytes & the base pointer (x19) gets initialized to
-; this 128-byte aligned area for local variables &
-; spill slots
-; CHECK: sub x9, sp, #96
-; CHECK: and sp, x9, #0xffffffffffffff80
-; CHECK: mov x19, sp
-; Check correct access to arguments passed on the stack, through frame pointer
-; CHECK: ldr w[[IARG:[0-9]+]], [x29, #24]
-; CHECK: ldr d[[DARG:[0-9]+]], [x29, #40]
-; Check correct reservation of 16-byte aligned VLA (size in w0) on stack
-; and set-up of base pointer (x19).
-; CHECK: mov w9, w0
-; CHECK: mov x10, sp
-; CHECK: lsl x9, x9, #2
-; CHECK: add x9, x9, #15
-; CHECK: and x9, x9, #0x7fffffff0
-; CHECK: sub x[[VLASPTMP:[0-9]+]], x10, x9
-; CHECK: mov sp, x[[VLASPTMP]]
-; Check correct access to local variable, through base pointer
-; CHECK: ldr w[[ILOC:[0-9]+]], [x19]
-; CHECK: ldr w[[VLA:[0-9]+]], [x[[VLASPTMP]]]
-; Check epilogue:
-; Check that stack pointer get restored from frame pointer.
-; CHECK: sub sp, x29, #16
-; CHECK: ldp x29, x30, [sp, #16]
-; CHECK: ldr x19, [sp], #32
-; CHECK: ret
-
-; CHECK-MACHO-LABEL: _vla_dynamicrealign_nocall:
-; Check that used callee-saved registers are saved
-; CHECK-MACHO: stp x20, x19, [sp, #-32]!
-; Check that the frame pointer is created:
-; CHECK-MACHO: stp x29, x30, [sp, #16]
-; CHECK-MACHO: add x29, sp, #16
-; Check that the stack pointer gets re-aligned to 128
-; bytes & the base pointer (x19) gets initialized to
-; this 128-byte aligned area for local variables &
-; spill slots
-; CHECK-MACHO: sub x9, sp, #96
-; CHECK-MACHO: and sp, x9, #0xffffffffffffff80
-; CHECK-MACHO: mov x19, sp
-; Check correct access to arguments passed on the stack, through frame pointer
-; CHECK-MACHO: ldr w[[IARG:[0-9]+]], [x29, #20]
-; CHECK-MACHO: ldr d[[DARG:[0-9]+]], [x29, #32]
-; Check correct reservation of 16-byte aligned VLA (size in w0) on stack
-; and set-up of base pointer (x19).
-; CHECK-MACHO: mov w9, w0
-; CHECK-MACHO: mov x10, sp
-; CHECK-MACHO: lsl x9, x9, #2
-; CHECK-MACHO: add x9, x9, #15
-; CHECK-MACHO: and x9, x9, #0x7fffffff0
-; CHECK-MACHO: sub x[[VLASPTMP:[0-9]+]], x10, x9
-; CHECK-MACHO: mov sp, x[[VLASPTMP]]
-; Check correct access to local variable, through base pointer
-; CHECK-MACHO: ldr w[[ILOC:[0-9]+]], [x19]
-; CHECK-MACHO: ldr w[[VLA:[0-9]+]], [x[[VLASPTMP]]]
-; Check epilogue:
-; Check that stack pointer get restored from frame pointer.
-; CHECK-MACHO: sub sp, x29, #16
-; CHECK-MACHO: ldp x29, x30, [sp, #16]
-; CHECK-MACHO: ldp x20, x19, [sp], #32
-; CHECK-MACHO: ret
-
-
-; Function Attrs: nounwind
-define i32 @vla_dynamicrealign_nocall_large_align(i32 %i1, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, i32 %i10, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, double %d7, double %d8, double %d9, double %d10) #1 {
-entry:
- %l1 = alloca i32, align 32768
- %0 = zext i32 %i1 to i64
- %vla = alloca i32, i64 %0, align 4
- %conv = fptosi double %d10 to i32
- %add = add nsw i32 %conv, %i10
- %l1.0.l1.0. = load volatile i32, i32* %l1, align 32768
- %add1 = add nsw i32 %add, %l1.0.l1.0.
- %1 = load volatile i32, i32* %vla, align 4, !tbaa !1
- %add2 = add nsw i32 %add1, %1
- ret i32 %add2
-}
-
-; CHECK-LABEL: vla_dynamicrealign_nocall_large_align
-; Check that used callee-saved registers are saved
-; CHECK: stp x28, x19, [sp, #-32]!
-; Check that the frame pointer is created:
-; CHECK: stp x29, x30, [sp, #16]
-; CHECK: add x29, sp, #16
-; Check that the stack pointer gets re-aligned to 128
-; bytes & the base pointer (x19) gets initialized to
-; this 128-byte aligned area for local variables &
-; spill slots
-; CHECK: sub x9, sp, #7, lsl #12
-; CHECK: and sp, x9, #0xffffffffffff8000
-; CHECK: mov x19, sp
-; Check correct access to arguments passed on the stack, through frame pointer
-; CHECK: ldr w[[IARG:[0-9]+]], [x29, #24]
-; CHECK: ldr d[[DARG:[0-9]+]], [x29, #40]
-; Check correct reservation of 16-byte aligned VLA (size in w0) on stack
-; and set-up of base pointer (x19).
-; CHECK: mov w9, w0
-; CHECK: mov x10, sp
-; CHECK: lsl x9, x9, #2
-; CHECK: add x9, x9, #15
-; CHECK: and x9, x9, #0x7fffffff0
-; CHECK: sub x[[VLASPTMP:[0-9]+]], x10, x9
-; CHECK: mov sp, x[[VLASPTMP]]
-; Check correct access to local variable, through base pointer
-; CHECK: ldr w[[ILOC:[0-9]+]], [x19]
-; CHECK: ldr w[[VLA:[0-9]+]], [x[[VLASPTMP]]]
-; Check epilogue:
-; Check that stack pointer get restored from frame pointer.
-; CHECK: sub sp, x29, #16
-; CHECK: ldp x29, x30, [sp, #16]
-; CHECK: ldp x28, x19, [sp], #32
-; CHECK: ret
-
-; CHECK-MACHO-LABEL: _vla_dynamicrealign_nocall_large_align:
-; Check that used callee-saved registers are saved
-; CHECK-MACHO: stp x20, x19, [sp, #-32]!
-; Check that the frame pointer is created:
-; CHECK-MACHO: stp x29, x30, [sp, #16]
-; CHECK-MACHO: add x29, sp, #16
-; Check that the stack pointer gets re-aligned to 128
-; bytes & the base pointer (x19) gets initialized to
-; this 128-byte aligned area for local variables &
-; spill slots
-; CHECK-MACHO: sub x9, sp, #7, lsl #12
-; CHECK-MACHO: and sp, x9, #0xffffffffffff8000
-; CHECK-MACHO: mov x19, sp
-; Check correct access to arguments passed on the stack, through frame pointer
-; CHECK-MACHO: ldr w[[IARG:[0-9]+]], [x29, #20]
-; CHECK-MACHO: ldr d[[DARG:[0-9]+]], [x29, #32]
-; Check correct reservation of 16-byte aligned VLA (size in w0) on stack
-; and set-up of base pointer (x19).
-; CHECK-MACHO: mov w9, w0
-; CHECK-MACHO: mov x10, sp
-; CHECK-MACHO: lsl x9, x9, #2
-; CHECK-MACHO: add x9, x9, #15
-; CHECK-MACHO: and x9, x9, #0x7fffffff0
-; CHECK-MACHO: sub x[[VLASPTMP:[0-9]+]], x10, x9
-; CHECK-MACHO: mov sp, x[[VLASPTMP]]
-; Check correct access to local variable, through base pointer
-; CHECK-MACHO: ldr w[[ILOC:[0-9]+]], [x19]
-; CHECK-MACHO: ldr w[[VLA:[0-9]+]], [x[[VLASPTMP]]]
-; Check epilogue:
-; Check that stack pointer get restored from frame pointer.
-; CHECK-MACHO: sub sp, x29, #16
-; CHECK-MACHO: ldp x29, x30, [sp, #16]
-; CHECK-MACHO: ldp x20, x19, [sp], #32
-; CHECK-MACHO: ret
-
-
-define void @realign_conditional(i1 %b) {
-entry:
- br i1 %b, label %bb0, label %bb1
-
-bb0:
- %MyAlloca = alloca i8, i64 64, align 32
- br label %bb1
-
-bb1:
- ret void
-}
-
-; CHECK-LABEL: realign_conditional
-; No realignment in the prologue.
-; CHECK-NOT: and
-; CHECK-NOT: 0xffffffffffffffe0
-; CHECK: tbz {{.*}} .[[LABEL:.*]]
-; Stack is realigned in a non-entry BB.
-; CHECK: sub [[REG:x[01-9]+]], sp, #64
-; CHECK: and sp, [[REG]], #0xffffffffffffffe0
-; CHECK: .[[LABEL]]:
-; CHECK: ret
-
-
-define void @realign_conditional2(i1 %b) {
-entry:
- %tmp = alloca i8, i32 16
- br i1 %b, label %bb0, label %bb1
-
-bb0:
- %MyAlloca = alloca i8, i64 64, align 32
- br label %bb1
-
-bb1:
- ret void
-}
-
-; CHECK-LABEL: realign_conditional2
-; Extra realignment in the prologue (performance issue).
-; CHECK: tbz {{.*}} .[[LABEL:.*]]
-; CHECK: sub x9, sp, #32 // =32
-; CHECK: and sp, x9, #0xffffffffffffffe0
-; CHECK: mov x19, sp
-; Stack is realigned in a non-entry BB.
-; CHECK: sub [[REG:x[01-9]+]], sp, #64
-; CHECK: and sp, [[REG]], #0xffffffffffffffe0
-; CHECK: .[[LABEL]]:
-; CHECK: ret
-
-attributes #0 = { "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
-attributes #1 = { nounwind "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
-
-!1 = !{!2, !2, i64 0}
-!2 = !{!"int", !3, i64 0}
-!3 = !{!"omnipotent char", !4, i64 0}
-!4 = !{!"Simple C/C++ TBAA"}