diff options
author | Wang Pengcheng <wangpengcheng.pp@bytedance.com> | 2024-07-08 19:19:57 +0800 |
---|---|---|
committer | Wang Pengcheng <wangpengcheng.pp@bytedance.com> | 2024-07-08 19:19:57 +0800 |
commit | a1137eae8bd9e69d5830a0b13e67fed9a85172fd (patch) | |
tree | fef95f54090878f24e3dbccbf580c5aa3b9fce17 | |
parent | c119da23afb42daf588c3e4caf97094689d70688 (diff) | |
download | llvm-users/wangpc-pp/spr/earlyifcvtnfc-factor-out-isprofitabletoconvertif.zip llvm-users/wangpc-pp/spr/earlyifcvtnfc-factor-out-isprofitabletoconvertif.tar.gz llvm-users/wangpc-pp/spr/earlyifcvtnfc-factor-out-isprofitabletoconvertif.tar.bz2 |
[𝘀𝗽𝗿] initial versionusers/wangpc-pp/spr/earlyifcvtnfc-factor-out-isprofitabletoconvertif
Created using spr 1.3.6-beta.1
-rw-r--r-- | llvm/lib/CodeGen/EarlyIfConversion.cpp | 84 |
1 files changed, 48 insertions, 36 deletions
diff --git a/llvm/lib/CodeGen/EarlyIfConversion.cpp b/llvm/lib/CodeGen/EarlyIfConversion.cpp index 5f3e850..6824a4c 100644 --- a/llvm/lib/CodeGen/EarlyIfConversion.cpp +++ b/llvm/lib/CodeGen/EarlyIfConversion.cpp @@ -180,6 +180,13 @@ public: /// speculatively execute it. bool canConvertIf(MachineBasicBlock *MBB, bool Predicate = false); + /// isProfitableToConvertIf - Apply the target heuristic to decide if the + /// transformation is profitable. Branch probabilities are considered + /// currently. + bool isProfitableToConvertIf(const MachineBranchProbabilityInfo *MBPI, + TargetSchedModel SchedModel, + bool Predicate = false); + /// convertIf - If-convert the last block passed to canConvertIf(), assuming /// it is possible. Add any erased blocks to RemovedBlocks. void convertIf(SmallVectorImpl<MachineBasicBlock *> &RemovedBlocks, @@ -561,6 +568,46 @@ bool SSAIfConv::canConvertIf(MachineBasicBlock *MBB, bool Predicate) { return true; } +/// Apply the target heuristic to decide if the transformation is profitable. +bool SSAIfConv::isProfitableToConvertIf( + const MachineBranchProbabilityInfo *MBPI, TargetSchedModel SchedModel, + bool Predicate) { + auto TrueProbability = MBPI->getEdgeProbability(Head, TBB); + if (isTriangle()) { + MachineBasicBlock &IfBlock = (TBB == Tail) ? *FBB : *TBB; + + unsigned ExtraPredCost = 0; + unsigned Cycles = 0; + for (MachineInstr &I : IfBlock) { + unsigned NumCycles = SchedModel.computeInstrLatency(&I, false); + if (NumCycles > 1) + Cycles += NumCycles - 1; + ExtraPredCost += TII->getPredicationCost(I); + } + + return TII->isProfitableToIfCvt(IfBlock, Cycles, ExtraPredCost, + TrueProbability); + } + unsigned TExtra = 0; + unsigned FExtra = 0; + unsigned TCycle = 0; + unsigned FCycle = 0; + for (MachineInstr &I : *TBB) { + unsigned NumCycles = SchedModel.computeInstrLatency(&I, false); + if (NumCycles > 1) + TCycle += NumCycles - 1; + TExtra += TII->getPredicationCost(I); + } + for (MachineInstr &I : *FBB) { + unsigned NumCycles = SchedModel.computeInstrLatency(&I, false); + if (NumCycles > 1) + FCycle += NumCycles - 1; + FExtra += TII->getPredicationCost(I); + } + return TII->isProfitableToIfCvt(*TBB, TCycle, TExtra, *FBB, FCycle, FExtra, + TrueProbability); +} + /// \return true iff the two registers are known to have the same value. static bool hasSameValue(const MachineRegisterInfo &MRI, const TargetInstrInfo *TII, Register TReg, @@ -1155,43 +1202,8 @@ void EarlyIfPredicator::getAnalysisUsage(AnalysisUsage &AU) const { MachineFunctionPass::getAnalysisUsage(AU); } -/// Apply the target heuristic to decide if the transformation is profitable. bool EarlyIfPredicator::shouldConvertIf() { - auto TrueProbability = MBPI->getEdgeProbability(IfConv.Head, IfConv.TBB); - if (IfConv.isTriangle()) { - MachineBasicBlock &IfBlock = - (IfConv.TBB == IfConv.Tail) ? *IfConv.FBB : *IfConv.TBB; - - unsigned ExtraPredCost = 0; - unsigned Cycles = 0; - for (MachineInstr &I : IfBlock) { - unsigned NumCycles = SchedModel.computeInstrLatency(&I, false); - if (NumCycles > 1) - Cycles += NumCycles - 1; - ExtraPredCost += TII->getPredicationCost(I); - } - - return TII->isProfitableToIfCvt(IfBlock, Cycles, ExtraPredCost, - TrueProbability); - } - unsigned TExtra = 0; - unsigned FExtra = 0; - unsigned TCycle = 0; - unsigned FCycle = 0; - for (MachineInstr &I : *IfConv.TBB) { - unsigned NumCycles = SchedModel.computeInstrLatency(&I, false); - if (NumCycles > 1) - TCycle += NumCycles - 1; - TExtra += TII->getPredicationCost(I); - } - for (MachineInstr &I : *IfConv.FBB) { - unsigned NumCycles = SchedModel.computeInstrLatency(&I, false); - if (NumCycles > 1) - FCycle += NumCycles - 1; - FExtra += TII->getPredicationCost(I); - } - return TII->isProfitableToIfCvt(*IfConv.TBB, TCycle, TExtra, *IfConv.FBB, - FCycle, FExtra, TrueProbability); + return IfConv.isProfitableToConvertIf(MBPI, SchedModel, /*Predicate=*/true); } /// Attempt repeated if-conversion on MBB, return true if successful. |