[GlobalISel] Add a GISelValueTracker printing pass (#139687)
This adds a GISelValueTrackingPrinterPass that can print the known bits and sign bit of each def in a function. It is built on the new pass manager and so adds a NPM GISelValueTrackingAnalysis, renaming the older class to GISelValueTrackingAnalysisLegacy. The first 2 functions from the AArch64GISelMITest are ported over to an mir test to show it working. It also runs successfully on all files in llvm/test/CodeGen/AArch64/GlobalISel/*.mir that are not invalid. It can hopefully be used to test GlobalISel known bits analysis more directly in common cases, without jumping through the hoops that the C++ tests requires.
This commit is contained in:
@@ -66,7 +66,7 @@ dependency with ``INITIALIZE_PASS_DEPENDENCY``.
|
|||||||
...
|
...
|
||||||
|
|
||||||
INITIALIZE_PASS_BEGIN(...)
|
INITIALIZE_PASS_BEGIN(...)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)
|
||||||
INITIALIZE_PASS_END(...)
|
INITIALIZE_PASS_END(...)
|
||||||
|
|
||||||
and require the pass in ``getAnalysisUsage``.
|
and require the pass in ``getAnalysisUsage``.
|
||||||
@@ -74,10 +74,10 @@ and require the pass in ``getAnalysisUsage``.
|
|||||||
.. code-block:: c++
|
.. code-block:: c++
|
||||||
|
|
||||||
void MyPass::getAnalysisUsage(AnalysisUsage &AU) const {
|
void MyPass::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addRequired<GISelValueTrackingAnalysis>();
|
AU.addRequired<GISelValueTrackingAnalysisLegacy>();
|
||||||
// Optional: If your pass preserves known bits analysis (many do) then
|
// Optional: If your pass preserves known bits analysis (many do) then
|
||||||
// indicate that it's preserved for re-use by another pass here.
|
// indicate that it's preserved for re-use by another pass here.
|
||||||
AU.addPreserved<GISelValueTrackingAnalysis>();
|
AU.addPreserved<GISelValueTrackingAnalysisLegacy>();
|
||||||
}
|
}
|
||||||
|
|
||||||
Then it's just a matter of fetching the analysis and using it:
|
Then it's just a matter of fetching the analysis and using it:
|
||||||
@@ -86,7 +86,7 @@ Then it's just a matter of fetching the analysis and using it:
|
|||||||
|
|
||||||
bool MyPass::runOnMachineFunction(MachineFunction &MF) {
|
bool MyPass::runOnMachineFunction(MachineFunction &MF) {
|
||||||
...
|
...
|
||||||
GISelValueTracking &VT = getAnalysis<GISelValueTrackingAnalysis>().get(MF);
|
GISelValueTracking &VT = getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
|
||||||
...
|
...
|
||||||
MachineInstr *MI = ...;
|
MachineInstr *MI = ...;
|
||||||
KnownBits Known = VT->getKnownBits(MI->getOperand(0).getReg());
|
KnownBits Known = VT->getKnownBits(MI->getOperand(0).getReg());
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
#include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h"
|
#include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h"
|
||||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||||
#include "llvm/CodeGen/Register.h"
|
#include "llvm/CodeGen/Register.h"
|
||||||
|
#include "llvm/IR/PassManager.h"
|
||||||
#include "llvm/InitializePasses.h"
|
#include "llvm/InitializePasses.h"
|
||||||
#include "llvm/Support/KnownBits.h"
|
#include "llvm/Support/KnownBits.h"
|
||||||
|
|
||||||
@@ -104,19 +105,42 @@ protected:
|
|||||||
/// Eventually add other features such as caching/ser/deserializing
|
/// Eventually add other features such as caching/ser/deserializing
|
||||||
/// to MIR etc. Those implementations can derive from GISelValueTracking
|
/// to MIR etc. Those implementations can derive from GISelValueTracking
|
||||||
/// and override computeKnownBitsImpl.
|
/// and override computeKnownBitsImpl.
|
||||||
class GISelValueTrackingAnalysis : public MachineFunctionPass {
|
class GISelValueTrackingAnalysisLegacy : public MachineFunctionPass {
|
||||||
std::unique_ptr<GISelValueTracking> Info;
|
std::unique_ptr<GISelValueTracking> Info;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static char ID;
|
static char ID;
|
||||||
GISelValueTrackingAnalysis() : MachineFunctionPass(ID) {
|
GISelValueTrackingAnalysisLegacy() : MachineFunctionPass(ID) {
|
||||||
initializeGISelValueTrackingAnalysisPass(*PassRegistry::getPassRegistry());
|
initializeGISelValueTrackingAnalysisLegacyPass(
|
||||||
|
*PassRegistry::getPassRegistry());
|
||||||
}
|
}
|
||||||
GISelValueTracking &get(MachineFunction &MF);
|
GISelValueTracking &get(MachineFunction &MF);
|
||||||
void getAnalysisUsage(AnalysisUsage &AU) const override;
|
void getAnalysisUsage(AnalysisUsage &AU) const override;
|
||||||
bool runOnMachineFunction(MachineFunction &MF) override;
|
bool runOnMachineFunction(MachineFunction &MF) override;
|
||||||
void releaseMemory() override { Info.reset(); }
|
void releaseMemory() override { Info.reset(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class GISelValueTrackingAnalysis
|
||||||
|
: public AnalysisInfoMixin<GISelValueTrackingAnalysis> {
|
||||||
|
friend AnalysisInfoMixin<GISelValueTrackingAnalysis>;
|
||||||
|
static AnalysisKey Key;
|
||||||
|
|
||||||
|
public:
|
||||||
|
using Result = GISelValueTracking;
|
||||||
|
|
||||||
|
Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM);
|
||||||
|
};
|
||||||
|
|
||||||
|
class GISelValueTrackingPrinterPass
|
||||||
|
: public PassInfoMixin<GISelValueTrackingPrinterPass> {
|
||||||
|
raw_ostream &OS;
|
||||||
|
|
||||||
|
public:
|
||||||
|
GISelValueTrackingPrinterPass(raw_ostream &OS) : OS(OS) {}
|
||||||
|
|
||||||
|
PreservedAnalyses run(MachineFunction &MF,
|
||||||
|
MachineFunctionAnalysisManager &MFAM);
|
||||||
|
};
|
||||||
} // namespace llvm
|
} // namespace llvm
|
||||||
|
|
||||||
#endif // LLVM_CODEGEN_GLOBALISEL_GISELVALUETRACKING_H
|
#endif // LLVM_CODEGEN_GLOBALISEL_GISELVALUETRACKING_H
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ void initializeLazyValueInfoWrapperPassPass(PassRegistry &);
|
|||||||
void initializeLegacyLICMPassPass(PassRegistry &);
|
void initializeLegacyLICMPassPass(PassRegistry &);
|
||||||
void initializeLegalizerPass(PassRegistry &);
|
void initializeLegalizerPass(PassRegistry &);
|
||||||
void initializeGISelCSEAnalysisWrapperPassPass(PassRegistry &);
|
void initializeGISelCSEAnalysisWrapperPassPass(PassRegistry &);
|
||||||
void initializeGISelValueTrackingAnalysisPass(PassRegistry &);
|
void initializeGISelValueTrackingAnalysisLegacyPass(PassRegistry &);
|
||||||
void initializeLiveDebugValuesLegacyPass(PassRegistry &);
|
void initializeLiveDebugValuesLegacyPass(PassRegistry &);
|
||||||
void initializeLiveDebugVariablesWrapperLegacyPass(PassRegistry &);
|
void initializeLiveDebugVariablesWrapperLegacyPass(PassRegistry &);
|
||||||
void initializeLiveIntervalsWrapperPassPass(PassRegistry &);
|
void initializeLiveIntervalsWrapperPassPass(PassRegistry &);
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ LOOP_PASS("loop-term-fold", LoopTermFoldPass())
|
|||||||
// computed. (We still either need to regenerate kill flags after regalloc, or
|
// computed. (We still either need to regenerate kill flags after regalloc, or
|
||||||
// preferably fix the scavenger to not depend on them).
|
// preferably fix the scavenger to not depend on them).
|
||||||
MACHINE_FUNCTION_ANALYSIS("edge-bundles", EdgeBundlesAnalysis())
|
MACHINE_FUNCTION_ANALYSIS("edge-bundles", EdgeBundlesAnalysis())
|
||||||
|
MACHINE_FUNCTION_ANALYSIS("gisel-value-tracking", GISelValueTrackingAnalysis())
|
||||||
MACHINE_FUNCTION_ANALYSIS("livedebugvars", LiveDebugVariablesAnalysis())
|
MACHINE_FUNCTION_ANALYSIS("livedebugvars", LiveDebugVariablesAnalysis())
|
||||||
MACHINE_FUNCTION_ANALYSIS("live-intervals", LiveIntervalsAnalysis())
|
MACHINE_FUNCTION_ANALYSIS("live-intervals", LiveIntervalsAnalysis())
|
||||||
MACHINE_FUNCTION_ANALYSIS("live-reg-matrix", LiveRegMatrixAnalysis())
|
MACHINE_FUNCTION_ANALYSIS("live-reg-matrix", LiveRegMatrixAnalysis())
|
||||||
@@ -165,6 +166,7 @@ MACHINE_FUNCTION_PASS("post-RA-sched", PostRASchedulerPass(TM))
|
|||||||
MACHINE_FUNCTION_PASS("postmisched", PostMachineSchedulerPass(TM))
|
MACHINE_FUNCTION_PASS("postmisched", PostMachineSchedulerPass(TM))
|
||||||
MACHINE_FUNCTION_PASS("post-ra-pseudos", ExpandPostRAPseudosPass())
|
MACHINE_FUNCTION_PASS("post-ra-pseudos", ExpandPostRAPseudosPass())
|
||||||
MACHINE_FUNCTION_PASS("print", PrintMIRPass())
|
MACHINE_FUNCTION_PASS("print", PrintMIRPass())
|
||||||
|
MACHINE_FUNCTION_PASS("print<gisel-value-tracking>", GISelValueTrackingPrinterPass(errs()))
|
||||||
MACHINE_FUNCTION_PASS("print<livedebugvars>", LiveDebugVariablesPrinterPass(errs()))
|
MACHINE_FUNCTION_PASS("print<livedebugvars>", LiveDebugVariablesPrinterPass(errs()))
|
||||||
MACHINE_FUNCTION_PASS("print<live-intervals>", LiveIntervalsPrinterPass(errs()))
|
MACHINE_FUNCTION_PASS("print<live-intervals>", LiveIntervalsPrinterPass(errs()))
|
||||||
MACHINE_FUNCTION_PASS("print<live-stacks>", LiveStacksPrinterPass(errs()))
|
MACHINE_FUNCTION_PASS("print<live-stacks>", LiveStacksPrinterPass(errs()))
|
||||||
|
|||||||
@@ -27,9 +27,9 @@
|
|||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
char llvm::GISelValueTrackingAnalysis::ID = 0;
|
char llvm::GISelValueTrackingAnalysisLegacy::ID = 0;
|
||||||
|
|
||||||
INITIALIZE_PASS(GISelValueTrackingAnalysis, DEBUG_TYPE,
|
INITIALIZE_PASS(GISelValueTrackingAnalysisLegacy, DEBUG_TYPE,
|
||||||
"Analysis for ComputingKnownBits", false, true)
|
"Analysis for ComputingKnownBits", false, true)
|
||||||
|
|
||||||
GISelValueTracking::GISelValueTracking(MachineFunction &MF, unsigned MaxDepth)
|
GISelValueTracking::GISelValueTracking(MachineFunction &MF, unsigned MaxDepth)
|
||||||
@@ -893,16 +893,18 @@ unsigned GISelValueTracking::computeNumSignBits(Register R, unsigned Depth) {
|
|||||||
return computeNumSignBits(R, DemandedElts, Depth);
|
return computeNumSignBits(R, DemandedElts, Depth);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GISelValueTrackingAnalysis::getAnalysisUsage(AnalysisUsage &AU) const {
|
void GISelValueTrackingAnalysisLegacy::getAnalysisUsage(
|
||||||
|
AnalysisUsage &AU) const {
|
||||||
AU.setPreservesAll();
|
AU.setPreservesAll();
|
||||||
MachineFunctionPass::getAnalysisUsage(AU);
|
MachineFunctionPass::getAnalysisUsage(AU);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GISelValueTrackingAnalysis::runOnMachineFunction(MachineFunction &MF) {
|
bool GISelValueTrackingAnalysisLegacy::runOnMachineFunction(
|
||||||
|
MachineFunction &MF) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
GISelValueTracking &GISelValueTrackingAnalysis::get(MachineFunction &MF) {
|
GISelValueTracking &GISelValueTrackingAnalysisLegacy::get(MachineFunction &MF) {
|
||||||
if (!Info) {
|
if (!Info) {
|
||||||
unsigned MaxDepth =
|
unsigned MaxDepth =
|
||||||
MF.getTarget().getOptLevel() == CodeGenOptLevel::None ? 2 : 6;
|
MF.getTarget().getOptLevel() == CodeGenOptLevel::None ? 2 : 6;
|
||||||
@@ -910,3 +912,38 @@ GISelValueTracking &GISelValueTrackingAnalysis::get(MachineFunction &MF) {
|
|||||||
}
|
}
|
||||||
return *Info;
|
return *Info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AnalysisKey GISelValueTrackingAnalysis::Key;
|
||||||
|
|
||||||
|
GISelValueTracking
|
||||||
|
GISelValueTrackingAnalysis::run(MachineFunction &MF,
|
||||||
|
MachineFunctionAnalysisManager &MFAM) {
|
||||||
|
return Result(MF);
|
||||||
|
}
|
||||||
|
|
||||||
|
PreservedAnalyses
|
||||||
|
GISelValueTrackingPrinterPass::run(MachineFunction &MF,
|
||||||
|
MachineFunctionAnalysisManager &MFAM) {
|
||||||
|
auto &VTA = MFAM.getResult<GISelValueTrackingAnalysis>(MF);
|
||||||
|
const auto &MRI = MF.getRegInfo();
|
||||||
|
OS << "name: ";
|
||||||
|
MF.getFunction().printAsOperand(OS, /*PrintType=*/false);
|
||||||
|
OS << '\n';
|
||||||
|
|
||||||
|
for (MachineBasicBlock &BB : MF) {
|
||||||
|
for (MachineInstr &MI : BB) {
|
||||||
|
for (MachineOperand &MO : MI.defs()) {
|
||||||
|
if (!MO.isReg() || MO.getReg().isPhysical())
|
||||||
|
continue;
|
||||||
|
Register Reg = MO.getReg();
|
||||||
|
if (!MRI.getType(Reg).isValid())
|
||||||
|
continue;
|
||||||
|
KnownBits Known = VTA.getKnownBits(Reg);
|
||||||
|
unsigned SignedBits = VTA.computeNumSignBits(Reg);
|
||||||
|
OS << " " << MO << " KnownBits:" << Known << " SignBits:" << SignedBits
|
||||||
|
<< '\n';
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return PreservedAnalyses::all();
|
||||||
|
}
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ INITIALIZE_PASS_BEGIN(InstructionSelect, DEBUG_TYPE,
|
|||||||
"Select target instructions out of generic instructions",
|
"Select target instructions out of generic instructions",
|
||||||
false, false)
|
false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)
|
||||||
INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
|
INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LazyBlockFrequencyInfoPass)
|
INITIALIZE_PASS_DEPENDENCY(LazyBlockFrequencyInfoPass)
|
||||||
INITIALIZE_PASS_END(InstructionSelect, DEBUG_TYPE,
|
INITIALIZE_PASS_END(InstructionSelect, DEBUG_TYPE,
|
||||||
@@ -120,8 +120,8 @@ public:
|
|||||||
|
|
||||||
void InstructionSelect::getAnalysisUsage(AnalysisUsage &AU) const {
|
void InstructionSelect::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addRequired<TargetPassConfig>();
|
AU.addRequired<TargetPassConfig>();
|
||||||
AU.addRequired<GISelValueTrackingAnalysis>();
|
AU.addRequired<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.addPreserved<GISelValueTrackingAnalysis>();
|
AU.addPreserved<GISelValueTrackingAnalysisLegacy>();
|
||||||
|
|
||||||
if (OptLevel != CodeGenOptLevel::None) {
|
if (OptLevel != CodeGenOptLevel::None) {
|
||||||
AU.addRequired<ProfileSummaryInfoWrapperPass>();
|
AU.addRequired<ProfileSummaryInfoWrapperPass>();
|
||||||
@@ -146,7 +146,7 @@ bool InstructionSelect::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
OptLevel = MF.getFunction().hasOptNone() ? CodeGenOptLevel::None
|
OptLevel = MF.getFunction().hasOptNone() ? CodeGenOptLevel::None
|
||||||
: MF.getTarget().getOptLevel();
|
: MF.getTarget().getOptLevel();
|
||||||
|
|
||||||
VT = &getAnalysis<GISelValueTrackingAnalysis>().get(MF);
|
VT = &getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
|
||||||
if (OptLevel != CodeGenOptLevel::None) {
|
if (OptLevel != CodeGenOptLevel::None) {
|
||||||
PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
|
PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
|
||||||
if (PSI && PSI->hasProfileSummary())
|
if (PSI && PSI->hasProfileSummary())
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ INITIALIZE_PASS_BEGIN(Legalizer, DEBUG_TYPE,
|
|||||||
false)
|
false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass)
|
INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)
|
||||||
INITIALIZE_PASS_END(Legalizer, DEBUG_TYPE,
|
INITIALIZE_PASS_END(Legalizer, DEBUG_TYPE,
|
||||||
"Legalize the Machine IR a function's Machine IR", false,
|
"Legalize the Machine IR a function's Machine IR", false,
|
||||||
false)
|
false)
|
||||||
@@ -86,8 +86,8 @@ void Legalizer::getAnalysisUsage(AnalysisUsage &AU) const {
|
|||||||
AU.addRequired<TargetPassConfig>();
|
AU.addRequired<TargetPassConfig>();
|
||||||
AU.addRequired<GISelCSEAnalysisWrapperPass>();
|
AU.addRequired<GISelCSEAnalysisWrapperPass>();
|
||||||
AU.addPreserved<GISelCSEAnalysisWrapperPass>();
|
AU.addPreserved<GISelCSEAnalysisWrapperPass>();
|
||||||
AU.addRequired<GISelValueTrackingAnalysis>();
|
AU.addRequired<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.addPreserved<GISelValueTrackingAnalysis>();
|
AU.addPreserved<GISelValueTrackingAnalysisLegacy>();
|
||||||
getSelectionDAGFallbackAnalysisUsage(AU);
|
getSelectionDAGFallbackAnalysisUsage(AU);
|
||||||
MachineFunctionPass::getAnalysisUsage(AU);
|
MachineFunctionPass::getAnalysisUsage(AU);
|
||||||
}
|
}
|
||||||
@@ -341,7 +341,8 @@ bool Legalizer::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
AuxObservers.push_back(&LocObserver);
|
AuxObservers.push_back(&LocObserver);
|
||||||
|
|
||||||
// This allows Known Bits Analysis in the legalizer.
|
// This allows Known Bits Analysis in the legalizer.
|
||||||
GISelValueTracking *VT = &getAnalysis<GISelValueTrackingAnalysis>().get(MF);
|
GISelValueTracking *VT =
|
||||||
|
&getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
|
||||||
|
|
||||||
const LegalizerInfo &LI = *MF.getSubtarget().getLegalizerInfo();
|
const LegalizerInfo &LI = *MF.getSubtarget().getLegalizerInfo();
|
||||||
MFResult Result = legalizeMachineFunction(MF, LI, AuxObservers, LocObserver,
|
MFResult Result = legalizeMachineFunction(MF, LI, AuxObservers, LocObserver,
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ add_llvm_component_library(LLVMPasses
|
|||||||
Analysis
|
Analysis
|
||||||
CFGuard
|
CFGuard
|
||||||
CodeGen
|
CodeGen
|
||||||
|
GlobalISel
|
||||||
Core
|
Core
|
||||||
Coroutines
|
Coroutines
|
||||||
HipStdPar
|
HipStdPar
|
||||||
|
|||||||
@@ -99,6 +99,7 @@
|
|||||||
#include "llvm/CodeGen/FinalizeISel.h"
|
#include "llvm/CodeGen/FinalizeISel.h"
|
||||||
#include "llvm/CodeGen/FixupStatepointCallerSaved.h"
|
#include "llvm/CodeGen/FixupStatepointCallerSaved.h"
|
||||||
#include "llvm/CodeGen/GCMetadata.h"
|
#include "llvm/CodeGen/GCMetadata.h"
|
||||||
|
#include "llvm/CodeGen/GlobalISel/GISelValueTracking.h"
|
||||||
#include "llvm/CodeGen/GlobalMerge.h"
|
#include "llvm/CodeGen/GlobalMerge.h"
|
||||||
#include "llvm/CodeGen/GlobalMergeFunctions.h"
|
#include "llvm/CodeGen/GlobalMergeFunctions.h"
|
||||||
#include "llvm/CodeGen/HardwareLoops.h"
|
#include "llvm/CodeGen/HardwareLoops.h"
|
||||||
|
|||||||
@@ -135,8 +135,8 @@ void AArch64O0PreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
|
|||||||
AU.addRequired<TargetPassConfig>();
|
AU.addRequired<TargetPassConfig>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
getSelectionDAGFallbackAnalysisUsage(AU);
|
getSelectionDAGFallbackAnalysisUsage(AU);
|
||||||
AU.addRequired<GISelValueTrackingAnalysis>();
|
AU.addRequired<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.addPreserved<GISelValueTrackingAnalysis>();
|
AU.addPreserved<GISelValueTrackingAnalysisLegacy>();
|
||||||
MachineFunctionPass::getAnalysisUsage(AU);
|
MachineFunctionPass::getAnalysisUsage(AU);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,7 +153,8 @@ bool AArch64O0PreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
auto &TPC = getAnalysis<TargetPassConfig>();
|
auto &TPC = getAnalysis<TargetPassConfig>();
|
||||||
|
|
||||||
const Function &F = MF.getFunction();
|
const Function &F = MF.getFunction();
|
||||||
GISelValueTracking *VT = &getAnalysis<GISelValueTrackingAnalysis>().get(MF);
|
GISelValueTracking *VT =
|
||||||
|
&getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
|
||||||
|
|
||||||
const AArch64Subtarget &ST = MF.getSubtarget<AArch64Subtarget>();
|
const AArch64Subtarget &ST = MF.getSubtarget<AArch64Subtarget>();
|
||||||
|
|
||||||
@@ -174,7 +175,7 @@ INITIALIZE_PASS_BEGIN(AArch64O0PreLegalizerCombiner, DEBUG_TYPE,
|
|||||||
"Combine AArch64 machine instrs before legalization",
|
"Combine AArch64 machine instrs before legalization",
|
||||||
false, false)
|
false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass)
|
INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass)
|
||||||
INITIALIZE_PASS_END(AArch64O0PreLegalizerCombiner, DEBUG_TYPE,
|
INITIALIZE_PASS_END(AArch64O0PreLegalizerCombiner, DEBUG_TYPE,
|
||||||
"Combine AArch64 machine instrs before legalization", false,
|
"Combine AArch64 machine instrs before legalization", false,
|
||||||
|
|||||||
@@ -636,8 +636,8 @@ void AArch64PostLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
|
|||||||
AU.addRequired<TargetPassConfig>();
|
AU.addRequired<TargetPassConfig>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
getSelectionDAGFallbackAnalysisUsage(AU);
|
getSelectionDAGFallbackAnalysisUsage(AU);
|
||||||
AU.addRequired<GISelValueTrackingAnalysis>();
|
AU.addRequired<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.addPreserved<GISelValueTrackingAnalysis>();
|
AU.addPreserved<GISelValueTrackingAnalysisLegacy>();
|
||||||
if (!IsOptNone) {
|
if (!IsOptNone) {
|
||||||
AU.addRequired<MachineDominatorTreeWrapperPass>();
|
AU.addRequired<MachineDominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<MachineDominatorTreeWrapperPass>();
|
AU.addPreserved<MachineDominatorTreeWrapperPass>();
|
||||||
@@ -668,7 +668,8 @@ bool AArch64PostLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
const AArch64Subtarget &ST = MF.getSubtarget<AArch64Subtarget>();
|
const AArch64Subtarget &ST = MF.getSubtarget<AArch64Subtarget>();
|
||||||
const auto *LI = ST.getLegalizerInfo();
|
const auto *LI = ST.getLegalizerInfo();
|
||||||
|
|
||||||
GISelValueTracking *VT = &getAnalysis<GISelValueTrackingAnalysis>().get(MF);
|
GISelValueTracking *VT =
|
||||||
|
&getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
|
||||||
MachineDominatorTree *MDT =
|
MachineDominatorTree *MDT =
|
||||||
IsOptNone ? nullptr
|
IsOptNone ? nullptr
|
||||||
: &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
|
: &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
|
||||||
@@ -883,7 +884,7 @@ INITIALIZE_PASS_BEGIN(AArch64PostLegalizerCombiner, DEBUG_TYPE,
|
|||||||
"Combine AArch64 MachineInstrs after legalization", false,
|
"Combine AArch64 MachineInstrs after legalization", false,
|
||||||
false)
|
false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)
|
||||||
INITIALIZE_PASS_END(AArch64PostLegalizerCombiner, DEBUG_TYPE,
|
INITIALIZE_PASS_END(AArch64PostLegalizerCombiner, DEBUG_TYPE,
|
||||||
"Combine AArch64 MachineInstrs after legalization", false,
|
"Combine AArch64 MachineInstrs after legalization", false,
|
||||||
false)
|
false)
|
||||||
|
|||||||
@@ -820,8 +820,8 @@ void AArch64PreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
|
|||||||
AU.addRequired<TargetPassConfig>();
|
AU.addRequired<TargetPassConfig>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
getSelectionDAGFallbackAnalysisUsage(AU);
|
getSelectionDAGFallbackAnalysisUsage(AU);
|
||||||
AU.addRequired<GISelValueTrackingAnalysis>();
|
AU.addRequired<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.addPreserved<GISelValueTrackingAnalysis>();
|
AU.addPreserved<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.addRequired<MachineDominatorTreeWrapperPass>();
|
AU.addRequired<MachineDominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<MachineDominatorTreeWrapperPass>();
|
AU.addPreserved<MachineDominatorTreeWrapperPass>();
|
||||||
AU.addRequired<GISelCSEAnalysisWrapperPass>();
|
AU.addRequired<GISelCSEAnalysisWrapperPass>();
|
||||||
@@ -852,7 +852,8 @@ bool AArch64PreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
const Function &F = MF.getFunction();
|
const Function &F = MF.getFunction();
|
||||||
bool EnableOpt =
|
bool EnableOpt =
|
||||||
MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F);
|
MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F);
|
||||||
GISelValueTracking *VT = &getAnalysis<GISelValueTrackingAnalysis>().get(MF);
|
GISelValueTracking *VT =
|
||||||
|
&getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
|
||||||
MachineDominatorTree *MDT =
|
MachineDominatorTree *MDT =
|
||||||
&getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
|
&getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
|
||||||
CombinerInfo CInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,
|
CombinerInfo CInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,
|
||||||
@@ -874,7 +875,7 @@ INITIALIZE_PASS_BEGIN(AArch64PreLegalizerCombiner, DEBUG_TYPE,
|
|||||||
"Combine AArch64 machine instrs before legalization",
|
"Combine AArch64 machine instrs before legalization",
|
||||||
false, false)
|
false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass)
|
INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass)
|
||||||
INITIALIZE_PASS_END(AArch64PreLegalizerCombiner, DEBUG_TYPE,
|
INITIALIZE_PASS_END(AArch64PreLegalizerCombiner, DEBUG_TYPE,
|
||||||
"Combine AArch64 machine instrs before legalization", false,
|
"Combine AArch64 machine instrs before legalization", false,
|
||||||
|
|||||||
@@ -462,8 +462,8 @@ void AMDGPUPostLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
|
|||||||
AU.addRequired<TargetPassConfig>();
|
AU.addRequired<TargetPassConfig>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
getSelectionDAGFallbackAnalysisUsage(AU);
|
getSelectionDAGFallbackAnalysisUsage(AU);
|
||||||
AU.addRequired<GISelValueTrackingAnalysis>();
|
AU.addRequired<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.addPreserved<GISelValueTrackingAnalysis>();
|
AU.addPreserved<GISelValueTrackingAnalysisLegacy>();
|
||||||
if (!IsOptNone) {
|
if (!IsOptNone) {
|
||||||
AU.addRequired<MachineDominatorTreeWrapperPass>();
|
AU.addRequired<MachineDominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<MachineDominatorTreeWrapperPass>();
|
AU.addPreserved<MachineDominatorTreeWrapperPass>();
|
||||||
@@ -490,7 +490,8 @@ bool AMDGPUPostLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
const AMDGPULegalizerInfo *LI =
|
const AMDGPULegalizerInfo *LI =
|
||||||
static_cast<const AMDGPULegalizerInfo *>(ST.getLegalizerInfo());
|
static_cast<const AMDGPULegalizerInfo *>(ST.getLegalizerInfo());
|
||||||
|
|
||||||
GISelValueTracking *VT = &getAnalysis<GISelValueTrackingAnalysis>().get(MF);
|
GISelValueTracking *VT =
|
||||||
|
&getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
|
||||||
MachineDominatorTree *MDT =
|
MachineDominatorTree *MDT =
|
||||||
IsOptNone ? nullptr
|
IsOptNone ? nullptr
|
||||||
: &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
|
: &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
|
||||||
@@ -512,7 +513,7 @@ INITIALIZE_PASS_BEGIN(AMDGPUPostLegalizerCombiner, DEBUG_TYPE,
|
|||||||
"Combine AMDGPU machine instrs after legalization", false,
|
"Combine AMDGPU machine instrs after legalization", false,
|
||||||
false)
|
false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)
|
||||||
INITIALIZE_PASS_END(AMDGPUPostLegalizerCombiner, DEBUG_TYPE,
|
INITIALIZE_PASS_END(AMDGPUPostLegalizerCombiner, DEBUG_TYPE,
|
||||||
"Combine AMDGPU machine instrs after legalization", false,
|
"Combine AMDGPU machine instrs after legalization", false,
|
||||||
false)
|
false)
|
||||||
|
|||||||
@@ -234,8 +234,8 @@ void AMDGPUPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
|
|||||||
AU.addRequired<TargetPassConfig>();
|
AU.addRequired<TargetPassConfig>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
getSelectionDAGFallbackAnalysisUsage(AU);
|
getSelectionDAGFallbackAnalysisUsage(AU);
|
||||||
AU.addRequired<GISelValueTrackingAnalysis>();
|
AU.addRequired<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.addPreserved<GISelValueTrackingAnalysis>();
|
AU.addPreserved<GISelValueTrackingAnalysisLegacy>();
|
||||||
if (!IsOptNone) {
|
if (!IsOptNone) {
|
||||||
AU.addRequired<MachineDominatorTreeWrapperPass>();
|
AU.addRequired<MachineDominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<MachineDominatorTreeWrapperPass>();
|
AU.addPreserved<MachineDominatorTreeWrapperPass>();
|
||||||
@@ -260,7 +260,8 @@ bool AMDGPUPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
const Function &F = MF.getFunction();
|
const Function &F = MF.getFunction();
|
||||||
bool EnableOpt =
|
bool EnableOpt =
|
||||||
MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F);
|
MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F);
|
||||||
GISelValueTracking *VT = &getAnalysis<GISelValueTrackingAnalysis>().get(MF);
|
GISelValueTracking *VT =
|
||||||
|
&getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
|
||||||
|
|
||||||
// Enable CSE.
|
// Enable CSE.
|
||||||
GISelCSEAnalysisWrapper &Wrapper =
|
GISelCSEAnalysisWrapper &Wrapper =
|
||||||
@@ -289,7 +290,7 @@ INITIALIZE_PASS_BEGIN(AMDGPUPreLegalizerCombiner, DEBUG_TYPE,
|
|||||||
"Combine AMDGPU machine instrs before legalization",
|
"Combine AMDGPU machine instrs before legalization",
|
||||||
false, false)
|
false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)
|
||||||
INITIALIZE_PASS_END(AMDGPUPreLegalizerCombiner, DEBUG_TYPE,
|
INITIALIZE_PASS_END(AMDGPUPreLegalizerCombiner, DEBUG_TYPE,
|
||||||
"Combine AMDGPU machine instrs before legalization", false,
|
"Combine AMDGPU machine instrs before legalization", false,
|
||||||
false)
|
false)
|
||||||
|
|||||||
@@ -446,8 +446,8 @@ void AMDGPURegBankCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
|
|||||||
AU.addRequired<TargetPassConfig>();
|
AU.addRequired<TargetPassConfig>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
getSelectionDAGFallbackAnalysisUsage(AU);
|
getSelectionDAGFallbackAnalysisUsage(AU);
|
||||||
AU.addRequired<GISelValueTrackingAnalysis>();
|
AU.addRequired<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.addPreserved<GISelValueTrackingAnalysis>();
|
AU.addPreserved<GISelValueTrackingAnalysisLegacy>();
|
||||||
if (!IsOptNone) {
|
if (!IsOptNone) {
|
||||||
AU.addRequired<MachineDominatorTreeWrapperPass>();
|
AU.addRequired<MachineDominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<MachineDominatorTreeWrapperPass>();
|
AU.addPreserved<MachineDominatorTreeWrapperPass>();
|
||||||
@@ -471,7 +471,8 @@ bool AMDGPURegBankCombiner::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F);
|
MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F);
|
||||||
|
|
||||||
const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>();
|
const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>();
|
||||||
GISelValueTracking *VT = &getAnalysis<GISelValueTrackingAnalysis>().get(MF);
|
GISelValueTracking *VT =
|
||||||
|
&getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
|
||||||
|
|
||||||
const auto *LI = ST.getLegalizerInfo();
|
const auto *LI = ST.getLegalizerInfo();
|
||||||
MachineDominatorTree *MDT =
|
MachineDominatorTree *MDT =
|
||||||
@@ -496,7 +497,7 @@ INITIALIZE_PASS_BEGIN(AMDGPURegBankCombiner, DEBUG_TYPE,
|
|||||||
"Combine AMDGPU machine instrs after regbankselect",
|
"Combine AMDGPU machine instrs after regbankselect",
|
||||||
false, false)
|
false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)
|
||||||
INITIALIZE_PASS_END(AMDGPURegBankCombiner, DEBUG_TYPE,
|
INITIALIZE_PASS_END(AMDGPURegBankCombiner, DEBUG_TYPE,
|
||||||
"Combine AMDGPU machine instrs after regbankselect", false,
|
"Combine AMDGPU machine instrs after regbankselect", false,
|
||||||
false)
|
false)
|
||||||
|
|||||||
@@ -106,8 +106,8 @@ void MipsPostLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
|
|||||||
AU.addRequired<TargetPassConfig>();
|
AU.addRequired<TargetPassConfig>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
getSelectionDAGFallbackAnalysisUsage(AU);
|
getSelectionDAGFallbackAnalysisUsage(AU);
|
||||||
AU.addRequired<GISelValueTrackingAnalysis>();
|
AU.addRequired<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.addPreserved<GISelValueTrackingAnalysis>();
|
AU.addPreserved<GISelValueTrackingAnalysisLegacy>();
|
||||||
if (!IsOptNone) {
|
if (!IsOptNone) {
|
||||||
AU.addRequired<MachineDominatorTreeWrapperPass>();
|
AU.addRequired<MachineDominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<MachineDominatorTreeWrapperPass>();
|
AU.addPreserved<MachineDominatorTreeWrapperPass>();
|
||||||
@@ -134,7 +134,8 @@ bool MipsPostLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
const MipsLegalizerInfo *LI =
|
const MipsLegalizerInfo *LI =
|
||||||
static_cast<const MipsLegalizerInfo *>(ST.getLegalizerInfo());
|
static_cast<const MipsLegalizerInfo *>(ST.getLegalizerInfo());
|
||||||
|
|
||||||
GISelValueTracking *VT = &getAnalysis<GISelValueTrackingAnalysis>().get(MF);
|
GISelValueTracking *VT =
|
||||||
|
&getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
|
||||||
MachineDominatorTree *MDT =
|
MachineDominatorTree *MDT =
|
||||||
IsOptNone ? nullptr
|
IsOptNone ? nullptr
|
||||||
: &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
|
: &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
|
||||||
@@ -150,7 +151,7 @@ INITIALIZE_PASS_BEGIN(MipsPostLegalizerCombiner, DEBUG_TYPE,
|
|||||||
"Combine Mips machine instrs after legalization", false,
|
"Combine Mips machine instrs after legalization", false,
|
||||||
false)
|
false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)
|
||||||
INITIALIZE_PASS_END(MipsPostLegalizerCombiner, DEBUG_TYPE,
|
INITIALIZE_PASS_END(MipsPostLegalizerCombiner, DEBUG_TYPE,
|
||||||
"Combine Mips machine instrs after legalization", false,
|
"Combine Mips machine instrs after legalization", false,
|
||||||
false)
|
false)
|
||||||
|
|||||||
@@ -102,8 +102,8 @@ public:
|
|||||||
|
|
||||||
void MipsPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
|
void MipsPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addRequired<TargetPassConfig>();
|
AU.addRequired<TargetPassConfig>();
|
||||||
AU.addRequired<GISelValueTrackingAnalysis>();
|
AU.addRequired<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.addPreserved<GISelValueTrackingAnalysis>();
|
AU.addPreserved<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
getSelectionDAGFallbackAnalysisUsage(AU);
|
getSelectionDAGFallbackAnalysisUsage(AU);
|
||||||
MachineFunctionPass::getAnalysisUsage(AU);
|
MachineFunctionPass::getAnalysisUsage(AU);
|
||||||
@@ -122,7 +122,8 @@ bool MipsPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
const MipsLegalizerInfo *LI =
|
const MipsLegalizerInfo *LI =
|
||||||
static_cast<const MipsLegalizerInfo *>(ST.getLegalizerInfo());
|
static_cast<const MipsLegalizerInfo *>(ST.getLegalizerInfo());
|
||||||
|
|
||||||
GISelValueTracking *VT = &getAnalysis<GISelValueTrackingAnalysis>().get(MF);
|
GISelValueTracking *VT =
|
||||||
|
&getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
|
||||||
MipsPreLegalizerCombinerInfo PCInfo;
|
MipsPreLegalizerCombinerInfo PCInfo;
|
||||||
MipsPreLegalizerCombinerImpl Impl(MF, PCInfo, TPC, *VT, /*CSEInfo*/ nullptr,
|
MipsPreLegalizerCombinerImpl Impl(MF, PCInfo, TPC, *VT, /*CSEInfo*/ nullptr,
|
||||||
ST, /*MDT*/ nullptr, LI);
|
ST, /*MDT*/ nullptr, LI);
|
||||||
@@ -134,7 +135,7 @@ INITIALIZE_PASS_BEGIN(MipsPreLegalizerCombiner, DEBUG_TYPE,
|
|||||||
"Combine Mips machine instrs before legalization", false,
|
"Combine Mips machine instrs before legalization", false,
|
||||||
false)
|
false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)
|
||||||
INITIALIZE_PASS_END(MipsPreLegalizerCombiner, DEBUG_TYPE,
|
INITIALIZE_PASS_END(MipsPreLegalizerCombiner, DEBUG_TYPE,
|
||||||
"Combine Mips machine instrs before legalization", false,
|
"Combine Mips machine instrs before legalization", false,
|
||||||
false)
|
false)
|
||||||
|
|||||||
@@ -103,8 +103,8 @@ void RISCVO0PreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
|
|||||||
AU.addRequired<TargetPassConfig>();
|
AU.addRequired<TargetPassConfig>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
getSelectionDAGFallbackAnalysisUsage(AU);
|
getSelectionDAGFallbackAnalysisUsage(AU);
|
||||||
AU.addRequired<GISelValueTrackingAnalysis>();
|
AU.addRequired<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.addPreserved<GISelValueTrackingAnalysis>();
|
AU.addPreserved<GISelValueTrackingAnalysisLegacy>();
|
||||||
MachineFunctionPass::getAnalysisUsage(AU);
|
MachineFunctionPass::getAnalysisUsage(AU);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,7 +121,8 @@ bool RISCVO0PreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
auto &TPC = getAnalysis<TargetPassConfig>();
|
auto &TPC = getAnalysis<TargetPassConfig>();
|
||||||
|
|
||||||
const Function &F = MF.getFunction();
|
const Function &F = MF.getFunction();
|
||||||
GISelValueTracking *VT = &getAnalysis<GISelValueTrackingAnalysis>().get(MF);
|
GISelValueTracking *VT =
|
||||||
|
&getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
|
||||||
|
|
||||||
const RISCVSubtarget &ST = MF.getSubtarget<RISCVSubtarget>();
|
const RISCVSubtarget &ST = MF.getSubtarget<RISCVSubtarget>();
|
||||||
|
|
||||||
@@ -142,7 +143,7 @@ INITIALIZE_PASS_BEGIN(RISCVO0PreLegalizerCombiner, DEBUG_TYPE,
|
|||||||
"Combine RISC-V machine instrs before legalization",
|
"Combine RISC-V machine instrs before legalization",
|
||||||
false, false)
|
false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass)
|
INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass)
|
||||||
INITIALIZE_PASS_END(RISCVO0PreLegalizerCombiner, DEBUG_TYPE,
|
INITIALIZE_PASS_END(RISCVO0PreLegalizerCombiner, DEBUG_TYPE,
|
||||||
"Combine RISC-V machine instrs before legalization", false,
|
"Combine RISC-V machine instrs before legalization", false,
|
||||||
|
|||||||
@@ -107,8 +107,8 @@ void RISCVPostLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
|
|||||||
AU.addRequired<TargetPassConfig>();
|
AU.addRequired<TargetPassConfig>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
getSelectionDAGFallbackAnalysisUsage(AU);
|
getSelectionDAGFallbackAnalysisUsage(AU);
|
||||||
AU.addRequired<GISelValueTrackingAnalysis>();
|
AU.addRequired<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.addPreserved<GISelValueTrackingAnalysis>();
|
AU.addPreserved<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.addRequired<MachineDominatorTreeWrapperPass>();
|
AU.addRequired<MachineDominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<MachineDominatorTreeWrapperPass>();
|
AU.addPreserved<MachineDominatorTreeWrapperPass>();
|
||||||
AU.addRequired<GISelCSEAnalysisWrapperPass>();
|
AU.addRequired<GISelCSEAnalysisWrapperPass>();
|
||||||
@@ -137,7 +137,8 @@ bool RISCVPostLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
const RISCVSubtarget &ST = MF.getSubtarget<RISCVSubtarget>();
|
const RISCVSubtarget &ST = MF.getSubtarget<RISCVSubtarget>();
|
||||||
const auto *LI = ST.getLegalizerInfo();
|
const auto *LI = ST.getLegalizerInfo();
|
||||||
|
|
||||||
GISelValueTracking *VT = &getAnalysis<GISelValueTrackingAnalysis>().get(MF);
|
GISelValueTracking *VT =
|
||||||
|
&getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
|
||||||
MachineDominatorTree *MDT =
|
MachineDominatorTree *MDT =
|
||||||
&getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
|
&getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
|
||||||
GISelCSEAnalysisWrapper &Wrapper =
|
GISelCSEAnalysisWrapper &Wrapper =
|
||||||
@@ -157,7 +158,7 @@ INITIALIZE_PASS_BEGIN(RISCVPostLegalizerCombiner, DEBUG_TYPE,
|
|||||||
"Combine RISC-V MachineInstrs after legalization", false,
|
"Combine RISC-V MachineInstrs after legalization", false,
|
||||||
false)
|
false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)
|
||||||
INITIALIZE_PASS_END(RISCVPostLegalizerCombiner, DEBUG_TYPE,
|
INITIALIZE_PASS_END(RISCVPostLegalizerCombiner, DEBUG_TYPE,
|
||||||
"Combine RISC-V MachineInstrs after legalization", false,
|
"Combine RISC-V MachineInstrs after legalization", false,
|
||||||
false)
|
false)
|
||||||
|
|||||||
@@ -105,8 +105,8 @@ void RISCVPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
|
|||||||
AU.addRequired<TargetPassConfig>();
|
AU.addRequired<TargetPassConfig>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
getSelectionDAGFallbackAnalysisUsage(AU);
|
getSelectionDAGFallbackAnalysisUsage(AU);
|
||||||
AU.addRequired<GISelValueTrackingAnalysis>();
|
AU.addRequired<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.addPreserved<GISelValueTrackingAnalysis>();
|
AU.addPreserved<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.addRequired<MachineDominatorTreeWrapperPass>();
|
AU.addRequired<MachineDominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<MachineDominatorTreeWrapperPass>();
|
AU.addPreserved<MachineDominatorTreeWrapperPass>();
|
||||||
AU.addRequired<GISelCSEAnalysisWrapperPass>();
|
AU.addRequired<GISelCSEAnalysisWrapperPass>();
|
||||||
@@ -137,7 +137,8 @@ bool RISCVPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
const Function &F = MF.getFunction();
|
const Function &F = MF.getFunction();
|
||||||
bool EnableOpt =
|
bool EnableOpt =
|
||||||
MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F);
|
MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F);
|
||||||
GISelValueTracking *VT = &getAnalysis<GISelValueTrackingAnalysis>().get(MF);
|
GISelValueTracking *VT =
|
||||||
|
&getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
|
||||||
MachineDominatorTree *MDT =
|
MachineDominatorTree *MDT =
|
||||||
&getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
|
&getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
|
||||||
CombinerInfo CInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,
|
CombinerInfo CInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,
|
||||||
@@ -159,7 +160,7 @@ INITIALIZE_PASS_BEGIN(RISCVPreLegalizerCombiner, DEBUG_TYPE,
|
|||||||
"Combine RISC-V machine instrs before legalization", false,
|
"Combine RISC-V machine instrs before legalization", false,
|
||||||
false)
|
false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass)
|
INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass)
|
||||||
INITIALIZE_PASS_END(RISCVPreLegalizerCombiner, DEBUG_TYPE,
|
INITIALIZE_PASS_END(RISCVPreLegalizerCombiner, DEBUG_TYPE,
|
||||||
"Combine RISC-V machine instrs before legalization", false,
|
"Combine RISC-V machine instrs before legalization", false,
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ public:
|
|||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
void SPIRVPreLegalizer::getAnalysisUsage(AnalysisUsage &AU) const {
|
void SPIRVPreLegalizer::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addPreserved<GISelValueTrackingAnalysis>();
|
AU.addPreserved<GISelValueTrackingAnalysisLegacy>();
|
||||||
MachineFunctionPass::getAnalysisUsage(AU);
|
MachineFunctionPass::getAnalysisUsage(AU);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -187,8 +187,8 @@ void SPIRVPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
|
|||||||
AU.addRequired<TargetPassConfig>();
|
AU.addRequired<TargetPassConfig>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
getSelectionDAGFallbackAnalysisUsage(AU);
|
getSelectionDAGFallbackAnalysisUsage(AU);
|
||||||
AU.addRequired<GISelValueTrackingAnalysis>();
|
AU.addRequired<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.addPreserved<GISelValueTrackingAnalysis>();
|
AU.addPreserved<GISelValueTrackingAnalysisLegacy>();
|
||||||
AU.addRequired<MachineDominatorTreeWrapperPass>();
|
AU.addRequired<MachineDominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<MachineDominatorTreeWrapperPass>();
|
AU.addPreserved<MachineDominatorTreeWrapperPass>();
|
||||||
MachineFunctionPass::getAnalysisUsage(AU);
|
MachineFunctionPass::getAnalysisUsage(AU);
|
||||||
@@ -212,7 +212,8 @@ bool SPIRVPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
const Function &F = MF.getFunction();
|
const Function &F = MF.getFunction();
|
||||||
bool EnableOpt =
|
bool EnableOpt =
|
||||||
MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F);
|
MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F);
|
||||||
GISelValueTracking *VT = &getAnalysis<GISelValueTrackingAnalysis>().get(MF);
|
GISelValueTracking *VT =
|
||||||
|
&getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
|
||||||
MachineDominatorTree *MDT =
|
MachineDominatorTree *MDT =
|
||||||
&getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
|
&getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
|
||||||
CombinerInfo CInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,
|
CombinerInfo CInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,
|
||||||
@@ -234,7 +235,7 @@ INITIALIZE_PASS_BEGIN(SPIRVPreLegalizerCombiner, DEBUG_TYPE,
|
|||||||
"Combine SPIRV machine instrs before legalization", false,
|
"Combine SPIRV machine instrs before legalization", false,
|
||||||
false)
|
false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
|
||||||
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)
|
||||||
INITIALIZE_PASS_END(SPIRVPreLegalizerCombiner, DEBUG_TYPE,
|
INITIALIZE_PASS_END(SPIRVPreLegalizerCombiner, DEBUG_TYPE,
|
||||||
"Combine SPIRV machine instrs before legalization", false,
|
"Combine SPIRV machine instrs before legalization", false,
|
||||||
false)
|
false)
|
||||||
|
|||||||
27
llvm/test/CodeGen/AArch64/GlobalISel/knownbits-const.mir
Normal file
27
llvm/test/CodeGen/AArch64/GlobalISel/knownbits-const.mir
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
|
||||||
|
# RUN: llc -mtriple aarch64 -passes="print<gisel-value-tracking>" %s -o - 2>&1 | FileCheck %s
|
||||||
|
|
||||||
|
---
|
||||||
|
name: Cst
|
||||||
|
tracksRegLiveness: true
|
||||||
|
body: |
|
||||||
|
bb.1:
|
||||||
|
; CHECK-LABEL: name: @Cst
|
||||||
|
; CHECK-NEXT: %0:_ KnownBits:00000001 SignBits:7
|
||||||
|
; CHECK-NEXT: %1:_ KnownBits:00000001 SignBits:7
|
||||||
|
%0:_(s8) = G_CONSTANT i8 1
|
||||||
|
%1:_(s8) = COPY %0
|
||||||
|
...
|
||||||
|
---
|
||||||
|
name: CstWithClass
|
||||||
|
# We can't analyze %0 due to the lack of an LLT. We will get a default
|
||||||
|
# constructed KnownBits back. %0 will have the correct size but we will
|
||||||
|
# not know any further info.
|
||||||
|
tracksRegLiveness: true
|
||||||
|
body: |
|
||||||
|
bb.1:
|
||||||
|
; CHECK-LABEL: name: @CstWithClass
|
||||||
|
; CHECK-NEXT: %1:_ KnownBits:???????????????????????????????? SignBits:1
|
||||||
|
%0:gpr32 = MOVi32imm 1
|
||||||
|
%1:_(s32) = COPY %0
|
||||||
|
...
|
||||||
@@ -10,52 +10,6 @@
|
|||||||
#include "llvm/CodeGen/GlobalISel/GISelValueTracking.h"
|
#include "llvm/CodeGen/GlobalISel/GISelValueTracking.h"
|
||||||
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
|
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
|
||||||
|
|
||||||
TEST_F(AArch64GISelMITest, TestKnownBitsCst) {
|
|
||||||
StringRef MIRString = " %3:_(s8) = G_CONSTANT i8 1\n"
|
|
||||||
" %4:_(s8) = COPY %3\n";
|
|
||||||
setUp(MIRString);
|
|
||||||
if (!TM)
|
|
||||||
GTEST_SKIP();
|
|
||||||
unsigned CopyReg = Copies[Copies.size() - 1];
|
|
||||||
MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
|
|
||||||
unsigned SrcReg = FinalCopy->getOperand(1).getReg();
|
|
||||||
unsigned DstReg = FinalCopy->getOperand(0).getReg();
|
|
||||||
GISelValueTracking Info(*MF);
|
|
||||||
KnownBits Res = Info.getKnownBits(SrcReg);
|
|
||||||
EXPECT_EQ((uint64_t)1, Res.One.getZExtValue());
|
|
||||||
EXPECT_EQ((uint64_t)0xfe, Res.Zero.getZExtValue());
|
|
||||||
|
|
||||||
KnownBits Res2 = Info.getKnownBits(DstReg);
|
|
||||||
EXPECT_EQ(Res.One.getZExtValue(), Res2.One.getZExtValue());
|
|
||||||
EXPECT_EQ(Res.Zero.getZExtValue(), Res2.Zero.getZExtValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(AArch64GISelMITest, TestKnownBitsCstWithClass) {
|
|
||||||
StringRef MIRString = " %10:gpr32 = MOVi32imm 1\n"
|
|
||||||
" %4:_(s32) = COPY %10\n";
|
|
||||||
setUp(MIRString);
|
|
||||||
if (!TM)
|
|
||||||
GTEST_SKIP();
|
|
||||||
unsigned CopyReg = Copies[Copies.size() - 1];
|
|
||||||
MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
|
|
||||||
unsigned SrcReg = FinalCopy->getOperand(1).getReg();
|
|
||||||
unsigned DstReg = FinalCopy->getOperand(0).getReg();
|
|
||||||
GISelValueTracking Info(*MF);
|
|
||||||
KnownBits Res = Info.getKnownBits(SrcReg);
|
|
||||||
// We can't analyze %3 due to the register class constraint. We will get a
|
|
||||||
// default-constructed KnownBits back.
|
|
||||||
EXPECT_EQ((uint64_t)1, Res.getBitWidth());
|
|
||||||
EXPECT_EQ((uint64_t)0, Res.One.getZExtValue());
|
|
||||||
EXPECT_EQ((uint64_t)0, Res.Zero.getZExtValue());
|
|
||||||
|
|
||||||
KnownBits Res2 = Info.getKnownBits(DstReg);
|
|
||||||
// We still don't know the values due to the register class constraint but %4
|
|
||||||
// did reveal the size of %3.
|
|
||||||
EXPECT_EQ((uint64_t)32, Res2.getBitWidth());
|
|
||||||
EXPECT_EQ(Res.One.getZExtValue(), Res2.One.getZExtValue());
|
|
||||||
EXPECT_EQ(Res.Zero.getZExtValue(), Res2.Zero.getZExtValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check that we are able to track bits through PHIs
|
// Check that we are able to track bits through PHIs
|
||||||
// and get the intersections of everything we know on each operand.
|
// and get the intersections of everything we know on each operand.
|
||||||
TEST_F(AArch64GISelMITest, TestKnownBitsCstPHI) {
|
TEST_F(AArch64GISelMITest, TestKnownBitsCstPHI) {
|
||||||
|
|||||||
Reference in New Issue
Block a user