diff options
author | Jonas Paulsson <paulsson@linux.vnet.ibm.com> | 2019-11-27 17:22:43 +0100 |
---|---|---|
committer | Jonas Paulsson <paulsson@linux.vnet.ibm.com> | 2019-12-12 10:26:03 -0800 |
commit | 61f5ba5c32fae2726d3ead5e7360c084720f4692 (patch) | |
tree | 39e44c89660ef94b91e64b563658b83d6eba2643 /llvm/test/CodeGen | |
parent | 7eaae939b9bb294d029d212d768bb38272c00936 (diff) | |
download | bcm5719-llvm-61f5ba5c32fae2726d3ead5e7360c084720f4692.tar.gz bcm5719-llvm-61f5ba5c32fae2726d3ead5e7360c084720f4692.zip |
[SystemZ] Implement the packed stack layout
Any llvm function with the "packed-stack" attribute will be compiled to use
the packed stack layout which reuses unused parts of the incoming register
save area. This is needed for building the Linux kernel.
Review: Ulrich Weigand
https://reviews.llvm.org/D70821
Diffstat (limited to 'llvm/test/CodeGen')
-rw-r--r-- | llvm/test/CodeGen/SystemZ/anyregcc-novec.ll | 18 | ||||
-rw-r--r-- | llvm/test/CodeGen/SystemZ/frame-02.ll | 86 | ||||
-rw-r--r-- | llvm/test/CodeGen/SystemZ/frame-03.ll | 86 | ||||
-rw-r--r-- | llvm/test/CodeGen/SystemZ/frame-04.ll | 86 | ||||
-rw-r--r-- | llvm/test/CodeGen/SystemZ/frame-19.ll | 11 | ||||
-rw-r--r-- | llvm/test/CodeGen/SystemZ/frame-20.ll | 86 | ||||
-rw-r--r-- | llvm/test/CodeGen/SystemZ/frame-22.ll | 87 |
7 files changed, 274 insertions, 186 deletions
diff --git a/llvm/test/CodeGen/SystemZ/anyregcc-novec.ll b/llvm/test/CodeGen/SystemZ/anyregcc-novec.ll index f7e2af91792..b37cd220ffe 100644 --- a/llvm/test/CodeGen/SystemZ/anyregcc-novec.ll +++ b/llvm/test/CodeGen/SystemZ/anyregcc-novec.ll @@ -5,14 +5,14 @@ define anyregcc void @anyregcc1() { entry: ;CHECK-LABEL: anyregcc1 ;CHECK: stmg %r2, %r15, 16(%r15) -;CHECK: aghi %r15, -256 -;CHECK: std %f0, 384(%r15) +;CHECK: aghi %r15, -96 +;CHECK: std %f0, 224(%r15) ;CHECK: std %f1, -;CHECK: std %f2, 392(%r15) +;CHECK: std %f2, 232(%r15) ;CHECK: std %f3, -;CHECK: std %f4, 400(%r15) +;CHECK: std %f4, 240(%r15) ;CHECK: std %f5, -;CHECK: std %f6, 408(%r15) +;CHECK: std %f6, 248(%r15) ;CHECK: std %f7, ;CHECK: std %f8, ;CHECK: std %f9, @@ -26,10 +26,10 @@ entry: ;CHECK: .cfi_offset %f2, -24 ;CHECK: .cfi_offset %f4, -16 ;CHECK: .cfi_offset %f6, -8 -;CHECK: ld %f0, 384(%r15) -;CHECK: ld %f2, 392(%r15) -;CHECK: ld %f4, 400(%r15) -;CHECK: ld %f6, 408(%r15) +;CHECK: ld %f0, 224(%r15) +;CHECK: ld %f2, 232(%r15) +;CHECK: ld %f4, 240(%r15) +;CHECK: ld %f6, 248(%r15) call void asm sideeffect "", "~{r0},~{r1},~{r2},~{r3},~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{f0},~{f1},~{f2},~{f3},~{f4},~{f5},~{f6},~{f7},~{f8},~{f9},~{f10},~{f11},~{f12},~{f13},~{f14},~{f15}"() nounwind ret void } diff --git a/llvm/test/CodeGen/SystemZ/frame-02.ll b/llvm/test/CodeGen/SystemZ/frame-02.ll index 411a0826d84..d7160483b53 100644 --- a/llvm/test/CodeGen/SystemZ/frame-02.ll +++ b/llvm/test/CodeGen/SystemZ/frame-02.ll @@ -4,20 +4,20 @@ ; This function should require all FPRs, but no other spill slots. ; We need to save and restore 8 of the 16 FPRs, so the frame size -; should be exactly 160 + 8 * 8 = 224. The CFA offset is 160 -; (the caller-allocated part of the frame) + 224. +; should be exactly 8 * 8 = 64. The CFA offset is 160 +; (the caller-allocated part of the frame) + 64. define void @f1(float *%ptr) { ; CHECK-LABEL: f1: -; CHECK: aghi %r15, -224 -; CHECK: .cfi_def_cfa_offset 384 -; CHECK: std %f8, 216(%r15) -; CHECK: std %f9, 208(%r15) -; CHECK: std %f10, 200(%r15) -; CHECK: std %f11, 192(%r15) -; CHECK: std %f12, 184(%r15) -; CHECK: std %f13, 176(%r15) -; CHECK: std %f14, 168(%r15) -; CHECK: std %f15, 160(%r15) +; CHECK: aghi %r15, -64 +; CHECK: .cfi_def_cfa_offset 224 +; CHECK: std %f8, 56(%r15) +; CHECK: std %f9, 48(%r15) +; CHECK: std %f10, 40(%r15) +; CHECK: std %f11, 32(%r15) +; CHECK: std %f12, 24(%r15) +; CHECK: std %f13, 16(%r15) +; CHECK: std %f14, 8(%r15) +; CHECK: std %f15, 0(%r15) ; CHECK: .cfi_offset %f8, -168 ; CHECK: .cfi_offset %f9, -176 ; CHECK: .cfi_offset %f10, -184 @@ -27,15 +27,15 @@ define void @f1(float *%ptr) { ; CHECK: .cfi_offset %f14, -216 ; CHECK: .cfi_offset %f15, -224 ; ...main function body... -; CHECK: ld %f8, 216(%r15) -; CHECK: ld %f9, 208(%r15) -; CHECK: ld %f10, 200(%r15) -; CHECK: ld %f11, 192(%r15) -; CHECK: ld %f12, 184(%r15) -; CHECK: ld %f13, 176(%r15) -; CHECK: ld %f14, 168(%r15) -; CHECK: ld %f15, 160(%r15) -; CHECK: aghi %r15, 224 +; CHECK: ld %f8, 56(%r15) +; CHECK: ld %f9, 48(%r15) +; CHECK: ld %f10, 40(%r15) +; CHECK: ld %f11, 32(%r15) +; CHECK: ld %f12, 24(%r15) +; CHECK: ld %f13, 16(%r15) +; CHECK: ld %f14, 8(%r15) +; CHECK: ld %f15, 0(%r15) +; CHECK: aghi %r15, 64 ; CHECK: br %r14 %l0 = load volatile float, float *%ptr %l1 = load volatile float, float *%ptr @@ -92,15 +92,15 @@ define void @f1(float *%ptr) { ; so %f15 is the one that gets dropped. define void @f2(float *%ptr) { ; CHECK-LABEL: f2: -; CHECK: aghi %r15, -216 -; CHECK: .cfi_def_cfa_offset 376 -; CHECK: std %f8, 208(%r15) -; CHECK: std %f9, 200(%r15) -; CHECK: std %f10, 192(%r15) -; CHECK: std %f11, 184(%r15) -; CHECK: std %f12, 176(%r15) -; CHECK: std %f13, 168(%r15) -; CHECK: std %f14, 160(%r15) +; CHECK: aghi %r15, -56 +; CHECK: .cfi_def_cfa_offset 216 +; CHECK: std %f8, 48(%r15) +; CHECK: std %f9, 40(%r15) +; CHECK: std %f10, 32(%r15) +; CHECK: std %f11, 24(%r15) +; CHECK: std %f12, 16(%r15) +; CHECK: std %f13, 8(%r15) +; CHECK: std %f14, 0(%r15) ; CHECK: .cfi_offset %f8, -168 ; CHECK: .cfi_offset %f9, -176 ; CHECK: .cfi_offset %f10, -184 @@ -110,14 +110,14 @@ define void @f2(float *%ptr) { ; CHECK: .cfi_offset %f14, -216 ; CHECK-NOT: %f15 ; ...main function body... -; CHECK: ld %f8, 208(%r15) -; CHECK: ld %f9, 200(%r15) -; CHECK: ld %f10, 192(%r15) -; CHECK: ld %f11, 184(%r15) -; CHECK: ld %f12, 176(%r15) -; CHECK: ld %f13, 168(%r15) -; CHECK: ld %f14, 160(%r15) -; CHECK: aghi %r15, 216 +; CHECK: ld %f8, 48(%r15) +; CHECK: ld %f9, 40(%r15) +; CHECK: ld %f10, 32(%r15) +; CHECK: ld %f11, 24(%r15) +; CHECK: ld %f12, 16(%r15) +; CHECK: ld %f13, 8(%r15) +; CHECK: ld %f14, 0(%r15) +; CHECK: aghi %r15, 56 ; CHECK: br %r14 %l0 = load volatile float, float *%ptr %l1 = load volatile float, float *%ptr @@ -170,9 +170,9 @@ define void @f2(float *%ptr) { ; Like f1, but should require only one call-saved FPR. define void @f3(float *%ptr) { ; CHECK-LABEL: f3: -; CHECK: aghi %r15, -168 -; CHECK: .cfi_def_cfa_offset 328 -; CHECK: std %f8, 160(%r15) +; CHECK: aghi %r15, -8 +; CHECK: .cfi_def_cfa_offset 168 +; CHECK: std %f8, 0(%r15) ; CHECK: .cfi_offset %f8, -168 ; CHECK-NOT: %f9 ; CHECK-NOT: %f10 @@ -182,8 +182,8 @@ define void @f3(float *%ptr) { ; CHECK-NOT: %f14 ; CHECK-NOT: %f15 ; ...main function body... -; CHECK: ld %f8, 160(%r15) -; CHECK: aghi %r15, 168 +; CHECK: ld %f8, 0(%r15) +; CHECK: aghi %r15, 8 ; CHECK: br %r14 %l0 = load volatile float, float *%ptr %l1 = load volatile float, float *%ptr diff --git a/llvm/test/CodeGen/SystemZ/frame-03.ll b/llvm/test/CodeGen/SystemZ/frame-03.ll index 28826150e78..ce2e0244457 100644 --- a/llvm/test/CodeGen/SystemZ/frame-03.ll +++ b/llvm/test/CodeGen/SystemZ/frame-03.ll @@ -6,20 +6,20 @@ ; This function should require all FPRs, but no other spill slots. ; We need to save and restore 8 of the 16 FPRs, so the frame size -; should be exactly 160 + 8 * 8 = 224. The CFA offset is 160 -; (the caller-allocated part of the frame) + 224. +; should be exactly 8 * 8 = 64. The CFA offset is 160 +; (the caller-allocated part of the frame) + 64. define void @f1(double *%ptr) { ; CHECK-LABEL: f1: -; CHECK: aghi %r15, -224 -; CHECK: .cfi_def_cfa_offset 384 -; CHECK: std %f8, 216(%r15) -; CHECK: std %f9, 208(%r15) -; CHECK: std %f10, 200(%r15) -; CHECK: std %f11, 192(%r15) -; CHECK: std %f12, 184(%r15) -; CHECK: std %f13, 176(%r15) -; CHECK: std %f14, 168(%r15) -; CHECK: std %f15, 160(%r15) +; CHECK: aghi %r15, -64 +; CHECK: .cfi_def_cfa_offset 224 +; CHECK: std %f8, 56(%r15) +; CHECK: std %f9, 48(%r15) +; CHECK: std %f10, 40(%r15) +; CHECK: std %f11, 32(%r15) +; CHECK: std %f12, 24(%r15) +; CHECK: std %f13, 16(%r15) +; CHECK: std %f14, 8(%r15) +; CHECK: std %f15, 0(%r15) ; CHECK: .cfi_offset %f8, -168 ; CHECK: .cfi_offset %f9, -176 ; CHECK: .cfi_offset %f10, -184 @@ -29,15 +29,15 @@ define void @f1(double *%ptr) { ; CHECK: .cfi_offset %f14, -216 ; CHECK: .cfi_offset %f15, -224 ; ...main function body... -; CHECK: ld %f8, 216(%r15) -; CHECK: ld %f9, 208(%r15) -; CHECK: ld %f10, 200(%r15) -; CHECK: ld %f11, 192(%r15) -; CHECK: ld %f12, 184(%r15) -; CHECK: ld %f13, 176(%r15) -; CHECK: ld %f14, 168(%r15) -; CHECK: ld %f15, 160(%r15) -; CHECK: aghi %r15, 224 +; CHECK: ld %f8, 56(%r15) +; CHECK: ld %f9, 48(%r15) +; CHECK: ld %f10, 40(%r15) +; CHECK: ld %f11, 32(%r15) +; CHECK: ld %f12, 24(%r15) +; CHECK: ld %f13, 16(%r15) +; CHECK: ld %f14, 8(%r15) +; CHECK: ld %f15, 0(%r15) +; CHECK: aghi %r15, 64 ; CHECK: br %r14 %l0 = load volatile double, double *%ptr %l1 = load volatile double, double *%ptr @@ -94,15 +94,15 @@ define void @f1(double *%ptr) { ; so %f15 is the one that gets dropped. define void @f2(double *%ptr) { ; CHECK-LABEL: f2: -; CHECK: aghi %r15, -216 -; CHECK: .cfi_def_cfa_offset 376 -; CHECK: std %f8, 208(%r15) -; CHECK: std %f9, 200(%r15) -; CHECK: std %f10, 192(%r15) -; CHECK: std %f11, 184(%r15) -; CHECK: std %f12, 176(%r15) -; CHECK: std %f13, 168(%r15) -; CHECK: std %f14, 160(%r15) +; CHECK: aghi %r15, -56 +; CHECK: .cfi_def_cfa_offset 216 +; CHECK: std %f8, 48(%r15) +; CHECK: std %f9, 40(%r15) +; CHECK: std %f10, 32(%r15) +; CHECK: std %f11, 24(%r15) +; CHECK: std %f12, 16(%r15) +; CHECK: std %f13, 8(%r15) +; CHECK: std %f14, 0(%r15) ; CHECK: .cfi_offset %f8, -168 ; CHECK: .cfi_offset %f9, -176 ; CHECK: .cfi_offset %f10, -184 @@ -112,14 +112,14 @@ define void @f2(double *%ptr) { ; CHECK: .cfi_offset %f14, -216 ; CHECK-NOT: %f15 ; ...main function body... -; CHECK: ld %f8, 208(%r15) -; CHECK: ld %f9, 200(%r15) -; CHECK: ld %f10, 192(%r15) -; CHECK: ld %f11, 184(%r15) -; CHECK: ld %f12, 176(%r15) -; CHECK: ld %f13, 168(%r15) -; CHECK: ld %f14, 160(%r15) -; CHECK: aghi %r15, 216 +; CHECK: ld %f8, 48(%r15) +; CHECK: ld %f9, 40(%r15) +; CHECK: ld %f10, 32(%r15) +; CHECK: ld %f11, 24(%r15) +; CHECK: ld %f12, 16(%r15) +; CHECK: ld %f13, 8(%r15) +; CHECK: ld %f14, 0(%r15) +; CHECK: aghi %r15, 56 ; CHECK: br %r14 %l0 = load volatile double, double *%ptr %l1 = load volatile double, double *%ptr @@ -172,9 +172,9 @@ define void @f2(double *%ptr) { ; Like f1, but should require only one call-saved FPR. define void @f3(double *%ptr) { ; CHECK-LABEL: f3: -; CHECK: aghi %r15, -168 -; CHECK: .cfi_def_cfa_offset 328 -; CHECK: std %f8, 160(%r15) +; CHECK: aghi %r15, -8 +; CHECK: .cfi_def_cfa_offset 168 +; CHECK: std %f8, 0(%r15) ; CHECK: .cfi_offset %f8, -168 ; CHECK-NOT: %f9 ; CHECK-NOT: %f10 @@ -184,8 +184,8 @@ define void @f3(double *%ptr) { ; CHECK-NOT: %f14 ; CHECK-NOT: %f15 ; ...main function body... -; CHECK: ld %f8, 160(%r15) -; CHECK: aghi %r15, 168 +; CHECK: ld %f8, 0(%r15) +; CHECK: aghi %r15, 8 ; CHECK: br %r14 %l0 = load volatile double, double *%ptr %l1 = load volatile double, double *%ptr diff --git a/llvm/test/CodeGen/SystemZ/frame-04.ll b/llvm/test/CodeGen/SystemZ/frame-04.ll index 5e1b29f570c..ae9c53a7ddc 100644 --- a/llvm/test/CodeGen/SystemZ/frame-04.ll +++ b/llvm/test/CodeGen/SystemZ/frame-04.ll @@ -5,20 +5,20 @@ ; This function should require all FPRs, but no other spill slots. ; We need to save and restore 8 of the 16 FPRs, so the frame size -; should be exactly 160 + 8 * 8 = 224. The CFA offset is 160 -; (the caller-allocated part of the frame) + 224. +; should be exactly 8 * 8 = 64. The CFA offset is 160 +; (the caller-allocated part of the frame) + 64. define void @f1(fp128 *%ptr) { ; CHECK-LABEL: f1: -; CHECK: aghi %r15, -224 -; CHECK: .cfi_def_cfa_offset 384 -; CHECK: std %f8, 216(%r15) -; CHECK: std %f9, 208(%r15) -; CHECK: std %f10, 200(%r15) -; CHECK: std %f11, 192(%r15) -; CHECK: std %f12, 184(%r15) -; CHECK: std %f13, 176(%r15) -; CHECK: std %f14, 168(%r15) -; CHECK: std %f15, 160(%r15) +; CHECK: aghi %r15, -64 +; CHECK: .cfi_def_cfa_offset 224 +; CHECK: std %f8, 56(%r15) +; CHECK: std %f9, 48(%r15) +; CHECK: std %f10, 40(%r15) +; CHECK: std %f11, 32(%r15) +; CHECK: std %f12, 24(%r15) +; CHECK: std %f13, 16(%r15) +; CHECK: std %f14, 8(%r15) +; CHECK: std %f15, 0(%r15) ; CHECK: .cfi_offset %f8, -168 ; CHECK: .cfi_offset %f9, -176 ; CHECK: .cfi_offset %f10, -184 @@ -28,15 +28,15 @@ define void @f1(fp128 *%ptr) { ; CHECK: .cfi_offset %f14, -216 ; CHECK: .cfi_offset %f15, -224 ; ...main function body... -; CHECK: ld %f8, 216(%r15) -; CHECK: ld %f9, 208(%r15) -; CHECK: ld %f10, 200(%r15) -; CHECK: ld %f11, 192(%r15) -; CHECK: ld %f12, 184(%r15) -; CHECK: ld %f13, 176(%r15) -; CHECK: ld %f14, 168(%r15) -; CHECK: ld %f15, 160(%r15) -; CHECK: aghi %r15, 224 +; CHECK: ld %f8, 56(%r15) +; CHECK: ld %f9, 48(%r15) +; CHECK: ld %f10, 40(%r15) +; CHECK: ld %f11, 32(%r15) +; CHECK: ld %f12, 24(%r15) +; CHECK: ld %f13, 16(%r15) +; CHECK: ld %f14, 8(%r15) +; CHECK: ld %f15, 0(%r15) +; CHECK: aghi %r15, 64 ; CHECK: br %r14 %l0 = load volatile fp128, fp128 *%ptr %l1 = load volatile fp128, fp128 *%ptr @@ -69,14 +69,14 @@ define void @f1(fp128 *%ptr) { ; so %f13+%f15 is the pair that gets dropped. define void @f2(fp128 *%ptr) { ; CHECK-LABEL: f2: -; CHECK: aghi %r15, -208 -; CHECK: .cfi_def_cfa_offset 368 -; CHECK: std %f8, 200(%r15) -; CHECK: std %f9, 192(%r15) -; CHECK: std %f10, 184(%r15) -; CHECK: std %f11, 176(%r15) -; CHECK: std %f12, 168(%r15) -; CHECK: std %f14, 160(%r15) +; CHECK: aghi %r15, -48 +; CHECK: .cfi_def_cfa_offset 208 +; CHECK: std %f8, 40(%r15) +; CHECK: std %f9, 32(%r15) +; CHECK: std %f10, 24(%r15) +; CHECK: std %f11, 16(%r15) +; CHECK: std %f12, 8(%r15) +; CHECK: std %f14, 0(%r15) ; CHECK: .cfi_offset %f8, -168 ; CHECK: .cfi_offset %f9, -176 ; CHECK: .cfi_offset %f10, -184 @@ -86,13 +86,13 @@ define void @f2(fp128 *%ptr) { ; CHECK-NOT: %f13 ; CHECK-NOT: %f15 ; ...main function body... -; CHECK: ld %f8, 200(%r15) -; CHECK: ld %f9, 192(%r15) -; CHECK: ld %f10, 184(%r15) -; CHECK: ld %f11, 176(%r15) -; CHECK: ld %f12, 168(%r15) -; CHECK: ld %f14, 160(%r15) -; CHECK: aghi %r15, 208 +; CHECK: ld %f8, 40(%r15) +; CHECK: ld %f9, 32(%r15) +; CHECK: ld %f10, 24(%r15) +; CHECK: ld %f11, 16(%r15) +; CHECK: ld %f12, 8(%r15) +; CHECK: ld %f14, 0(%r15) +; CHECK: aghi %r15, 48 ; CHECK: br %r14 %l0 = load volatile fp128, fp128 *%ptr %l1 = load volatile fp128, fp128 *%ptr @@ -122,10 +122,10 @@ define void @f2(fp128 *%ptr) { ; numerical order so the pair should be %f8+%f10. define void @f3(fp128 *%ptr) { ; CHECK-LABEL: f3: -; CHECK: aghi %r15, -176 -; CHECK: .cfi_def_cfa_offset 336 -; CHECK: std %f8, 168(%r15) -; CHECK: std %f10, 160(%r15) +; CHECK: aghi %r15, -16 +; CHECK: .cfi_def_cfa_offset 176 +; CHECK: std %f8, 8(%r15) +; CHECK: std %f10, 0(%r15) ; CHECK: .cfi_offset %f8, -168 ; CHECK: .cfi_offset %f10, -176 ; CHECK-NOT: %f9 @@ -135,9 +135,9 @@ define void @f3(fp128 *%ptr) { ; CHECK-NOT: %f14 ; CHECK-NOT: %f15 ; ...main function body... -; CHECK: ld %f8, 168(%r15) -; CHECK: ld %f10, 160(%r15) -; CHECK: aghi %r15, 176 +; CHECK: ld %f8, 8(%r15) +; CHECK: ld %f10, 0(%r15) +; CHECK: aghi %r15, 16 ; CHECK: br %r14 %l0 = load volatile fp128, fp128 *%ptr %l1 = load volatile fp128, fp128 *%ptr diff --git a/llvm/test/CodeGen/SystemZ/frame-19.ll b/llvm/test/CodeGen/SystemZ/frame-19.ll index 2a0693b9ac4..c6a26600683 100644 --- a/llvm/test/CodeGen/SystemZ/frame-19.ll +++ b/llvm/test/CodeGen/SystemZ/frame-19.ll @@ -96,10 +96,11 @@ define void @f1(<16 x i8> *%ptr) { ret void } -; Like f1, but no 16-byte slot should be needed. +; Like f1, but no 16-byte slot should be needed, and no outgoing reg save +; area of 160 bytes. define void @f2(<16 x i8> *%ptr) { ; CHECK-LABEL: f2: -; CHECK: aghi %r15, -224 +; CHECK: aghi %r15, -64 ; CHECK-DAG: std %f8, ; CHECK-DAG: std %f9, ; CHECK-DAG: std %f10, @@ -118,7 +119,7 @@ define void @f2(<16 x i8> *%ptr) { ; CHECK-DAG: ld %f13, ; CHECK-DAG: ld %f14, ; CHECK-DAG: ld %f15, -; CHECK: aghi %r15, 224 +; CHECK: aghi %r15, 64 ; CHECK: br %r14 %v0 = load volatile <16 x i8>, <16 x i8> *%ptr %v1 = load volatile <16 x i8>, <16 x i8> *%ptr @@ -190,7 +191,7 @@ define void @f2(<16 x i8> *%ptr) { ; Like f2, but only %f8 should be saved. define void @f3(<16 x i8> *%ptr) { ; CHECK-LABEL: f3: -; CHECK: aghi %r15, -168 +; CHECK: aghi %r15, -8 ; CHECK-DAG: std %f8, ; CHECK-NOT: vst {{.*}}(%r15) ; CHECK-NOT: vl {{.*}}(%r15) @@ -202,7 +203,7 @@ define void @f3(<16 x i8> *%ptr) { ; CHECK-NOT: %v14 ; CHECK-NOT: %v15 ; CHECK-DAG: ld %f8, -; CHECK: aghi %r15, 168 +; CHECK: aghi %r15, 8 ; CHECK: br %r14 %v0 = load volatile <16 x i8>, <16 x i8> *%ptr %v1 = load volatile <16 x i8>, <16 x i8> *%ptr diff --git a/llvm/test/CodeGen/SystemZ/frame-20.ll b/llvm/test/CodeGen/SystemZ/frame-20.ll index 8d601c6f6d5..6653c8185b0 100644 --- a/llvm/test/CodeGen/SystemZ/frame-20.ll +++ b/llvm/test/CodeGen/SystemZ/frame-20.ll @@ -5,20 +5,20 @@ ; This function should require all FPRs, but no other spill slots. ; We need to save and restore 8 of the 16 FPRs, so the frame size -; should be exactly 160 + 8 * 8 = 224. The CFA offset is 160 -; (the caller-allocated part of the frame) + 224. +; should be exactly 8 * 8 = 64. The CFA offset is 160 +; (the caller-allocated part of the frame) + 64. define void @f1(double *%ptr) { ; CHECK-LABEL: f1: -; CHECK: aghi %r15, -224 -; CHECK: .cfi_def_cfa_offset 384 -; CHECK: std %f8, 216(%r15) -; CHECK: std %f9, 208(%r15) -; CHECK: std %f10, 200(%r15) -; CHECK: std %f11, 192(%r15) -; CHECK: std %f12, 184(%r15) -; CHECK: std %f13, 176(%r15) -; CHECK: std %f14, 168(%r15) -; CHECK: std %f15, 160(%r15) +; CHECK: aghi %r15, -64 +; CHECK: .cfi_def_cfa_offset 224 +; CHECK: std %f8, 56(%r15) +; CHECK: std %f9, 48(%r15) +; CHECK: std %f10, 40(%r15) +; CHECK: std %f11, 32(%r15) +; CHECK: std %f12, 24(%r15) +; CHECK: std %f13, 16(%r15) +; CHECK: std %f14, 8(%r15) +; CHECK: std %f15, 0(%r15) ; CHECK: .cfi_offset %f8, -168 ; CHECK: .cfi_offset %f9, -176 ; CHECK: .cfi_offset %f10, -184 @@ -35,15 +35,15 @@ define void @f1(double *%ptr) { ; CHECK-DAG: vlrepg %v23, 0(%r2) ; CHECK-DAG: vlrepg %v24, 0(%r2) ; CHECK-DAG: vlrepg %v31, 0(%r2) -; CHECK: ld %f8, 216(%r15) -; CHECK: ld %f9, 208(%r15) -; CHECK: ld %f10, 200(%r15) -; CHECK: ld %f11, 192(%r15) -; CHECK: ld %f12, 184(%r15) -; CHECK: ld %f13, 176(%r15) -; CHECK: ld %f14, 168(%r15) -; CHECK: ld %f15, 160(%r15) -; CHECK: aghi %r15, 224 +; CHECK: ld %f8, 56(%r15) +; CHECK: ld %f9, 48(%r15) +; CHECK: ld %f10, 40(%r15) +; CHECK: ld %f11, 32(%r15) +; CHECK: ld %f12, 24(%r15) +; CHECK: ld %f13, 16(%r15) +; CHECK: ld %f14, 8(%r15) +; CHECK: ld %f15, 0(%r15) +; CHECK: aghi %r15, 64 ; CHECK: br %r14 %l0 = load volatile double, double *%ptr %l1 = load volatile double, double *%ptr @@ -148,15 +148,15 @@ define void @f1(double *%ptr) { ; so %f15 is the one that gets dropped. define void @f2(double *%ptr) { ; CHECK-LABEL: f2: -; CHECK: aghi %r15, -216 -; CHECK: .cfi_def_cfa_offset 376 -; CHECK: std %f8, 208(%r15) -; CHECK: std %f9, 200(%r15) -; CHECK: std %f10, 192(%r15) -; CHECK: std %f11, 184(%r15) -; CHECK: std %f12, 176(%r15) -; CHECK: std %f13, 168(%r15) -; CHECK: std %f14, 160(%r15) +; CHECK: aghi %r15, -56 +; CHECK: .cfi_def_cfa_offset 216 +; CHECK: std %f8, 48(%r15) +; CHECK: std %f9, 40(%r15) +; CHECK: std %f10, 32(%r15) +; CHECK: std %f11, 24(%r15) +; CHECK: std %f12, 16(%r15) +; CHECK: std %f13, 8(%r15) +; CHECK: std %f14, 0(%r15) ; CHECK: .cfi_offset %f8, -168 ; CHECK: .cfi_offset %f9, -176 ; CHECK: .cfi_offset %f10, -184 @@ -166,14 +166,14 @@ define void @f2(double *%ptr) { ; CHECK: .cfi_offset %f14, -216 ; CHECK-NOT: %v15 ; CHECK-NOT: %f15 -; CHECK: ld %f8, 208(%r15) -; CHECK: ld %f9, 200(%r15) -; CHECK: ld %f10, 192(%r15) -; CHECK: ld %f11, 184(%r15) -; CHECK: ld %f12, 176(%r15) -; CHECK: ld %f13, 168(%r15) -; CHECK: ld %f14, 160(%r15) -; CHECK: aghi %r15, 216 +; CHECK: ld %f8, 48(%r15) +; CHECK: ld %f9, 40(%r15) +; CHECK: ld %f10, 32(%r15) +; CHECK: ld %f11, 24(%r15) +; CHECK: ld %f12, 16(%r15) +; CHECK: ld %f13, 8(%r15) +; CHECK: ld %f14, 0(%r15) +; CHECK: aghi %r15, 56 ; CHECK: br %r14 %l0 = load volatile double, double *%ptr %l1 = load volatile double, double *%ptr @@ -274,14 +274,14 @@ define void @f2(double *%ptr) { ; Like f1, but should require only one call-saved FPR. define void @f3(double *%ptr) { ; CHECK-LABEL: f3: -; CHECK: aghi %r15, -168 -; CHECK: .cfi_def_cfa_offset 328 -; CHECK: std %f8, 160(%r15) +; CHECK: aghi %r15, -8 +; CHECK: .cfi_def_cfa_offset 168 +; CHECK: std %f8, 0(%r15) ; CHECK: .cfi_offset %f8, -168 ; CHECK-NOT: {{%[fv]9}} ; CHECK-NOT: {{%[fv]1[0-5]}} -; CHECK: ld %f8, 160(%r15) -; CHECK: aghi %r15, 168 +; CHECK: ld %f8, 0(%r15) +; CHECK: aghi %r15, 8 ; CHECK: br %r14 %l0 = load volatile double, double *%ptr %l1 = load volatile double, double *%ptr diff --git a/llvm/test/CodeGen/SystemZ/frame-22.ll b/llvm/test/CodeGen/SystemZ/frame-22.ll new file mode 100644 index 00000000000..fd4e3fec508 --- /dev/null +++ b/llvm/test/CodeGen/SystemZ/frame-22.ll @@ -0,0 +1,87 @@ +; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s +; +; Test the packed stack layout. + +; Test spill/restore of an FPR and a GPR. +define void @f1() #0 { +; CHECK-LABEL: f1: +; CHECK: stmg %r12, %r15, 128(%r15) +; CHECK-NEXT: .cfi_offset %r12, -32 +; CHECK-NEXT: .cfi_offset %r15, -8 +; CHECK-NEXT: std %f8, 120(%r15) # 8-byte Folded Spill +; CHECK-NEXT: .cfi_offset %f8, -40 +; CHECK-NEXT: #APP +; CHECK-NEXT: #NO_APP +; CHECK-NEXT: ld %f8, 120(%r15) # 8-byte Folded Reload +; CHECK-NEXT: lmg %r12, %r15, 128(%r15) +; CHECK-NEXT: br %r14 + call void asm sideeffect "", "~{f8},~{r12}"() nounwind + ret void +} + +; Test spill/restore with anyregcc, including an FP argument register. +define anyregcc void @f2() #0 { +; CHECK-LABEL: f2: +; CHECK: stmg %r3, %r15, 56(%r15) +; CHECK-NEXT: .cfi_offset %r3, -104 +; CHECK-NEXT: .cfi_offset %r15, -8 +; CHECK-NEXT: std %f0, 48(%r15) # 8-byte Folded Spill +; CHECK-NEXT: std %f1, 40(%r15) # 8-byte Folded Spill +; CHECK-NEXT: .cfi_offset %f0, -112 +; CHECK-NEXT: .cfi_offset %f1, -120 +; CHECK-NEXT: #APP +; CHECK-NEXT: #NO_APP +; CHECK-NEXT: ld %f0, 48(%r15) # 8-byte Folded Reload +; CHECK-NEXT: ld %f1, 40(%r15) # 8-byte Folded Reload +; CHECK-NEXT: lmg %r3, %r15, 56(%r15) +; CHECK-NEXT: br %r14 + call void asm sideeffect "", "~{f0},~{f1},~{r3}"() nounwind + ret void +} + +; Test spill/restore in local area with incoming stack arguments. +define i64 @f3(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, + double %A, double %B, double %C, double %D, double %E) #0 { +; CHECK-LABEL: f3: +; CHECK: std %f8, 152(%r15) # 8-byte Folded Spill +; CHECK-NEXT: .cfi_offset %f8, -8 +; CHECK-NEXT: ld %f0, 168(%r15) +; CHECK-NEXT: cgdbr %r2, 5, %f0 +; CHECK-NEXT: ag %r2, 160(%r15) +; CHECK-NEXT: #APP +; CHECK-NEXT: #NO_APP +; CHECK-NEXT: ld %f8, 152(%r15) # 8-byte Folded Reload +; CHECK-NEXT: br %r14 + call void asm sideeffect "", "~{f8}"() nounwind + %Ei = fptosi double %E to i64 + %S = add i64 %f, %Ei + ret i64 %S +} + +; Test spill/restore in local area with outgoing stack arguments. +define i64 @f4() #0 { +; CHECK-LABEL: f4: +; CHECK: stmg %r6, %r15, 80(%r15) +; CHECK-NEXT: .cfi_offset %r6, -80 +; CHECK-NEXT: .cfi_offset %r14, -16 +; CHECK-NEXT: .cfi_offset %r15, -8 +; CHECK-NEXT: aghi %r15, -104 +; CHECK-NEXT: .cfi_def_cfa_offset 264 +; CHECK-NEXT: std %f8, 176(%r15) # 8-byte Folded Spill +; CHECK-NEXT: .cfi_offset %f8, -88 +; CHECK-NEXT: #APP +; CHECK-NEXT: #NO_APP +; CHECK-NEXT: llihh %r0, 16404 +; CHECK-NEXT: stg %r0, 168(%r15) +; CHECK: mvghi 160(%r15), 6 +; CHECK-NEXT: brasl %r14, f3@PLT +; CHECK-NEXT: ld %f8, 176(%r15) # 8-byte Folded Reload +; CHECK-NEXT: lmg %r6, %r15, 184(%r15) +; CHECK-NEXT: br %r14 + call void asm sideeffect "", "~{f8}"() nounwind + %C = call i64 @f3 (i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, + double 1.0, double 2.0, double 3.0, double 4.0, double 5.0) + ret i64 %C +} + +attributes #0 = { "packed-stack"="true" } |