Skip to content

Commit 660b0d7

Browse files
committed
[AIX] Enable frame pointer for AIX and add related test suite
This patch: - enable frame pointer for AIX; - update some of red zone comments; - add/update testcases; Differential Revision: https://reviews.llvm.org/D72454
1 parent f270da6 commit 660b0d7

File tree

8 files changed

+558
-110
lines changed

8 files changed

+558
-110
lines changed

llvm/lib/Target/PowerPC/PPCFrameLowering.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ static unsigned computeTOCSaveOffset(const PPCSubtarget &STI) {
6060
}
6161

6262
static unsigned computeFramePointerSaveOffset(const PPCSubtarget &STI) {
63-
// SVR4 ABI: First slot in the general register save area.
63+
// First slot in the general register save area.
6464
return STI.isPPC64() ? -8U : -4U;
6565
}
6666

@@ -2436,8 +2436,6 @@ unsigned PPCFrameLowering::getTOCSaveOffset() const {
24362436
}
24372437

24382438
unsigned PPCFrameLowering::getFramePointerSaveOffset() const {
2439-
if (Subtarget.isAIXABI())
2440-
report_fatal_error("FramePointer is not implemented on AIX yet.");
24412439
return FramePointerSaveOffset;
24422440
}
24432441

llvm/lib/Target/PowerPC/PPCSubtarget.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -292,8 +292,15 @@ class PPCSubtarget : public PPCGenSubtargetInfo {
292292
return Align(16);
293293
}
294294

295-
// PPC32 SVR4ABI has no red zone and PPC64 SVR4ABI has a 288-byte red zone.
296-
unsigned getRedZoneSize() const { return isPPC64() ? 288 : 0; }
295+
unsigned getRedZoneSize() const {
296+
if (isPPC64())
297+
// 288 bytes = 18*8 (FPRs) + 18*8 (GPRs, GPR13 reserved)
298+
return 288;
299+
300+
// AIX PPC32: 220 bytes = 18*8 (FPRs) + 19*4 (GPRs);
301+
// PPC32 SVR4ABI has no redzone.
302+
return isAIXABI() ? 220 : 0;
303+
}
297304

298305
bool hasHTM() const { return HasHTM; }
299306
bool hasFloat128() const { return HasFloat128; }

llvm/test/CodeGen/PowerPC/Frames-alloca.ll

