Skip to content

Commit 467e1d0

Browse files
committed
[Xtensa] Minor fixes.
1 parent d3db27e commit 467e1d0

File tree

3 files changed

+35
-61
lines changed

3 files changed

+35
-61
lines changed

llvm/lib/Target/Xtensa/XtensaISelLowering.cpp

Lines changed: 31 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -134,10 +134,9 @@ XtensaTargetLowering::XtensaTargetLowering(const TargetMachine &TM,
134134
setOperationAction(ISD::STACKSAVE, MVT::Other, Custom);
135135
setOperationAction(ISD::STACKRESTORE, MVT::Other, Custom);
136136

137-
// VASTART and VACOPY need to deal with the Xtensa-specific varargs
137+
// VASTART, VAARG and VACOPY need to deal with the Xtensa-specific varargs
138138
// structure, but VAEND is a no-op.
139139
setOperationAction(ISD::VASTART, MVT::Other, Custom);
140-
// we use special va_list structure so we have to customize this
141140
setOperationAction(ISD::VAARG, MVT::Other, Custom);
142141
setOperationAction(ISD::VACOPY, MVT::Other, Custom);
143142
setOperationAction(ISD::VAEND, MVT::Other, Expand);
@@ -220,23 +219,18 @@ void XtensaTargetLowering::LowerAsmOperandForConstraint(
220219
TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, Ops, DAG);
221220
}
222221

223-
unsigned XtensaTargetLowering::getVaListSizeInBits(const DataLayout &DL) const {
224-
// 2 * sizeof(int*) + sizeof(int)
225-
return 3 * 4;
226-
}
227-
228222
//===----------------------------------------------------------------------===//
229223
// Calling conventions
230224
//===----------------------------------------------------------------------===//
231225

232226
#include "XtensaGenCallingConv.inc"
233227

