diff options
Diffstat (limited to 'llvm/lib/CodeGen/IfConversion.cpp')
-rw-r--r-- | llvm/lib/CodeGen/IfConversion.cpp | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/llvm/lib/CodeGen/IfConversion.cpp b/llvm/lib/CodeGen/IfConversion.cpp index 7d64828aa482..1a5c5d685017 100644 --- a/llvm/lib/CodeGen/IfConversion.cpp +++ b/llvm/lib/CodeGen/IfConversion.cpp @@ -31,6 +31,7 @@ #include "llvm/CodeGen/MachineModuleInfo.h" #include "llvm/CodeGen/MachineOperand.h" #include "llvm/CodeGen/MachineRegisterInfo.h" +#include "llvm/CodeGen/MBFIWrapper.h" #include "llvm/CodeGen/TargetInstrInfo.h" #include "llvm/CodeGen/TargetLowering.h" #include "llvm/CodeGen/TargetRegisterInfo.h" @@ -447,7 +448,7 @@ bool IfConverter::runOnMachineFunction(MachineFunction &MF) { TLI = ST.getTargetLowering(); TII = ST.getInstrInfo(); TRI = ST.getRegisterInfo(); - BranchFolder::MBFIWrapper MBFI(getAnalysis<MachineBlockFrequencyInfo>()); + MBFIWrapper MBFI(getAnalysis<MachineBlockFrequencyInfo>()); MBPI = &getAnalysis<MachineBranchProbabilityInfo>(); ProfileSummaryInfo *PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI(); @@ -462,10 +463,7 @@ bool IfConverter::runOnMachineFunction(MachineFunction &MF) { if (!PreRegAlloc) { // Tail merge tend to expose more if-conversion opportunities. BranchFolder BF(true, false, MBFI, *MBPI, PSI); - auto *MMIWP = getAnalysisIfAvailable<MachineModuleInfoWrapperPass>(); - BFChange = BF.OptimizeFunction( - MF, TII, ST.getRegisterInfo(), - MMIWP ? &MMIWP->getMMI() : nullptr); + BFChange = BF.OptimizeFunction(MF, TII, ST.getRegisterInfo()); } LLVM_DEBUG(dbgs() << "\nIfcvt: function (" << ++FnNum << ") \'" @@ -604,10 +602,7 @@ bool IfConverter::runOnMachineFunction(MachineFunction &MF) { if (MadeChange && IfCvtBranchFold) { BranchFolder BF(false, false, MBFI, *MBPI, PSI); - auto *MMIWP = getAnalysisIfAvailable<MachineModuleInfoWrapperPass>(); - BF.OptimizeFunction( - MF, TII, MF.getSubtarget().getRegisterInfo(), - MMIWP ? &MMIWP->getMMI() : nullptr); + BF.OptimizeFunction(MF, TII, MF.getSubtarget().getRegisterInfo()); } MadeChange |= BFChange; @@ -972,6 +967,11 @@ bool IfConverter::ValidDiamond( FalseBBI.IsBeingAnalyzed || FalseBBI.IsDone) return false; + // If the True and False BBs are equal we're dealing with a degenerate case + // that we don't treat as a diamond. + if (TrueBBI.BB == FalseBBI.BB) + return false; + MachineBasicBlock *TT = TrueBBI.TrueBB; MachineBasicBlock *FT = FalseBBI.TrueBB; @@ -1851,7 +1851,7 @@ bool IfConverter::IfConvertDiamondCommon( while (NumDups1 != 0) { // Since this instruction is going to be deleted, update call // site info state if the instruction is call instruction. - if (DI2->isCall(MachineInstr::IgnoreBundle)) + if (DI2->shouldUpdateCallSiteInfo()) MBB2.getParent()->eraseCallSiteInfo(&*DI2); ++DI2; @@ -1900,7 +1900,7 @@ bool IfConverter::IfConvertDiamondCommon( // Since this instruction is going to be deleted, update call // site info state if the instruction is call instruction. - if (DI1->isCall(MachineInstr::IgnoreBundle)) + if (DI1->shouldUpdateCallSiteInfo()) MBB1.getParent()->eraseCallSiteInfo(&*DI1); // skip dbg_value instructions @@ -2188,8 +2188,8 @@ void IfConverter::CopyAndPredicateBlock(BBInfo &ToBBI, BBInfo &FromBBI, MachineInstr *MI = MF.CloneMachineInstr(&I); // Make a copy of the call site info. - if (MI->isCall(MachineInstr::IgnoreBundle)) - MF.copyCallSiteInfo(&I,MI); + if (I.isCandidateForCallSiteEntry()) + MF.copyCallSiteInfo(&I, MI); ToBBI.BB->insert(ToBBI.BB->end(), MI); ToBBI.NonPredSize++; @@ -2237,10 +2237,10 @@ void IfConverter::CopyAndPredicateBlock(BBInfo &ToBBI, BBInfo &FromBBI, } /// Move all instructions from FromBB to the end of ToBB. This will leave -/// FromBB as an empty block, so remove all of its successor edges except for -/// the fall-through edge. If AddEdges is true, i.e., when FromBBI's branch is -/// being moved, add those successor edges to ToBBI and remove the old edge -/// from ToBBI to FromBBI. +/// FromBB as an empty block, so remove all of its successor edges and move it +/// to the end of the function. If AddEdges is true, i.e., when FromBBI's +/// branch is being moved, add those successor edges to ToBBI and remove the old +/// edge from ToBBI to FromBBI. void IfConverter::MergeBlocks(BBInfo &ToBBI, BBInfo &FromBBI, bool AddEdges) { MachineBasicBlock &FromMBB = *FromBBI.BB; assert(!FromMBB.hasAddressTaken() && @@ -2280,8 +2280,10 @@ void IfConverter::MergeBlocks(BBInfo &ToBBI, BBInfo &FromBBI, bool AddEdges) { for (MachineBasicBlock *Succ : FromSuccs) { // Fallthrough edge can't be transferred. - if (Succ == FallThrough) + if (Succ == FallThrough) { + FromMBB.removeSuccessor(Succ); continue; + } auto NewProb = BranchProbability::getZero(); if (AddEdges) { |