2323#include " llvm/CodeGen/Passes.h"
2424#include " llvm/CodeGen/TargetPassConfig.h"
2525#include " llvm/CodeGen/ValueTypes.h"
26+ #include " llvm/IR/Analysis.h"
2627#include " llvm/IR/DataLayout.h"
28+ #include " llvm/IR/Dominators.h"
2729#include " llvm/IR/Function.h"
2830#include " llvm/IR/IRBuilder.h"
2931#include " llvm/IR/Instructions.h"
3032#include " llvm/IR/IntrinsicInst.h"
3133#include " llvm/IR/IntrinsicsX86.h"
34+ #include " llvm/IR/PassManager.h"
3235#include " llvm/IR/PatternMatch.h"
3336#include " llvm/InitializePasses.h"
3437#include " llvm/Pass.h"
4043using namespace llvm ;
4144using namespace PatternMatch ;
4245
43- #define DEBUG_TYPE " lower-amx-intrinsics"
46+ #define DEBUG_TYPE " x86- lower-amx-intrinsics"
4447
4548#ifndef NDEBUG
4649static bool isV256I32Ty (Type *Ty) {
@@ -626,6 +629,37 @@ bool X86LowerAMXIntrinsics::visit() {
626629 return C;
627630}
628631
632+ namespace {
633+ bool shouldRunLowerAMXIntrinsics (const Function &F, const TargetMachine *TM) {
634+ return X86ScalarizeAMX && (F.hasFnAttribute (Attribute::OptimizeNone) ||
635+ TM->getOptLevel () == CodeGenOptLevel::None);
636+ }
637+
638+ bool runLowerAMXIntrinsics (Function &F, DominatorTree *DT, LoopInfo *LI) {
639+ DomTreeUpdater DTU (DT, DomTreeUpdater::UpdateStrategy::Lazy);
640+
641+ X86LowerAMXIntrinsics LAT (F, DTU, LI);
642+ return LAT.visit ();
643+ }
644+ } // namespace
645+
646+ PreservedAnalyses X86LowerAMXIntrinsicsPass::run (Function &F,
647+ FunctionAnalysisManager &FAM) {
648+ if (!shouldRunLowerAMXIntrinsics (F, TM))
649+ return PreservedAnalyses::all ();
650+
651+ DominatorTree &DT = FAM.getResult <DominatorTreeAnalysis>(F);
652+ LoopInfo &LI = FAM.getResult <LoopAnalysis>(F);
653+ bool Changed = runLowerAMXIntrinsics (F, &DT, &LI);
654+ if (!Changed)
655+ return PreservedAnalyses::all ();
656+
657+ PreservedAnalyses PA = PreservedAnalyses::none ();
658+ PA.preserve <DominatorTreeAnalysis>();
659+ PA.preserve <LoopAnalysis>();
660+ return PA;
661+ }
662+
629663namespace {
630664class X86LowerAMXIntrinsicsLegacyPass : public FunctionPass {
631665public:
@@ -634,21 +668,15 @@ class X86LowerAMXIntrinsicsLegacyPass : public FunctionPass {
634668 X86LowerAMXIntrinsicsLegacyPass () : FunctionPass(ID) {}
635669
636670 bool runOnFunction (Function &F) override {
637- if (!X86ScalarizeAMX)
638- return false ;
639671 TargetMachine *TM = &getAnalysis<TargetPassConfig>().getTM <TargetMachine>();
640- if (!F.hasFnAttribute (Attribute::OptimizeNone) &&
641- TM->getOptLevel () != CodeGenOptLevel::None)
672+ if (!shouldRunLowerAMXIntrinsics (F, TM))
642673 return false ;
643674
644675 auto *DTWP = getAnalysisIfAvailable<DominatorTreeWrapperPass>();
645676 auto *DT = DTWP ? &DTWP->getDomTree () : nullptr ;
646677 auto *LIWP = getAnalysisIfAvailable<LoopInfoWrapperPass>();
647678 auto *LI = LIWP ? &LIWP->getLoopInfo () : nullptr ;
648- DomTreeUpdater DTU (DT, DomTreeUpdater::UpdateStrategy::Lazy);
649-
650- X86LowerAMXIntrinsics LAT (F, DTU, LI);
651- return LAT.visit ();
679+ return runLowerAMXIntrinsics (F, DT, LI);
652680 }
653681 StringRef getPassName () const override { return " Lower AMX intrinsics" ; }
654682
@@ -668,6 +696,6 @@ INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
668696INITIALIZE_PASS_END(X86LowerAMXIntrinsicsLegacyPass, DEBUG_TYPE, PassName,
669697 false , false )
670698
671- FunctionPass *llvm::createX86LowerAMXIntrinsicsPass () {
699+ FunctionPass *llvm::createX86LowerAMXIntrinsicsLegacyPass () {
672700 return new X86LowerAMXIntrinsicsLegacyPass ();
673701}
0 commit comments