228+
static const MCPhysReg IntRegs[] = {Xtensa::A2, Xtensa::A3, Xtensa::A4,
229+
Xtensa::A5, Xtensa::A6, Xtensa::A7};
230+
234231
static bool CC_Xtensa_Custom(unsigned ValNo, MVT ValVT, MVT LocVT,
235232
CCValAssign::LocInfo LocInfo,
236233
ISD::ArgFlagsTy ArgFlags, CCState &State) {
237-
static const MCPhysReg IntRegs[] = {Xtensa::A2, Xtensa::A3, Xtensa::A4,
238-
Xtensa::A5, Xtensa::A6, Xtensa::A7};
239-
240234
if (ArgFlags.isByVal()) {
241235
Align ByValAlign = ArgFlags.getNonZeroByValAlign();
242236
unsigned ByValSize = ArgFlags.getByValSize();
@@ -319,9 +313,6 @@ SDValue XtensaTargetLowering::LowerFormalArguments(
319313
MachineFunction &MF = DAG.getMachineFunction();
320314
MachineFrameInfo &MFI = MF.getFrameInfo();
321315
XtensaMachineFunctionInfo *XtensaFI = MF.getInfo<XtensaMachineFunctionInfo>();
322-
EVT PtrVT = getPointerTy(MF.getDataLayout());
323-
324-
XtensaFI->setVarArgsFrameIndex(0);
325316

326317
// Used with vargs to acumulate store chains.
327318
std::vector<SDValue> OutChains;
@@ -338,16 +329,13 @@ SDValue XtensaTargetLowering::LowerFormalArguments(
338329
// Arguments stored on registers
339330
if (VA.isRegLoc()) {
340331
EVT RegVT = VA.getLocVT();
341-
const TargetRegisterClass *RC;
342332

343-
if (RegVT == MVT::i32)
344-
RC = &Xtensa::ARRegClass;
345-
else
333+
if (RegVT != MVT::i32)
346334
report_fatal_error("RegVT not supported by FormalArguments Lowering");
347335

348336
// Transform the arguments stored on
349337
// physical registers into virtual ones
350-
unsigned Register = MF.addLiveIn(VA.getLocReg(), RC);
338+
unsigned Register = MF.addLiveIn(VA.getLocReg(), &Xtensa::ARRegClass);
351339
SDValue ArgValue = DAG.getCopyFromReg(Chain, DL, Register, RegVT);
352340

353341
// If this is an 8 or 16-bit value, it has been passed promoted
@@ -394,20 +382,18 @@ SDValue XtensaTargetLowering::LowerFormalArguments(
394382
}
395383

396384
if (IsVarArg) {
397-
static const MCPhysReg XtensaArgRegs[6] = {
398-
Xtensa::A2, Xtensa::A3, Xtensa::A4, Xtensa::A5, Xtensa::A6, Xtensa::A7};
399-
ArrayRef<MCPhysReg> ArgRegs = ArrayRef(XtensaArgRegs);
385+
ArrayRef<MCPhysReg> ArgRegs = ArrayRef(IntRegs);
400386
unsigned Idx = CCInfo.getFirstUnallocated(ArgRegs);
401387
const TargetRegisterClass *RC = &Xtensa::ARRegClass;
402388
MachineFrameInfo &MFI = MF.getFrameInfo();
403389
MachineRegisterInfo &RegInfo = MF.getRegInfo();
404390
unsigned RegSize = 4;
405-
MVT RegTy = MVT::getIntegerVT(RegSize * 8);
391+
MVT RegTy = MVT::i32;
406392

407393
XtensaFI->setVarArgsFirstGPR(Idx + 2); // 2 - number of a2 register
408394

409-
XtensaFI->setVarArgsStackOffset(MFI.CreateFixedObject(
410-
PtrVT.getSizeInBits() / 8, CCInfo.getStackSize(), true));
395+
XtensaFI->setVarArgsOnStackFrameIndex(
396+
MFI.CreateFixedObject(4, CCInfo.getStackSize(), true));
411397

412398
// Offset of the first variable argument from stack pointer, and size of
413399
// the vararg save area. For now, the varargs save area is either zero or
@@ -422,36 +408,26 @@ SDValue XtensaTargetLowering::LowerFormalArguments(
422408
} else {
423409
VarArgsSaveSize = RegSize * (ArgRegs.size() - Idx);
424410
VaArgOffset = -VarArgsSaveSize;
425-
}
426411

427-
// Record the frame index of the first variable argument
428-
// which is a value necessary to VASTART.
429-
int FI = MFI.CreateFixedObject(RegSize, VaArgOffset, true);
430-
XtensaFI->setVarArgsFrameIndex(FI);
431-
432-
// Copy the integer registers that may have been used for passing varargs
433-
// to the vararg save area.
434-
for (unsigned I = Idx; I < ArgRegs.size(); ++I, VaArgOffset += RegSize) {
435-
const unsigned Reg = RegInfo.createVirtualRegister(RC);
436-
unsigned FrameReg = Subtarget.getRegisterInfo()->getFrameRegister(MF);
437-
438-
// Argument passed in FrameReg we save in A8 (in emitPrologue),
439-
// so load argument from A8
440-
if (ArgRegs[I] == FrameReg) {
441-
RegInfo.addLiveIn(Xtensa::A8, Reg);
442-
} else {
412+
// Record the frame index of the first variable argument
413+
// which is a value necessary to VASTART.
414+
int FI = MFI.CreateFixedObject(RegSize, VaArgOffset, true);
415+
XtensaFI->setVarArgsInRegsFrameIndex(FI);
416+
417+
// Copy the integer registers that may have been used for passing varargs
418+
// to the vararg save area.
419+
for (unsigned I = Idx; I < ArgRegs.size(); ++I, VaArgOffset += RegSize) {
420+
const Register Reg = RegInfo.createVirtualRegister(RC);
443421
RegInfo.addLiveIn(ArgRegs[I], Reg);
444-
}
445422

446-
SDValue ArgValue = DAG.getCopyFromReg(Chain, DL, Reg, RegTy);
447-
FI = MFI.CreateFixedObject(RegSize, VaArgOffset, true);
448-
SDValue PtrOff = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
449-
SDValue Store = DAG.getStore(Chain, DL, ArgValue, PtrOff,
450-
MachinePointerInfo::getFixedStack(MF, FI));
451-
cast<StoreSDNode>(Store.getNode())
452-
->getMemOperand()
453-
->setValue((Value *)nullptr);
454-
OutChains.push_back(Store);
423+
SDValue ArgValue = DAG.getCopyFromReg(Chain, DL, Reg, RegTy);
424+
FI = MFI.CreateFixedObject(RegSize, VaArgOffset, true);
425+
SDValue PtrOff =
426+
DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
427+
SDValue Store = DAG.getStore(Chain, DL, ArgValue, PtrOff,
428+
MachinePointerInfo::getFixedStack(MF, FI));
429+
OutChains.push_back(Store);
430+
}
455431
}
456432
}
457433

@@ -950,7 +926,7 @@ SDValue XtensaTargetLowering::LowerVASTART(SDValue Op,
950926

951927
SDValue VAIndex;
952928
SDValue StackOffsetFI =
953-
DAG.getFrameIndex(XtensaFI->getVarArgsStackOffset(), PtrVT);
929+
DAG.getFrameIndex(XtensaFI->getVarArgsOnStackFrameIndex(), PtrVT);
954930
unsigned ArgWords = XtensaFI->getVarArgsFirstGPR() - 2;
955931

956932
// If first variable argument passed in registers (maximum words in registers
@@ -964,7 +940,7 @@ SDValue XtensaTargetLowering::LowerVASTART(SDValue Op,
964940
}
965941

966942
SDValue FrameIndex =
967-
DAG.getFrameIndex(XtensaFI->getVarArgsFrameIndex(), PtrVT);
943+
DAG.getFrameIndex(XtensaFI->getVarArgsInRegsFrameIndex(), PtrVT);
968944
uint64_t FrameOffset = PtrVT.getStoreSize();
969945
const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
970946

@@ -991,7 +967,8 @@ SDValue XtensaTargetLowering::LowerVASTART(SDValue Op,
991967
}
992968

993969
SDValue XtensaTargetLowering::LowerVACOPY(SDValue Op, SelectionDAG &DAG) const {
994-
unsigned VAListSize = getVaListSizeInBits(DAG.getDataLayout()) / 8;
970+
// Size of the va_list_tag structure
971+
constexpr unsigned VAListSize = 3 * 4;
995972
return DAG.getMemcpy(
996973
Op.getOperand(0), Op, Op.getOperand(1), Op.getOperand(2),
997974
DAG.getConstant(VAListSize, SDLoc(Op), MVT::i32), Align(4),

llvm/lib/Target/Xtensa/XtensaISelLowering.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,6 @@ class XtensaTargetLowering : public TargetLowering {
7474

7575
bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
7676

77-
/// Returns the size of the platform's va_list object.
78-
unsigned getVaListSizeInBits(const DataLayout &DL) const override;
79-
8077
const char *getTargetNodeName(unsigned Opcode) const override;
8178

8279
std::pair<unsigned, const TargetRegisterClass *>

llvm/lib/Target/Xtensa/XtensaMachineFunctionInfo.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,12 @@ class XtensaMachineFunctionInfo : public MachineFunctionInfo {
4343
unsigned getVarArgsFirstGPR() const { return VarArgsFirstGPR; }
4444
void setVarArgsFirstGPR(unsigned GPR) { VarArgsFirstGPR = GPR; }
4545

46-
int getVarArgsStackOffset() const { return VarArgsStackOffset; }
47-
void setVarArgsStackOffset(int Offset) { VarArgsStackOffset = Offset; }
46+
int getVarArgsOnStackFrameIndex() const { return VarArgsStackOffset; }
47+
void setVarArgsOnStackFrameIndex(int Offset) { VarArgsStackOffset = Offset; }
4848

4949
// Get and set the frame index of the first stack vararg.
50-
unsigned getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
51-
void setVarArgsFrameIndex(unsigned FI) { VarArgsFrameIndex = FI; }
50+
unsigned getVarArgsInRegsFrameIndex() const { return VarArgsFrameIndex; }
51+
void setVarArgsInRegsFrameIndex(unsigned FI) { VarArgsFrameIndex = FI; }
5252
};
5353

5454
} // namespace llvm

0 commit comments

Comments
 (0)