Skip to content

Commit e99169f

Browse files
committed
[AArch64][GlobalISel] CallLowering: Don't generate new copies each time we need
to store to a stack ___location for outgoing args. During call arg lowering we shouldn't be modifying SP so cache the SP copy vreg for subsequent uses. Gives a 0.2% geomean code size improvement on CTMark. Differential Revision: https://reviews.llvm.org/D77838
1 parent c846d26 commit e99169f

File tree

5 files changed

+6
-9
lines changed

5 files changed

+6
-9
lines changed

llvm/lib/Target/AArch64/AArch64CallLowering.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ struct OutgoingArgHandler : public CallLowering::ValueHandler {
133133
int FPDiff = 0)
134134
: ValueHandler(MIRBuilder, MRI, AssignFn), MIB(MIB),
135135
AssignFnVarArg(AssignFnVarArg), IsTailCall(IsTailCall), FPDiff(FPDiff),
136-
StackSize(0) {}
136+
StackSize(0), SPReg(0) {}
137137

138138
bool isIncomingArgumentHandler() const override { return false; }
139139

@@ -151,7 +151,8 @@ struct OutgoingArgHandler : public CallLowering::ValueHandler {
151151
return FIReg.getReg(0);
152152
}
153153

154-
auto SPReg = MIRBuilder.buildCopy(p0, Register(AArch64::SP));
154+
if (!SPReg)
155+
SPReg = MIRBuilder.buildCopy(p0, Register(AArch64::SP)).getReg(0);
155156

156157
auto OffsetReg = MIRBuilder.buildConstant(s64, Offset);
157158

@@ -204,6 +205,9 @@ struct OutgoingArgHandler : public CallLowering::ValueHandler {
204205
/// callee's. Unused elsewhere.
205206
int FPDiff;
206207
uint64_t StackSize;
208+
209+
// Cache the SP register vreg if we need it more than once in this call site.
210+
Register SPReg;
207211
};
208212
} // namespace
209213

llvm/test/CodeGen/AArch64/GlobalISel/call-translator-cse.ll

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
; CHECK: [[CST2:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
1212
; CHECK: [[GEP2:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[CST2]](s64)
1313
; CHECK: G_STORE [[LO]](s64), [[GEP2]](p0) :: (store 8 into stack, align 1)
14-
; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp
1514
; CHECK: [[GEP3:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[CST]](s64)
1615
; CHECK: G_STORE [[HI]](s64), [[GEP3]](p0) :: (store 8 into stack + 8, align 1)
1716
define void @test_split_struct([2 x i64]* %ptr) {

llvm/test/CodeGen/AArch64/GlobalISel/call-translator-ios.ll

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ define signext i8 @test_stack_slots([8 x i64], i8 signext %lhs, i8 signext %rhs)
2424
; CHECK: [[C42_OFFS:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
2525
; CHECK: [[C42_LOC:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[C42_OFFS]](s64)
2626
; CHECK: G_STORE [[C42]](s8), [[C42_LOC]](p0) :: (store 1 into stack)
27-
; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp
2827
; CHECK: [[C12_OFFS:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
2928
; CHECK: [[C12_LOC:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[C12_OFFS]](s64)
3029
; CHECK: G_STORE [[C12]](s8), [[C12_LOC]](p0) :: (store 1 into stack + 1)
@@ -65,7 +64,6 @@ define void @take_128bit_struct([2 x i64]* %ptr, [2 x i64] %in) {
6564
; CHECK: [[ADDR:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[OFF]](s64)
6665
; CHECK: G_STORE [[LD1]](s64), [[ADDR]](p0) :: (store 8 into stack, align 1)
6766

68-
; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp
6967
; CHECK: [[ADDR:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[CST]]
7068
; CHECK: G_STORE [[LD2]](s64), [[ADDR]](p0) :: (store 8 into stack + 8, align 1)
7169
define void @test_split_struct([2 x i64]* %ptr) {

llvm/test/CodeGen/AArch64/GlobalISel/call-translator.ll

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,11 +199,9 @@ define void @test_stack_slots([8 x i64], i64 %lhs, i64 %rhs, i64* %addr) {
199199
; CHECK: [[C42_OFFS:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
200200
; CHECK: [[C42_LOC:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[C42_OFFS]](s64)
201201
; CHECK: G_STORE [[C42]](s64), [[C42_LOC]](p0) :: (store 8 into stack, align 1)
202-
; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp
203202
; CHECK: [[C12_OFFS:%[0-9]+]]:_(s64) = G_CONSTANT i64 8
204203
; CHECK: [[C12_LOC:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[C12_OFFS]](s64)
205204
; CHECK: G_STORE [[C12]](s64), [[C12_LOC]](p0) :: (store 8 into stack + 8, align 1)
206-
; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp
207205
; CHECK: [[PTR_OFFS:%[0-9]+]]:_(s64) = G_CONSTANT i64 16
208206
; CHECK: [[PTR_LOC:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[PTR_OFFS]](s64)
209207
; CHECK: G_STORE [[PTR]](p0), [[PTR_LOC]](p0) :: (store 8 into stack + 16, align 1)
@@ -255,7 +253,6 @@ define void @take_128bit_struct([2 x i64]* %ptr, [2 x i64] %in) {
255253
; CHECK: [[CST2:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
256254
; CHECK: [[GEP2:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[CST2]](s64)
257255
; CHECK: G_STORE [[LO]](s64), [[GEP2]](p0) :: (store 8 into stack, align 1)
258-
; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp
259256
; CHECK: [[GEP3:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[CST]](s64)
260257
; CHECK: G_STORE [[HI]](s64), [[GEP3]](p0) :: (store 8 into stack + 8, align 1)
261258
define void @test_split_struct([2 x i64]* %ptr) {

llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-exceptions.ll

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ continue:
7171
; CHECK: [[ANSWER_EXT:%[0-9]+]]:_(s64) = G_ANYEXT [[ANSWER]]
7272
; CHECK: G_STORE [[ANSWER_EXT]](s64), [[SLOT]]
7373

74-
; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp
7574
; CHECK: [[OFFSET:%[0-9]+]]:_(s64) = G_CONSTANT i64 8
7675
; CHECK: [[SLOT:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[OFFSET]](s64)
7776
; CHECK: G_STORE [[ONE]](s32), [[SLOT]]

0 commit comments

Comments
 (0)