diff --git a/llvm/docs/GlobalISel/KnownBits.rst b/llvm/docs/GlobalISel/KnownBits.rst index c01faa5f08f0..3c61a58626e8 100644 --- a/llvm/docs/GlobalISel/KnownBits.rst +++ b/llvm/docs/GlobalISel/KnownBits.rst @@ -66,7 +66,7 @@ dependency with ``INITIALIZE_PASS_DEPENDENCY``. ... INITIALIZE_PASS_BEGIN(...) - INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis) + INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy) INITIALIZE_PASS_END(...) and require the pass in ``getAnalysisUsage``. @@ -74,10 +74,10 @@ and require the pass in ``getAnalysisUsage``. .. code-block:: c++ void MyPass::getAnalysisUsage(AnalysisUsage &AU) const { - AU.addRequired(); + AU.addRequired(); // Optional: If your pass preserves known bits analysis (many do) then // indicate that it's preserved for re-use by another pass here. - AU.addPreserved(); + AU.addPreserved(); } 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) { ... - GISelValueTracking &VT = getAnalysis().get(MF); + GISelValueTracking &VT = getAnalysis().get(MF); ... MachineInstr *MI = ...; KnownBits Known = VT->getKnownBits(MI->getOperand(0).getReg()); diff --git a/llvm/include/llvm/CodeGen/GlobalISel/GISelValueTracking.h b/llvm/include/llvm/CodeGen/GlobalISel/GISelValueTracking.h index aa99bf321d2b..d4b4a4e731da 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/GISelValueTracking.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/GISelValueTracking.h @@ -18,6 +18,7 @@ #include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/Register.h" +#include "llvm/IR/PassManager.h" #include "llvm/InitializePasses.h" #include "llvm/Support/KnownBits.h" @@ -104,19 +105,42 @@ protected: /// Eventually add other features such as caching/ser/deserializing /// to MIR etc. Those implementations can derive from GISelValueTracking /// and override computeKnownBitsImpl. -class GISelValueTrackingAnalysis : public MachineFunctionPass { +class GISelValueTrackingAnalysisLegacy : public MachineFunctionPass { std::unique_ptr Info; public: static char ID; - GISelValueTrackingAnalysis() : MachineFunctionPass(ID) { - initializeGISelValueTrackingAnalysisPass(*PassRegistry::getPassRegistry()); + GISelValueTrackingAnalysisLegacy() : MachineFunctionPass(ID) { + initializeGISelValueTrackingAnalysisLegacyPass( + *PassRegistry::getPassRegistry()); } GISelValueTracking &get(MachineFunction &MF); void getAnalysisUsage(AnalysisUsage &AU) const override; bool runOnMachineFunction(MachineFunction &MF) override; void releaseMemory() override { Info.reset(); } }; + +class GISelValueTrackingAnalysis + : public AnalysisInfoMixin { + friend AnalysisInfoMixin; + static AnalysisKey Key; + +public: + using Result = GISelValueTracking; + + Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM); +}; + +class GISelValueTrackingPrinterPass + : public PassInfoMixin { + raw_ostream &OS; + +public: + GISelValueTrackingPrinterPass(raw_ostream &OS) : OS(OS) {} + + PreservedAnalyses run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM); +}; } // namespace llvm #endif // LLVM_CODEGEN_GLOBALISEL_GISELVALUETRACKING_H diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index 0e58caf6478a..42610d505c2b 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -155,7 +155,7 @@ void initializeLazyValueInfoWrapperPassPass(PassRegistry &); void initializeLegacyLICMPassPass(PassRegistry &); void initializeLegalizerPass(PassRegistry &); void initializeGISelCSEAnalysisWrapperPassPass(PassRegistry &); -void initializeGISelValueTrackingAnalysisPass(PassRegistry &); +void initializeGISelValueTrackingAnalysisLegacyPass(PassRegistry &); void initializeLiveDebugValuesLegacyPass(PassRegistry &); void initializeLiveDebugVariablesWrapperLegacyPass(PassRegistry &); void initializeLiveIntervalsWrapperPassPass(PassRegistry &); diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def index c69573ee3ed9..518dc55acb99 100644 --- a/llvm/include/llvm/Passes/MachinePassRegistry.def +++ b/llvm/include/llvm/Passes/MachinePassRegistry.def @@ -98,6 +98,7 @@ LOOP_PASS("loop-term-fold", LoopTermFoldPass()) // computed. (We still either need to regenerate kill flags after regalloc, or // preferably fix the scavenger to not depend on them). MACHINE_FUNCTION_ANALYSIS("edge-bundles", EdgeBundlesAnalysis()) +MACHINE_FUNCTION_ANALYSIS("gisel-value-tracking", GISelValueTrackingAnalysis()) MACHINE_FUNCTION_ANALYSIS("livedebugvars", LiveDebugVariablesAnalysis()) MACHINE_FUNCTION_ANALYSIS("live-intervals", LiveIntervalsAnalysis()) 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("post-ra-pseudos", ExpandPostRAPseudosPass()) MACHINE_FUNCTION_PASS("print", PrintMIRPass()) +MACHINE_FUNCTION_PASS("print", GISelValueTrackingPrinterPass(errs())) MACHINE_FUNCTION_PASS("print", LiveDebugVariablesPrinterPass(errs())) MACHINE_FUNCTION_PASS("print", LiveIntervalsPrinterPass(errs())) MACHINE_FUNCTION_PASS("print", LiveStacksPrinterPass(errs())) diff --git a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp index 89c3801dc203..589936b6c260 100644 --- a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp +++ b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp @@ -27,9 +27,9 @@ 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) GISelValueTracking::GISelValueTracking(MachineFunction &MF, unsigned MaxDepth) @@ -893,16 +893,18 @@ unsigned GISelValueTracking::computeNumSignBits(Register R, unsigned Depth) { return computeNumSignBits(R, DemandedElts, Depth); } -void GISelValueTrackingAnalysis::getAnalysisUsage(AnalysisUsage &AU) const { +void GISelValueTrackingAnalysisLegacy::getAnalysisUsage( + AnalysisUsage &AU) const { AU.setPreservesAll(); MachineFunctionPass::getAnalysisUsage(AU); } -bool GISelValueTrackingAnalysis::runOnMachineFunction(MachineFunction &MF) { +bool GISelValueTrackingAnalysisLegacy::runOnMachineFunction( + MachineFunction &MF) { return false; } -GISelValueTracking &GISelValueTrackingAnalysis::get(MachineFunction &MF) { +GISelValueTracking &GISelValueTrackingAnalysisLegacy::get(MachineFunction &MF) { if (!Info) { unsigned MaxDepth = MF.getTarget().getOptLevel() == CodeGenOptLevel::None ? 2 : 6; @@ -910,3 +912,38 @@ GISelValueTracking &GISelValueTrackingAnalysis::get(MachineFunction &MF) { } 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(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(); +} diff --git a/llvm/lib/CodeGen/GlobalISel/InstructionSelect.cpp b/llvm/lib/CodeGen/GlobalISel/InstructionSelect.cpp index 5842f204febf..194cbc5b2ac8 100644 --- a/llvm/lib/CodeGen/GlobalISel/InstructionSelect.cpp +++ b/llvm/lib/CodeGen/GlobalISel/InstructionSelect.cpp @@ -56,7 +56,7 @@ INITIALIZE_PASS_BEGIN(InstructionSelect, DEBUG_TYPE, "Select target instructions out of generic instructions", false, false) INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) -INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis) +INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy) INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass) INITIALIZE_PASS_DEPENDENCY(LazyBlockFrequencyInfoPass) INITIALIZE_PASS_END(InstructionSelect, DEBUG_TYPE, @@ -120,8 +120,8 @@ public: void InstructionSelect::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); - AU.addRequired(); - AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); if (OptLevel != CodeGenOptLevel::None) { AU.addRequired(); @@ -146,7 +146,7 @@ bool InstructionSelect::runOnMachineFunction(MachineFunction &MF) { OptLevel = MF.getFunction().hasOptNone() ? CodeGenOptLevel::None : MF.getTarget().getOptLevel(); - VT = &getAnalysis().get(MF); + VT = &getAnalysis().get(MF); if (OptLevel != CodeGenOptLevel::None) { PSI = &getAnalysis().getPSI(); if (PSI && PSI->hasProfileSummary()) diff --git a/llvm/lib/CodeGen/GlobalISel/Legalizer.cpp b/llvm/lib/CodeGen/GlobalISel/Legalizer.cpp index e4bce16f230b..1bb3f4bcc9b1 100644 --- a/llvm/lib/CodeGen/GlobalISel/Legalizer.cpp +++ b/llvm/lib/CodeGen/GlobalISel/Legalizer.cpp @@ -75,7 +75,7 @@ INITIALIZE_PASS_BEGIN(Legalizer, DEBUG_TYPE, false) INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass) -INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis) +INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy) INITIALIZE_PASS_END(Legalizer, DEBUG_TYPE, "Legalize the Machine IR a function's Machine IR", false, false) @@ -86,8 +86,8 @@ void Legalizer::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.addRequired(); AU.addPreserved(); - AU.addRequired(); - AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); getSelectionDAGFallbackAnalysisUsage(AU); MachineFunctionPass::getAnalysisUsage(AU); } @@ -341,7 +341,8 @@ bool Legalizer::runOnMachineFunction(MachineFunction &MF) { AuxObservers.push_back(&LocObserver); // This allows Known Bits Analysis in the legalizer. - GISelValueTracking *VT = &getAnalysis().get(MF); + GISelValueTracking *VT = + &getAnalysis().get(MF); const LegalizerInfo &LI = *MF.getSubtarget().getLegalizerInfo(); MFResult Result = legalizeMachineFunction(MF, LI, AuxObservers, LocObserver, diff --git a/llvm/lib/Passes/CMakeLists.txt b/llvm/lib/Passes/CMakeLists.txt index 6425f4934b21..91c8c4f67074 100644 --- a/llvm/lib/Passes/CMakeLists.txt +++ b/llvm/lib/Passes/CMakeLists.txt @@ -19,6 +19,7 @@ add_llvm_component_library(LLVMPasses Analysis CFGuard CodeGen + GlobalISel Core Coroutines HipStdPar diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index 7740f622ede7..8e69683c1d4c 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -99,6 +99,7 @@ #include "llvm/CodeGen/FinalizeISel.h" #include "llvm/CodeGen/FixupStatepointCallerSaved.h" #include "llvm/CodeGen/GCMetadata.h" +#include "llvm/CodeGen/GlobalISel/GISelValueTracking.h" #include "llvm/CodeGen/GlobalMerge.h" #include "llvm/CodeGen/GlobalMergeFunctions.h" #include "llvm/CodeGen/HardwareLoops.h" diff --git a/llvm/lib/Target/AArch64/GISel/AArch64O0PreLegalizerCombiner.cpp b/llvm/lib/Target/AArch64/GISel/AArch64O0PreLegalizerCombiner.cpp index 460902c67fe3..cca0adc84f6f 100644 --- a/llvm/lib/Target/AArch64/GISel/AArch64O0PreLegalizerCombiner.cpp +++ b/llvm/lib/Target/AArch64/GISel/AArch64O0PreLegalizerCombiner.cpp @@ -135,8 +135,8 @@ void AArch64O0PreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.setPreservesCFG(); getSelectionDAGFallbackAnalysisUsage(AU); - AU.addRequired(); - AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); MachineFunctionPass::getAnalysisUsage(AU); } @@ -153,7 +153,8 @@ bool AArch64O0PreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { auto &TPC = getAnalysis(); const Function &F = MF.getFunction(); - GISelValueTracking *VT = &getAnalysis().get(MF); + GISelValueTracking *VT = + &getAnalysis().get(MF); const AArch64Subtarget &ST = MF.getSubtarget(); @@ -174,7 +175,7 @@ INITIALIZE_PASS_BEGIN(AArch64O0PreLegalizerCombiner, DEBUG_TYPE, "Combine AArch64 machine instrs before legalization", false, false) INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) -INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis) +INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy) INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass) INITIALIZE_PASS_END(AArch64O0PreLegalizerCombiner, DEBUG_TYPE, "Combine AArch64 machine instrs before legalization", false, diff --git a/llvm/lib/Target/AArch64/GISel/AArch64PostLegalizerCombiner.cpp b/llvm/lib/Target/AArch64/GISel/AArch64PostLegalizerCombiner.cpp index 32c33990ad34..1c3d2b416630 100644 --- a/llvm/lib/Target/AArch64/GISel/AArch64PostLegalizerCombiner.cpp +++ b/llvm/lib/Target/AArch64/GISel/AArch64PostLegalizerCombiner.cpp @@ -636,8 +636,8 @@ void AArch64PostLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.setPreservesCFG(); getSelectionDAGFallbackAnalysisUsage(AU); - AU.addRequired(); - AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); if (!IsOptNone) { AU.addRequired(); AU.addPreserved(); @@ -668,7 +668,8 @@ bool AArch64PostLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { const AArch64Subtarget &ST = MF.getSubtarget(); const auto *LI = ST.getLegalizerInfo(); - GISelValueTracking *VT = &getAnalysis().get(MF); + GISelValueTracking *VT = + &getAnalysis().get(MF); MachineDominatorTree *MDT = IsOptNone ? nullptr : &getAnalysis().getDomTree(); @@ -883,7 +884,7 @@ INITIALIZE_PASS_BEGIN(AArch64PostLegalizerCombiner, DEBUG_TYPE, "Combine AArch64 MachineInstrs after legalization", false, false) INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) -INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis) +INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy) INITIALIZE_PASS_END(AArch64PostLegalizerCombiner, DEBUG_TYPE, "Combine AArch64 MachineInstrs after legalization", false, false) diff --git a/llvm/lib/Target/AArch64/GISel/AArch64PreLegalizerCombiner.cpp b/llvm/lib/Target/AArch64/GISel/AArch64PreLegalizerCombiner.cpp index 416386555dc0..37a7d2206b18 100644 --- a/llvm/lib/Target/AArch64/GISel/AArch64PreLegalizerCombiner.cpp +++ b/llvm/lib/Target/AArch64/GISel/AArch64PreLegalizerCombiner.cpp @@ -820,8 +820,8 @@ void AArch64PreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.setPreservesCFG(); getSelectionDAGFallbackAnalysisUsage(AU); - AU.addRequired(); - AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); AU.addRequired(); AU.addPreserved(); AU.addRequired(); @@ -852,7 +852,8 @@ bool AArch64PreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { const Function &F = MF.getFunction(); bool EnableOpt = MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F); - GISelValueTracking *VT = &getAnalysis().get(MF); + GISelValueTracking *VT = + &getAnalysis().get(MF); MachineDominatorTree *MDT = &getAnalysis().getDomTree(); CombinerInfo CInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false, @@ -874,7 +875,7 @@ INITIALIZE_PASS_BEGIN(AArch64PreLegalizerCombiner, DEBUG_TYPE, "Combine AArch64 machine instrs before legalization", false, false) INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) -INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis) +INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy) INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass) INITIALIZE_PASS_END(AArch64PreLegalizerCombiner, DEBUG_TYPE, "Combine AArch64 machine instrs before legalization", false, diff --git a/llvm/lib/Target/AMDGPU/AMDGPUPostLegalizerCombiner.cpp b/llvm/lib/Target/AMDGPU/AMDGPUPostLegalizerCombiner.cpp index a52a6aef2bc3..0c6122cce78e 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUPostLegalizerCombiner.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUPostLegalizerCombiner.cpp @@ -462,8 +462,8 @@ void AMDGPUPostLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.setPreservesCFG(); getSelectionDAGFallbackAnalysisUsage(AU); - AU.addRequired(); - AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); if (!IsOptNone) { AU.addRequired(); AU.addPreserved(); @@ -490,7 +490,8 @@ bool AMDGPUPostLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { const AMDGPULegalizerInfo *LI = static_cast(ST.getLegalizerInfo()); - GISelValueTracking *VT = &getAnalysis().get(MF); + GISelValueTracking *VT = + &getAnalysis().get(MF); MachineDominatorTree *MDT = IsOptNone ? nullptr : &getAnalysis().getDomTree(); @@ -512,7 +513,7 @@ INITIALIZE_PASS_BEGIN(AMDGPUPostLegalizerCombiner, DEBUG_TYPE, "Combine AMDGPU machine instrs after legalization", false, false) INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) -INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis) +INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy) INITIALIZE_PASS_END(AMDGPUPostLegalizerCombiner, DEBUG_TYPE, "Combine AMDGPU machine instrs after legalization", false, false) diff --git a/llvm/lib/Target/AMDGPU/AMDGPUPreLegalizerCombiner.cpp b/llvm/lib/Target/AMDGPU/AMDGPUPreLegalizerCombiner.cpp index ca97591a8711..4aec2ba35ae5 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUPreLegalizerCombiner.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUPreLegalizerCombiner.cpp @@ -234,8 +234,8 @@ void AMDGPUPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.setPreservesCFG(); getSelectionDAGFallbackAnalysisUsage(AU); - AU.addRequired(); - AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); if (!IsOptNone) { AU.addRequired(); AU.addPreserved(); @@ -260,7 +260,8 @@ bool AMDGPUPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { const Function &F = MF.getFunction(); bool EnableOpt = MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F); - GISelValueTracking *VT = &getAnalysis().get(MF); + GISelValueTracking *VT = + &getAnalysis().get(MF); // Enable CSE. GISelCSEAnalysisWrapper &Wrapper = @@ -289,7 +290,7 @@ INITIALIZE_PASS_BEGIN(AMDGPUPreLegalizerCombiner, DEBUG_TYPE, "Combine AMDGPU machine instrs before legalization", false, false) INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) -INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis) +INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy) INITIALIZE_PASS_END(AMDGPUPreLegalizerCombiner, DEBUG_TYPE, "Combine AMDGPU machine instrs before legalization", false, false) diff --git a/llvm/lib/Target/AMDGPU/AMDGPURegBankCombiner.cpp b/llvm/lib/Target/AMDGPU/AMDGPURegBankCombiner.cpp index d41ea17cd6f0..f08502fb3d92 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPURegBankCombiner.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPURegBankCombiner.cpp @@ -446,8 +446,8 @@ void AMDGPURegBankCombiner::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.setPreservesCFG(); getSelectionDAGFallbackAnalysisUsage(AU); - AU.addRequired(); - AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); if (!IsOptNone) { AU.addRequired(); AU.addPreserved(); @@ -471,7 +471,8 @@ bool AMDGPURegBankCombiner::runOnMachineFunction(MachineFunction &MF) { MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F); const GCNSubtarget &ST = MF.getSubtarget(); - GISelValueTracking *VT = &getAnalysis().get(MF); + GISelValueTracking *VT = + &getAnalysis().get(MF); const auto *LI = ST.getLegalizerInfo(); MachineDominatorTree *MDT = @@ -496,7 +497,7 @@ INITIALIZE_PASS_BEGIN(AMDGPURegBankCombiner, DEBUG_TYPE, "Combine AMDGPU machine instrs after regbankselect", false, false) INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) -INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis) +INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy) INITIALIZE_PASS_END(AMDGPURegBankCombiner, DEBUG_TYPE, "Combine AMDGPU machine instrs after regbankselect", false, false) diff --git a/llvm/lib/Target/Mips/MipsPostLegalizerCombiner.cpp b/llvm/lib/Target/Mips/MipsPostLegalizerCombiner.cpp index bb7482c5555e..166a2501e3f0 100644 --- a/llvm/lib/Target/Mips/MipsPostLegalizerCombiner.cpp +++ b/llvm/lib/Target/Mips/MipsPostLegalizerCombiner.cpp @@ -106,8 +106,8 @@ void MipsPostLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.setPreservesCFG(); getSelectionDAGFallbackAnalysisUsage(AU); - AU.addRequired(); - AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); if (!IsOptNone) { AU.addRequired(); AU.addPreserved(); @@ -134,7 +134,8 @@ bool MipsPostLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { const MipsLegalizerInfo *LI = static_cast(ST.getLegalizerInfo()); - GISelValueTracking *VT = &getAnalysis().get(MF); + GISelValueTracking *VT = + &getAnalysis().get(MF); MachineDominatorTree *MDT = IsOptNone ? nullptr : &getAnalysis().getDomTree(); @@ -150,7 +151,7 @@ INITIALIZE_PASS_BEGIN(MipsPostLegalizerCombiner, DEBUG_TYPE, "Combine Mips machine instrs after legalization", false, false) INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) -INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis) +INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy) INITIALIZE_PASS_END(MipsPostLegalizerCombiner, DEBUG_TYPE, "Combine Mips machine instrs after legalization", false, false) diff --git a/llvm/lib/Target/Mips/MipsPreLegalizerCombiner.cpp b/llvm/lib/Target/Mips/MipsPreLegalizerCombiner.cpp index a1ae66ef0977..278dcb143d33 100644 --- a/llvm/lib/Target/Mips/MipsPreLegalizerCombiner.cpp +++ b/llvm/lib/Target/Mips/MipsPreLegalizerCombiner.cpp @@ -102,8 +102,8 @@ public: void MipsPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); - AU.addRequired(); - AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); AU.setPreservesCFG(); getSelectionDAGFallbackAnalysisUsage(AU); MachineFunctionPass::getAnalysisUsage(AU); @@ -122,7 +122,8 @@ bool MipsPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { const MipsLegalizerInfo *LI = static_cast(ST.getLegalizerInfo()); - GISelValueTracking *VT = &getAnalysis().get(MF); + GISelValueTracking *VT = + &getAnalysis().get(MF); MipsPreLegalizerCombinerInfo PCInfo; MipsPreLegalizerCombinerImpl Impl(MF, PCInfo, TPC, *VT, /*CSEInfo*/ nullptr, ST, /*MDT*/ nullptr, LI); @@ -134,7 +135,7 @@ INITIALIZE_PASS_BEGIN(MipsPreLegalizerCombiner, DEBUG_TYPE, "Combine Mips machine instrs before legalization", false, false) INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) -INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis) +INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy) INITIALIZE_PASS_END(MipsPreLegalizerCombiner, DEBUG_TYPE, "Combine Mips machine instrs before legalization", false, false) diff --git a/llvm/lib/Target/RISCV/GISel/RISCVO0PreLegalizerCombiner.cpp b/llvm/lib/Target/RISCV/GISel/RISCVO0PreLegalizerCombiner.cpp index 1450d5f092f9..d57479c80297 100644 --- a/llvm/lib/Target/RISCV/GISel/RISCVO0PreLegalizerCombiner.cpp +++ b/llvm/lib/Target/RISCV/GISel/RISCVO0PreLegalizerCombiner.cpp @@ -103,8 +103,8 @@ void RISCVO0PreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.setPreservesCFG(); getSelectionDAGFallbackAnalysisUsage(AU); - AU.addRequired(); - AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); MachineFunctionPass::getAnalysisUsage(AU); } @@ -121,7 +121,8 @@ bool RISCVO0PreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { auto &TPC = getAnalysis(); const Function &F = MF.getFunction(); - GISelValueTracking *VT = &getAnalysis().get(MF); + GISelValueTracking *VT = + &getAnalysis().get(MF); const RISCVSubtarget &ST = MF.getSubtarget(); @@ -142,7 +143,7 @@ INITIALIZE_PASS_BEGIN(RISCVO0PreLegalizerCombiner, DEBUG_TYPE, "Combine RISC-V machine instrs before legalization", false, false) INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) -INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis) +INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy) INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass) INITIALIZE_PASS_END(RISCVO0PreLegalizerCombiner, DEBUG_TYPE, "Combine RISC-V machine instrs before legalization", false, diff --git a/llvm/lib/Target/RISCV/GISel/RISCVPostLegalizerCombiner.cpp b/llvm/lib/Target/RISCV/GISel/RISCVPostLegalizerCombiner.cpp index eaccf6d67dcc..1e4c598d3adf 100644 --- a/llvm/lib/Target/RISCV/GISel/RISCVPostLegalizerCombiner.cpp +++ b/llvm/lib/Target/RISCV/GISel/RISCVPostLegalizerCombiner.cpp @@ -107,8 +107,8 @@ void RISCVPostLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.setPreservesCFG(); getSelectionDAGFallbackAnalysisUsage(AU); - AU.addRequired(); - AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); AU.addRequired(); AU.addPreserved(); AU.addRequired(); @@ -137,7 +137,8 @@ bool RISCVPostLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { const RISCVSubtarget &ST = MF.getSubtarget(); const auto *LI = ST.getLegalizerInfo(); - GISelValueTracking *VT = &getAnalysis().get(MF); + GISelValueTracking *VT = + &getAnalysis().get(MF); MachineDominatorTree *MDT = &getAnalysis().getDomTree(); GISelCSEAnalysisWrapper &Wrapper = @@ -157,7 +158,7 @@ INITIALIZE_PASS_BEGIN(RISCVPostLegalizerCombiner, DEBUG_TYPE, "Combine RISC-V MachineInstrs after legalization", false, false) INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) -INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis) +INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy) INITIALIZE_PASS_END(RISCVPostLegalizerCombiner, DEBUG_TYPE, "Combine RISC-V MachineInstrs after legalization", false, false) diff --git a/llvm/lib/Target/RISCV/GISel/RISCVPreLegalizerCombiner.cpp b/llvm/lib/Target/RISCV/GISel/RISCVPreLegalizerCombiner.cpp index afd25676a89e..e6e8147f3118 100644 --- a/llvm/lib/Target/RISCV/GISel/RISCVPreLegalizerCombiner.cpp +++ b/llvm/lib/Target/RISCV/GISel/RISCVPreLegalizerCombiner.cpp @@ -105,8 +105,8 @@ void RISCVPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.setPreservesCFG(); getSelectionDAGFallbackAnalysisUsage(AU); - AU.addRequired(); - AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); AU.addRequired(); AU.addPreserved(); AU.addRequired(); @@ -137,7 +137,8 @@ bool RISCVPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { const Function &F = MF.getFunction(); bool EnableOpt = MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F); - GISelValueTracking *VT = &getAnalysis().get(MF); + GISelValueTracking *VT = + &getAnalysis().get(MF); MachineDominatorTree *MDT = &getAnalysis().getDomTree(); CombinerInfo CInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false, @@ -159,7 +160,7 @@ INITIALIZE_PASS_BEGIN(RISCVPreLegalizerCombiner, DEBUG_TYPE, "Combine RISC-V machine instrs before legalization", false, false) INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) -INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis) +INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy) INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass) INITIALIZE_PASS_END(RISCVPreLegalizerCombiner, DEBUG_TYPE, "Combine RISC-V machine instrs before legalization", false, diff --git a/llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp b/llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp index 3fcff3dd8f55..b6a2da6e2045 100644 --- a/llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp @@ -39,7 +39,7 @@ public: } // namespace void SPIRVPreLegalizer::getAnalysisUsage(AnalysisUsage &AU) const { - AU.addPreserved(); + AU.addPreserved(); MachineFunctionPass::getAnalysisUsage(AU); } diff --git a/llvm/lib/Target/SPIRV/SPIRVPreLegalizerCombiner.cpp b/llvm/lib/Target/SPIRV/SPIRVPreLegalizerCombiner.cpp index c96ee6b02491..d378f2b0d1ff 100644 --- a/llvm/lib/Target/SPIRV/SPIRVPreLegalizerCombiner.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVPreLegalizerCombiner.cpp @@ -187,8 +187,8 @@ void SPIRVPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.setPreservesCFG(); getSelectionDAGFallbackAnalysisUsage(AU); - AU.addRequired(); - AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); AU.addRequired(); AU.addPreserved(); MachineFunctionPass::getAnalysisUsage(AU); @@ -212,7 +212,8 @@ bool SPIRVPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { const Function &F = MF.getFunction(); bool EnableOpt = MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F); - GISelValueTracking *VT = &getAnalysis().get(MF); + GISelValueTracking *VT = + &getAnalysis().get(MF); MachineDominatorTree *MDT = &getAnalysis().getDomTree(); CombinerInfo CInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false, @@ -234,7 +235,7 @@ INITIALIZE_PASS_BEGIN(SPIRVPreLegalizerCombiner, DEBUG_TYPE, "Combine SPIRV machine instrs before legalization", false, false) INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) -INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysis) +INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy) INITIALIZE_PASS_END(SPIRVPreLegalizerCombiner, DEBUG_TYPE, "Combine SPIRV machine instrs before legalization", false, false) diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-const.mir b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-const.mir new file mode 100644 index 000000000000..5d88bb08ebe7 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-const.mir @@ -0,0 +1,27 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple aarch64 -passes="print" %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 +... diff --git a/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp b/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp index de29cbcd2947..089fb00d6080 100644 --- a/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp @@ -10,52 +10,6 @@ #include "llvm/CodeGen/GlobalISel/GISelValueTracking.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 // and get the intersections of everything we know on each operand. TEST_F(AArch64GISelMITest, TestKnownBitsCstPHI) {