#include "AArch64GlobalISelUtils.h"
#include "AArch64TargetMachine.h"
#include "llvm/CodeGen/GlobalISel/CSEInfo.h"
#include "llvm/CodeGen/GlobalISel/Combiner.h"
#include "llvm/CodeGen/GlobalISel/CombinerHelper.h"
#include "llvm/CodeGen/GlobalISel/CombinerInfo.h"
#include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h"
#include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
#include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
#include "llvm/CodeGen/GlobalISel/Utils.h"
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/TargetPassConfig.h"
#include "llvm/IR/Instructions.h"
#include "llvm/Support/Debug.h"
#define GET_GICOMBINER_DEPS
#include "AArch64GenPreLegalizeGICombiner.inc"
#undef GET_GICOMBINER_DEPS
#define DEBUG_TYPE …
usingnamespacellvm;
usingnamespaceMIPatternMatch;
namespace {
#define GET_GICOMBINER_TYPES
#include "AArch64GenPreLegalizeGICombiner.inc"
#undef GET_GICOMBINER_TYPES
bool matchFConstantToConstant(MachineInstr &MI, MachineRegisterInfo &MRI) { … }
void applyFConstantToConstant(MachineInstr &MI) { … }
bool matchICmpRedundantTrunc(MachineInstr &MI, MachineRegisterInfo &MRI,
GISelKnownBits *KB, Register &MatchInfo) { … }
void applyICmpRedundantTrunc(MachineInstr &MI, MachineRegisterInfo &MRI,
MachineIRBuilder &Builder,
GISelChangeObserver &Observer, Register &WideReg) { … }
bool matchFoldGlobalOffset(MachineInstr &MI, MachineRegisterInfo &MRI,
std::pair<uint64_t, uint64_t> &MatchInfo) { … }
void applyFoldGlobalOffset(MachineInstr &MI, MachineRegisterInfo &MRI,
MachineIRBuilder &B, GISelChangeObserver &Observer,
std::pair<uint64_t, uint64_t> &MatchInfo) { … }
bool matchExtAddvToUdotAddv(MachineInstr &MI, MachineRegisterInfo &MRI,
const AArch64Subtarget &STI,
std::tuple<Register, Register, bool> &MatchInfo) { … }
void applyExtAddvToUdotAddv(MachineInstr &MI, MachineRegisterInfo &MRI,
MachineIRBuilder &Builder,
GISelChangeObserver &Observer,
const AArch64Subtarget &STI,
std::tuple<Register, Register, bool> &MatchInfo) { … }
bool matchExtUaddvToUaddlv(MachineInstr &MI, MachineRegisterInfo &MRI,
std::pair<Register, bool> &MatchInfo) { … }
void applyExtUaddvToUaddlv(MachineInstr &MI, MachineRegisterInfo &MRI,
MachineIRBuilder &B, GISelChangeObserver &Observer,
std::pair<Register, bool> &MatchInfo) { … }
bool matchPushAddSubExt(MachineInstr &MI, MachineRegisterInfo &MRI,
Register DstReg, Register SrcReg1, Register SrcReg2) { … }
void applyPushAddSubExt(MachineInstr &MI, MachineRegisterInfo &MRI,
MachineIRBuilder &B, bool isSExt, Register DstReg,
Register SrcReg1, Register SrcReg2) { … }
bool tryToSimplifyUADDO(MachineInstr &MI, MachineIRBuilder &B,
CombinerHelper &Helper, GISelChangeObserver &Observer) { … }
class AArch64PreLegalizerCombinerImpl : public Combiner { … };
#define GET_GICOMBINER_IMPL
#include "AArch64GenPreLegalizeGICombiner.inc"
#undef GET_GICOMBINER_IMPL
AArch64PreLegalizerCombinerImpl::AArch64PreLegalizerCombinerImpl(
MachineFunction &MF, CombinerInfo &CInfo, const TargetPassConfig *TPC,
GISelKnownBits &KB, GISelCSEInfo *CSEInfo,
const AArch64PreLegalizerCombinerImplRuleConfig &RuleConfig,
const AArch64Subtarget &STI, MachineDominatorTree *MDT,
const LegalizerInfo *LI)
: … { … }
bool AArch64PreLegalizerCombinerImpl::tryCombineAll(MachineInstr &MI) const { … }
class AArch64PreLegalizerCombiner : public MachineFunctionPass { … };
}
void AArch64PreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { … }
AArch64PreLegalizerCombiner::AArch64PreLegalizerCombiner()
: … { … }
bool AArch64PreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { … }
char AArch64PreLegalizerCombiner::ID = …;
INITIALIZE_PASS_BEGIN(AArch64PreLegalizerCombiner, DEBUG_TYPE,
"Combine AArch64 machine instrs before legalization",
false, false)
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
INITIALIZE_PASS_DEPENDENCY(GISelKnownBitsAnalysis)
INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass)
INITIALIZE_PASS_END(AArch64PreLegalizerCombiner, DEBUG_TYPE,
"Combine AArch64 machine instrs before legalization", false,
false)
namespace llvm {
FunctionPass *createAArch64PreLegalizerCombiner() { … }
}