Skip to content

Commit 548a24d

Browse files
jacobly0adriweb
authored andcommitted
1 parent 4931385 commit 548a24d

File tree

2 files changed

+43
-47
lines changed

2 files changed

+43
-47
lines changed

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

+21-12
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,27 @@ inline ImplicitDefMatch m_GImplicitDef() { return ImplicitDefMatch(); }
404404
// Helper for matching G_FCONSTANT
405405
inline bind_ty<const ConstantFP *> m_GFCst(const ConstantFP *&C) { return C; }
406406

407+
template <typename Class> struct specific_ty {
408+
Class RequestedVal;
409+
410+
specific_ty(Class RequestedVal) : RequestedVal(RequestedVal) {}
411+
412+
bool match(const MachineRegisterInfo &MRI, Register Reg) {
413+
Class MatchedVal;
414+
return mi_match(Reg, MRI, bind_ty<Class>(MatchedVal)) &&
415+
MatchedVal == RequestedVal;
416+
}
417+
};
418+
419+
inline specific_ty<Register> m_SpecificReg(Register R) { return R; }
420+
inline specific_ty<MachineInstr *> m_SpecificMInstr(MachineInstr *MI) {
421+
return MI;
422+
}
423+
inline specific_ty<LLT> m_SpecificType(LLT Ty) { return Ty; }
424+
inline specific_ty<CmpInst::Predicate> m_SpecificPred(CmpInst::Predicate P) {
425+
return P;
426+
}
427+
407428
// General helper for all the binary generic MI such as G_ADD/G_SUB etc
408429
template <typename LHS_P, typename RHS_P, unsigned Opcode,
409430
bool Commutable = false>
@@ -746,18 +767,6 @@ m_c_GFCmp(const Pred &P, const LHS &L, const RHS &R) {
746767
return CompareOp_match<Pred, LHS, RHS, TargetOpcode::G_FCMP, true>(P, L, R);
747768
}
748769

749-
// Helper for checking if a Reg is of specific type.
750-
struct CheckType {
751-
LLT Ty;
752-
CheckType(const LLT Ty) : Ty(Ty) {}
753-
754-
bool match(const MachineRegisterInfo &MRI, Register Reg) {
755-
return MRI.getType(Reg) == Ty;
756-
}
757-
};
758-
759-
inline CheckType m_SpecificType(LLT Ty) { return Ty; }
760-
761770
template <typename Src0Ty, typename Src1Ty, typename Src2Ty, unsigned Opcode>
762771
struct TernaryOp_match {
763772
Src0Ty Src0;

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

+22-35
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)