Skip to content

Commit b1d0bc0

Browse files
committed
[AArch64] Fix an immediate out of range for large realignments on Windows
Also add a missing FrameSetup flag on the existing add instruction. This fixes #63701. Differential Revision: https://reviews.llvm.org/D155447
1 parent 5eb7191 commit b1d0bc0

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

llvm/lib/Target/AArch64/AArch64FrameLowering.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1739,10 +1739,22 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
17391739
NumBytes = 0;
17401740

17411741
if (RealignmentPadding > 0) {
1742-
BuildMI(MBB, MBBI, DL, TII->get(AArch64::ADDXri), AArch64::X15)
1743-
.addReg(AArch64::SP)
1744-
.addImm(RealignmentPadding)
1745-
.addImm(0);
1742+
if (RealignmentPadding >= 4096) {
1743+
BuildMI(MBB, MBBI, DL, TII->get(AArch64::MOVi64imm))
1744+
.addReg(AArch64::X16, RegState::Define)
1745+
.addImm(RealignmentPadding)
1746+
.setMIFlags(MachineInstr::FrameSetup);
1747+
BuildMI(MBB, MBBI, DL, TII->get(AArch64::ADDXrr), AArch64::X15)
1748+
.addReg(AArch64::SP)
1749+
.addReg(AArch64::X16, RegState::Kill)
1750+
.setMIFlag(MachineInstr::FrameSetup);
1751+
} else {
1752+
BuildMI(MBB, MBBI, DL, TII->get(AArch64::ADDXri), AArch64::X15)
1753+
.addReg(AArch64::SP)
1754+
.addImm(RealignmentPadding)
1755+
.addImm(0)
1756+
.setMIFlag(MachineInstr::FrameSetup);
1757+
}
17461758

17471759
uint64_t AndMask = ~(MFI.getMaxAlign().value() - 1);
17481760
BuildMI(MBB, MBBI, DL, TII->get(AArch64::ANDXri), AArch64::SP)

llvm/test/CodeGen/AArch64/win-align-chkstk.ll

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,28 @@ declare dso_local void @other(ptr noundef)
2525
; CHECK-NEXT: sub sp, sp, x15, lsl #4
2626
; CHECK-NEXT: add x15, sp, #16
2727
; CHECK-NEXT: and sp, x15, #0xffffffffffffffe0
28+
29+
define dso_local void @func2() {
30+
entry:
31+
%buf = alloca [8192 x i8], align 8192
32+
%arraydecay = getelementptr inbounds [8192 x i8], ptr %buf, i64 0, i64 0
33+
call void @other(ptr noundef %arraydecay)
34+
ret void
35+
}
36+
37+
; CHECK-LABEL: func2:
38+
; CHECK-NEXT: .seh_proc func2
39+
; CHECK-NEXT: // %bb.0:
40+
; CHECK-NEXT: str x28, [sp, #-32]!
41+
; CHECK-NEXT: .seh_save_reg_x x28, 32
42+
; CHECK-NEXT: stp x29, x30, [sp, #8]
43+
; CHECK-NEXT: .seh_save_fplr 8
44+
; CHECK-NEXT: add x29, sp, #8
45+
; CHECK-NEXT: .seh_add_fp 8
46+
; CHECK-NEXT: .seh_endprologue
47+
; CHECK-NEXT: mov x15, #1533
48+
; CHECK-NEXT: bl __chkstk
49+
; CHECK-NEXT: sub sp, sp, x15, lsl #4
50+
; CHECK-NEXT: mov x16, #8176
51+
; CHECK-NEXT: add x15, sp, x16
52+
; CHECK-NEXT: and sp, x15, #0xffffffffffffe000

0 commit comments

Comments
 (0)