Home | History | Annotate | Line # | Download | only in CodeGen
      1 //===- IfConversion.cpp - Machine code if conversion pass -----------------===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 //
      9 // This file implements the machine instruction level if-conversion pass, which
     10 // tries to convert conditional branches into predicated instructions.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "BranchFolding.h"
     15 #include "llvm/ADT/STLExtras.h"
     16 #include "llvm/ADT/ScopeExit.h"
     17 #include "llvm/ADT/SmallSet.h"
     18 #include "llvm/ADT/SmallVector.h"
     19 #include "llvm/ADT/SparseSet.h"
     20 #include "llvm/ADT/Statistic.h"
     21 #include "llvm/ADT/iterator_range.h"
     22 #include "llvm/Analysis/ProfileSummaryInfo.h"
     23 #include "llvm/CodeGen/LivePhysRegs.h"
     24 #include "llvm/CodeGen/MachineBasicBlock.h"
     25 #include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
     26 #include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
     27 #include "llvm/CodeGen/MachineFunction.h"
     28 #include "llvm/CodeGen/MachineFunctionPass.h"
     29 #include "llvm/CodeGen/MachineInstr.h"
     30 #include "llvm/CodeGen/MachineInstrBuilder.h"
     31 #include "llvm/CodeGen/MachineModuleInfo.h"
     32 #include "llvm/CodeGen/MachineOperand.h"
     33 #include "llvm/CodeGen/MachineRegisterInfo.h"
     34 #include "llvm/CodeGen/MBFIWrapper.h"
     35 #include "llvm/CodeGen/TargetInstrInfo.h"
     36 #include "llvm/CodeGen/TargetLowering.h"
     37 #include "llvm/CodeGen/TargetRegisterInfo.h"
     38 #include "llvm/CodeGen/TargetSchedule.h"
     39 #include "llvm/CodeGen/TargetSubtargetInfo.h"
     40 #include "llvm/IR/Attributes.h"
     41 #include "llvm/IR/DebugLoc.h"
     42 #include "llvm/InitializePasses.h"
     43 #include "llvm/MC/MCRegisterInfo.h"
     44 #include "llvm/Pass.h"
     45 #include "llvm/Support/BranchProbability.h"
     46 #include "llvm/Support/CommandLine.h"
     47 #include "llvm/Support/Debug.h"
     48 #include "llvm/Support/ErrorHandling.h"
     49 #include "llvm/Support/raw_ostream.h"
     50 #include <algorithm>
     51 #include <cassert>
     52 #include <functional>
     53 #include <iterator>
     54 #include <memory>
     55 #include <utility>
     56 #include <vector>
     57 
     58 using namespace llvm;
     59 
     60 #define DEBUG_TYPE "if-converter"
     61 
     62 // Hidden options for help debugging.
     63 static cl::opt<int> IfCvtFnStart("ifcvt-fn-start", cl::init(-1), cl::Hidden);
     64 static cl::opt<int> IfCvtFnStop("ifcvt-fn-stop", cl::init(-1), cl::Hidden);
     65 static cl::opt<int> IfCvtLimit("ifcvt-limit", cl::init(-1), cl::Hidden);
     66 static cl::opt<bool> DisableSimple("disable-ifcvt-simple",
     67                                    cl::init(false), cl::Hidden);
     68 static cl::opt<bool> DisableSimpleF("disable-ifcvt-simple-false",
     69                                     cl::init(false), cl::Hidden);
     70 static cl::opt<bool> DisableTriangle("disable-ifcvt-triangle",
     71                                      cl::init(false), cl::Hidden);
     72 static cl::opt<bool> DisableTriangleR("disable-ifcvt-triangle-rev",
     73                                       cl::init(false), cl::Hidden);
     74 static cl::opt<bool> DisableTriangleF("disable-ifcvt-triangle-false",
     75                                       cl::init(false), cl::Hidden);
     76 static cl::opt<bool> DisableTriangleFR("disable-ifcvt-triangle-false-rev",
     77                                        cl::init(false), cl::Hidden);
     78 static cl::opt<bool> DisableDiamond("disable-ifcvt-diamond",
     79                                     cl::init(false), cl::Hidden);
     80 static cl::opt<bool> DisableForkedDiamond("disable-ifcvt-forked-diamond",
     81                                         cl::init(false), cl::Hidden);
     82 static cl::opt<bool> IfCvtBranchFold("ifcvt-branch-fold",
     83                                      cl::init(true), cl::Hidden);
     84 
     85 STATISTIC(NumSimple,       "Number of simple if-conversions performed");
     86 STATISTIC(NumSimpleFalse,  "Number of simple (F) if-conversions performed");
     87 STATISTIC(NumTriangle,     "Number of triangle if-conversions performed");
     88 STATISTIC(NumTriangleRev,  "Number of triangle (R) if-conversions performed");
     89 STATISTIC(NumTriangleFalse,"Number of triangle (F) if-conversions performed");
     90 STATISTIC(NumTriangleFRev, "Number of triangle (F/R) if-conversions performed");
     91 STATISTIC(NumDiamonds,     "Number of diamond if-conversions performed");
     92 STATISTIC(NumForkedDiamonds, "Number of forked-diamond if-conversions performed");
     93 STATISTIC(NumIfConvBBs,    "Number of if-converted blocks");
     94 STATISTIC(NumDupBBs,       "Number of duplicated blocks");
     95 STATISTIC(NumUnpred,       "Number of true blocks of diamonds unpredicated");
     96 
     97 namespace {
     98 
     99   class IfConverter : public MachineFunctionPass {
    100     enum IfcvtKind {
    101       ICNotClassfied,  // BB data valid, but not classified.
    102       ICSimpleFalse,   // Same as ICSimple, but on the false path.
    103       ICSimple,        // BB is entry of an one split, no rejoin sub-CFG.
    104       ICTriangleFRev,  // Same as ICTriangleFalse, but false path rev condition.
    105       ICTriangleRev,   // Same as ICTriangle, but true path rev condition.
    106       ICTriangleFalse, // Same as ICTriangle, but on the false path.
    107       ICTriangle,      // BB is entry of a triangle sub-CFG.
    108       ICDiamond,       // BB is entry of a diamond sub-CFG.
    109       ICForkedDiamond  // BB is entry of an almost diamond sub-CFG, with a
    110                        // common tail that can be shared.
    111     };
    112 
    113     /// One per MachineBasicBlock, this is used to cache the result
    114     /// if-conversion feasibility analysis. This includes results from
    115     /// TargetInstrInfo::analyzeBranch() (i.e. TBB, FBB, and Cond), and its
    116     /// classification, and common tail block of its successors (if it's a
    117     /// diamond shape), its size, whether it's predicable, and whether any
    118     /// instruction can clobber the 'would-be' predicate.
    119     ///
    120     /// IsDone          - True if BB is not to be considered for ifcvt.
    121     /// IsBeingAnalyzed - True if BB is currently being analyzed.
    122     /// IsAnalyzed      - True if BB has been analyzed (info is still valid).
    123     /// IsEnqueued      - True if BB has been enqueued to be ifcvt'ed.
    124     /// IsBrAnalyzable  - True if analyzeBranch() returns false.
    125     /// HasFallThrough  - True if BB may fallthrough to the following BB.
    126     /// IsUnpredicable  - True if BB is known to be unpredicable.
    127     /// ClobbersPred    - True if BB could modify predicates (e.g. has
    128     ///                   cmp, call, etc.)
    129     /// NonPredSize     - Number of non-predicated instructions.
    130     /// ExtraCost       - Extra cost for multi-cycle instructions.
    131     /// ExtraCost2      - Some instructions are slower when predicated
    132     /// BB              - Corresponding MachineBasicBlock.
    133     /// TrueBB / FalseBB- See analyzeBranch().
    134     /// BrCond          - Conditions for end of block conditional branches.
    135     /// Predicate       - Predicate used in the BB.
    136     struct BBInfo {
    137       bool IsDone          : 1;
    138       bool IsBeingAnalyzed : 1;
    139       bool IsAnalyzed      : 1;
    140       bool IsEnqueued      : 1;
    141       bool IsBrAnalyzable  : 1;
    142       bool IsBrReversible  : 1;
    143       bool HasFallThrough  : 1;
    144       bool IsUnpredicable  : 1;
    145       bool CannotBeCopied  : 1;
    146       bool ClobbersPred    : 1;
    147       unsigned NonPredSize = 0;
    148       unsigned ExtraCost = 0;
    149       unsigned ExtraCost2 = 0;
    150       MachineBasicBlock *BB = nullptr;
    151       MachineBasicBlock *TrueBB = nullptr;
    152       MachineBasicBlock *FalseBB = nullptr;
    153       SmallVector<MachineOperand, 4> BrCond;
    154       SmallVector<MachineOperand, 4> Predicate;
    155 
    156       BBInfo() : IsDone(false), IsBeingAnalyzed(false),
    157                  IsAnalyzed(false), IsEnqueued(false), IsBrAnalyzable(false),
    158                  IsBrReversible(false), HasFallThrough(false),
    159                  IsUnpredicable(false), CannotBeCopied(false),
    160                  ClobbersPred(false) {}
    161     };
    162 
    163     /// Record information about pending if-conversions to attempt:
    164     /// BBI             - Corresponding BBInfo.
    165     /// Kind            - Type of block. See IfcvtKind.
    166     /// NeedSubsumption - True if the to-be-predicated BB has already been
    167     ///                   predicated.
    168     /// NumDups      - Number of instructions that would be duplicated due
    169     ///                   to this if-conversion. (For diamonds, the number of
    170     ///                   identical instructions at the beginnings of both
    171     ///                   paths).
    172     /// NumDups2     - For diamonds, the number of identical instructions
    173     ///                   at the ends of both paths.
    174     struct IfcvtToken {
    175       BBInfo &BBI;
    176       IfcvtKind Kind;
    177       unsigned NumDups;
    178       unsigned NumDups2;
    179       bool NeedSubsumption : 1;
    180       bool TClobbersPred : 1;
    181       bool FClobbersPred : 1;
    182 
    183       IfcvtToken(BBInfo &b, IfcvtKind k, bool s, unsigned d, unsigned d2 = 0,
    184                  bool tc = false, bool fc = false)
    185         : BBI(b), Kind(k), NumDups(d), NumDups2(d2), NeedSubsumption(s),
    186           TClobbersPred(tc), FClobbersPred(fc) {}
    187     };
    188 
    189     /// Results of if-conversion feasibility analysis indexed by basic block
    190     /// number.
    191     std::vector<BBInfo> BBAnalysis;
    192     TargetSchedModel SchedModel;
    193 
    194     const TargetLoweringBase *TLI;
    195     const TargetInstrInfo *TII;
    196     const TargetRegisterInfo *TRI;
    197     const MachineBranchProbabilityInfo *MBPI;
    198     MachineRegisterInfo *MRI;
    199 
    200     LivePhysRegs Redefs;
    201 
    202     bool PreRegAlloc;
    203     bool MadeChange;
    204     int FnNum = -1;
    205     std::function<bool(const MachineFunction &)> PredicateFtor;
    206 
    207   public:
    208     static char ID;
    209 
    210     IfConverter(std::function<bool(const MachineFunction &)> Ftor = nullptr)
    211         : MachineFunctionPass(ID), PredicateFtor(std::move(Ftor)) {
    212       initializeIfConverterPass(*PassRegistry::getPassRegistry());
    213     }
    214 
    215     void getAnalysisUsage(AnalysisUsage &AU) const override {
    216       AU.addRequired<MachineBlockFrequencyInfo>();
    217       AU.addRequired<MachineBranchProbabilityInfo>();
    218       AU.addRequired<ProfileSummaryInfoWrapperPass>();
    219       MachineFunctionPass::getAnalysisUsage(AU);
    220     }
    221 
    222     bool runOnMachineFunction(MachineFunction &MF) override;
    223 
    224     MachineFunctionProperties getRequiredProperties() const override {
    225       return MachineFunctionProperties().set(
    226           MachineFunctionProperties::Property::NoVRegs);
    227     }
    228 
    229   private:
    230     bool reverseBranchCondition(BBInfo &BBI) const;
    231     bool ValidSimple(BBInfo &TrueBBI, unsigned &Dups,
    232                      BranchProbability Prediction) const;
    233     bool ValidTriangle(BBInfo &TrueBBI, BBInfo &FalseBBI,
    234                        bool FalseBranch, unsigned &Dups,
    235                        BranchProbability Prediction) const;
    236     bool CountDuplicatedInstructions(
    237         MachineBasicBlock::iterator &TIB, MachineBasicBlock::iterator &FIB,
    238         MachineBasicBlock::iterator &TIE, MachineBasicBlock::iterator &FIE,
    239         unsigned &Dups1, unsigned &Dups2,
    240         MachineBasicBlock &TBB, MachineBasicBlock &FBB,
    241         bool SkipUnconditionalBranches) const;
    242     bool ValidDiamond(BBInfo &TrueBBI, BBInfo &FalseBBI,
    243                       unsigned &Dups1, unsigned &Dups2,
    244                       BBInfo &TrueBBICalc, BBInfo &FalseBBICalc) const;
    245     bool ValidForkedDiamond(BBInfo &TrueBBI, BBInfo &FalseBBI,
    246                             unsigned &Dups1, unsigned &Dups2,
    247                             BBInfo &TrueBBICalc, BBInfo &FalseBBICalc) const;
    248     void AnalyzeBranches(BBInfo &BBI);
    249     void ScanInstructions(BBInfo &BBI,
    250                           MachineBasicBlock::iterator &Begin,
    251                           MachineBasicBlock::iterator &End,
    252                           bool BranchUnpredicable = false) const;
    253     bool RescanInstructions(
    254         MachineBasicBlock::iterator &TIB, MachineBasicBlock::iterator &FIB,
    255         MachineBasicBlock::iterator &TIE, MachineBasicBlock::iterator &FIE,
    256         BBInfo &TrueBBI, BBInfo &FalseBBI) const;
    257     void AnalyzeBlock(MachineBasicBlock &MBB,
    258                       std::vector<std::unique_ptr<IfcvtToken>> &Tokens);
    259     bool FeasibilityAnalysis(BBInfo &BBI, SmallVectorImpl<MachineOperand> &Pred,
    260                              bool isTriangle = false, bool RevBranch = false,
    261                              bool hasCommonTail = false);
    262     void AnalyzeBlocks(MachineFunction &MF,
    263                        std::vector<std::unique_ptr<IfcvtToken>> &Tokens);
    264     void InvalidatePreds(MachineBasicBlock &MBB);
    265     bool IfConvertSimple(BBInfo &BBI, IfcvtKind Kind);
    266     bool IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind);
    267     bool IfConvertDiamondCommon(BBInfo &BBI, BBInfo &TrueBBI, BBInfo &FalseBBI,
    268                                 unsigned NumDups1, unsigned NumDups2,
    269                                 bool TClobbersPred, bool FClobbersPred,
    270                                 bool RemoveBranch, bool MergeAddEdges);
    271     bool IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind,
    272                           unsigned NumDups1, unsigned NumDups2,
    273                           bool TClobbers, bool FClobbers);
    274     bool IfConvertForkedDiamond(BBInfo &BBI, IfcvtKind Kind,
    275                               unsigned NumDups1, unsigned NumDups2,
    276                               bool TClobbers, bool FClobbers);
    277     void PredicateBlock(BBInfo &BBI,
    278                         MachineBasicBlock::iterator E,
    279                         SmallVectorImpl<MachineOperand> &Cond,
    280                         SmallSet<MCPhysReg, 4> *LaterRedefs = nullptr);
    281     void CopyAndPredicateBlock(BBInfo &ToBBI, BBInfo &FromBBI,
    282                                SmallVectorImpl<MachineOperand> &Cond,
    283                                bool IgnoreBr = false);
    284     void MergeBlocks(BBInfo &ToBBI, BBInfo &FromBBI, bool AddEdges = true);
    285 
    286     bool MeetIfcvtSizeLimit(MachineBasicBlock &BB,
    287                             unsigned Cycle, unsigned Extra,
    288                             BranchProbability Prediction) const {
    289       return Cycle > 0 && TII->isProfitableToIfCvt(BB, Cycle, Extra,
    290                                                    Prediction);
    291     }
    292 
    293     bool MeetIfcvtSizeLimit(BBInfo &TBBInfo, BBInfo &FBBInfo,
    294                             MachineBasicBlock &CommBB, unsigned Dups,
    295                             BranchProbability Prediction, bool Forked) const {
    296       const MachineFunction &MF = *TBBInfo.BB->getParent();
    297       if (MF.getFunction().hasMinSize()) {
    298         MachineBasicBlock::iterator TIB = TBBInfo.BB->begin();
    299         MachineBasicBlock::iterator FIB = FBBInfo.BB->begin();
    300         MachineBasicBlock::iterator TIE = TBBInfo.BB->end();
    301         MachineBasicBlock::iterator FIE = FBBInfo.BB->end();
    302 
    303         unsigned Dups1 = 0, Dups2 = 0;
    304         if (!CountDuplicatedInstructions(TIB, FIB, TIE, FIE, Dups1, Dups2,
    305                                          *TBBInfo.BB, *FBBInfo.BB,
    306                                          /*SkipUnconditionalBranches*/ true))
    307           llvm_unreachable("should already have been checked by ValidDiamond");
    308 
    309         unsigned BranchBytes = 0;
    310         unsigned CommonBytes = 0;
    311 
    312         // Count common instructions at the start of the true and false blocks.
    313         for (auto &I : make_range(TBBInfo.BB->begin(), TIB)) {
    314           LLVM_DEBUG(dbgs() << "Common inst: " << I);
    315           CommonBytes += TII->getInstSizeInBytes(I);
    316         }
    317         for (auto &I : make_range(FBBInfo.BB->begin(), FIB)) {
    318           LLVM_DEBUG(dbgs() << "Common inst: " << I);
    319           CommonBytes += TII->getInstSizeInBytes(I);
    320         }
    321 
    322         // Count instructions at the end of the true and false blocks, after
    323         // the ones we plan to predicate. Analyzable branches will be removed
    324         // (unless this is a forked diamond), and all other instructions are
    325         // common between the two blocks.
    326         for (auto &I : make_range(TIE, TBBInfo.BB->end())) {
    327           if (I.isBranch() && TBBInfo.IsBrAnalyzable && !Forked) {
    328             LLVM_DEBUG(dbgs() << "Saving branch: " << I);
    329             BranchBytes += TII->predictBranchSizeForIfCvt(I);
    330           } else {
    331             LLVM_DEBUG(dbgs() << "Common inst: " << I);
    332             CommonBytes += TII->getInstSizeInBytes(I);
    333           }
    334         }
    335         for (auto &I : make_range(FIE, FBBInfo.BB->end())) {
    336           if (I.isBranch() && FBBInfo.IsBrAnalyzable && !Forked) {
    337             LLVM_DEBUG(dbgs() << "Saving branch: " << I);
    338             BranchBytes += TII->predictBranchSizeForIfCvt(I);
    339           } else {
    340             LLVM_DEBUG(dbgs() << "Common inst: " << I);
    341             CommonBytes += TII->getInstSizeInBytes(I);
    342           }
    343         }
    344         for (auto &I : CommBB.terminators()) {
    345           if (I.isBranch()) {
    346             LLVM_DEBUG(dbgs() << "Saving branch: " << I);
    347             BranchBytes += TII->predictBranchSizeForIfCvt(I);
    348           }
    349         }
    350 
    351         // The common instructions in one branch will be eliminated, halving
    352         // their code size.
    353         CommonBytes /= 2;
    354 
    355         // Count the instructions which we need to predicate.
    356         unsigned NumPredicatedInstructions = 0;
    357         for (auto &I : make_range(TIB, TIE)) {
    358           if (!I.isDebugInstr()) {
    359             LLVM_DEBUG(dbgs() << "Predicating: " << I);
    360             NumPredicatedInstructions++;
    361           }
    362         }
    363         for (auto &I : make_range(FIB, FIE)) {
    364           if (!I.isDebugInstr()) {
    365             LLVM_DEBUG(dbgs() << "Predicating: " << I);
    366             NumPredicatedInstructions++;
    367           }
    368         }
    369 
    370         // Even though we're optimising for size at the expense of performance,
    371         // avoid creating really long predicated blocks.
    372         if (NumPredicatedInstructions > 15)
    373           return false;
    374 
    375         // Some targets (e.g. Thumb2) need to insert extra instructions to
    376         // start predicated blocks.
    377         unsigned ExtraPredicateBytes = TII->extraSizeToPredicateInstructions(
    378             MF, NumPredicatedInstructions);
    379 
    380         LLVM_DEBUG(dbgs() << "MeetIfcvtSizeLimit(BranchBytes=" << BranchBytes
    381                           << ", CommonBytes=" << CommonBytes
    382                           << ", NumPredicatedInstructions="
    383                           << NumPredicatedInstructions
    384                           << ", ExtraPredicateBytes=" << ExtraPredicateBytes
    385                           << ")\n");
    386         return (BranchBytes + CommonBytes) > ExtraPredicateBytes;
    387       } else {
    388         unsigned TCycle = TBBInfo.NonPredSize + TBBInfo.ExtraCost - Dups;
    389         unsigned FCycle = FBBInfo.NonPredSize + FBBInfo.ExtraCost - Dups;
    390         bool Res = TCycle > 0 && FCycle > 0 &&
    391                    TII->isProfitableToIfCvt(
    392                        *TBBInfo.BB, TCycle, TBBInfo.ExtraCost2, *FBBInfo.BB,
    393                        FCycle, FBBInfo.ExtraCost2, Prediction);
    394         LLVM_DEBUG(dbgs() << "MeetIfcvtSizeLimit(TCycle=" << TCycle
    395                           << ", FCycle=" << FCycle
    396                           << ", TExtra=" << TBBInfo.ExtraCost2 << ", FExtra="
    397                           << FBBInfo.ExtraCost2 << ") = " << Res << "\n");
    398         return Res;
    399       }
    400     }
    401 
    402     /// Returns true if Block ends without a terminator.
    403     bool blockAlwaysFallThrough(BBInfo &BBI) const {
    404       return BBI.IsBrAnalyzable && BBI.TrueBB == nullptr;
    405     }
    406 
    407     /// Used to sort if-conversion candidates.
    408     static bool IfcvtTokenCmp(const std::unique_ptr<IfcvtToken> &C1,
    409                               const std::unique_ptr<IfcvtToken> &C2) {
    410       int Incr1 = (C1->Kind == ICDiamond)
    411         ? -(int)(C1->NumDups + C1->NumDups2) : (int)C1->NumDups;
    412       int Incr2 = (C2->Kind == ICDiamond)
    413         ? -(int)(C2->NumDups + C2->NumDups2) : (int)C2->NumDups;
    414       if (Incr1 > Incr2)
    415         return true;
    416       else if (Incr1 == Incr2) {
    417         // Favors subsumption.
    418         if (!C1->NeedSubsumption && C2->NeedSubsumption)
    419           return true;
    420         else if (C1->NeedSubsumption == C2->NeedSubsumption) {
    421           // Favors diamond over triangle, etc.
    422           if ((unsigned)C1->Kind < (unsigned)C2->Kind)
    423             return true;
    424           else if (C1->Kind == C2->Kind)
    425             return C1->BBI.BB->getNumber() < C2->BBI.BB->getNumber();
    426         }
    427       }
    428       return false;
    429     }
    430   };
    431 
    432 } // end anonymous namespace
    433 
    434 char IfConverter::ID = 0;
    435 
    436 char &llvm::IfConverterID = IfConverter::ID;
    437 
    438 INITIALIZE_PASS_BEGIN(IfConverter, DEBUG_TYPE, "If Converter", false, false)
    439 INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo)
    440 INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
    441 INITIALIZE_PASS_END(IfConverter, DEBUG_TYPE, "If Converter", false, false)
    442 
    443 bool IfConverter::runOnMachineFunction(MachineFunction &MF) {
    444   if (skipFunction(MF.getFunction()) || (PredicateFtor && !PredicateFtor(MF)))
    445     return false;
    446 
    447   const TargetSubtargetInfo &ST = MF.getSubtarget();
    448   TLI = ST.getTargetLowering();
    449   TII = ST.getInstrInfo();
    450   TRI = ST.getRegisterInfo();
    451   MBFIWrapper MBFI(getAnalysis<MachineBlockFrequencyInfo>());
    452   MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
    453   ProfileSummaryInfo *PSI =
    454       &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
    455   MRI = &MF.getRegInfo();
    456   SchedModel.init(&ST);
    457 
    458   if (!TII) return false;
    459 
    460   PreRegAlloc = MRI->isSSA();
    461 
    462   bool BFChange = false;
    463   if (!PreRegAlloc) {
    464     // Tail merge tend to expose more if-conversion opportunities.
    465     BranchFolder BF(true, false, MBFI, *MBPI, PSI);
    466     BFChange = BF.OptimizeFunction(MF, TII, ST.getRegisterInfo());
    467   }
    468 
    469   LLVM_DEBUG(dbgs() << "\nIfcvt: function (" << ++FnNum << ") \'"
    470                     << MF.getName() << "\'");
    471 
    472   if (FnNum < IfCvtFnStart || (IfCvtFnStop != -1 && FnNum > IfCvtFnStop)) {
    473     LLVM_DEBUG(dbgs() << " skipped\n");
    474     return false;
    475   }
    476   LLVM_DEBUG(dbgs() << "\n");
    477 
    478   MF.RenumberBlocks();
    479   BBAnalysis.resize(MF.getNumBlockIDs());
    480 
    481   std::vector<std::unique_ptr<IfcvtToken>> Tokens;
    482   MadeChange = false;
    483   unsigned NumIfCvts = NumSimple + NumSimpleFalse + NumTriangle +
    484     NumTriangleRev + NumTriangleFalse + NumTriangleFRev + NumDiamonds;
    485   while (IfCvtLimit == -1 || (int)NumIfCvts < IfCvtLimit) {
    486     // Do an initial analysis for each basic block and find all the potential
    487     // candidates to perform if-conversion.
    488     bool Change = false;
    489     AnalyzeBlocks(MF, Tokens);
    490     while (!Tokens.empty()) {
    491       std::unique_ptr<IfcvtToken> Token = std::move(Tokens.back());
    492       Tokens.pop_back();
    493       BBInfo &BBI = Token->BBI;
    494       IfcvtKind Kind = Token->Kind;
    495       unsigned NumDups = Token->NumDups;
    496       unsigned NumDups2 = Token->NumDups2;
    497 
    498       // If the block has been evicted out of the queue or it has already been
    499       // marked dead (due to it being predicated), then skip it.
    500       if (BBI.IsDone)
    501         BBI.IsEnqueued = false;
    502       if (!BBI.IsEnqueued)
    503         continue;
    504 
    505       BBI.IsEnqueued = false;
    506 
    507       bool RetVal = false;
    508       switch (Kind) {
    509       default: llvm_unreachable("Unexpected!");
    510       case ICSimple:
    511       case ICSimpleFalse: {
    512         bool isFalse = Kind == ICSimpleFalse;
    513         if ((isFalse && DisableSimpleF) || (!isFalse && DisableSimple)) break;
    514         LLVM_DEBUG(dbgs() << "Ifcvt (Simple"
    515                           << (Kind == ICSimpleFalse ? " false" : "")
    516                           << "): " << printMBBReference(*BBI.BB) << " ("
    517                           << ((Kind == ICSimpleFalse) ? BBI.FalseBB->getNumber()
    518                                                       : BBI.TrueBB->getNumber())
    519                           << ") ");
    520         RetVal = IfConvertSimple(BBI, Kind);
    521         LLVM_DEBUG(dbgs() << (RetVal ? "succeeded!" : "failed!") << "\n");
    522         if (RetVal) {
    523           if (isFalse) ++NumSimpleFalse;
    524           else         ++NumSimple;
    525         }
    526        break;
    527       }
    528       case ICTriangle:
    529       case ICTriangleRev:
    530       case ICTriangleFalse:
    531       case ICTriangleFRev: {
    532         bool isFalse = Kind == ICTriangleFalse;
    533         bool isRev   = (Kind == ICTriangleRev || Kind == ICTriangleFRev);
    534         if (DisableTriangle && !isFalse && !isRev) break;
    535         if (DisableTriangleR && !isFalse && isRev) break;
    536         if (DisableTriangleF && isFalse && !isRev) break;
    537         if (DisableTriangleFR && isFalse && isRev) break;
    538         LLVM_DEBUG(dbgs() << "Ifcvt (Triangle");
    539         if (isFalse)
    540           LLVM_DEBUG(dbgs() << " false");
    541         if (isRev)
    542           LLVM_DEBUG(dbgs() << " rev");
    543         LLVM_DEBUG(dbgs() << "): " << printMBBReference(*BBI.BB)
    544                           << " (T:" << BBI.TrueBB->getNumber()
    545                           << ",F:" << BBI.FalseBB->getNumber() << ") ");
    546         RetVal = IfConvertTriangle(BBI, Kind);
    547         LLVM_DEBUG(dbgs() << (RetVal ? "succeeded!" : "failed!") << "\n");
    548         if (RetVal) {
    549           if (isFalse) {
    550             if (isRev) ++NumTriangleFRev;
    551             else       ++NumTriangleFalse;
    552           } else {
    553             if (isRev) ++NumTriangleRev;
    554             else       ++NumTriangle;
    555           }
    556         }
    557         break;
    558       }
    559       case ICDiamond:
    560         if (DisableDiamond) break;
    561         LLVM_DEBUG(dbgs() << "Ifcvt (Diamond): " << printMBBReference(*BBI.BB)
    562                           << " (T:" << BBI.TrueBB->getNumber()
    563                           << ",F:" << BBI.FalseBB->getNumber() << ") ");
    564         RetVal = IfConvertDiamond(BBI, Kind, NumDups, NumDups2,
    565                                   Token->TClobbersPred,
    566                                   Token->FClobbersPred);
    567         LLVM_DEBUG(dbgs() << (RetVal ? "succeeded!" : "failed!") << "\n");
    568         if (RetVal) ++NumDiamonds;
    569         break;
    570       case ICForkedDiamond:
    571         if (DisableForkedDiamond) break;
    572         LLVM_DEBUG(dbgs() << "Ifcvt (Forked Diamond): "
    573                           << printMBBReference(*BBI.BB)
    574                           << " (T:" << BBI.TrueBB->getNumber()
    575                           << ",F:" << BBI.FalseBB->getNumber() << ") ");
    576         RetVal = IfConvertForkedDiamond(BBI, Kind, NumDups, NumDups2,
    577                                       Token->TClobbersPred,
    578                                       Token->FClobbersPred);
    579         LLVM_DEBUG(dbgs() << (RetVal ? "succeeded!" : "failed!") << "\n");
    580         if (RetVal) ++NumForkedDiamonds;
    581         break;
    582       }
    583 
    584       if (RetVal && MRI->tracksLiveness())
    585         recomputeLivenessFlags(*BBI.BB);
    586 
    587       Change |= RetVal;
    588 
    589       NumIfCvts = NumSimple + NumSimpleFalse + NumTriangle + NumTriangleRev +
    590         NumTriangleFalse + NumTriangleFRev + NumDiamonds;
    591       if (IfCvtLimit != -1 && (int)NumIfCvts >= IfCvtLimit)
    592         break;
    593     }
    594 
    595     if (!Change)
    596       break;
    597     MadeChange |= Change;
    598   }
    599 
    600   Tokens.clear();
    601   BBAnalysis.clear();
    602 
    603   if (MadeChange && IfCvtBranchFold) {
    604     BranchFolder BF(false, false, MBFI, *MBPI, PSI);
    605     BF.OptimizeFunction(MF, TII, MF.getSubtarget().getRegisterInfo());
    606   }
    607 
    608   MadeChange |= BFChange;
    609   return MadeChange;
    610 }
    611 
    612 /// BB has a fallthrough. Find its 'false' successor given its 'true' successor.
    613 static MachineBasicBlock *findFalseBlock(MachineBasicBlock *BB,
    614                                          MachineBasicBlock *TrueBB) {
    615   for (MachineBasicBlock *SuccBB : BB->successors()) {
    616     if (SuccBB != TrueBB)
    617       return SuccBB;
    618   }
    619   return nullptr;
    620 }
    621 
    622 /// Reverse the condition of the end of the block branch. Swap block's 'true'
    623 /// and 'false' successors.
    624 bool IfConverter::reverseBranchCondition(BBInfo &BBI) const {
    625   DebugLoc dl;  // FIXME: this is nowhere
    626   if (!TII->reverseBranchCondition(BBI.BrCond)) {
    627     TII->removeBranch(*BBI.BB);
    628     TII->insertBranch(*BBI.BB, BBI.FalseBB, BBI.TrueBB, BBI.BrCond, dl);
    629     std::swap(BBI.TrueBB, BBI.FalseBB);
    630     return true;
    631   }
    632   return false;
    633 }
    634 
    635 /// Returns the next block in the function blocks ordering. If it is the end,
    636 /// returns NULL.
    637 static inline MachineBasicBlock *getNextBlock(MachineBasicBlock &MBB) {
    638   MachineFunction::iterator I = MBB.getIterator();
    639   MachineFunction::iterator E = MBB.getParent()->end();
    640   if (++I == E)
    641     return nullptr;
    642   return &*I;
    643 }
    644 
    645 /// Returns true if the 'true' block (along with its predecessor) forms a valid
    646 /// simple shape for ifcvt. It also returns the number of instructions that the
    647 /// ifcvt would need to duplicate if performed in Dups.
    648 bool IfConverter::ValidSimple(BBInfo &TrueBBI, unsigned &Dups,
    649                               BranchProbability Prediction) const {
    650   Dups = 0;
    651   if (TrueBBI.IsBeingAnalyzed || TrueBBI.IsDone)
    652     return false;
    653 
    654   if (TrueBBI.IsBrAnalyzable)
    655     return false;
    656 
    657   if (TrueBBI.BB->pred_size() > 1) {
    658     if (TrueBBI.CannotBeCopied ||
    659         !TII->isProfitableToDupForIfCvt(*TrueBBI.BB, TrueBBI.NonPredSize,
    660                                         Prediction))
    661       return false;
    662     Dups = TrueBBI.NonPredSize;
    663   }
    664 
    665   return true;
    666 }
    667 
    668 /// Returns true if the 'true' and 'false' blocks (along with their common
    669 /// predecessor) forms a valid triangle shape for ifcvt. If 'FalseBranch' is
    670 /// true, it checks if 'true' block's false branch branches to the 'false' block
    671 /// rather than the other way around. It also returns the number of instructions
    672 /// that the ifcvt would need to duplicate if performed in 'Dups'.
    673 bool IfConverter::ValidTriangle(BBInfo &TrueBBI, BBInfo &FalseBBI,
    674                                 bool FalseBranch, unsigned &Dups,
    675                                 BranchProbability Prediction) const {
    676   Dups = 0;
    677   if (TrueBBI.BB == FalseBBI.BB)
    678     return false;
    679 
    680   if (TrueBBI.IsBeingAnalyzed || TrueBBI.IsDone)
    681     return false;
    682 
    683   if (TrueBBI.BB->pred_size() > 1) {
    684     if (TrueBBI.CannotBeCopied)
    685       return false;
    686 
    687     unsigned Size = TrueBBI.NonPredSize;
    688     if (TrueBBI.IsBrAnalyzable) {
    689       if (TrueBBI.TrueBB && TrueBBI.BrCond.empty())
    690         // Ends with an unconditional branch. It will be removed.
    691         --Size;
    692       else {
    693         MachineBasicBlock *FExit = FalseBranch
    694           ? TrueBBI.TrueBB : TrueBBI.FalseBB;
    695         if (FExit)
    696           // Require a conditional branch
    697           ++Size;
    698       }
    699     }
    700     if (!TII->isProfitableToDupForIfCvt(*TrueBBI.BB, Size, Prediction))
    701       return false;
    702     Dups = Size;
    703   }
    704 
    705   MachineBasicBlock *TExit = FalseBranch ? TrueBBI.FalseBB : TrueBBI.TrueBB;
    706   if (!TExit && blockAlwaysFallThrough(TrueBBI)) {
    707     MachineFunction::iterator I = TrueBBI.BB->getIterator();
    708     if (++I == TrueBBI.BB->getParent()->end())
    709       return false;
    710     TExit = &*I;
    711   }
    712   return TExit && TExit == FalseBBI.BB;
    713 }
    714 
    715 /// Count duplicated instructions and move the iterators to show where they
    716 /// are.
    717 /// @param TIB True Iterator Begin
    718 /// @param FIB False Iterator Begin
    719 /// These two iterators initially point to the first instruction of the two
    720 /// blocks, and finally point to the first non-shared instruction.
    721 /// @param TIE True Iterator End
    722 /// @param FIE False Iterator End
    723 /// These two iterators initially point to End() for the two blocks() and
    724 /// finally point to the first shared instruction in the tail.
    725 /// Upon return [TIB, TIE), and [FIB, FIE) mark the un-duplicated portions of
    726 /// two blocks.
    727 /// @param Dups1 count of duplicated instructions at the beginning of the 2
    728 /// blocks.
    729 /// @param Dups2 count of duplicated instructions at the end of the 2 blocks.
    730 /// @param SkipUnconditionalBranches if true, Don't make sure that
    731 /// unconditional branches at the end of the blocks are the same. True is
    732 /// passed when the blocks are analyzable to allow for fallthrough to be
    733 /// handled.
    734 /// @return false if the shared portion prevents if conversion.
    735 bool IfConverter::CountDuplicatedInstructions(
    736     MachineBasicBlock::iterator &TIB,
    737     MachineBasicBlock::iterator &FIB,
    738     MachineBasicBlock::iterator &TIE,
    739     MachineBasicBlock::iterator &FIE,
    740     unsigned &Dups1, unsigned &Dups2,
    741     MachineBasicBlock &TBB, MachineBasicBlock &FBB,
    742     bool SkipUnconditionalBranches) const {
    743   while (TIB != TIE && FIB != FIE) {
    744     // Skip dbg_value instructions. These do not count.
    745     TIB = skipDebugInstructionsForward(TIB, TIE, false);
    746     FIB = skipDebugInstructionsForward(FIB, FIE, false);
    747     if (TIB == TIE || FIB == FIE)
    748       break;
    749     if (!TIB->isIdenticalTo(*FIB))
    750       break;
    751     // A pred-clobbering instruction in the shared portion prevents
    752     // if-conversion.
    753     std::vector<MachineOperand> PredDefs;
    754     if (TII->ClobbersPredicate(*TIB, PredDefs, false))
    755       return false;
    756     // If we get all the way to the branch instructions, don't count them.
    757     if (!TIB->isBranch())
    758       ++Dups1;
    759     ++TIB;
    760     ++FIB;
    761   }
    762 
    763   // Check for already containing all of the block.
    764   if (TIB == TIE || FIB == FIE)
    765     return true;
    766   // Now, in preparation for counting duplicate instructions at the ends of the
    767   // blocks, switch to reverse_iterators. Note that getReverse() returns an
    768   // iterator that points to the same instruction, unlike std::reverse_iterator.
    769   // We have to do our own shifting so that we get the same range.
    770   MachineBasicBlock::reverse_iterator RTIE = std::next(TIE.getReverse());
    771   MachineBasicBlock::reverse_iterator RFIE = std::next(FIE.getReverse());
    772   const MachineBasicBlock::reverse_iterator RTIB = std::next(TIB.getReverse());
    773   const MachineBasicBlock::reverse_iterator RFIB = std::next(FIB.getReverse());
    774 
    775   if (!TBB.succ_empty() || !FBB.succ_empty()) {
    776     if (SkipUnconditionalBranches) {
    777       while (RTIE != RTIB && RTIE->isUnconditionalBranch())
    778         ++RTIE;
    779       while (RFIE != RFIB && RFIE->isUnconditionalBranch())
    780         ++RFIE;
    781     }
    782   }
    783 
    784   // Count duplicate instructions at the ends of the blocks.
    785   while (RTIE != RTIB && RFIE != RFIB) {
    786     // Skip dbg_value instructions. These do not count.
    787     // Note that these are reverse iterators going forward.
    788     RTIE = skipDebugInstructionsForward(RTIE, RTIB, false);
    789     RFIE = skipDebugInstructionsForward(RFIE, RFIB, false);
    790     if (RTIE == RTIB || RFIE == RFIB)
    791       break;
    792     if (!RTIE->isIdenticalTo(*RFIE))
    793       break;
    794     // We have to verify that any branch instructions are the same, and then we
    795     // don't count them toward the # of duplicate instructions.
    796     if (!RTIE->isBranch())
    797       ++Dups2;
    798     ++RTIE;
    799     ++RFIE;
    800   }
    801   TIE = std::next(RTIE.getReverse());
    802   FIE = std::next(RFIE.getReverse());
    803   return true;
    804 }
    805 
    806 /// RescanInstructions - Run ScanInstructions on a pair of blocks.
    807 /// @param TIB - True Iterator Begin, points to first non-shared instruction
    808 /// @param FIB - False Iterator Begin, points to first non-shared instruction
    809 /// @param TIE - True Iterator End, points past last non-shared instruction
    810 /// @param FIE - False Iterator End, points past last non-shared instruction
    811 /// @param TrueBBI  - BBInfo to update for the true block.
    812 /// @param FalseBBI - BBInfo to update for the false block.
    813 /// @returns - false if either block cannot be predicated or if both blocks end
    814 ///   with a predicate-clobbering instruction.
    815 bool IfConverter::RescanInstructions(
    816     MachineBasicBlock::iterator &TIB, MachineBasicBlock::iterator &FIB,
    817     MachineBasicBlock::iterator &TIE, MachineBasicBlock::iterator &FIE,
    818     BBInfo &TrueBBI, BBInfo &FalseBBI) const {
    819   bool BranchUnpredicable = true;
    820   TrueBBI.IsUnpredicable = FalseBBI.IsUnpredicable = false;
    821   ScanInstructions(TrueBBI, TIB, TIE, BranchUnpredicable);
    822   if (TrueBBI.IsUnpredicable)
    823     return false;
    824   ScanInstructions(FalseBBI, FIB, FIE, BranchUnpredicable);
    825   if (FalseBBI.IsUnpredicable)
    826     return false;
    827   if (TrueBBI.ClobbersPred && FalseBBI.ClobbersPred)
    828     return false;
    829   return true;
    830 }
    831 
    832 #ifndef NDEBUG
    833 static void verifySameBranchInstructions(
    834     MachineBasicBlock *MBB1,
    835     MachineBasicBlock *MBB2) {
    836   const MachineBasicBlock::reverse_iterator B1 = MBB1->rend();
    837   const MachineBasicBlock::reverse_iterator B2 = MBB2->rend();
    838   MachineBasicBlock::reverse_iterator E1 = MBB1->rbegin();
    839   MachineBasicBlock::reverse_iterator E2 = MBB2->rbegin();
    840   while (E1 != B1 && E2 != B2) {
    841     skipDebugInstructionsForward(E1, B1, false);
    842     skipDebugInstructionsForward(E2, B2, false);
    843     if (E1 == B1 && E2 == B2)
    844       break;
    845 
    846     if (E1 == B1) {
    847       assert(!E2->isBranch() && "Branch mis-match, one block is empty.");
    848       break;
    849     }
    850     if (E2 == B2) {
    851       assert(!E1->isBranch() && "Branch mis-match, one block is empty.");
    852       break;
    853     }
    854 
    855     if (E1->isBranch() || E2->isBranch())
    856       assert(E1->isIdenticalTo(*E2) &&
    857              "Branch mis-match, branch instructions don't match.");
    858     else
    859       break;
    860     ++E1;
    861     ++E2;
    862   }
    863 }
    864 #endif
    865 
    866 /// ValidForkedDiamond - Returns true if the 'true' and 'false' blocks (along
    867 /// with their common predecessor) form a diamond if a common tail block is
    868 /// extracted.
    869 /// While not strictly a diamond, this pattern would form a diamond if
    870 /// tail-merging had merged the shared tails.
    871 ///           EBB
    872 ///         _/   \_
    873 ///         |     |
    874 ///        TBB   FBB
    875 ///        /  \ /   \
    876 ///  FalseBB TrueBB FalseBB
    877 /// Currently only handles analyzable branches.
    878 /// Specifically excludes actual diamonds to avoid overlap.
    879 bool IfConverter::ValidForkedDiamond(
    880     BBInfo &TrueBBI, BBInfo &FalseBBI,
    881     unsigned &Dups1, unsigned &Dups2,
    882     BBInfo &TrueBBICalc, BBInfo &FalseBBICalc) const {
    883   Dups1 = Dups2 = 0;
    884   if (TrueBBI.IsBeingAnalyzed || TrueBBI.IsDone ||
    885       FalseBBI.IsBeingAnalyzed || FalseBBI.IsDone)
    886     return false;
    887 
    888   if (!TrueBBI.IsBrAnalyzable || !FalseBBI.IsBrAnalyzable)
    889     return false;
    890   // Don't IfConvert blocks that can't be folded into their predecessor.
    891   if  (TrueBBI.BB->pred_size() > 1 || FalseBBI.BB->pred_size() > 1)
    892     return false;
    893 
    894   // This function is specifically looking for conditional tails, as
    895   // unconditional tails are already handled by the standard diamond case.
    896   if (TrueBBI.BrCond.size() == 0 ||
    897       FalseBBI.BrCond.size() == 0)
    898     return false;
    899 
    900   MachineBasicBlock *TT = TrueBBI.TrueBB;
    901   MachineBasicBlock *TF = TrueBBI.FalseBB;
    902   MachineBasicBlock *FT = FalseBBI.TrueBB;
    903   MachineBasicBlock *FF = FalseBBI.FalseBB;
    904 
    905   if (!TT)
    906     TT = getNextBlock(*TrueBBI.BB);
    907   if (!TF)
    908     TF = getNextBlock(*TrueBBI.BB);
    909   if (!FT)
    910     FT = getNextBlock(*FalseBBI.BB);
    911   if (!FF)
    912     FF = getNextBlock(*FalseBBI.BB);
    913 
    914   if (!TT || !TF)
    915     return false;
    916 
    917   // Check successors. If they don't match, bail.
    918   if (!((TT == FT && TF == FF) || (TF == FT && TT == FF)))
    919     return false;
    920 
    921   bool FalseReversed = false;
    922   if (TF == FT && TT == FF) {
    923     // If the branches are opposing, but we can't reverse, don't do it.
    924     if (!FalseBBI.IsBrReversible)
    925       return false;
    926     FalseReversed = true;
    927     reverseBranchCondition(FalseBBI);
    928   }
    929   auto UnReverseOnExit = make_scope_exit([&]() {
    930     if (FalseReversed)
    931       reverseBranchCondition(FalseBBI);
    932   });
    933 
    934   // Count duplicate instructions at the beginning of the true and false blocks.
    935   MachineBasicBlock::iterator TIB = TrueBBI.BB->begin();
    936   MachineBasicBlock::iterator FIB = FalseBBI.BB->begin();
    937   MachineBasicBlock::iterator TIE = TrueBBI.BB->end();
    938   MachineBasicBlock::iterator FIE = FalseBBI.BB->end();
    939   if(!CountDuplicatedInstructions(TIB, FIB, TIE, FIE, Dups1, Dups2,
    940                                   *TrueBBI.BB, *FalseBBI.BB,
    941                                   /* SkipUnconditionalBranches */ true))
    942     return false;
    943 
    944   TrueBBICalc.BB = TrueBBI.BB;
    945   FalseBBICalc.BB = FalseBBI.BB;
    946   TrueBBICalc.IsBrAnalyzable = TrueBBI.IsBrAnalyzable;
    947   FalseBBICalc.IsBrAnalyzable = FalseBBI.IsBrAnalyzable;
    948   if (!RescanInstructions(TIB, FIB, TIE, FIE, TrueBBICalc, FalseBBICalc))
    949     return false;
    950 
    951   // The size is used to decide whether to if-convert, and the shared portions
    952   // are subtracted off. Because of the subtraction, we just use the size that
    953   // was calculated by the original ScanInstructions, as it is correct.
    954   TrueBBICalc.NonPredSize = TrueBBI.NonPredSize;
    955   FalseBBICalc.NonPredSize = FalseBBI.NonPredSize;
    956   return true;
    957 }
    958 
    959 /// ValidDiamond - Returns true if the 'true' and 'false' blocks (along
    960 /// with their common predecessor) forms a valid diamond shape for ifcvt.
    961 bool IfConverter::ValidDiamond(
    962     BBInfo &TrueBBI, BBInfo &FalseBBI,
    963     unsigned &Dups1, unsigned &Dups2,
    964     BBInfo &TrueBBICalc, BBInfo &FalseBBICalc) const {
    965   Dups1 = Dups2 = 0;
    966   if (TrueBBI.IsBeingAnalyzed || TrueBBI.IsDone ||
    967       FalseBBI.IsBeingAnalyzed || FalseBBI.IsDone)
    968     return false;
    969 
    970   // If the True and False BBs are equal we're dealing with a degenerate case
    971   // that we don't treat as a diamond.
    972   if (TrueBBI.BB == FalseBBI.BB)
    973     return false;
    974 
    975   MachineBasicBlock *TT = TrueBBI.TrueBB;
    976   MachineBasicBlock *FT = FalseBBI.TrueBB;
    977 
    978   if (!TT && blockAlwaysFallThrough(TrueBBI))
    979     TT = getNextBlock(*TrueBBI.BB);
    980   if (!FT && blockAlwaysFallThrough(FalseBBI))
    981     FT = getNextBlock(*FalseBBI.BB);
    982   if (TT != FT)
    983     return false;
    984   if (!TT && (TrueBBI.IsBrAnalyzable || FalseBBI.IsBrAnalyzable))
    985     return false;
    986   if  (TrueBBI.BB->pred_size() > 1 || FalseBBI.BB->pred_size() > 1)
    987     return false;
    988 
    989   // FIXME: Allow true block to have an early exit?
    990   if (TrueBBI.FalseBB || FalseBBI.FalseBB)
    991     return false;
    992 
    993   // Count duplicate instructions at the beginning and end of the true and
    994   // false blocks.
    995   // Skip unconditional branches only if we are considering an analyzable
    996   // diamond. Otherwise the branches must be the same.
    997   bool SkipUnconditionalBranches =
    998       TrueBBI.IsBrAnalyzable && FalseBBI.IsBrAnalyzable;
    999   MachineBasicBlock::iterator TIB = TrueBBI.BB->begin();
   1000   MachineBasicBlock::iterator FIB = FalseBBI.BB->begin();
   1001   MachineBasicBlock::iterator TIE = TrueBBI.BB->end();
   1002   MachineBasicBlock::iterator FIE = FalseBBI.BB->end();
   1003   if(!CountDuplicatedInstructions(TIB, FIB, TIE, FIE, Dups1, Dups2,
   1004                                   *TrueBBI.BB, *FalseBBI.BB,
   1005                                   SkipUnconditionalBranches))
   1006     return false;
   1007 
   1008   TrueBBICalc.BB = TrueBBI.BB;
   1009   FalseBBICalc.BB = FalseBBI.BB;
   1010   TrueBBICalc.IsBrAnalyzable = TrueBBI.IsBrAnalyzable;
   1011   FalseBBICalc.IsBrAnalyzable = FalseBBI.IsBrAnalyzable;
   1012   if (!RescanInstructions(TIB, FIB, TIE, FIE, TrueBBICalc, FalseBBICalc))
   1013     return false;
   1014   // The size is used to decide whether to if-convert, and the shared portions
   1015   // are subtracted off. Because of the subtraction, we just use the size that
   1016   // was calculated by the original ScanInstructions, as it is correct.
   1017   TrueBBICalc.NonPredSize = TrueBBI.NonPredSize;
   1018   FalseBBICalc.NonPredSize = FalseBBI.NonPredSize;
   1019   return true;
   1020 }
   1021 
   1022 /// AnalyzeBranches - Look at the branches at the end of a block to determine if
   1023 /// the block is predicable.
   1024 void IfConverter::AnalyzeBranches(BBInfo &BBI) {
   1025   if (BBI.IsDone)
   1026     return;
   1027 
   1028   BBI.TrueBB = BBI.FalseBB = nullptr;
   1029   BBI.BrCond.clear();
   1030   BBI.IsBrAnalyzable =
   1031       !TII->analyzeBranch(*BBI.BB, BBI.TrueBB, BBI.FalseBB, BBI.BrCond);
   1032   if (!BBI.IsBrAnalyzable) {
   1033     BBI.TrueBB = nullptr;
   1034     BBI.FalseBB = nullptr;
   1035     BBI.BrCond.clear();
   1036   }
   1037 
   1038   SmallVector<MachineOperand, 4> RevCond(BBI.BrCond.begin(), BBI.BrCond.end());
   1039   BBI.IsBrReversible = (RevCond.size() == 0) ||
   1040       !TII->reverseBranchCondition(RevCond);
   1041   BBI.HasFallThrough = BBI.IsBrAnalyzable && BBI.FalseBB == nullptr;
   1042 
   1043   if (BBI.BrCond.size()) {
   1044     // No false branch. This BB must end with a conditional branch and a
   1045     // fallthrough.
   1046     if (!BBI.FalseBB)
   1047       BBI.FalseBB = findFalseBlock(BBI.BB, BBI.TrueBB);
   1048     if (!BBI.FalseBB) {
   1049       // Malformed bcc? True and false blocks are the same?
   1050       BBI.IsUnpredicable = true;
   1051     }
   1052   }
   1053 }
   1054 
   1055 /// ScanInstructions - Scan all the instructions in the block to determine if
   1056 /// the block is predicable. In most cases, that means all the instructions
   1057 /// in the block are isPredicable(). Also checks if the block contains any
   1058 /// instruction which can clobber a predicate (e.g. condition code register).
   1059 /// If so, the block is not predicable unless it's the last instruction.
   1060 void IfConverter::ScanInstructions(BBInfo &BBI,
   1061                                    MachineBasicBlock::iterator &Begin,
   1062                                    MachineBasicBlock::iterator &End,
   1063                                    bool BranchUnpredicable) const {
   1064   if (BBI.IsDone || BBI.IsUnpredicable)
   1065     return;
   1066 
   1067   bool AlreadyPredicated = !BBI.Predicate.empty();
   1068 
   1069   BBI.NonPredSize = 0;
   1070   BBI.ExtraCost = 0;
   1071   BBI.ExtraCost2 = 0;
   1072   BBI.ClobbersPred = false;
   1073   for (MachineInstr &MI : make_range(Begin, End)) {
   1074     if (MI.isDebugInstr())
   1075       continue;
   1076 
   1077     // It's unsafe to duplicate convergent instructions in this context, so set
   1078     // BBI.CannotBeCopied to true if MI is convergent.  To see why, consider the
   1079     // following CFG, which is subject to our "simple" transformation.
   1080     //
   1081     //    BB0     // if (c1) goto BB1; else goto BB2;
   1082     //   /   \
   1083     //  BB1   |
   1084     //   |   BB2  // if (c2) goto TBB; else goto FBB;
   1085     //   |   / |
   1086     //   |  /  |
   1087     //   TBB   |
   1088     //    |    |
   1089     //    |   FBB
   1090     //    |
   1091     //    exit
   1092     //
   1093     // Suppose we want to move TBB's contents up into BB1 and BB2 (in BB1 they'd
   1094     // be unconditional, and in BB2, they'd be predicated upon c2), and suppose
   1095     // TBB contains a convergent instruction.  This is safe iff doing so does
   1096     // not add a control-flow dependency to the convergent instruction -- i.e.,
   1097     // it's safe iff the set of control flows that leads us to the convergent
   1098     // instruction does not get smaller after the transformation.
   1099     //
   1100     // Originally we executed TBB if c1 || c2.  After the transformation, there
   1101     // are two copies of TBB's instructions.  We get to the first if c1, and we
   1102     // get to the second if !c1 && c2.
   1103     //
   1104     // There are clearly fewer ways to satisfy the condition "c1" than
   1105     // "c1 || c2".  Since we've shrunk the set of control flows which lead to
   1106     // our convergent instruction, the transformation is unsafe.
   1107     if (MI.isNotDuplicable() || MI.isConvergent())
   1108       BBI.CannotBeCopied = true;
   1109 
   1110     bool isPredicated = TII->isPredicated(MI);
   1111     bool isCondBr = BBI.IsBrAnalyzable && MI.isConditionalBranch();
   1112 
   1113     if (BranchUnpredicable && MI.isBranch()) {
   1114       BBI.IsUnpredicable = true;
   1115       return;
   1116     }
   1117 
   1118     // A conditional branch is not predicable, but it may be eliminated.
   1119     if (isCondBr)
   1120       continue;
   1121 
   1122     if (!isPredicated) {
   1123       BBI.NonPredSize++;
   1124       unsigned ExtraPredCost = TII->getPredicationCost(MI);
   1125       unsigned NumCycles = SchedModel.computeInstrLatency(&MI, false);
   1126       if (NumCycles > 1)
   1127         BBI.ExtraCost += NumCycles-1;
   1128       BBI.ExtraCost2 += ExtraPredCost;
   1129     } else if (!AlreadyPredicated) {
   1130       // FIXME: This instruction is already predicated before the
   1131       // if-conversion pass. It's probably something like a conditional move.
   1132       // Mark this block unpredicable for now.
   1133       BBI.IsUnpredicable = true;
   1134       return;
   1135     }
   1136 
   1137     if (BBI.ClobbersPred && !isPredicated) {
   1138       // Predicate modification instruction should end the block (except for
   1139       // already predicated instructions and end of block branches).
   1140       // Predicate may have been modified, the subsequent (currently)
   1141       // unpredicated instructions cannot be correctly predicated.
   1142       BBI.IsUnpredicable = true;
   1143       return;
   1144     }
   1145 
   1146     // FIXME: Make use of PredDefs? e.g. ADDC, SUBC sets predicates but are
   1147     // still potentially predicable.
   1148     std::vector<MachineOperand> PredDefs;
   1149     if (TII->ClobbersPredicate(MI, PredDefs, true))
   1150       BBI.ClobbersPred = true;
   1151 
   1152     if (!TII->isPredicable(MI)) {
   1153       BBI.IsUnpredicable = true;
   1154       return;
   1155     }
   1156   }
   1157 }
   1158 
   1159 /// Determine if the block is a suitable candidate to be predicated by the
   1160 /// specified predicate.
   1161 /// @param BBI BBInfo for the block to check
   1162 /// @param Pred Predicate array for the branch that leads to BBI
   1163 /// @param isTriangle true if the Analysis is for a triangle
   1164 /// @param RevBranch true if Reverse(Pred) leads to BBI (e.g. BBI is the false
   1165 ///        case
   1166 /// @param hasCommonTail true if BBI shares a tail with a sibling block that
   1167 ///        contains any instruction that would make the block unpredicable.
   1168 bool IfConverter::FeasibilityAnalysis(BBInfo &BBI,
   1169                                       SmallVectorImpl<MachineOperand> &Pred,
   1170                                       bool isTriangle, bool RevBranch,
   1171                                       bool hasCommonTail) {
   1172   // If the block is dead or unpredicable, then it cannot be predicated.
   1173   // Two blocks may share a common unpredicable tail, but this doesn't prevent
   1174   // them from being if-converted. The non-shared portion is assumed to have
   1175   // been checked
   1176   if (BBI.IsDone || (BBI.IsUnpredicable && !hasCommonTail))
   1177     return false;
   1178 
   1179   // If it is already predicated but we couldn't analyze its terminator, the
   1180   // latter might fallthrough, but we can't determine where to.
   1181   // Conservatively avoid if-converting again.
   1182   if (BBI.Predicate.size() && !BBI.IsBrAnalyzable)
   1183     return false;
   1184 
   1185   // If it is already predicated, check if the new predicate subsumes
   1186   // its predicate.
   1187   if (BBI.Predicate.size() && !TII->SubsumesPredicate(Pred, BBI.Predicate))
   1188     return false;
   1189 
   1190   if (!hasCommonTail && BBI.BrCond.size()) {
   1191     if (!isTriangle)
   1192       return false;
   1193 
   1194     // Test predicate subsumption.
   1195     SmallVector<MachineOperand, 4> RevPred(Pred.begin(), Pred.end());
   1196     SmallVector<MachineOperand, 4> Cond(BBI.BrCond.begin(), BBI.BrCond.end());
   1197     if (RevBranch) {
   1198       if (TII->reverseBranchCondition(Cond))
   1199         return false;
   1200     }
   1201     if (TII->reverseBranchCondition(RevPred) ||
   1202         !TII->SubsumesPredicate(Cond, RevPred))
   1203       return false;
   1204   }
   1205 
   1206   return true;
   1207 }
   1208 
   1209 /// Analyze the structure of the sub-CFG starting from the specified block.
   1210 /// Record its successors and whether it looks like an if-conversion candidate.
   1211 void IfConverter::AnalyzeBlock(
   1212     MachineBasicBlock &MBB, std::vector<std::unique_ptr<IfcvtToken>> &Tokens) {
   1213   struct BBState {
   1214     BBState(MachineBasicBlock &MBB) : MBB(&MBB), SuccsAnalyzed(false) {}
   1215     MachineBasicBlock *MBB;
   1216 
   1217     /// This flag is true if MBB's successors have been analyzed.
   1218     bool SuccsAnalyzed;
   1219   };
   1220 
   1221   // Push MBB to the stack.
   1222   SmallVector<BBState, 16> BBStack(1, MBB);
   1223 
   1224   while (!BBStack.empty()) {
   1225     BBState &State = BBStack.back();
   1226     MachineBasicBlock *BB = State.MBB;
   1227     BBInfo &BBI = BBAnalysis[BB->getNumber()];
   1228 
   1229     if (!State.SuccsAnalyzed) {
   1230       if (BBI.IsAnalyzed || BBI.IsBeingAnalyzed) {
   1231         BBStack.pop_back();
   1232         continue;
   1233       }
   1234 
   1235       BBI.BB = BB;
   1236       BBI.IsBeingAnalyzed = true;
   1237 
   1238       AnalyzeBranches(BBI);
   1239       MachineBasicBlock::iterator Begin = BBI.BB->begin();
   1240       MachineBasicBlock::iterator End = BBI.BB->end();
   1241       ScanInstructions(BBI, Begin, End);
   1242 
   1243       // Unanalyzable or ends with fallthrough or unconditional branch, or if is
   1244       // not considered for ifcvt anymore.
   1245       if (!BBI.IsBrAnalyzable || BBI.BrCond.empty() || BBI.IsDone) {
   1246         BBI.IsBeingAnalyzed = false;
   1247         BBI.IsAnalyzed = true;
   1248         BBStack.pop_back();
   1249         continue;
   1250       }
   1251 
   1252       // Do not ifcvt if either path is a back edge to the entry block.
   1253       if (BBI.TrueBB == BB || BBI.FalseBB == BB) {
   1254         BBI.IsBeingAnalyzed = false;
   1255         BBI.IsAnalyzed = true;
   1256         BBStack.pop_back();
   1257         continue;
   1258       }
   1259 
   1260       // Do not ifcvt if true and false fallthrough blocks are the same.
   1261       if (!BBI.FalseBB) {
   1262         BBI.IsBeingAnalyzed = false;
   1263         BBI.IsAnalyzed = true;
   1264         BBStack.pop_back();
   1265         continue;
   1266       }
   1267 
   1268       // Push the False and True blocks to the stack.
   1269       State.SuccsAnalyzed = true;
   1270       BBStack.push_back(*BBI.FalseBB);
   1271       BBStack.push_back(*BBI.TrueBB);
   1272       continue;
   1273     }
   1274 
   1275     BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()];
   1276     BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
   1277 
   1278     if (TrueBBI.IsDone && FalseBBI.IsDone) {
   1279       BBI.IsBeingAnalyzed = false;
   1280       BBI.IsAnalyzed = true;
   1281       BBStack.pop_back();
   1282       continue;
   1283     }
   1284 
   1285     SmallVector<MachineOperand, 4>
   1286         RevCond(BBI.BrCond.begin(), BBI.BrCond.end());
   1287     bool CanRevCond = !TII->reverseBranchCondition(RevCond);
   1288 
   1289     unsigned Dups = 0;
   1290     unsigned Dups2 = 0;
   1291     bool TNeedSub = !TrueBBI.Predicate.empty();
   1292     bool FNeedSub = !FalseBBI.Predicate.empty();
   1293     bool Enqueued = false;
   1294 
   1295     BranchProbability Prediction = MBPI->getEdgeProbability(BB, TrueBBI.BB);
   1296 
   1297     if (CanRevCond) {
   1298       BBInfo TrueBBICalc, FalseBBICalc;
   1299       auto feasibleDiamond = [&](bool Forked) {
   1300         bool MeetsSize = MeetIfcvtSizeLimit(TrueBBICalc, FalseBBICalc, *BB,
   1301                                             Dups + Dups2, Prediction, Forked);
   1302         bool TrueFeasible = FeasibilityAnalysis(TrueBBI, BBI.BrCond,
   1303                                                 /* IsTriangle */ false, /* RevCond */ false,
   1304                                                 /* hasCommonTail */ true);
   1305         bool FalseFeasible = FeasibilityAnalysis(FalseBBI, RevCond,
   1306                                                  /* IsTriangle */ false, /* RevCond */ false,
   1307                                                  /* hasCommonTail */ true);
   1308         return MeetsSize && TrueFeasible && FalseFeasible;
   1309       };
   1310 
   1311       if (ValidDiamond(TrueBBI, FalseBBI, Dups, Dups2,
   1312                        TrueBBICalc, FalseBBICalc)) {
   1313         if (feasibleDiamond(false)) {
   1314           // Diamond:
   1315           //   EBB
   1316           //   / \_
   1317           //  |   |
   1318           // TBB FBB
   1319           //   \ /
   1320           //  TailBB
   1321           // Note TailBB can be empty.
   1322           Tokens.push_back(std::make_unique<IfcvtToken>(
   1323               BBI, ICDiamond, TNeedSub | FNeedSub, Dups, Dups2,
   1324               (bool) TrueBBICalc.ClobbersPred, (bool) FalseBBICalc.ClobbersPred));
   1325           Enqueued = true;
   1326         }
   1327       } else if (ValidForkedDiamond(TrueBBI, FalseBBI, Dups, Dups2,
   1328                                     TrueBBICalc, FalseBBICalc)) {
   1329         if (feasibleDiamond(true)) {
   1330           // ForkedDiamond:
   1331           // if TBB and FBB have a common tail that includes their conditional
   1332           // branch instructions, then we can If Convert this pattern.
   1333           //          EBB
   1334           //         _/ \_
   1335           //         |   |
   1336           //        TBB  FBB
   1337           //        / \ /   \
   1338           //  FalseBB TrueBB FalseBB
   1339           //
   1340           Tokens.push_back(std::make_unique<IfcvtToken>(
   1341               BBI, ICForkedDiamond, TNeedSub | FNeedSub, Dups, Dups2,
   1342               (bool) TrueBBICalc.ClobbersPred, (bool) FalseBBICalc.ClobbersPred));
   1343           Enqueued = true;
   1344         }
   1345       }
   1346     }
   1347 
   1348     if (ValidTriangle(TrueBBI, FalseBBI, false, Dups, Prediction) &&
   1349         MeetIfcvtSizeLimit(*TrueBBI.BB, TrueBBI.NonPredSize + TrueBBI.ExtraCost,
   1350                            TrueBBI.ExtraCost2, Prediction) &&
   1351         FeasibilityAnalysis(TrueBBI, BBI.BrCond, true)) {
   1352       // Triangle:
   1353       //   EBB
   1354       //   | \_
   1355       //   |  |
   1356       //   | TBB
   1357       //   |  /
   1358       //   FBB
   1359       Tokens.push_back(
   1360           std::make_unique<IfcvtToken>(BBI, ICTriangle, TNeedSub, Dups));
   1361       Enqueued = true;
   1362     }
   1363 
   1364     if (ValidTriangle(TrueBBI, FalseBBI, true, Dups, Prediction) &&
   1365         MeetIfcvtSizeLimit(*TrueBBI.BB, TrueBBI.NonPredSize + TrueBBI.ExtraCost,
   1366                            TrueBBI.ExtraCost2, Prediction) &&
   1367         FeasibilityAnalysis(TrueBBI, BBI.BrCond, true, true)) {
   1368       Tokens.push_back(
   1369           std::make_unique<IfcvtToken>(BBI, ICTriangleRev, TNeedSub, Dups));
   1370       Enqueued = true;
   1371     }
   1372 
   1373     if (ValidSimple(TrueBBI, Dups, Prediction) &&
   1374         MeetIfcvtSizeLimit(*TrueBBI.BB, TrueBBI.NonPredSize + TrueBBI.ExtraCost,
   1375                            TrueBBI.ExtraCost2, Prediction) &&
   1376         FeasibilityAnalysis(TrueBBI, BBI.BrCond)) {
   1377       // Simple (split, no rejoin):
   1378       //   EBB
   1379       //   | \_
   1380       //   |  |
   1381       //   | TBB---> exit
   1382       //   |
   1383       //   FBB
   1384       Tokens.push_back(
   1385           std::make_unique<IfcvtToken>(BBI, ICSimple, TNeedSub, Dups));
   1386       Enqueued = true;
   1387     }
   1388 
   1389     if (CanRevCond) {
   1390       // Try the other path...
   1391       if (ValidTriangle(FalseBBI, TrueBBI, false, Dups,
   1392                         Prediction.getCompl()) &&
   1393           MeetIfcvtSizeLimit(*FalseBBI.BB,
   1394                              FalseBBI.NonPredSize + FalseBBI.ExtraCost,
   1395                              FalseBBI.ExtraCost2, Prediction.getCompl()) &&
   1396           FeasibilityAnalysis(FalseBBI, RevCond, true)) {
   1397         Tokens.push_back(std::make_unique<IfcvtToken>(BBI, ICTriangleFalse,
   1398                                                        FNeedSub, Dups));
   1399         Enqueued = true;
   1400       }
   1401 
   1402       if (ValidTriangle(FalseBBI, TrueBBI, true, Dups,
   1403                         Prediction.getCompl()) &&
   1404           MeetIfcvtSizeLimit(*FalseBBI.BB,
   1405                              FalseBBI.NonPredSize + FalseBBI.ExtraCost,
   1406                            FalseBBI.ExtraCost2, Prediction.getCompl()) &&
   1407         FeasibilityAnalysis(FalseBBI, RevCond, true, true)) {
   1408         Tokens.push_back(
   1409             std::make_unique<IfcvtToken>(BBI, ICTriangleFRev, FNeedSub, Dups));
   1410         Enqueued = true;
   1411       }
   1412 
   1413       if (ValidSimple(FalseBBI, Dups, Prediction.getCompl()) &&
   1414           MeetIfcvtSizeLimit(*FalseBBI.BB,
   1415                              FalseBBI.NonPredSize + FalseBBI.ExtraCost,
   1416                              FalseBBI.ExtraCost2, Prediction.getCompl()) &&
   1417           FeasibilityAnalysis(FalseBBI, RevCond)) {
   1418         Tokens.push_back(
   1419             std::make_unique<IfcvtToken>(BBI, ICSimpleFalse, FNeedSub, Dups));
   1420         Enqueued = true;
   1421       }
   1422     }
   1423 
   1424     BBI.IsEnqueued = Enqueued;
   1425     BBI.IsBeingAnalyzed = false;
   1426     BBI.IsAnalyzed = true;
   1427     BBStack.pop_back();
   1428   }
   1429 }
   1430 
   1431 /// Analyze all blocks and find entries for all if-conversion candidates.
   1432 void IfConverter::AnalyzeBlocks(
   1433     MachineFunction &MF, std::vector<std::unique_ptr<IfcvtToken>> &Tokens) {
   1434   for (MachineBasicBlock &MBB : MF)
   1435     AnalyzeBlock(MBB, Tokens);
   1436 
   1437   // Sort to favor more complex ifcvt scheme.
   1438   llvm::stable_sort(Tokens, IfcvtTokenCmp);
   1439 }
   1440 
   1441 /// Returns true either if ToMBB is the next block after MBB or that all the
   1442 /// intervening blocks are empty (given MBB can fall through to its next block).
   1443 static bool canFallThroughTo(MachineBasicBlock &MBB, MachineBasicBlock &ToMBB) {
   1444   MachineFunction::iterator PI = MBB.getIterator();
   1445   MachineFunction::iterator I = std::next(PI);
   1446   MachineFunction::iterator TI = ToMBB.getIterator();
   1447   MachineFunction::iterator E = MBB.getParent()->end();
   1448   while (I != TI) {
   1449     // Check isSuccessor to avoid case where the next block is empty, but
   1450     // it's not a successor.
   1451     if (I == E || !I->empty() || !PI->isSuccessor(&*I))
   1452       return false;
   1453     PI = I++;
   1454   }
   1455   // Finally see if the last I is indeed a successor to PI.
   1456   return PI->isSuccessor(&*I);
   1457 }
   1458 
   1459 /// Invalidate predecessor BB info so it would be re-analyzed to determine if it
   1460 /// can be if-converted. If predecessor is already enqueued, dequeue it!
   1461 void IfConverter::InvalidatePreds(MachineBasicBlock &MBB) {
   1462   for (const MachineBasicBlock *Predecessor : MBB.predecessors()) {
   1463     BBInfo &PBBI = BBAnalysis[Predecessor->getNumber()];
   1464     if (PBBI.IsDone || PBBI.BB == &MBB)
   1465       continue;
   1466     PBBI.IsAnalyzed = false;
   1467     PBBI.IsEnqueued = false;
   1468   }
   1469 }
   1470 
   1471 /// Inserts an unconditional branch from \p MBB to \p ToMBB.
   1472 static void InsertUncondBranch(MachineBasicBlock &MBB, MachineBasicBlock &ToMBB,
   1473                                const TargetInstrInfo *TII) {
   1474   DebugLoc dl;  // FIXME: this is nowhere
   1475   SmallVector<MachineOperand, 0> NoCond;
   1476   TII->insertBranch(MBB, &ToMBB, nullptr, NoCond, dl);
   1477 }
   1478 
   1479 /// Behaves like LiveRegUnits::StepForward() but also adds implicit uses to all
   1480 /// values defined in MI which are also live/used by MI.
   1481 static void UpdatePredRedefs(MachineInstr &MI, LivePhysRegs &Redefs) {
   1482   const TargetRegisterInfo *TRI = MI.getMF()->getSubtarget().getRegisterInfo();
   1483 
   1484   // Before stepping forward past MI, remember which regs were live
   1485   // before MI. This is needed to set the Undef flag only when reg is
   1486   // dead.
   1487   SparseSet<MCPhysReg, identity<MCPhysReg>> LiveBeforeMI;
   1488   LiveBeforeMI.setUniverse(TRI->getNumRegs());
   1489   for (unsigned Reg : Redefs)
   1490     LiveBeforeMI.insert(Reg);
   1491 
   1492   SmallVector<std::pair<MCPhysReg, const MachineOperand*>, 4> Clobbers;
   1493   Redefs.stepForward(MI, Clobbers);
   1494 
   1495   // Now add the implicit uses for each of the clobbered values.
   1496   for (auto Clobber : Clobbers) {
   1497     // FIXME: Const cast here is nasty, but better than making StepForward
   1498     // take a mutable instruction instead of const.
   1499     unsigned Reg = Clobber.first;
   1500     MachineOperand &Op = const_cast<MachineOperand&>(*Clobber.second);
   1501     MachineInstr *OpMI = Op.getParent();
   1502     MachineInstrBuilder MIB(*OpMI->getMF(), OpMI);
   1503     if (Op.isRegMask()) {
   1504       // First handle regmasks.  They clobber any entries in the mask which
   1505       // means that we need a def for those registers.
   1506       if (LiveBeforeMI.count(Reg))
   1507         MIB.addReg(Reg, RegState::Implicit);
   1508 
   1509       // We also need to add an implicit def of this register for the later
   1510       // use to read from.
   1511       // For the register allocator to have allocated a register clobbered
   1512       // by the call which is used later, it must be the case that
   1513       // the call doesn't return.
   1514       MIB.addReg(Reg, RegState::Implicit | RegState::Define);
   1515       continue;
   1516     }
   1517     if (LiveBeforeMI.count(Reg))
   1518       MIB.addReg(Reg, RegState::Implicit);
   1519     else {
   1520       bool HasLiveSubReg = false;
   1521       for (MCSubRegIterator S(Reg, TRI); S.isValid(); ++S) {
   1522         if (!LiveBeforeMI.count(*S))
   1523           continue;
   1524         HasLiveSubReg = true;
   1525         break;
   1526       }
   1527       if (HasLiveSubReg)
   1528         MIB.addReg(Reg, RegState::Implicit);
   1529     }
   1530   }
   1531 }
   1532 
   1533 /// If convert a simple (split, no rejoin) sub-CFG.
   1534 bool IfConverter::IfConvertSimple(BBInfo &BBI, IfcvtKind Kind) {
   1535   BBInfo &TrueBBI  = BBAnalysis[BBI.TrueBB->getNumber()];
   1536   BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
   1537   BBInfo *CvtBBI = &TrueBBI;
   1538   BBInfo *NextBBI = &FalseBBI;
   1539 
   1540   SmallVector<MachineOperand, 4> Cond(BBI.BrCond.begin(), BBI.BrCond.end());
   1541   if (Kind == ICSimpleFalse)
   1542     std::swap(CvtBBI, NextBBI);
   1543 
   1544   MachineBasicBlock &CvtMBB = *CvtBBI->BB;
   1545   MachineBasicBlock &NextMBB = *NextBBI->BB;
   1546   if (CvtBBI->IsDone ||
   1547       (CvtBBI->CannotBeCopied && CvtMBB.pred_size() > 1)) {
   1548     // Something has changed. It's no longer safe to predicate this block.
   1549     BBI.IsAnalyzed = false;
   1550     CvtBBI->IsAnalyzed = false;
   1551     return false;
   1552   }
   1553 
   1554   if (CvtMBB.hasAddressTaken())
   1555     // Conservatively abort if-conversion if BB's address is taken.
   1556     return false;
   1557 
   1558   if (Kind == ICSimpleFalse)
   1559     if (TII->reverseBranchCondition(Cond))
   1560       llvm_unreachable("Unable to reverse branch condition!");
   1561 
   1562   Redefs.init(*TRI);
   1563 
   1564   if (MRI->tracksLiveness()) {
   1565     // Initialize liveins to the first BB. These are potentially redefined by
   1566     // predicated instructions.
   1567     Redefs.addLiveIns(CvtMBB);
   1568     Redefs.addLiveIns(NextMBB);
   1569   }
   1570 
   1571   // Remove the branches from the entry so we can add the contents of the true
   1572   // block to it.
   1573   BBI.NonPredSize -= TII->removeBranch(*BBI.BB);
   1574 
   1575   if (CvtMBB.pred_size() > 1) {
   1576     // Copy instructions in the true block, predicate them, and add them to
   1577     // the entry block.
   1578     CopyAndPredicateBlock(BBI, *CvtBBI, Cond);
   1579 
   1580     // Keep the CFG updated.
   1581     BBI.BB->removeSuccessor(&CvtMBB, true);
   1582   } else {
   1583     // Predicate the instructions in the true block.
   1584     PredicateBlock(*CvtBBI, CvtMBB.end(), Cond);
   1585 
   1586     // Merge converted block into entry block. The BB to Cvt edge is removed
   1587     // by MergeBlocks.
   1588     MergeBlocks(BBI, *CvtBBI);
   1589   }
   1590 
   1591   bool IterIfcvt = true;
   1592   if (!canFallThroughTo(*BBI.BB, NextMBB)) {
   1593     InsertUncondBranch(*BBI.BB, NextMBB, TII);
   1594     BBI.HasFallThrough = false;
   1595     // Now ifcvt'd block will look like this:
   1596     // BB:
   1597     // ...
   1598     // t, f = cmp
   1599     // if t op
   1600     // b BBf
   1601     //
   1602     // We cannot further ifcvt this block because the unconditional branch
   1603     // will have to be predicated on the new condition, that will not be
   1604     // available if cmp executes.
   1605     IterIfcvt = false;
   1606   }
   1607 
   1608   // Update block info. BB can be iteratively if-converted.
   1609   if (!IterIfcvt)
   1610     BBI.IsDone = true;
   1611   InvalidatePreds(*BBI.BB);
   1612   CvtBBI->IsDone = true;
   1613 
   1614   // FIXME: Must maintain LiveIns.
   1615   return true;
   1616 }
   1617 
   1618 /// If convert a triangle sub-CFG.
   1619 bool IfConverter::IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind) {
   1620   BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()];
   1621   BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
   1622   BBInfo *CvtBBI = &TrueBBI;
   1623   BBInfo *NextBBI = &FalseBBI;
   1624   DebugLoc dl;  // FIXME: this is nowhere
   1625 
   1626   SmallVector<MachineOperand, 4> Cond(BBI.BrCond.begin(), BBI.BrCond.end());
   1627   if (Kind == ICTriangleFalse || Kind == ICTriangleFRev)
   1628     std::swap(CvtBBI, NextBBI);
   1629 
   1630   MachineBasicBlock &CvtMBB = *CvtBBI->BB;
   1631   MachineBasicBlock &NextMBB = *NextBBI->BB;
   1632   if (CvtBBI->IsDone ||
   1633       (CvtBBI->CannotBeCopied && CvtMBB.pred_size() > 1)) {
   1634     // Something has changed. It's no longer safe to predicate this block.
   1635     BBI.IsAnalyzed = false;
   1636     CvtBBI->IsAnalyzed = false;
   1637     return false;
   1638   }
   1639 
   1640   if (CvtMBB.hasAddressTaken())
   1641     // Conservatively abort if-conversion if BB's address is taken.
   1642     return false;
   1643 
   1644   if (Kind == ICTriangleFalse || Kind == ICTriangleFRev)
   1645     if (TII->reverseBranchCondition(Cond))
   1646       llvm_unreachable("Unable to reverse branch condition!");
   1647 
   1648   if (Kind == ICTriangleRev || Kind == ICTriangleFRev) {
   1649     if (reverseBranchCondition(*CvtBBI)) {
   1650       // BB has been changed, modify its predecessors (except for this
   1651       // one) so they don't get ifcvt'ed based on bad intel.
   1652       for (MachineBasicBlock *PBB : CvtMBB.predecessors()) {
   1653         if (PBB == BBI.BB)
   1654           continue;
   1655         BBInfo &PBBI = BBAnalysis[PBB->getNumber()];
   1656         if (PBBI.IsEnqueued) {
   1657           PBBI.IsAnalyzed = false;
   1658           PBBI.IsEnqueued = false;
   1659         }
   1660       }
   1661     }
   1662   }
   1663 
   1664   // Initialize liveins to the first BB. These are potentially redefined by
   1665   // predicated instructions.
   1666   Redefs.init(*TRI);
   1667   if (MRI->tracksLiveness()) {
   1668     Redefs.addLiveIns(CvtMBB);
   1669     Redefs.addLiveIns(NextMBB);
   1670   }
   1671 
   1672   bool HasEarlyExit = CvtBBI->FalseBB != nullptr;
   1673   BranchProbability CvtNext, CvtFalse, BBNext, BBCvt;
   1674 
   1675   if (HasEarlyExit) {
   1676     // Get probabilities before modifying CvtMBB and BBI.BB.
   1677     CvtNext = MBPI->getEdgeProbability(&CvtMBB, &NextMBB);
   1678     CvtFalse = MBPI->getEdgeProbability(&CvtMBB, CvtBBI->FalseBB);
   1679     BBNext = MBPI->getEdgeProbability(BBI.BB, &NextMBB);
   1680     BBCvt = MBPI->getEdgeProbability(BBI.BB, &CvtMBB);
   1681   }
   1682 
   1683   // Remove the branches from the entry so we can add the contents of the true
   1684   // block to it.
   1685   BBI.NonPredSize -= TII->removeBranch(*BBI.BB);
   1686 
   1687   if (CvtMBB.pred_size() > 1) {
   1688     // Copy instructions in the true block, predicate them, and add them to
   1689     // the entry block.
   1690     CopyAndPredicateBlock(BBI, *CvtBBI, Cond, true);
   1691   } else {
   1692     // Predicate the 'true' block after removing its branch.
   1693     CvtBBI->NonPredSize -= TII->removeBranch(CvtMBB);
   1694     PredicateBlock(*CvtBBI, CvtMBB.end(), Cond);
   1695 
   1696     // Now merge the entry of the triangle with the true block.
   1697     MergeBlocks(BBI, *CvtBBI, false);
   1698   }
   1699 
   1700   // Keep the CFG updated.
   1701   BBI.BB->removeSuccessor(&CvtMBB, true);
   1702 
   1703   // If 'true' block has a 'false' successor, add an exit branch to it.
   1704   if (HasEarlyExit) {
   1705     SmallVector<MachineOperand, 4> RevCond(CvtBBI->BrCond.begin(),
   1706                                            CvtBBI->BrCond.end());
   1707     if (TII->reverseBranchCondition(RevCond))
   1708       llvm_unreachable("Unable to reverse branch condition!");
   1709 
   1710     // Update the edge probability for both CvtBBI->FalseBB and NextBBI.
   1711     // NewNext = New_Prob(BBI.BB, NextMBB) =
   1712     //   Prob(BBI.BB, NextMBB) +
   1713     //   Prob(BBI.BB, CvtMBB) * Prob(CvtMBB, NextMBB)
   1714     // NewFalse = New_Prob(BBI.BB, CvtBBI->FalseBB) =
   1715     //   Prob(BBI.BB, CvtMBB) * Prob(CvtMBB, CvtBBI->FalseBB)
   1716     auto NewTrueBB = getNextBlock(*BBI.BB);
   1717     auto NewNext = BBNext + BBCvt * CvtNext;
   1718     auto NewTrueBBIter = find(BBI.BB->successors(), NewTrueBB);
   1719     if (NewTrueBBIter != BBI.BB->succ_end())
   1720       BBI.BB->setSuccProbability(NewTrueBBIter, NewNext);
   1721 
   1722     auto NewFalse = BBCvt * CvtFalse;
   1723     TII->insertBranch(*BBI.BB, CvtBBI->FalseBB, nullptr, RevCond, dl);
   1724     BBI.BB->addSuccessor(CvtBBI->FalseBB, NewFalse);
   1725   }
   1726 
   1727   // Merge in the 'false' block if the 'false' block has no other
   1728   // predecessors. Otherwise, add an unconditional branch to 'false'.
   1729   bool FalseBBDead = false;
   1730   bool IterIfcvt = true;
   1731   bool isFallThrough = canFallThroughTo(*BBI.BB, NextMBB);
   1732   if (!isFallThrough) {
   1733     // Only merge them if the true block does not fallthrough to the false
   1734     // block. By not merging them, we make it possible to iteratively
   1735     // ifcvt the blocks.
   1736     if (!HasEarlyExit &&
   1737         NextMBB.pred_size() == 1 && !NextBBI->HasFallThrough &&
   1738         !NextMBB.hasAddressTaken()) {
   1739       MergeBlocks(BBI, *NextBBI);
   1740       FalseBBDead = true;
   1741     } else {
   1742       InsertUncondBranch(*BBI.BB, NextMBB, TII);
   1743       BBI.HasFallThrough = false;
   1744     }
   1745     // Mixed predicated and unpredicated code. This cannot be iteratively
   1746     // predicated.
   1747     IterIfcvt = false;
   1748   }
   1749 
   1750   // Update block info. BB can be iteratively if-converted.
   1751   if (!IterIfcvt)
   1752     BBI.IsDone = true;
   1753   InvalidatePreds(*BBI.BB);
   1754   CvtBBI->IsDone = true;
   1755   if (FalseBBDead)
   1756     NextBBI->IsDone = true;
   1757 
   1758   // FIXME: Must maintain LiveIns.
   1759   return true;
   1760 }
   1761 
   1762 /// Common code shared between diamond conversions.
   1763 /// \p BBI, \p TrueBBI, and \p FalseBBI form the diamond shape.
   1764 /// \p NumDups1 - number of shared instructions at the beginning of \p TrueBBI
   1765 ///               and FalseBBI
   1766 /// \p NumDups2 - number of shared instructions at the end of \p TrueBBI
   1767 ///               and \p FalseBBI
   1768 /// \p RemoveBranch - Remove the common branch of the two blocks before
   1769 ///                   predicating. Only false for unanalyzable fallthrough
   1770 ///                   cases. The caller will replace the branch if necessary.
   1771 /// \p MergeAddEdges - Add successor edges when merging blocks. Only false for
   1772 ///                    unanalyzable fallthrough
   1773 bool IfConverter::IfConvertDiamondCommon(
   1774     BBInfo &BBI, BBInfo &TrueBBI, BBInfo &FalseBBI,
   1775     unsigned NumDups1, unsigned NumDups2,
   1776     bool TClobbersPred, bool FClobbersPred,
   1777     bool RemoveBranch, bool MergeAddEdges) {
   1778 
   1779   if (TrueBBI.IsDone || FalseBBI.IsDone ||
   1780       TrueBBI.BB->pred_size() > 1 || FalseBBI.BB->pred_size() > 1) {
   1781     // Something has changed. It's no longer safe to predicate these blocks.
   1782     BBI.IsAnalyzed = false;
   1783     TrueBBI.IsAnalyzed = false;
   1784     FalseBBI.IsAnalyzed = false;
   1785     return false;
   1786   }
   1787 
   1788   if (TrueBBI.BB->hasAddressTaken() || FalseBBI.BB->hasAddressTaken())
   1789     // Conservatively abort if-conversion if either BB has its address taken.
   1790     return false;
   1791 
   1792   // Put the predicated instructions from the 'true' block before the
   1793   // instructions from the 'false' block, unless the true block would clobber
   1794   // the predicate, in which case, do the opposite.
   1795   BBInfo *BBI1 = &TrueBBI;
   1796   BBInfo *BBI2 = &FalseBBI;
   1797   SmallVector<MachineOperand, 4> RevCond(BBI.BrCond.begin(), BBI.BrCond.end());
   1798   if (TII->reverseBranchCondition(RevCond))
   1799     llvm_unreachable("Unable to reverse branch condition!");
   1800   SmallVector<MachineOperand, 4> *Cond1 = &BBI.BrCond;
   1801   SmallVector<MachineOperand, 4> *Cond2 = &RevCond;
   1802 
   1803   // Figure out the more profitable ordering.
   1804   bool DoSwap = false;
   1805   if (TClobbersPred && !FClobbersPred)
   1806     DoSwap = true;
   1807   else if (!TClobbersPred && !FClobbersPred) {
   1808     if (TrueBBI.NonPredSize > FalseBBI.NonPredSize)
   1809       DoSwap = true;
   1810   } else if (TClobbersPred && FClobbersPred)
   1811     llvm_unreachable("Predicate info cannot be clobbered by both sides.");
   1812   if (DoSwap) {
   1813     std::swap(BBI1, BBI2);
   1814     std::swap(Cond1, Cond2);
   1815   }
   1816 
   1817   // Remove the conditional branch from entry to the blocks.
   1818   BBI.NonPredSize -= TII->removeBranch(*BBI.BB);
   1819 
   1820   MachineBasicBlock &MBB1 = *BBI1->BB;
   1821   MachineBasicBlock &MBB2 = *BBI2->BB;
   1822 
   1823   // Initialize the Redefs:
   1824   // - BB2 live-in regs need implicit uses before being redefined by BB1
   1825   //   instructions.
   1826   // - BB1 live-out regs need implicit uses before being redefined by BB2
   1827   //   instructions. We start with BB1 live-ins so we have the live-out regs
   1828   //   after tracking the BB1 instructions.
   1829   Redefs.init(*TRI);
   1830   if (MRI->tracksLiveness()) {
   1831     Redefs.addLiveIns(MBB1);
   1832     Redefs.addLiveIns(MBB2);
   1833   }
   1834 
   1835   // Remove the duplicated instructions at the beginnings of both paths.
   1836   // Skip dbg_value instructions.
   1837   MachineBasicBlock::iterator DI1 = MBB1.getFirstNonDebugInstr(false);
   1838   MachineBasicBlock::iterator DI2 = MBB2.getFirstNonDebugInstr(false);
   1839   BBI1->NonPredSize -= NumDups1;
   1840   BBI2->NonPredSize -= NumDups1;
   1841 
   1842   // Skip past the dups on each side separately since there may be
   1843   // differing dbg_value entries. NumDups1 can include a "return"
   1844   // instruction, if it's not marked as "branch".
   1845   for (unsigned i = 0; i < NumDups1; ++DI1) {
   1846     if (DI1 == MBB1.end())
   1847       break;
   1848     if (!DI1->isDebugInstr())
   1849       ++i;
   1850   }
   1851   while (NumDups1 != 0) {
   1852     // Since this instruction is going to be deleted, update call
   1853     // site info state if the instruction is call instruction.
   1854     if (DI2->shouldUpdateCallSiteInfo())
   1855       MBB2.getParent()->eraseCallSiteInfo(&*DI2);
   1856 
   1857     ++DI2;
   1858     if (DI2 == MBB2.end())
   1859       break;
   1860     if (!DI2->isDebugInstr())
   1861       --NumDups1;
   1862   }
   1863 
   1864   if (MRI->tracksLiveness()) {
   1865     for (const MachineInstr &MI : make_range(MBB1.begin(), DI1)) {
   1866       SmallVector<std::pair<MCPhysReg, const MachineOperand*>, 4> Dummy;
   1867       Redefs.stepForward(MI, Dummy);
   1868     }
   1869   }
   1870 
   1871   BBI.BB->splice(BBI.BB->end(), &MBB1, MBB1.begin(), DI1);
   1872   MBB2.erase(MBB2.begin(), DI2);
   1873 
   1874   // The branches have been checked to match, so it is safe to remove the
   1875   // branch in BB1 and rely on the copy in BB2. The complication is that
   1876   // the blocks may end with a return instruction, which may or may not
   1877   // be marked as "branch". If it's not, then it could be included in
   1878   // "dups1", leaving the blocks potentially empty after moving the common
   1879   // duplicates.
   1880 #ifndef NDEBUG
   1881   // Unanalyzable branches must match exactly. Check that now.
   1882   if (!BBI1->IsBrAnalyzable)
   1883     verifySameBranchInstructions(&MBB1, &MBB2);
   1884 #endif
   1885   // Remove duplicated instructions from the tail of MBB1: any branch
   1886   // instructions, and the common instructions counted by NumDups2.
   1887   DI1 = MBB1.end();
   1888   while (DI1 != MBB1.begin()) {
   1889     MachineBasicBlock::iterator Prev = std::prev(DI1);
   1890     if (!Prev->isBranch() && !Prev->isDebugInstr())
   1891       break;
   1892     DI1 = Prev;
   1893   }
   1894   for (unsigned i = 0; i != NumDups2; ) {
   1895     // NumDups2 only counted non-dbg_value instructions, so this won't
   1896     // run off the head of the list.
   1897     assert(DI1 != MBB1.begin());
   1898 
   1899     --DI1;
   1900 
   1901     // Since this instruction is going to be deleted, update call
   1902     // site info state if the instruction is call instruction.
   1903     if (DI1->shouldUpdateCallSiteInfo())
   1904       MBB1.getParent()->eraseCallSiteInfo(&*DI1);
   1905 
   1906     // skip dbg_value instructions
   1907     if (!DI1->isDebugInstr())
   1908       ++i;
   1909   }
   1910   MBB1.erase(DI1, MBB1.end());
   1911 
   1912   DI2 = BBI2->BB->end();
   1913   // The branches have been checked to match. Skip over the branch in the false
   1914   // block so that we don't try to predicate it.
   1915   if (RemoveBranch)
   1916     BBI2->NonPredSize -= TII->removeBranch(*BBI2->BB);
   1917   else {
   1918     // Make DI2 point to the end of the range where the common "tail"
   1919     // instructions could be found.
   1920     while (DI2 != MBB2.begin()) {
   1921       MachineBasicBlock::iterator Prev = std::prev(DI2);
   1922       if (!Prev->isBranch() && !Prev->isDebugInstr())
   1923         break;
   1924       DI2 = Prev;
   1925     }
   1926   }
   1927   while (NumDups2 != 0) {
   1928     // NumDups2 only counted non-dbg_value instructions, so this won't
   1929     // run off the head of the list.
   1930     assert(DI2 != MBB2.begin());
   1931     --DI2;
   1932     // skip dbg_value instructions
   1933     if (!DI2->isDebugInstr())
   1934       --NumDups2;
   1935   }
   1936 
   1937   // Remember which registers would later be defined by the false block.
   1938   // This allows us not to predicate instructions in the true block that would
   1939   // later be re-defined. That is, rather than
   1940   //   subeq  r0, r1, #1
   1941   //   addne  r0, r1, #1
   1942   // generate:
   1943   //   sub    r0, r1, #1
   1944   //   addne  r0, r1, #1
   1945   SmallSet<MCPhysReg, 4> RedefsByFalse;
   1946   SmallSet<MCPhysReg, 4> ExtUses;
   1947   if (TII->isProfitableToUnpredicate(MBB1, MBB2)) {
   1948     for (const MachineInstr &FI : make_range(MBB2.begin(), DI2)) {
   1949       if (FI.isDebugInstr())
   1950         continue;
   1951       SmallVector<MCPhysReg, 4> Defs;
   1952       for (const MachineOperand &MO : FI.operands()) {
   1953         if (!MO.isReg())
   1954           continue;
   1955         Register Reg = MO.getReg();
   1956         if (!Reg)
   1957           continue;
   1958         if (MO.isDef()) {
   1959           Defs.push_back(Reg);
   1960         } else if (!RedefsByFalse.count(Reg)) {
   1961           // These are defined before ctrl flow reach the 'false' instructions.
   1962           // They cannot be modified by the 'true' instructions.
   1963           for (MCSubRegIterator SubRegs(Reg, TRI, /*IncludeSelf=*/true);
   1964                SubRegs.isValid(); ++SubRegs)
   1965             ExtUses.insert(*SubRegs);
   1966         }
   1967       }
   1968 
   1969       for (MCPhysReg Reg : Defs) {
   1970         if (!ExtUses.count(Reg)) {
   1971           for (MCSubRegIterator SubRegs(Reg, TRI, /*IncludeSelf=*/true);
   1972                SubRegs.isValid(); ++SubRegs)
   1973             RedefsByFalse.insert(*SubRegs);
   1974         }
   1975       }
   1976     }
   1977   }
   1978 
   1979   // Predicate the 'true' block.
   1980   PredicateBlock(*BBI1, MBB1.end(), *Cond1, &RedefsByFalse);
   1981 
   1982   // After predicating BBI1, if there is a predicated terminator in BBI1 and
   1983   // a non-predicated in BBI2, then we don't want to predicate the one from
   1984   // BBI2. The reason is that if we merged these blocks, we would end up with
   1985   // two predicated terminators in the same block.
   1986   // Also, if the branches in MBB1 and MBB2 were non-analyzable, then don't
   1987   // predicate them either. They were checked to be identical, and so the
   1988   // same branch would happen regardless of which path was taken.
   1989   if (!MBB2.empty() && (DI2 == MBB2.end())) {
   1990     MachineBasicBlock::iterator BBI1T = MBB1.getFirstTerminator();
   1991     MachineBasicBlock::iterator BBI2T = MBB2.getFirstTerminator();
   1992     bool BB1Predicated = BBI1T != MBB1.end() && TII->isPredicated(*BBI1T);
   1993     bool BB2NonPredicated = BBI2T != MBB2.end() && !TII->isPredicated(*BBI2T);
   1994     if (BB2NonPredicated && (BB1Predicated || !BBI2->IsBrAnalyzable))
   1995       --DI2;
   1996   }
   1997 
   1998   // Predicate the 'false' block.
   1999   PredicateBlock(*BBI2, DI2, *Cond2);
   2000 
   2001   // Merge the true block into the entry of the diamond.
   2002   MergeBlocks(BBI, *BBI1, MergeAddEdges);
   2003   MergeBlocks(BBI, *BBI2, MergeAddEdges);
   2004   return true;
   2005 }
   2006 
   2007 /// If convert an almost-diamond sub-CFG where the true
   2008 /// and false blocks share a common tail.
   2009 bool IfConverter::IfConvertForkedDiamond(
   2010     BBInfo &BBI, IfcvtKind Kind,
   2011     unsigned NumDups1, unsigned NumDups2,
   2012     bool TClobbersPred, bool FClobbersPred) {
   2013   BBInfo &TrueBBI  = BBAnalysis[BBI.TrueBB->getNumber()];
   2014   BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
   2015 
   2016   // Save the debug location for later.
   2017   DebugLoc dl;
   2018   MachineBasicBlock::iterator TIE = TrueBBI.BB->getFirstTerminator();
   2019   if (TIE != TrueBBI.BB->end())
   2020     dl = TIE->getDebugLoc();
   2021   // Removing branches from both blocks is safe, because we have already
   2022   // determined that both blocks have the same branch instructions. The branch
   2023   // will be added back at the end, unpredicated.
   2024   if (!IfConvertDiamondCommon(
   2025       BBI, TrueBBI, FalseBBI,
   2026       NumDups1, NumDups2,
   2027       TClobbersPred, FClobbersPred,
   2028       /* RemoveBranch */ true, /* MergeAddEdges */ true))
   2029     return false;
   2030 
   2031   // Add back the branch.
   2032   // Debug location saved above when removing the branch from BBI2
   2033   TII->insertBranch(*BBI.BB, TrueBBI.TrueBB, TrueBBI.FalseBB,
   2034                     TrueBBI.BrCond, dl);
   2035 
   2036   // Update block info.
   2037   BBI.IsDone = TrueBBI.IsDone = FalseBBI.IsDone = true;
   2038   InvalidatePreds(*BBI.BB);
   2039 
   2040   // FIXME: Must maintain LiveIns.
   2041   return true;
   2042 }
   2043 
   2044 /// If convert a diamond sub-CFG.
   2045 bool IfConverter::IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind,
   2046                                    unsigned NumDups1, unsigned NumDups2,
   2047                                    bool TClobbersPred, bool FClobbersPred) {
   2048   BBInfo &TrueBBI  = BBAnalysis[BBI.TrueBB->getNumber()];
   2049   BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
   2050   MachineBasicBlock *TailBB = TrueBBI.TrueBB;
   2051 
   2052   // True block must fall through or end with an unanalyzable terminator.
   2053   if (!TailBB) {
   2054     if (blockAlwaysFallThrough(TrueBBI))
   2055       TailBB = FalseBBI.TrueBB;
   2056     assert((TailBB || !TrueBBI.IsBrAnalyzable) && "Unexpected!");
   2057   }
   2058 
   2059   if (!IfConvertDiamondCommon(
   2060       BBI, TrueBBI, FalseBBI,
   2061       NumDups1, NumDups2,
   2062       TClobbersPred, FClobbersPred,
   2063       /* RemoveBranch */ TrueBBI.IsBrAnalyzable,
   2064       /* MergeAddEdges */ TailBB == nullptr))
   2065     return false;
   2066 
   2067   // If the if-converted block falls through or unconditionally branches into
   2068   // the tail block, and the tail block does not have other predecessors, then
   2069   // fold the tail block in as well. Otherwise, unless it falls through to the
   2070   // tail, add a unconditional branch to it.
   2071   if (TailBB) {
   2072     // We need to remove the edges to the true and false blocks manually since
   2073     // we didn't let IfConvertDiamondCommon update the CFG.
   2074     BBI.BB->removeSuccessor(TrueBBI.BB);
   2075     BBI.BB->removeSuccessor(FalseBBI.BB, true);
   2076 
   2077     BBInfo &TailBBI = BBAnalysis[TailBB->getNumber()];
   2078     bool CanMergeTail = !TailBBI.HasFallThrough &&
   2079       !TailBBI.BB->hasAddressTaken();
   2080     // The if-converted block can still have a predicated terminator
   2081     // (e.g. a predicated return). If that is the case, we cannot merge
   2082     // it with the tail block.
   2083     MachineBasicBlock::const_iterator TI = BBI.BB->getFirstTerminator();
   2084     if (TI != BBI.BB->end() && TII->isPredicated(*TI))
   2085       CanMergeTail = false;
   2086     // There may still be a fall-through edge from BBI1 or BBI2 to TailBB;
   2087     // check if there are any other predecessors besides those.
   2088     unsigned NumPreds = TailBB->pred_size();
   2089     if (NumPreds > 1)
   2090       CanMergeTail = false;
   2091     else if (NumPreds == 1 && CanMergeTail) {
   2092       MachineBasicBlock::pred_iterator PI = TailBB->pred_begin();
   2093       if (*PI != TrueBBI.BB && *PI != FalseBBI.BB)
   2094         CanMergeTail = false;
   2095     }
   2096     if (CanMergeTail) {
   2097       MergeBlocks(BBI, TailBBI);
   2098       TailBBI.IsDone = true;
   2099     } else {
   2100       BBI.BB->addSuccessor(TailBB, BranchProbability::getOne());
   2101       InsertUncondBranch(*BBI.BB, *TailBB, TII);
   2102       BBI.HasFallThrough = false;
   2103     }
   2104   }
   2105 
   2106   // Update block info.
   2107   BBI.IsDone = TrueBBI.IsDone = FalseBBI.IsDone = true;
   2108   InvalidatePreds(*BBI.BB);
   2109 
   2110   // FIXME: Must maintain LiveIns.
   2111   return true;
   2112 }
   2113 
   2114 static bool MaySpeculate(const MachineInstr &MI,
   2115                          SmallSet<MCPhysReg, 4> &LaterRedefs) {
   2116   bool SawStore = true;
   2117   if (!MI.isSafeToMove(nullptr, SawStore))
   2118     return false;
   2119 
   2120   for (const MachineOperand &MO : MI.operands()) {
   2121     if (!MO.isReg())
   2122       continue;
   2123     Register Reg = MO.getReg();
   2124     if (!Reg)
   2125       continue;
   2126     if (MO.isDef() && !LaterRedefs.count(Reg))
   2127       return false;
   2128   }
   2129 
   2130   return true;
   2131 }
   2132 
   2133 /// Predicate instructions from the start of the block to the specified end with
   2134 /// the specified condition.
   2135 void IfConverter::PredicateBlock(BBInfo &BBI,
   2136                                  MachineBasicBlock::iterator E,
   2137                                  SmallVectorImpl<MachineOperand> &Cond,
   2138                                  SmallSet<MCPhysReg, 4> *LaterRedefs) {
   2139   bool AnyUnpred = false;
   2140   bool MaySpec = LaterRedefs != nullptr;
   2141   for (MachineInstr &I : make_range(BBI.BB->begin(), E)) {
   2142     if (I.isDebugInstr() || TII->isPredicated(I))
   2143       continue;
   2144     // It may be possible not to predicate an instruction if it's the 'true'
   2145     // side of a diamond and the 'false' side may re-define the instruction's
   2146     // defs.
   2147     if (MaySpec && MaySpeculate(I, *LaterRedefs)) {
   2148       AnyUnpred = true;
   2149       continue;
   2150     }
   2151     // If any instruction is predicated, then every instruction after it must
   2152     // be predicated.
   2153     MaySpec = false;
   2154     if (!TII->PredicateInstruction(I, Cond)) {
   2155 #ifndef NDEBUG
   2156       dbgs() << "Unable to predicate " << I << "!\n";
   2157 #endif
   2158       llvm_unreachable(nullptr);
   2159     }
   2160 
   2161     // If the predicated instruction now redefines a register as the result of
   2162     // if-conversion, add an implicit kill.
   2163     UpdatePredRedefs(I, Redefs);
   2164   }
   2165 
   2166   BBI.Predicate.append(Cond.begin(), Cond.end());
   2167 
   2168   BBI.IsAnalyzed = false;
   2169   BBI.NonPredSize = 0;
   2170 
   2171   ++NumIfConvBBs;
   2172   if (AnyUnpred)
   2173     ++NumUnpred;
   2174 }
   2175 
   2176 /// Copy and predicate instructions from source BB to the destination block.
   2177 /// Skip end of block branches if IgnoreBr is true.
   2178 void IfConverter::CopyAndPredicateBlock(BBInfo &ToBBI, BBInfo &FromBBI,
   2179                                         SmallVectorImpl<MachineOperand> &Cond,
   2180                                         bool IgnoreBr) {
   2181   MachineFunction &MF = *ToBBI.BB->getParent();
   2182 
   2183   MachineBasicBlock &FromMBB = *FromBBI.BB;
   2184   for (MachineInstr &I : FromMBB) {
   2185     // Do not copy the end of the block branches.
   2186     if (IgnoreBr && I.isBranch())
   2187       break;
   2188 
   2189     MachineInstr *MI = MF.CloneMachineInstr(&I);
   2190     // Make a copy of the call site info.
   2191     if (I.isCandidateForCallSiteEntry())
   2192       MF.copyCallSiteInfo(&I, MI);
   2193 
   2194     ToBBI.BB->insert(ToBBI.BB->end(), MI);
   2195     ToBBI.NonPredSize++;
   2196     unsigned ExtraPredCost = TII->getPredicationCost(I);
   2197     unsigned NumCycles = SchedModel.computeInstrLatency(&I, false);
   2198     if (NumCycles > 1)
   2199       ToBBI.ExtraCost += NumCycles-1;
   2200     ToBBI.ExtraCost2 += ExtraPredCost;
   2201 
   2202     if (!TII->isPredicated(I) && !MI->isDebugInstr()) {
   2203       if (!TII->PredicateInstruction(*MI, Cond)) {
   2204 #ifndef NDEBUG
   2205         dbgs() << "Unable to predicate " << I << "!\n";
   2206 #endif
   2207         llvm_unreachable(nullptr);
   2208       }
   2209     }
   2210 
   2211     // If the predicated instruction now redefines a register as the result of
   2212     // if-conversion, add an implicit kill.
   2213     UpdatePredRedefs(*MI, Redefs);
   2214   }
   2215 
   2216   if (!IgnoreBr) {
   2217     std::vector<MachineBasicBlock *> Succs(FromMBB.succ_begin(),
   2218                                            FromMBB.succ_end());
   2219     MachineBasicBlock *NBB = getNextBlock(FromMBB);
   2220     MachineBasicBlock *FallThrough = FromBBI.HasFallThrough ? NBB : nullptr;
   2221 
   2222     for (MachineBasicBlock *Succ : Succs) {
   2223       // Fallthrough edge can't be transferred.
   2224       if (Succ == FallThrough)
   2225         continue;
   2226       ToBBI.BB->addSuccessor(Succ);
   2227     }
   2228   }
   2229 
   2230   ToBBI.Predicate.append(FromBBI.Predicate.begin(), FromBBI.Predicate.end());
   2231   ToBBI.Predicate.append(Cond.begin(), Cond.end());
   2232 
   2233   ToBBI.ClobbersPred |= FromBBI.ClobbersPred;
   2234   ToBBI.IsAnalyzed = false;
   2235 
   2236   ++NumDupBBs;
   2237 }
   2238 
   2239 /// Move all instructions from FromBB to the end of ToBB.  This will leave
   2240 /// FromBB as an empty block, so remove all of its successor edges and move it
   2241 /// to the end of the function.  If AddEdges is true, i.e., when FromBBI's
   2242 /// branch is being moved, add those successor edges to ToBBI and remove the old
   2243 /// edge from ToBBI to FromBBI.
   2244 void IfConverter::MergeBlocks(BBInfo &ToBBI, BBInfo &FromBBI, bool AddEdges) {
   2245   MachineBasicBlock &FromMBB = *FromBBI.BB;
   2246   assert(!FromMBB.hasAddressTaken() &&
   2247          "Removing a BB whose address is taken!");
   2248 
   2249   // In case FromMBB contains terminators (e.g. return instruction),
   2250   // first move the non-terminator instructions, then the terminators.
   2251   MachineBasicBlock::iterator FromTI = FromMBB.getFirstTerminator();
   2252   MachineBasicBlock::iterator ToTI = ToBBI.BB->getFirstTerminator();
   2253   ToBBI.BB->splice(ToTI, &FromMBB, FromMBB.begin(), FromTI);
   2254 
   2255   // If FromBB has non-predicated terminator we should copy it at the end.
   2256   if (FromTI != FromMBB.end() && !TII->isPredicated(*FromTI))
   2257     ToTI = ToBBI.BB->end();
   2258   ToBBI.BB->splice(ToTI, &FromMBB, FromTI, FromMBB.end());
   2259 
   2260   // Force normalizing the successors' probabilities of ToBBI.BB to convert all
   2261   // unknown probabilities into known ones.
   2262   // FIXME: This usage is too tricky and in the future we would like to
   2263   // eliminate all unknown probabilities in MBB.
   2264   if (ToBBI.IsBrAnalyzable)
   2265     ToBBI.BB->normalizeSuccProbs();
   2266 
   2267   SmallVector<MachineBasicBlock *, 4> FromSuccs(FromMBB.successors());
   2268   MachineBasicBlock *NBB = getNextBlock(FromMBB);
   2269   MachineBasicBlock *FallThrough = FromBBI.HasFallThrough ? NBB : nullptr;
   2270   // The edge probability from ToBBI.BB to FromMBB, which is only needed when
   2271   // AddEdges is true and FromMBB is a successor of ToBBI.BB.
   2272   auto To2FromProb = BranchProbability::getZero();
   2273   if (AddEdges && ToBBI.BB->isSuccessor(&FromMBB)) {
   2274     // Remove the old edge but remember the edge probability so we can calculate
   2275     // the correct weights on the new edges being added further down.
   2276     To2FromProb = MBPI->getEdgeProbability(ToBBI.BB, &FromMBB);
   2277     ToBBI.BB->removeSuccessor(&FromMBB);
   2278   }
   2279 
   2280   for (MachineBasicBlock *Succ : FromSuccs) {
   2281     // Fallthrough edge can't be transferred.
   2282     if (Succ == FallThrough) {
   2283       FromMBB.removeSuccessor(Succ);
   2284       continue;
   2285     }
   2286 
   2287     auto NewProb = BranchProbability::getZero();
   2288     if (AddEdges) {
   2289       // Calculate the edge probability for the edge from ToBBI.BB to Succ,
   2290       // which is a portion of the edge probability from FromMBB to Succ. The
   2291       // portion ratio is the edge probability from ToBBI.BB to FromMBB (if
   2292       // FromBBI is a successor of ToBBI.BB. See comment below for exception).
   2293       NewProb = MBPI->getEdgeProbability(&FromMBB, Succ);
   2294 
   2295       // To2FromProb is 0 when FromMBB is not a successor of ToBBI.BB. This
   2296       // only happens when if-converting a diamond CFG and FromMBB is the
   2297       // tail BB.  In this case FromMBB post-dominates ToBBI.BB and hence we
   2298       // could just use the probabilities on FromMBB's out-edges when adding
   2299       // new successors.
   2300       if (!To2FromProb.isZero())
   2301         NewProb *= To2FromProb;
   2302     }
   2303 
   2304     FromMBB.removeSuccessor(Succ);
   2305 
   2306     if (AddEdges) {
   2307       // If the edge from ToBBI.BB to Succ already exists, update the
   2308       // probability of this edge by adding NewProb to it. An example is shown
   2309       // below, in which A is ToBBI.BB and B is FromMBB. In this case we
   2310       // don't have to set C as A's successor as it already is. We only need to
   2311       // update the edge probability on A->C. Note that B will not be
   2312       // immediately removed from A's successors. It is possible that B->D is
   2313       // not removed either if D is a fallthrough of B. Later the edge A->D
   2314       // (generated here) and B->D will be combined into one edge. To maintain
   2315       // correct edge probability of this combined edge, we need to set the edge
   2316       // probability of A->B to zero, which is already done above. The edge
   2317       // probability on A->D is calculated by scaling the original probability
   2318       // on A->B by the probability of B->D.
   2319       //
   2320       // Before ifcvt:      After ifcvt (assume B->D is kept):
   2321       //
   2322       //       A                A
   2323       //      /|               /|\
   2324       //     / B              / B|
   2325       //    | /|             |  ||
   2326       //    |/ |             |  |/
   2327       //    C  D             C  D
   2328       //
   2329       if (ToBBI.BB->isSuccessor(Succ))
   2330         ToBBI.BB->setSuccProbability(
   2331             find(ToBBI.BB->successors(), Succ),
   2332             MBPI->getEdgeProbability(ToBBI.BB, Succ) + NewProb);
   2333       else
   2334         ToBBI.BB->addSuccessor(Succ, NewProb);
   2335     }
   2336   }
   2337 
   2338   // Move the now empty FromMBB out of the way to the end of the function so
   2339   // it doesn't interfere with fallthrough checks done by canFallThroughTo().
   2340   MachineBasicBlock *Last = &*FromMBB.getParent()->rbegin();
   2341   if (Last != &FromMBB)
   2342     FromMBB.moveAfter(Last);
   2343 
   2344   // Normalize the probabilities of ToBBI.BB's successors with all adjustment
   2345   // we've done above.
   2346   if (ToBBI.IsBrAnalyzable && FromBBI.IsBrAnalyzable)
   2347     ToBBI.BB->normalizeSuccProbs();
   2348 
   2349   ToBBI.Predicate.append(FromBBI.Predicate.begin(), FromBBI.Predicate.end());
   2350   FromBBI.Predicate.clear();
   2351 
   2352   ToBBI.NonPredSize += FromBBI.NonPredSize;
   2353   ToBBI.ExtraCost += FromBBI.ExtraCost;
   2354   ToBBI.ExtraCost2 += FromBBI.ExtraCost2;
   2355   FromBBI.NonPredSize = 0;
   2356   FromBBI.ExtraCost = 0;
   2357   FromBBI.ExtraCost2 = 0;
   2358 
   2359   ToBBI.ClobbersPred |= FromBBI.ClobbersPred;
   2360   ToBBI.HasFallThrough = FromBBI.HasFallThrough;
   2361   ToBBI.IsAnalyzed = false;
   2362   FromBBI.IsAnalyzed = false;
   2363 }
   2364 
   2365 FunctionPass *
   2366 llvm::createIfConverter(std::function<bool(const MachineFunction &)> Ftor) {
   2367   return new IfConverter(std::move(Ftor));
   2368 }
   2369