diff options
Diffstat (limited to 'llvm/include/llvm/CodeGen/GlobalISel')
13 files changed, 82 insertions, 36 deletions
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h b/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h index 9c878d4b087b..3a4b3ee18e1b 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h @@ -95,7 +95,7 @@ public: bool IsFixed = true) : ArgInfo(Regs, OrigValue.getType(), OrigIndex, Flags, IsFixed, &OrigValue) {} - ArgInfo() : BaseArgInfo() {} + ArgInfo() {} }; struct CallLoweringInfo { @@ -388,12 +388,12 @@ protected: /// \p Handler to move them to the assigned locations. /// /// \return True if everything has succeeded, false otherwise. - bool determineAndHandleAssignments(ValueHandler &Handler, - ValueAssigner &Assigner, - SmallVectorImpl<ArgInfo> &Args, - MachineIRBuilder &MIRBuilder, - CallingConv::ID CallConv, bool IsVarArg, - Register ThisReturnReg = Register()) const; + bool + determineAndHandleAssignments(ValueHandler &Handler, ValueAssigner &Assigner, + SmallVectorImpl<ArgInfo> &Args, + MachineIRBuilder &MIRBuilder, + CallingConv::ID CallConv, bool IsVarArg, + ArrayRef<Register> ThisReturnRegs = None) const; /// Use \p Handler to insert code to handle the argument/return values /// represented by \p Args. It's expected determineAssignments previously @@ -402,7 +402,7 @@ protected: CCState &CCState, SmallVectorImpl<CCValAssign> &ArgLocs, MachineIRBuilder &MIRBuilder, - Register ThisReturnReg = Register()) const; + ArrayRef<Register> ThisReturnRegs = None) const; /// Check whether parameters to a call that are passed in callee saved /// registers are the same as from the calling function. This needs to be diff --git a/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h b/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h index f3fa652b0175..45c27c25aea0 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h @@ -323,6 +323,11 @@ public: void applyCombineUnmergeConstant(MachineInstr &MI, SmallVectorImpl<APInt> &Csts); + /// Transform G_UNMERGE G_IMPLICIT_DEF -> G_IMPLICIT_DEF, G_IMPLICIT_DEF, ... + bool + matchCombineUnmergeUndef(MachineInstr &MI, + std::function<void(MachineIRBuilder &)> &MatchInfo); + /// Transform X, Y<dead> = G_UNMERGE Z -> X = G_TRUNC Z. bool matchCombineUnmergeWithDeadLanesToTrunc(MachineInstr &MI); void applyCombineUnmergeWithDeadLanesToTrunc(MachineInstr &MI); @@ -353,8 +358,8 @@ public: std::pair<Register, bool> &PtrRegAndCommute); // Transform G_PTR_ADD (G_PTRTOINT C1), C2 -> C1 + C2 - bool matchCombineConstPtrAddToI2P(MachineInstr &MI, int64_t &NewCst); - void applyCombineConstPtrAddToI2P(MachineInstr &MI, int64_t &NewCst); + bool matchCombineConstPtrAddToI2P(MachineInstr &MI, APInt &NewCst); + void applyCombineConstPtrAddToI2P(MachineInstr &MI, APInt &NewCst); /// Transform anyext(trunc(x)) to x. bool matchCombineAnyExtTrunc(MachineInstr &MI, Register &Reg); diff --git a/llvm/include/llvm/CodeGen/GlobalISel/CombinerInfo.h b/llvm/include/llvm/CodeGen/GlobalISel/CombinerInfo.h index 4a1a4ff2528a..e73f8489497e 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/CombinerInfo.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/CombinerInfo.h @@ -20,7 +20,6 @@ class GISelChangeObserver; class LegalizerInfo; class MachineInstr; class MachineIRBuilder; -class MachineRegisterInfo; // Contains information relevant to enabling/disabling various combines for a // pass. diff --git a/llvm/include/llvm/CodeGen/GlobalISel/GISelWorkList.h b/llvm/include/llvm/CodeGen/GlobalISel/GISelWorkList.h index c5af64d2bcbe..7d198fada411 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/GISelWorkList.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/GISelWorkList.h @@ -15,7 +15,6 @@ namespace llvm { class MachineInstr; -class MachineFunction; // Worklist which mostly works similar to InstCombineWorkList, but on // MachineInstrs. The main difference with something like a SetVector is that diff --git a/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h b/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h index 886b3af834d7..38d2fe28063a 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h @@ -487,7 +487,8 @@ public: // That is not done yet. if (ConvertOp == 0) return true; - return !DestTy.isVector() && OpTy.isVector(); + return !DestTy.isVector() && OpTy.isVector() && + DestTy == OpTy.getElementType(); case TargetOpcode::G_CONCAT_VECTORS: { if (ConvertOp == 0) return true; @@ -977,10 +978,13 @@ public: Builder.setInstr(MI); for (unsigned Idx = 0; Idx < NumDefs; ++Idx) { - Register MergeSrc = MergeI->getOperand(Idx + 1).getReg(); Register DefReg = MI.getOperand(Idx).getReg(); - Builder.buildInstr(ConvertOp, {DefReg}, {MergeSrc}); - UpdatedDefs.push_back(DefReg); + Register MergeSrc = MergeI->getOperand(Idx + 1).getReg(); + + if (!MRI.use_empty(DefReg)) { + Builder.buildInstr(ConvertOp, {DefReg}, {MergeSrc}); + UpdatedDefs.push_back(DefReg); + } } markInstAndDefDead(MI, *MergeI, DeadInsts); diff --git a/llvm/include/llvm/CodeGen/GlobalISel/Legalizer.h b/llvm/include/llvm/CodeGen/GlobalISel/Legalizer.h index 4871d8d32ebd..c19f1d5330ba 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/Legalizer.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/Legalizer.h @@ -25,7 +25,6 @@ namespace llvm { -class MachineRegisterInfo; class LostDebugLocObserver; class Legalizer : public MachineFunctionPass { diff --git a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h index 044f2e22cfdd..3b2f937375eb 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h @@ -30,7 +30,6 @@ namespace llvm { // Forward declarations. class LegalizerInfo; -class Legalizer; class MachineRegisterInfo; class GISelChangeObserver; class LostDebugLocObserver; diff --git a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h index 0b37539030b1..9507c3411b5c 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h @@ -38,7 +38,6 @@ class LegalizerHelper; class MachineInstr; class MachineRegisterInfo; class MCInstrInfo; -class GISelChangeObserver; namespace LegalizeActions { enum LegalizeAction : std::uint8_t { @@ -557,7 +556,7 @@ class LegalizeRuleSet { } public: - LegalizeRuleSet() : AliasOf(0), IsAliasedByAnother(false), Rules() {} + LegalizeRuleSet() : AliasOf(0), IsAliasedByAnother(false) {} bool isAliasedByAnother() { return IsAliasedByAnother; } void setIsAliasedByAnother() { IsAliasedByAnother = true; } diff --git a/llvm/include/llvm/CodeGen/GlobalISel/LoadStoreOpt.h b/llvm/include/llvm/CodeGen/GlobalISel/LoadStoreOpt.h index 29575f386d7a..0845c001abdb 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/LoadStoreOpt.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/LoadStoreOpt.h @@ -30,7 +30,6 @@ namespace llvm { // Forward declarations. class MachineRegisterInfo; -class TargetTransformInfo; namespace GISelAddressing { /// Helper struct to store a base, index and offset that forms an address struct BaseIndexOffset { diff --git a/llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h b/llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h index 28bb8de11762..daf1ff052983 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h @@ -13,6 +13,7 @@ #ifndef LLVM_CODEGEN_GLOBALISEL_MIPATTERNMATCH_H #define LLVM_CODEGEN_GLOBALISEL_MIPATTERNMATCH_H +#include "llvm/ADT/APInt.h" #include "llvm/CodeGen/GlobalISel/Utils.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/IR/InstrTypes.h" @@ -59,11 +60,26 @@ inline OneNonDBGUse_match<SubPat> m_OneNonDBGUse(const SubPat &SP) { return SP; } -struct ConstantMatch { - int64_t &CR; - ConstantMatch(int64_t &C) : CR(C) {} +template <typename ConstT> +inline Optional<ConstT> matchConstant(Register, const MachineRegisterInfo &); + +template <> +inline Optional<APInt> matchConstant(Register Reg, + const MachineRegisterInfo &MRI) { + return getIConstantVRegVal(Reg, MRI); +} + +template <> +inline Optional<int64_t> matchConstant(Register Reg, + const MachineRegisterInfo &MRI) { + return getIConstantVRegSExtVal(Reg, MRI); +} + +template <typename ConstT> struct ConstantMatch { + ConstT &CR; + ConstantMatch(ConstT &C) : CR(C) {} bool match(const MachineRegisterInfo &MRI, Register Reg) { - if (auto MaybeCst = getIConstantVRegSExtVal(Reg, MRI)) { + if (auto MaybeCst = matchConstant<ConstT>(Reg, MRI)) { CR = *MaybeCst; return true; } @@ -71,7 +87,12 @@ struct ConstantMatch { } }; -inline ConstantMatch m_ICst(int64_t &Cst) { return ConstantMatch(Cst); } +inline ConstantMatch<APInt> m_ICst(APInt &Cst) { + return ConstantMatch<APInt>(Cst); +} +inline ConstantMatch<int64_t> m_ICst(int64_t &Cst) { + return ConstantMatch<int64_t>(Cst); +} struct GCstAndRegMatch { Optional<ValueAndVReg> &ValReg; diff --git a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h index fde0cb3cf1af..c4c2fc076dd8 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h @@ -836,17 +836,38 @@ public: /// \return a MachineInstrBuilder for the newly created instruction. MachineInstrBuilder buildCopy(const DstOp &Res, const SrcOp &Op); + + /// Build and insert G_ASSERT_SEXT, G_ASSERT_ZEXT, or G_ASSERT_ALIGN + /// + /// \return a MachineInstrBuilder for the newly created instruction. + MachineInstrBuilder buildAssertOp(unsigned Opc, const DstOp &Res, const SrcOp &Op, + unsigned Val) { + return buildInstr(Opc, Res, Op).addImm(Val); + } + /// Build and insert \p Res = G_ASSERT_ZEXT Op, Size /// /// \return a MachineInstrBuilder for the newly created instruction. MachineInstrBuilder buildAssertZExt(const DstOp &Res, const SrcOp &Op, - unsigned Size); + unsigned Size) { + return buildAssertOp(TargetOpcode::G_ASSERT_ZEXT, Res, Op, Size); + } /// Build and insert \p Res = G_ASSERT_SEXT Op, Size /// /// \return a MachineInstrBuilder for the newly created instruction. MachineInstrBuilder buildAssertSExt(const DstOp &Res, const SrcOp &Op, - unsigned Size); + unsigned Size) { + return buildAssertOp(TargetOpcode::G_ASSERT_SEXT, Res, Op, Size); + } + + /// Build and insert \p Res = G_ASSERT_ALIGN Op, AlignVal + /// + /// \return a MachineInstrBuilder for the newly created instruction. + MachineInstrBuilder buildAssertAlign(const DstOp &Res, const SrcOp &Op, + Align AlignVal) { + return buildAssertOp(TargetOpcode::G_ASSERT_ALIGN, Res, Op, AlignVal.value()); + } /// Build and insert `Res = G_LOAD Addr, MMO`. /// diff --git a/llvm/include/llvm/CodeGen/GlobalISel/RegBankSelect.h b/llvm/include/llvm/CodeGen/GlobalISel/RegBankSelect.h index 5c693d8de521..45006eecfce6 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/RegBankSelect.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/RegBankSelect.h @@ -253,7 +253,7 @@ public: public: MBBInsertPoint(MachineBasicBlock &MBB, bool Beginning = true) - : InsertPoint(), MBB(MBB), Beginning(Beginning) { + : MBB(MBB), Beginning(Beginning) { // If we try to insert before phis, we should use the insertion // points on the incoming edges. assert((!Beginning || MBB.getFirstNonPHI() == MBB.begin()) && @@ -299,7 +299,7 @@ public: public: EdgeInsertPoint(MachineBasicBlock &Src, MachineBasicBlock &Dst, Pass &P) - : InsertPoint(), Src(Src), DstOrSplit(&Dst), P(P) {} + : Src(Src), DstOrSplit(&Dst), P(P) {} bool isSplit() const override { return Src.succ_size() > 1 && DstOrSplit->pred_size() > 1; diff --git a/llvm/include/llvm/CodeGen/GlobalISel/Utils.h b/llvm/include/llvm/CodeGen/GlobalISel/Utils.h index 8fed79585fe9..aed915d2cc4b 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/Utils.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/Utils.h @@ -44,7 +44,6 @@ class TargetLowering; class TargetPassConfig; class TargetRegisterInfo; class TargetRegisterClass; -class ConstantInt; class ConstantFP; class APFloat; class MachineIRBuilder; @@ -271,9 +270,10 @@ Optional<APFloat> ConstantFoldFPBinOp(unsigned Opcode, const Register Op1, /// If successful, returns the G_BUILD_VECTOR representing the folded vector /// constant. \p MIB should have an insertion point already set to create new /// G_CONSTANT instructions as needed. -Optional<MachineInstr *> -ConstantFoldVectorBinop(unsigned Opcode, const Register Op1, const Register Op2, - const MachineRegisterInfo &MRI, MachineIRBuilder &MIB); +Register ConstantFoldVectorBinop(unsigned Opcode, const Register Op1, + const Register Op2, + const MachineRegisterInfo &MRI, + MachineIRBuilder &MIB); Optional<APInt> ConstantFoldExtOp(unsigned Opcode, const Register Op1, uint64_t Imm, const MachineRegisterInfo &MRI); @@ -311,10 +311,11 @@ Align inferAlignFromPtrInfo(MachineFunction &MF, const MachinePointerInfo &MPO); /// /// If there is an existing live-in argument register, it will be returned. /// This will also ensure there is a valid copy -Register getFunctionLiveInPhysReg(MachineFunction &MF, const TargetInstrInfo &TII, +Register getFunctionLiveInPhysReg(MachineFunction &MF, + const TargetInstrInfo &TII, MCRegister PhysReg, const TargetRegisterClass &RC, - LLT RegTy = LLT()); + const DebugLoc &DL, LLT RegTy = LLT()); /// Return the least common multiple type of \p OrigTy and \p TargetTy, by changing the /// number of vector elements or scalar bitwidth. The intent is a |