mirror of
https://github.com/intel/llvm.git
synced 2026-01-18 07:57:36 +08:00
[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
This commit is contained in:
@@ -133,7 +133,7 @@ struct OutgoingArgHandler : public CallLowering::ValueHandler {
|
||||
int FPDiff = 0)
|
||||
: ValueHandler(MIRBuilder, MRI, AssignFn), MIB(MIB),
|
||||
AssignFnVarArg(AssignFnVarArg), IsTailCall(IsTailCall), FPDiff(FPDiff),
|
||||
StackSize(0) {}
|
||||
StackSize(0), SPReg(0) {}
|
||||
|
||||
bool isIncomingArgumentHandler() const override { return false; }
|
||||
|
||||
@@ -151,7 +151,8 @@ struct OutgoingArgHandler : public CallLowering::ValueHandler {
|
||||
return FIReg.getReg(0);
|
||||
}
|
||||
|
||||
auto SPReg = MIRBuilder.buildCopy(p0, Register(AArch64::SP));
|
||||
if (!SPReg)
|
||||
SPReg = MIRBuilder.buildCopy(p0, Register(AArch64::SP)).getReg(0);
|
||||
|
||||
auto OffsetReg = MIRBuilder.buildConstant(s64, Offset);
|
||||
|
||||
@@ -204,6 +205,9 @@ struct OutgoingArgHandler : public CallLowering::ValueHandler {
|
||||
/// callee's. Unused elsewhere.
|
||||
int FPDiff;
|
||||
uint64_t StackSize;
|
||||
|
||||
// Cache the SP register vreg if we need it more than once in this call site.
|
||||
Register SPReg;
|
||||
};
|
||||
} // namespace
|
||||
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
; CHECK: [[CST2:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
|
||||
; CHECK: [[GEP2:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[CST2]](s64)
|
||||
; CHECK: G_STORE [[LO]](s64), [[GEP2]](p0) :: (store 8 into stack, align 1)
|
||||
; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp
|
||||
; CHECK: [[GEP3:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[CST]](s64)
|
||||
; CHECK: G_STORE [[HI]](s64), [[GEP3]](p0) :: (store 8 into stack + 8, align 1)
|
||||
define void @test_split_struct([2 x i64]* %ptr) {
|
||||
|
||||
@@ -24,7 +24,6 @@ define signext i8 @test_stack_slots([8 x i64], i8 signext %lhs, i8 signext %rhs)
|
||||
; CHECK: [[C42_OFFS:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
|
||||
; CHECK: [[C42_LOC:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[C42_OFFS]](s64)
|
||||
; CHECK: G_STORE [[C42]](s8), [[C42_LOC]](p0) :: (store 1 into stack)
|
||||
; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp
|
||||
; CHECK: [[C12_OFFS:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
|
||||
; CHECK: [[C12_LOC:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[C12_OFFS]](s64)
|
||||
; 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) {
|
||||
; CHECK: [[ADDR:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[OFF]](s64)
|
||||
; CHECK: G_STORE [[LD1]](s64), [[ADDR]](p0) :: (store 8 into stack, align 1)
|
||||
|
||||
; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp
|
||||
; CHECK: [[ADDR:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[CST]]
|
||||
; CHECK: G_STORE [[LD2]](s64), [[ADDR]](p0) :: (store 8 into stack + 8, align 1)
|
||||
define void @test_split_struct([2 x i64]* %ptr) {
|
||||
|
||||
@@ -199,11 +199,9 @@ define void @test_stack_slots([8 x i64], i64 %lhs, i64 %rhs, i64* %addr) {
|
||||
; CHECK: [[C42_OFFS:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
|
||||
; CHECK: [[C42_LOC:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[C42_OFFS]](s64)
|
||||
; CHECK: G_STORE [[C42]](s64), [[C42_LOC]](p0) :: (store 8 into stack, align 1)
|
||||
; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp
|
||||
; CHECK: [[C12_OFFS:%[0-9]+]]:_(s64) = G_CONSTANT i64 8
|
||||
; CHECK: [[C12_LOC:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[C12_OFFS]](s64)
|
||||
; CHECK: G_STORE [[C12]](s64), [[C12_LOC]](p0) :: (store 8 into stack + 8, align 1)
|
||||
; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp
|
||||
; CHECK: [[PTR_OFFS:%[0-9]+]]:_(s64) = G_CONSTANT i64 16
|
||||
; CHECK: [[PTR_LOC:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[PTR_OFFS]](s64)
|
||||
; 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) {
|
||||
; CHECK: [[CST2:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
|
||||
; CHECK: [[GEP2:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[CST2]](s64)
|
||||
; CHECK: G_STORE [[LO]](s64), [[GEP2]](p0) :: (store 8 into stack, align 1)
|
||||
; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp
|
||||
; CHECK: [[GEP3:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[CST]](s64)
|
||||
; CHECK: G_STORE [[HI]](s64), [[GEP3]](p0) :: (store 8 into stack + 8, align 1)
|
||||
define void @test_split_struct([2 x i64]* %ptr) {
|
||||
|
||||
@@ -71,7 +71,6 @@ continue:
|
||||
; CHECK: [[ANSWER_EXT:%[0-9]+]]:_(s64) = G_ANYEXT [[ANSWER]]
|
||||
; CHECK: G_STORE [[ANSWER_EXT]](s64), [[SLOT]]
|
||||
|
||||
; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp
|
||||
; CHECK: [[OFFSET:%[0-9]+]]:_(s64) = G_CONSTANT i64 8
|
||||
; CHECK: [[SLOT:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[OFFSET]](s64)
|
||||
; CHECK: G_STORE [[ONE]](s32), [[SLOT]]
|
||||
|
||||
Reference in New Issue
Block a user