Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit ebcc092

Browse files
committed
[AArch64][GlobalISel] Fix fallbacks introduced in r336120 due to unselectable stores.
r336120 resulted in falling back to SelectionDAG more often due to the G_STORE MMOs not matching the vreg size. This fixes that by explicitly any-extending the value. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@336209 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 8567853 commit ebcc092

File tree

3 files changed

+13
-6
lines changed

3 files changed

+13
-6
lines changed

lib/Target/AArch64/AArch64CallLowering.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,12 @@ struct OutgoingArgHandler : public CallLowering::ValueHandler {
155155

156156
void assignValueToAddress(unsigned ValVReg, unsigned Addr, uint64_t Size,
157157
MachinePointerInfo &MPO, CCValAssign &VA) override {
158-
if (VA.getLocInfo() == CCValAssign::LocInfo::AExt)
158+
if (VA.getLocInfo() == CCValAssign::LocInfo::AExt) {
159159
Size = VA.getLocVT().getSizeInBits() / 8;
160-
160+
ValVReg = MIRBuilder.buildAnyExt(LLT::scalar(Size * 8), ValVReg)
161+
->getOperand(0)
162+
.getReg();
163+
}
161164
auto MMO = MIRBuilder.getMF().getMachineMemOperand(
162165
MPO, MachineMemOperand::MOStore, Size, 0);
163166
MIRBuilder.buildStore(ValVReg, Addr, *MMO);

test/CodeGen/AArch64/GlobalISel/arm64-callingconv-ios.ll

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,12 @@ target triple = "aarch64-apple-ios9.0"
1616
; CHECK: $w0 = COPY [[ANSWER]]
1717
; CHECK: $d0 = COPY [[D_ONE]]
1818
; CHECK: $x1 = COPY [[TWELVE]]
19-
; CHECK: G_STORE [[THREE]](s8), {{%[0-9]+}}(p0) :: (store 8 into stack, align 0)
20-
; CHECK: G_STORE [[ONE]](s16), {{%[0-9]+}}(p0) :: (store 8 into stack + 8, align 0)
21-
; CHECK: G_STORE [[FOUR]](s32), {{%[0-9]+}}(p0) :: (store 8 into stack + 16, align 0)
19+
; CHECK: [[THREE_EXT:%[0-9]+]]:_(s64) = G_ANYEXT [[THREE]]
20+
; CHECK: G_STORE [[THREE_EXT]](s64), {{%[0-9]+}}(p0) :: (store 8 into stack, align 0)
21+
; CHECK: [[ONE_EXT:%[0-9]+]]:_(s64) = G_ANYEXT [[ONE]]
22+
; CHECK: G_STORE [[ONE_EXT]](s64), {{%[0-9]+}}(p0) :: (store 8 into stack + 8, align 0)
23+
; CHECK: [[FOUR_EXT:%[0-9]+]]:_(s64) = G_ANYEXT [[FOUR]]
24+
; CHECK: G_STORE [[FOUR_EXT]](s64), {{%[0-9]+}}(p0) :: (store 8 into stack + 16, align 0)
2225
; CHECK: G_STORE [[F_ONE]](s32), {{%[0-9]+}}(p0) :: (store 4 into stack + 24, align 0)
2326
; CHECK: G_STORE [[TWO]](s64), {{%[0-9]+}}(p0) :: (store 8 into stack + 32, align 0)
2427
declare void @varargs(i32, double, i64, ...)

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ continue:
7474
; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp
7575
; CHECK: [[OFFSET:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
7676
; CHECK: [[SLOT:%[0-9]+]]:_(p0) = G_GEP [[SP]], [[OFFSET]](s64)
77-
; CHECK: G_STORE [[ANSWER]](s32), [[SLOT]]
77+
; CHECK: [[ANSWER_EXT:%[0-9]+]]:_(s64) = G_ANYEXT [[ANSWER]]
78+
; CHECK: G_STORE [[ANSWER_EXT]](s64), [[SLOT]]
7879

7980
; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp
8081
; CHECK: [[OFFSET:%[0-9]+]]:_(s64) = G_CONSTANT i64 8

0 commit comments

Comments
 (0)