diff options
author | shkzhang <shkzhang@cn.ibm.com> | 2019-12-11 04:46:00 -0500 |
---|---|---|
committer | shkzhang <shkzhang@cn.ibm.com> | 2019-12-11 04:46:00 -0500 |
commit | 1408e7e17525287c596a8f575957aecb684fa75d (patch) | |
tree | 9dbf83122387cd937f9ece7a4383d8139a1847a2 /llvm/lib/CodeGen/EarlyIfConversion.cpp | |
parent | 11f311875f092e59cac2936b54f922b968e615e3 (diff) | |
download | bcm5719-llvm-1408e7e17525287c596a8f575957aecb684fa75d.tar.gz bcm5719-llvm-1408e7e17525287c596a8f575957aecb684fa75d.zip |
[PowerPC] [CodeGen] Use MachineBranchProbabilityInfo in EarlyIfPredicator to avoid the potential bug
Summary:
In the function `EarlyIfPredicator::shouldConvertIf()`, we call
`TII->isProfitableToIfCvt()` with `BranchProbability::getUnknown()`, it may
cause the potential assertion error for those hook which use `BranchProbability`
in `isProfitableToIfCvt()`, for example `SystemZ`.
`SystemZ` use `Probability < BranchProbability(1, 8))` in the function
`SystemZInstrInfo::isProfitableToIfCvt()`, if we call this function with
`BranchProbability::getUnknown()`, it will cause assertion error.
This patch is to fix the potential bug.
Reviewed By: ThomasRaoux
Differential Revision: https://reviews.llvm.org/D71273
Diffstat (limited to 'llvm/lib/CodeGen/EarlyIfConversion.cpp')
-rw-r--r-- | llvm/lib/CodeGen/EarlyIfConversion.cpp | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/EarlyIfConversion.cpp b/llvm/lib/CodeGen/EarlyIfConversion.cpp index 92bd9d1df37..d45e424184d 100644 --- a/llvm/lib/CodeGen/EarlyIfConversion.cpp +++ b/llvm/lib/CodeGen/EarlyIfConversion.cpp @@ -941,6 +941,7 @@ class EarlyIfPredicator : public MachineFunctionPass { TargetSchedModel SchedModel; MachineRegisterInfo *MRI; MachineDominatorTree *DomTree; + MachineBranchProbabilityInfo *MBPI; MachineLoopInfo *Loops; SSAIfConv IfConv; @@ -966,10 +967,12 @@ char &llvm::EarlyIfPredicatorID = EarlyIfPredicator::ID; INITIALIZE_PASS_BEGIN(EarlyIfPredicator, DEBUG_TYPE, "Early If Predicator", false, false) INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree) +INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo) INITIALIZE_PASS_END(EarlyIfPredicator, DEBUG_TYPE, "Early If Predicator", false, false) void EarlyIfPredicator::getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequired<MachineBranchProbabilityInfo>(); AU.addRequired<MachineDominatorTree>(); AU.addPreserved<MachineDominatorTree>(); AU.addRequired<MachineLoopInfo>(); @@ -979,6 +982,7 @@ void EarlyIfPredicator::getAnalysisUsage(AnalysisUsage &AU) const { /// 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; @@ -993,7 +997,7 @@ bool EarlyIfPredicator::shouldConvertIf() { } return TII->isProfitableToIfCvt(IfBlock, Cycles, ExtraPredCost, - BranchProbability::getUnknown()); + TrueProbability); } unsigned TExtra = 0; unsigned FExtra = 0; @@ -1012,8 +1016,7 @@ bool EarlyIfPredicator::shouldConvertIf() { FExtra += TII->getPredicationCost(I); } return TII->isProfitableToIfCvt(*IfConv.TBB, TCycle, TExtra, *IfConv.FBB, - FCycle, FExtra, - BranchProbability::getUnknown()); + FCycle, FExtra, TrueProbability); } /// Attempt repeated if-conversion on MBB, return true if successful. @@ -1044,6 +1047,7 @@ bool EarlyIfPredicator::runOnMachineFunction(MachineFunction &MF) { SchedModel.init(&STI); DomTree = &getAnalysis<MachineDominatorTree>(); Loops = getAnalysisIfAvailable<MachineLoopInfo>(); + MBPI = &getAnalysis<MachineBranchProbabilityInfo>(); bool Changed = false; IfConv.runOnMachineFunction(MF); |