Lines changed: 0 additions & 26 deletions
This file was deleted.
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-unknown-linux-gnu | \
2+
; RUN: FileCheck %s -check-prefix=PPC32-LINUX
3+
4+
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-unknown-linux-gnu \
5+
; RUN: -frame-pointer=all | FileCheck %s -check-prefix=PPC32-LINUX
6+
7+
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu | \
8+
; RUN: FileCheck %s -check-prefixes=PPC64,PPC64-LINUX
9+
10+
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu \
11+
; RUN: -frame-pointer=all | FileCheck %s -check-prefixes=PPC64,PPC64-LINUX
12+
13+
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
14+
; RUN: -mtriple=powerpc-ibm-aix-xcoff | FileCheck %s \
15+
; RUN: -check-prefix=PPC32-AIX
16+
17+
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
18+
; RUN: -mtriple=powerpc-ibm-aix-xcoff -frame-pointer=all | FileCheck %s \
19+
; RUN: -check-prefix=PPC32-AIX
20+
21+
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
22+
; RUN: -mtriple=powerpc64-ibm-aix-xcoff | FileCheck %s \
23+
; RUN: -check-prefixes=PPC64,PPC64-AIX
24+
25+
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
26+
; RUN: -mtriple=powerpc64-ibm-aix-xcoff -frame-pointer=all | FileCheck %s \
27+
; RUN: -check-prefixes=PPC64,PPC64-AIX
28+
29+
define dso_local signext i32 @foo(i32 %n) {
30+
entry:
31+
%ptr0 = alloca i32*
32+
%0 = alloca i32, i32 %n
33+
store i32* %0, i32** %ptr0
34+
%1 = alloca i32, i32 %n
35+
%2 = alloca i32, i32 %n
36+
%3 = alloca i32, i32 %n
37+
%4 = alloca i32, i32 %n
38+
%5 = alloca i32, i32 %n
39+
%6 = alloca i32, i32 %n
40+
%7 = alloca i32, i32 %n
41+
%8 = alloca i32, i32 %n
42+
%9 = load i32*, i32** %ptr0
43+
44+
%call = call i32 @bar(i32* %1, i32* %2, i32* %3, i32* %4, i32* %5, i32* %6, i32* %7, i32* %8, i32* %9)
45+
ret i32 %call
46+
}
47+
48+
declare i32 @bar(i32*, i32*, i32*, i32*, i32*, i32*, i32*, i32*, i32*)
49+
50+
; PPC32-LINUX-LABEL: foo
51+
; PPC32-LINUX: mflr 0
52+
; PPC32-LINUX: stw 0, 4(1)
53+
; PPC32-LINUX: stwu 1, -32(1)
54+
; PPC32-LINUX: stw 31, 28(1)
55+
; PPC32-LINUX: mr 31, 1
56+
; PPC32-LINUX: addi 3, 31, 32
57+
; PPC32-LINUX: stwux 3, 1, 10
58+
59+
; Allocated area is referred by stack pointer.
60+
; PPC32-LINUX: addi 11, 1, 16
61+
62+
; Local variable area is referred by frame pointer.
63+
; PPC32-LINUX: stw 11, 24(31)
64+
65+
; PPC32-LINUX: stwux
66+
; PPC32-LINUX: stwux
67+
; PPC32-LINUX: stwux
68+
; PPC32-LINUX: stwux
69+
; PPC32-LINUX: stwux
70+
; PPC32-LINUX: stwux
71+
; PPC32-LINUX: stwux
72+
; PPC32-LINUX: stwux
73+
; PPC32-LINUX-NOT: stuwux
74+
75+
; Parameter save area is referred by stack pointer.
76+
; PPC32-LINUX: stw 11, 8(1)
77+
78+
; PPC32-LINUX: bl bar
79+
; PPC32-LINUX: lwz 31, 0(1)
80+
; PPC32-LINUX: lwz 0, -4(31)
81+
; PPC32-LINUX: mr 1, 31
82+
; PPC32-LINUX: mr 31, 0
83+
; PPC32-LINUX: lwz 0, 4(1)
84+
; PPC32-LINUX: mtlr 0
85+
; PPC32-LINUX: blr
86+
87+
; PPC64-LABEL: foo
88+
; PPC64: mflr 0
89+
; PPC64: std 31, -8(1)
90+
; PPC64: std 0, 16(1)
91+
; PPC64: stdu 1, -160(1)
92+
; PPC64: mr 31, 1
93+
; PPC64: addi 3, 31, 160
94+
; PPC64: stdux 3, 1, 10
95+
96+
; Allocated area is referred by stack pointer.
97+
; PPC64: addi 11, 1, 128
98+
99+
; Local variable area is referred by frame pointer.
100+
; PPC64: std 11, 144(31)
101+
102+
; PPC64: stdux
103+
; PPC64: stdux
104+
; PPC64: stdux
105+
; PPC64: stdux
106+
; PPC64: stdux
107+
; PPC64: stdux
108+
; PPC64: stdux
109+
; PPC64: stdux
110+
; PPC64-NOT: stdux
111+
112+
; Parameter save area is referred by stack pointer.
113+
; PPC64: std 11, 112(1)
114+
115+
; PPC64-LINUX: bl bar
116+
; PPC64-AIX: bl .bar
117+
; PPC64: ld 1, 0(1)
118+
; PPC64: ld 0, 16(1)
119+
; PPC64-DAG: ld 31, -8(1)
120+
; PPC64-DAG: mtlr 0
121+
; PPC64: blr
122+
123+
; PPC32-AIX: mflr 0
124+
; PPC32-AIX: stw 31, -4(1)
125+
; PPC32-AIX: stw 0, 8(1)
126+
; PPC32-AIX: stwu 1, -80(1)
127+
; PPC32-AIX: mr 31, 1
128+
; PPC32-AIX: addi 3, 31, 80
129+
; PPC32-AIX: stwux 3, 1, 10
130+
131+
; Allocated area is referred by stack pointer.
132+
; PPC32-AIX: addi 11, 1, 64
133+
134+
; Local variable area is referred by frame pointer.
135+
; PPC32-AIX: stw 11, 72(31)
136+
137+
; PPC32-AIX: stwux
138+
; PPC32-AIX: stwux
139+
; PPC32-AIX: stwux
140+
; PPC32-AIX: stwux
141+
; PPC32-AIX: stwux
142+
; PPC32-AIX: stwux
143+
; PPC32-AIX: stwux
144+
; PPC32-AIX: stwux
145+
; PPC32-AIX-NOT: stwux
146+
147+
; Parameter save area is referred by stack pointer.
148+
; PPC32-AIX: stw 11, 56(1)
149+
150+
; PPC32-AIX: bl .bar
151+
; PPC32-AIX: nop
152+
; PPC32-AIX: lwz 1, 0(1)
153+
; PPC32-AIX: lwz 0, 8(1)
154+
; PPC32-AIX-DAG: mtlr 0
155+
; PPC32-AIX-DAG: lwz 31, -4(1)
156+
; PPC32-AIX: blr
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu | FileCheck %s -check-prefix=PPC32-LINUX
2+
; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu | FileCheck %s -check-prefix=PPC64-LINUX
3+
; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu -frame-pointer=all | FileCheck %s -check-prefix=PPC32-LINUX
4+
; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -frame-pointer=all | FileCheck %s -check-prefix=PPC64-LINUX
5+
; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu | FileCheck %s -check-prefix=PPC32-LINUX
6+
7+
; RUN: llc < %s -mcpu=pwr4 -mattr=-altivec -verify-machineinstrs \
8+
; RUN: -mtriple=powerpc-ibm-aix-xcoff | FileCheck %s -check-prefix=PPC32-AIX
9+
10+
; RUN: llc < %s -mcpu=pwr4 -mattr=-altivec -verify-machineinstrs \
11+
; RUN: -mtriple=powerpc-ibm-aix-xcoff -frame-pointer=all | FileCheck %s \
12+
; RUN: -check-prefix=PPC32-AIX
13+
14+
; RUN: llc < %s -mcpu=pwr4 -mattr=-altivec -verify-machineinstrs \
15+
; RUN: -mtriple=powerpc64-ibm-aix-xcoff | FileCheck %s -check-prefix=PPC64-AIX
16+
17+
; RUN: llc < %s -mcpu=pwr4 -mattr=-altivec -verify-machineinstrs \
18+
; RUN: -mtriple=powerpc64-ibm-aix-xcoff -frame-pointer=all | FileCheck %s \
19+
; RUN: -check-prefix=PPC64-AIX
20+
21+
define i32* @f1(i32 %n) nounwind {
22+
%tmp = alloca i32, i32 %n ; <i32*> [#uses=1]
23+
ret i32* %tmp
24+
}
25+
26+
; PPC32-LINUX-LABEL: f1
27+
; PPC32-LINUX: stwu 1, -32(1)
28+
; PPC32-LINUX-NEXT: slwi 3, 3, 2
29+
; PPC32-LINUX-NEXT: addi 3, 3, 15
30+
; PPC32-LINUX-NEXT: stw 31, 28(1)
31+
; PPC32-LINUX-NEXT: mr 31, 1
32+
; PPC32-LINUX-NEXT: rlwinm 3, 3, 0, 0, 27
33+
; PPC32-LINUX-NEXT: neg 3, 3
34+
; PPC32-LINUX-NEXT: addi 4, 31, 32
35+
; PPC32-LINUX-NEXT: stwux 4, 1, 3
36+
; PPC32-LINUX-NEXT: lwz 31, 0(1)
37+
; PPC32-LINUX-NEXT: addi 3, 1, 16
38+
; PPC32-LINUX-NEXT: lwz 0, -4(31)
39+
; PPC32-LINUX-NEXT: mr 1, 31
40+
; PPC32-LINUX-NEXT: mr 31, 0
41+
; PPC32-LINUX-NEXT: blr
42+
43+
; PPC64-LINUX-LABEL: f1
44+
; PPC64-LINUX: std 31, -8(1)
45+
; PPC64-LINUX-NEXT: stdu 1, -64(1)
46+
; PPC64-LINUX-NEXT: lis 4, 32767
47+
; PPC64-LINUX-NEXT: rldic 3, 3, 2, 30
48+
; PPC64-LINUX-NEXT: ori 4, 4, 65535
49+
; PPC64-LINUX-NEXT: addi 3, 3, 15
50+
; PPC64-LINUX-NEXT: sldi 4, 4, 4
51+
; PPC64-LINUX-NEXT: mr 31, 1
52+
; PPC64-LINUX-NEXT: and 3, 3, 4
53+
; PPC64-LINUX-NEXT: neg 3, 3
54+
; PPC64-LINUX-NEXT: addi 4, 31, 64
55+
; PPC64-LINUX-NEXT: stdux 4, 1, 3
56+
57+
; The linkage area is always put on the top of the stack.
58+
; PPC64-LINUX-NEXT: addi 3, 1, 48
59+
60+
; PPC64-LINUX-NEXT: ld 1, 0(1)
61+
; PPC64-LINUX-NEXT: ld 31, -8(1)
62+
; PPC64-LINUX-NEXT: blr
63+
64+
; PPC32-AIX-LABEL: f1
65+
; PPC32-AIX: stw 31, -4(1)
66+
; PPC32-AIX-NEXT: stwu 1, -48(1)
67+
; PPC32-AIX-NEXT: slwi 3, 3, 2
68+
; PPC32-AIX-NEXT: mr 31, 1
69+
; PPC32-AIX-NEXT: addi 3, 3, 15
70+
; PPC32-AIX-NEXT: addi 4, 31, 48
71+
; PPC32-AIX-NEXT: rlwinm 3, 3, 0, 0, 27
72+
; PPC32-AIX-NEXT: neg 3, 3
73+
; PPC32-AIX-NEXT: stwux 4, 1, 3
74+
75+
; The linkage area is always put on the top of the stack.
76+
; PPC32-AIX-NEXT: addi 3, 1, 32
77+
78+
; PPC32-AIX-NEXT: lwz 1, 0(1)
79+
; PPC32-AIX-NEXT: lwz 31, -4(1)
80+
; PPC32-AIX-NEXT: blr
81+
82+
; PPC64-AIX-LABEL: f1
83+
; PPC64-AIX: std 31, -8(1)
84+
; PPC64-AIX-NEXT: stdu 1, -64(1)
85+
; PPC64-AIX-NEXT: lis 4, 32767
86+
; PPC64-AIX-NEXT: rldic 3, 3, 2, 30
87+
; PPC64-AIX-NEXT: ori 4, 4, 65535
88+
; PPC64-AIX-NEXT: addi 3, 3, 15
89+
; PPC64-AIX-NEXT: sldi 4, 4, 4
90+
; PPC64-AIX-NEXT: mr 31, 1
91+
; PPC64-AIX-NEXT: and 3, 3, 4
92+
; PPC64-AIX-NEXT: addi 4, 31, 64
93+
; PPC64-AIX-NEXT: neg 3, 3
94+
; PPC64-AIX-NEXT: stdux 4, 1, 3
95+
96+
; The linkage area is always put on the top of the stack.
97+
; PPC64-AIX-NEXT: addi 3, 1, 48
98+
99+
; PPC64-AIX-NEXT: ld 1, 0(1)
100+
; PPC64-AIX-NEXT: ld 31, -8(1)
101+
; PPC64-AIX-NEXT: blr

0 commit comments

Comments
 (0)