Skip to content

Commit dee6a2d

Browse files
jacobly0adriweb
authored andcommitted
1 parent 3314dbf commit dee6a2d

File tree

2 files changed

+43
-37
lines changed

2 files changed

+43
-37
lines changed

llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,15 @@ inline std::optional<ConstT> matchConstant(Register Reg,
6868
auto Val = matchConstant<APInt>(Reg, MRI);
6969
if (Val && Val->getBitWidth() <= 64)
7070
return Val->getSExtValue();
71-
return None;
71+
return std::nullopt;
7272
}
7373

7474
template <>
7575
inline std::optional<APInt> matchConstant(Register Reg,
7676
const MachineRegisterInfo &MRI) {
7777
if (auto ValAndVReg = getIConstantVRegValWithLookThrough(Reg, MRI))
7878
return ValAndVReg->Value;
79-
return None;
79+
return std::nullopt;
8080
}
8181

8282
template <typename ConstT> struct ConstantMatch {
@@ -374,6 +374,25 @@ inline ImplicitDefMatch m_GImplicitDef() { return ImplicitDefMatch(); }
374374
// Helper for matching G_FCONSTANT
375375
inline bind_ty<const ConstantFP *> m_GFCst(const ConstantFP *&C) { return C; }
376376

377+
template <typename Class> struct specific_ty {
378+
Class RequestedVal;
379+
380+
specific_ty(Class RequestedVal) : RequestedVal(RequestedVal) {}
381+
382+
bool match(const MachineRegisterInfo &MRI, Register Reg) {
383+
Class MatchedVal;
384+
return mi_match(Reg, MRI, bind_ty<Class>(MatchedVal)) &&
385+
MatchedVal == RequestedVal;
386+
}
387+
};
388+
389+
inline specific_ty<MachineInstr *> m_SpecificMInstr(MachineInstr *MI) {
390+
return MI;
391+
}
392+
inline specific_ty<CmpInst::Predicate> m_SpecificPred(CmpInst::Predicate P) {
393+
return P;
394+
}
395+
377396
// General helper for all the binary generic MI such as G_ADD/G_SUB etc
378397
template <typename LHS_P, typename RHS_P, unsigned Opcode,
379398
bool Commutable = false>

llvm/lib/Target/Z80/GISel/Z80CallLowering.cpp

Lines changed: 22 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@
2020
#include "Z80Subtarget.h"
2121
#include "llvm/CodeGen/Analysis.h"
2222
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
23+
#include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
2324
#include "llvm/Support/Debug.h"
2425
#include "llvm/Target/TargetMachine.h"
2526
using namespace llvm;
27+
using namespace MIPatternMatch;
2628

2729
#define DEBUG_TYPE "z80-call-lowering"
2830

@@ -128,46 +130,31 @@ struct CallArgHandler : public Z80OutgoingValueHandler {
128130
Register getStackAddress(uint64_t Size, int64_t Offset,
129131
MachinePointerInfo &MPO,
130132
ISD::ArgFlagsTy Flags) override {
131-
return Z80OutgoingValueHandler::getStackAddress(Size, Offset, MPO, Flags);
133+
return Z80OutgoingValueHandler::getStackAddress(
134+
Size, Offset - SetupFrameAdjustment, MPO, Flags);
132135
}
133136

134137
void assignValueToAddress(Register ValVReg, Register Addr, LLT MemTy,
135138
MachinePointerInfo &MPO, CCValAssign &VA) override {
136-
if (MachineInstr *AddrMI = MRI.getVRegDef(Addr)) {
137-
LLT SlotTy = LLT::scalar(DL.getIndexSizeInBits(0));
138-
if (VA.getLocVT().getStoreSize() == SlotTy.getSizeInBytes() &&
139-
AddrMI->getOpcode() == TargetOpcode::G_PTR_ADD) {
140-
if (MachineInstr *BaseMI =
141-
getDefIgnoringCopies(AddrMI->getOperand(1).getReg(), MRI)) {
142-
if (auto OffConst = getIConstantVRegValWithLookThrough(
143-
AddrMI->getOperand(2).getReg(), MRI)) {
144-
if (BaseMI->getOpcode() == TargetOpcode::COPY &&
145-
BaseMI->getOperand(1).getReg() ==
146-
STI.getRegisterInfo()->getStackRegister() &&
147-
OffConst->Value == SetupFrameAdjustment) {
148-
auto SaveInsertPt = std::prev(MIRBuilder.getInsertPt());
149-
MIRBuilder.setInsertPt(MIRBuilder.getMBB(), StackPushes);
150-
--StackPushes;
151-
if (MemTy.getSizeInBits() < SlotTy.getSizeInBits())
152-
ValVReg = MIRBuilder.buildAnyExt(SlotTy, ValVReg).getReg(0);
153-
MIRBuilder.buildInstr(STI.is24Bit() ? Z80::PUSH24r : Z80::PUSH16r,
154-
{}, {ValVReg});
155-
++StackPushes;
156-
MIRBuilder.setInsertPt(MIRBuilder.getMBB(),
157-
std::next(SaveInsertPt));
158-
SetupFrameAdjustment += SlotTy.getSizeInBytes();
159-
return;
160-
}
161-
}
162-
}
163-
}
139+
LLT SlotTy = LLT::scalar(DL.getIndexSizeInBits(0));
140+
if (VA.getLocVT().getStoreSize() != SlotTy.getSizeInBytes() ||
141+
!mi_match(Addr, MRI,
142+
m_GPtrAdd(m_SpecificReg(SPRegCopy), m_ZeroInt()))) {
143+
Z80OutgoingValueHandler::assignValueToAddress(ValVReg, Addr, MemTy, MPO,
144+
VA);
145+
return;
164146
}
165-
LLT PtrTy = LLT::pointer(0, DL.getPointerSizeInBits(0));
166-
LLT OffTy = LLT::scalar(DL.getIndexSizeInBits(0));
167-
auto OffI = MIRBuilder.buildConstant(OffTy, -SetupFrameAdjustment);
168-
Addr = MIRBuilder.buildPtrAdd(PtrTy, Addr, OffI).getReg(0);
169-
Z80OutgoingValueHandler::assignValueToAddress(ValVReg, Addr, MemTy, MPO,
170-
VA);
147+
148+
auto SaveInsertPt = std::prev(MIRBuilder.getInsertPt());
149+
MIRBuilder.setInsertPt(MIRBuilder.getMBB(), StackPushes);
150+
--StackPushes;
151+
if (MemTy.getSizeInBits() < SlotTy.getSizeInBits())
152+
ValVReg = MIRBuilder.buildAnyExt(SlotTy, ValVReg).getReg(0);
153+
MIRBuilder.buildInstr(STI.is24Bit() ? Z80::PUSH24r : Z80::PUSH16r, {},
154+
{ValVReg});
155+
++StackPushes;
156+
MIRBuilder.setInsertPt(MIRBuilder.getMBB(), std::next(SaveInsertPt));
157+
SetupFrameAdjustment += SlotTy.getSizeInBytes();
171158
}
172159

173160
bool finalize(CCState &State) override {

0 commit comments

Comments
 (0)