Skip to content

Commit 892f3f4

Browse files
sstefan1MabezDev
authored andcommitted
Alignment fix take 2
1 parent c17cf0a commit 892f3f4

File tree

4 files changed

+37
-40
lines changed

4 files changed

+37
-40
lines changed

llvm/lib/Target/Xtensa/XtensaFrameLowering.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ void XtensaFrameLowering::emitPrologue(MachineFunction &MF,
112112
StackSize += (16 - StackSize) & 0xf;
113113

114114
if (STI.isWinABI()) {
115+
uint64_t MaxAlignment = MFI.getMaxAlign().value();
116+
if(MaxAlignment > 32)
117+
StackSize += MaxAlignment;
118+
115119
StackSize += 32;
116120

117121
if (StackSize <= 32760) {
@@ -134,6 +138,28 @@ void XtensaFrameLowering::emitPrologue(MachineFunction &MF,
134138
BuildMI(MBB, MBBI, dl, TII.get(Xtensa::MOVSP), SP).addReg(TmpReg);
135139
}
136140

141+
// Calculate how much is needed to have the correct alignment.
142+
// Change offset to: alignment + difference.
143+
// For example, in case of alignment of 128:
144+
// diff_to_128_aligned_address = (128 - (SP & 127))
145+
// new_offset = 128 + diff_to_128_aligned_address
146+
// This is safe to do because we increased the stack size by MaxAlignment.
147+
unsigned Reg, RegMisAlign;
148+
if (MaxAlignment > 32){
149+
TII.loadImmediate(MBB, MBBI, &RegMisAlign, MaxAlignment - 1);
150+
TII.loadImmediate(MBB, MBBI, &Reg, MaxAlignment);
151+
BuildMI(MBB, MBBI, dl, TII.get(Xtensa::AND))
152+
.addReg(RegMisAlign, RegState::Define)
153+
.addReg(FP)
154+
.addReg(RegMisAlign);
155+
BuildMI(MBB, MBBI, dl, TII.get(Xtensa::SUB), RegMisAlign)
156+
.addReg(Reg)
157+
.addReg(RegMisAlign);
158+
BuildMI(MBB, MBBI, dl, TII.get(Xtensa::ADD), SP)
159+
.addReg(SP)
160+
.addReg(RegMisAlign, RegState::Kill);
161+
}
162+
137163
// Store FP register in A8, because FP may be used to pass function
138164
// arguments
139165
if (XtensaFI->isSaveFrameRegister()) {

llvm/lib/Target/Xtensa/XtensaRegisterInfo.cpp

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@ static bool isValidAddrOffset(MachineInstr &MI, int64_t Offset) {
135135
bool XtensaRegisterInfo::eliminateFI(MachineBasicBlock::iterator II,
136136
unsigned OpNo, int FrameIndex,
137137
uint64_t StackSize, int64_t SPOffset,
138-
uint64_t Alignment,
139138
RegScavenger *RS) const {
140139
MachineInstr &MI = *II;
141140
MachineFunction &MF = *MI.getParent()->getParent();
@@ -184,9 +183,8 @@ bool XtensaRegisterInfo::eliminateFI(MachineBasicBlock::iterator II,
184183
LLVM_DEBUG(errs() << "Offset : " << Offset << "\n"
185184
<< "<--------->\n");
186185

187-
bool Valid = (Alignment <= 32) ? isValidAddrOffset(MI, Offset) : false;
186+
bool Valid = isValidAddrOffset(MI, Offset);
188187

189-
190188
// If MI is not a debug value, make sure Offset fits in the 16-bit immediate
191189
// field.
192190
if (!MI.isDebugValue() && !Valid) {
@@ -197,27 +195,7 @@ bool XtensaRegisterInfo::eliminateFI(MachineBasicBlock::iterator II,
197195
const XtensaInstrInfo &TII = *static_cast<const XtensaInstrInfo *>(
198196
MBB.getParent()->getSubtarget().getInstrInfo());
199197

200-
// Calculate how much is needed to have the correct alignment.
201-
// Change offset to: alignment + difference.
202-
// For example, in case of alignment of 128:
203-
// diff_to_128_aligned_address = (128 - (SP & 127))
204-
// new_offset = 128 + diff_to_128_aligned_address
205-
if (Alignment > 32) {
206-
TII.loadImmediate(MBB, II, &RegMisAlign, Alignment - 1);
207-
TII.loadImmediate(MBB, II, &Reg, Alignment);
208-
BuildMI(MBB, II, DL, TII.get(Xtensa::AND))
209-
.addReg(RegMisAlign, RegState::Define)
210-
.addReg(FrameReg)
211-
.addReg(RegMisAlign);
212-
BuildMI(MBB, II, DL, TII.get(Xtensa::SUB), RegMisAlign)
213-
.addReg(Reg)
214-
.addReg(RegMisAlign);
215-
BuildMI(MBB, II, DL, TII.get(Xtensa::ADD), Reg)
216-
.addReg(Reg)
217-
.addReg(RegMisAlign, RegState::Kill);
218-
} else {
219-
TII.loadImmediate(MBB, II, &Reg, Offset);
220-
}
198+
TII.loadImmediate(MBB, II, &Reg, Offset);
221199
BuildMI(MBB, II, DL, TII.get(ADD), Reg)
222200
.addReg(FrameReg)
223201
.addReg(Reg, RegState::Kill);
@@ -327,14 +305,12 @@ bool XtensaRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
327305
int FrameIndex = MI.getOperand(FIOperandNum).getIndex();
328306
uint64_t stackSize = MF.getFrameInfo().getStackSize();
329307
int64_t spOffset = MF.getFrameInfo().getObjectOffset(FrameIndex);
330-
uint64_t Alignment = MF.getFrameInfo().getObjectAlign(FrameIndex).value();
331308

332309
LLVM_DEBUG(errs() << "FrameIndex : " << FrameIndex << "\n"
333310
<< "spOffset : " << spOffset << "\n"
334311
<< "stackSize : " << stackSize << "\n");
335312

336-
return eliminateFI(MI, FIOperandNum, FrameIndex, stackSize, spOffset,
337-
Alignment, RS);
313+
return eliminateFI(MI, FIOperandNum, FrameIndex, stackSize, spOffset, RS);
338314
}
339315

340316
Register XtensaRegisterInfo::getFrameRegister(const MachineFunction &MF) const {

llvm/lib/Target/Xtensa/XtensaRegisterInfo.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ struct XtensaRegisterInfo : public XtensaGenRegisterInfo {
5757
private:
5858
bool eliminateFI(MachineBasicBlock::iterator II, unsigned OpNo,
5959
int FrameIndex, uint64_t StackSize, int64_t SPOffset,
60-
uint64_t Alignment, RegScavenger *RS) const;
60+
RegScavenger *RS) const;
6161

6262
bool requiresFrameIndexReplacementScavenging(const MachineFunction &MF) const override;
6363
};

llvm/test/CodeGen/Xtensa/aligned_alloc.ll

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,20 @@
44

55
define i8 @loadi8_128(i8 %a) {
66
; XTENSA-LABEL: loadi8_128:
7-
; XTENSA: entry a1, 288
8-
; XTENSA-NEXT: movi a9, 127
7+
; XTENSA: entry a1, 416
8+
; XTENSA-NEXT: movi a8, 127
9+
; XTENSA-NEXT: movi a9, 128
10+
; XTENSA-NEXT: and a8, a1, a8
11+
; XTENSA-NEXT: sub a8, a9, a8
12+
; XTENSA-NEXT: add.n a1, a1, a8
913
; XTENSA-NEXT: movi a8, 128
10-
; XTENSA-NEXT: and a9, a1, a9
11-
; XTENSA-NEXT: sub a9, a8, a9
12-
; XTENSA-NEXT: add.n a8, a8, a9
1314
; XTENSA-NEXT: add.n a8, a1, a8
1415
; XTENSA-NEXT: addi a10, a8, 0
1516
; XTENSA-NEXT: movi.n a11, 0
1617
; XTENSA-NEXT: movi.n a12, 64
1718
; XTENSA-NEXT: l32r a8, .LCPI0_0
1819
; XTENSA-NEXT: callx8 a8
19-
; XTENSA-NEXT: movi a9, 127
20-
; XTENSA-NEXT: movi a8, 128
21-
; XTENSA-NEXT: and a9, a1, a9
22-
; XTENSA-NEXT: sub a9, a8, a9
23-
; XTENSA-NEXT: add.n a8, a8, a9
24-
; XTENSA-NEXT: add.n a8, a1, a8
25-
; XTENSA-NEXT: l8ui a2, a8, 0
20+
; XTENSA-NEXT: l8ui a2, a1, 128
2621
; XTENSA-NEXT: retw.n
2722
%aligned = alloca i8, align 128
2823
call void @llvm.memset.p0.i64(ptr noundef nonnull align 64 dereferenceable(64) %aligned, i8 0, i64 64, i1 false)

0 commit comments

Comments
 (0)