Skip to content

Commit 3ccba24

Browse files
[RISCV][GISEL] Legalize G_VASTART using custom legalization (#73063)
The legalization was modeled after SelectionDAG.
1 parent 4d80122 commit 3ccba24

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "RISCVLegalizerInfo.h"
14+
#include "RISCVMachineFunctionInfo.h"
1415
#include "RISCVSubtarget.h"
1516
#include "llvm/CodeGen/GlobalISel/LegalizerHelper.h"
1617
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
@@ -300,6 +301,8 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
300301
getActionDefinitionsBuilder({G_FCEIL, G_FFLOOR})
301302
.libcallFor({s32, s64});
302303

304+
getActionDefinitionsBuilder(G_VASTART).customFor({p0});
305+
303306
getLegacyLegalizerInfo().computeTables();
304307
}
305308

@@ -327,6 +330,25 @@ bool RISCVLegalizerInfo::legalizeShlAshrLshr(
327330
return true;
328331
}
329332

333+
bool RISCVLegalizerInfo::legalizeVAStart(MachineInstr &MI,
334+
MachineIRBuilder &MIRBuilder,
335+
GISelChangeObserver &Observer) const {
336+
// Stores the address of the VarArgsFrameIndex slot into the memory location
337+
assert(MI.getOpcode() == TargetOpcode::G_VASTART);
338+
MachineFunction *MF = MI.getParent()->getParent();
339+
RISCVMachineFunctionInfo *FuncInfo = MF->getInfo<RISCVMachineFunctionInfo>();
340+
int FI = FuncInfo->getVarArgsFrameIndex();
341+
LLT AddrTy = MIRBuilder.getMRI()->getType(MI.getOperand(0).getReg());
342+
auto FINAddr = MIRBuilder.buildFrameIndex(AddrTy, FI);
343+
assert(MI.hasOneMemOperand());
344+
MachineInstr *LoweredMI = MIRBuilder.buildStore(
345+
MI.getOperand(0).getReg(), FINAddr, *MI.memoperands()[0]);
346+
Observer.createdInstr(*LoweredMI);
347+
Observer.erasingInstr(MI);
348+
MI.eraseFromParent();
349+
return true;
350+
}
351+
330352
bool RISCVLegalizerInfo::legalizeCustom(LegalizerHelper &Helper,
331353
MachineInstr &MI) const {
332354
MachineIRBuilder &MIRBuilder = Helper.MIRBuilder;
@@ -367,6 +389,8 @@ bool RISCVLegalizerInfo::legalizeCustom(LegalizerHelper &Helper,
367389
MI.eraseFromParent();
368390
return true;
369391
}
392+
case TargetOpcode::G_VASTART:
393+
return legalizeVAStart(MI, MIRBuilder, Observer);
370394
}
371395

372396
llvm_unreachable("expected switch to return");

llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ class RISCVLegalizerInfo : public LegalizerInfo {
3535
private:
3636
bool legalizeShlAshrLshr(MachineInstr &MI, MachineIRBuilder &MIRBuilder,
3737
GISelChangeObserver &Observer) const;
38+
39+
bool legalizeVAStart(MachineInstr &MI, MachineIRBuilder &MIRBuilder,
40+
GISelChangeObserver &Observer) const;
3841
};
3942
} // end namespace llvm
4043
#endif

0 commit comments

Comments
 (0)