|
11 | 11 | //===----------------------------------------------------------------------===//
|
12 | 12 |
|
13 | 13 | #include "RISCVLegalizerInfo.h"
|
| 14 | +#include "RISCVMachineFunctionInfo.h" |
14 | 15 | #include "RISCVSubtarget.h"
|
15 | 16 | #include "llvm/CodeGen/GlobalISel/LegalizerHelper.h"
|
16 | 17 | #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
|
@@ -300,6 +301,8 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
|
300 | 301 | getActionDefinitionsBuilder({G_FCEIL, G_FFLOOR})
|
301 | 302 | .libcallFor({s32, s64});
|
302 | 303 |
|
| 304 | + getActionDefinitionsBuilder(G_VASTART).customFor({p0}); |
| 305 | + |
303 | 306 | getLegacyLegalizerInfo().computeTables();
|
304 | 307 | }
|
305 | 308 |
|
@@ -327,6 +330,25 @@ bool RISCVLegalizerInfo::legalizeShlAshrLshr(
|
327 | 330 | return true;
|
328 | 331 | }
|
329 | 332 |
|
| 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 | + |
330 | 352 | bool RISCVLegalizerInfo::legalizeCustom(LegalizerHelper &Helper,
|
331 | 353 | MachineInstr &MI) const {
|
332 | 354 | MachineIRBuilder &MIRBuilder = Helper.MIRBuilder;
|
@@ -367,6 +389,8 @@ bool RISCVLegalizerInfo::legalizeCustom(LegalizerHelper &Helper,
|
367 | 389 | MI.eraseFromParent();
|
368 | 390 | return true;
|
369 | 391 | }
|
| 392 | + case TargetOpcode::G_VASTART: |
| 393 | + return legalizeVAStart(MI, MIRBuilder, Observer); |
370 | 394 | }
|
371 | 395 |
|
372 | 396 | llvm_unreachable("expected switch to return");
|
|
0 commit comments