133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//===-- EarlyIfConversion.cpp - If-conversion on SSA form machine code ----===//
233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//
333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//                     The LLVM Compiler Infrastructure
433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//
533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen// This file is distributed under the University of Illinois Open Source
633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen// License. See LICENSE.TXT for details.
733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//
833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//
1033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen// Early if-conversion is for out-of-order CPUs that don't have a lot of
1133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen// predicable instructions. The goal is to eliminate conditional branches that
1233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen// may mispredict.
1333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//
1433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen// Instructions from both sides of the branch are executed specutatively, and a
1533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen// cmov instruction selects the result.
1633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//
1733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
1833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
1933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen#include "llvm/ADT/BitVector.h"
201f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen#include "llvm/ADT/PostOrderIterator.h"
2133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen#include "llvm/ADT/SetVector.h"
2233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen#include "llvm/ADT/SmallPtrSet.h"
2333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen#include "llvm/ADT/SparseSet.h"
24786556c26847befdb011298fd7b36ae86fd150b0Jakob Stoklund Olesen#include "llvm/ADT/Statistic.h"
2533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
261f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen#include "llvm/CodeGen/MachineDominators.h"
2733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen#include "llvm/CodeGen/MachineFunction.h"
2833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen#include "llvm/CodeGen/MachineFunctionPass.h"
2947730a774dd6392744ee62c7385665c780e1c4e1Jakob Stoklund Olesen#include "llvm/CodeGen/MachineLoopInfo.h"
3033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen#include "llvm/CodeGen/MachineRegisterInfo.h"
315ed625c3cff2511469e9b3c5131c29fd89ddd482Jakob Stoklund Olesen#include "llvm/CodeGen/MachineTraceMetrics.h"
325ed625c3cff2511469e9b3c5131c29fd89ddd482Jakob Stoklund Olesen#include "llvm/CodeGen/Passes.h"
3333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen#include "llvm/Support/CommandLine.h"
3433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen#include "llvm/Support/Debug.h"
3533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen#include "llvm/Support/raw_ostream.h"
36d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetInstrInfo.h"
37d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetRegisterInfo.h"
38d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetSubtargetInfo.h"
3933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
4033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesenusing namespace llvm;
4133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "early-ifcvt"
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
4433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen// Absolute maximum number of instructions allowed per speculated block.
4533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen// This bypasses all other heuristics, so it should be set fairly high.
4633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesenstatic cl::opt<unsigned>
4733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund OlesenBlockInstrLimit("early-ifcvt-limit", cl::init(30), cl::Hidden,
4833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  cl::desc("Maximum number of instructions per speculated block."));
4933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
5033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen// Stress testing mode - disable heuristics.
5133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesenstatic cl::opt<bool> Stress("stress-early-ifcvt", cl::Hidden,
5233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  cl::desc("Turn all knobs to 11"));
5333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
54786556c26847befdb011298fd7b36ae86fd150b0Jakob Stoklund OlesenSTATISTIC(NumDiamondsSeen,  "Number of diamonds");
55786556c26847befdb011298fd7b36ae86fd150b0Jakob Stoklund OlesenSTATISTIC(NumDiamondsConv,  "Number of diamonds converted");
56786556c26847befdb011298fd7b36ae86fd150b0Jakob Stoklund OlesenSTATISTIC(NumTrianglesSeen, "Number of triangles");
57786556c26847befdb011298fd7b36ae86fd150b0Jakob Stoklund OlesenSTATISTIC(NumTrianglesConv, "Number of triangles converted");
58786556c26847befdb011298fd7b36ae86fd150b0Jakob Stoklund Olesen
5933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
6033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//                                 SSAIfConv
6133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
6233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//
6333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen// The SSAIfConv class performs if-conversion on SSA form machine code after
6400f43076a3d9cc76ef4736cf3e7215e19b05f6d5Matt Beaumont-Gay// determining if it is possible. The class contains no heuristics; external
6533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen// code should be used to determine when if-conversion is a good idea.
6633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//
6700f43076a3d9cc76ef4736cf3e7215e19b05f6d5Matt Beaumont-Gay// SSAIfConv can convert both triangles and diamonds:
6833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//
6933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//   Triangle: Head              Diamond: Head
7000f43076a3d9cc76ef4736cf3e7215e19b05f6d5Matt Beaumont-Gay//              | \                       /  \_
7100f43076a3d9cc76ef4736cf3e7215e19b05f6d5Matt Beaumont-Gay//              |  \                     /    |
7233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//              |  [TF]BB              FBB    TBB
7333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//              |  /                     \    /
7433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//              | /                       \  /
7533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//             Tail                       Tail
7633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//
7733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen// Instructions in the conditional blocks TBB and/or FBB are spliced into the
7800f43076a3d9cc76ef4736cf3e7215e19b05f6d5Matt Beaumont-Gay// Head block, and phis in the Tail block are converted to select instructions.
7933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//
8033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesennamespace {
8133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesenclass SSAIfConv {
8233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  const TargetInstrInfo *TII;
8333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  const TargetRegisterInfo *TRI;
8433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  MachineRegisterInfo *MRI;
8533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
861f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesenpublic:
8733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// The block containing the conditional branch.
8833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  MachineBasicBlock *Head;
8933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
9033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// The block containing phis after the if-then-else.
9133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  MachineBasicBlock *Tail;
9233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
9333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// The 'true' conditional block as determined by AnalyzeBranch.
9433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  MachineBasicBlock *TBB;
9533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
9633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// The 'false' conditional block as determined by AnalyzeBranch.
9733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  MachineBasicBlock *FBB;
9833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
9933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// isTriangle - When there is no 'else' block, either TBB or FBB will be
10033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// equal to Tail.
10133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  bool isTriangle() const { return TBB == Tail || FBB == Tail; }
10233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
103870da6de2c3f3f40360e04882b9ddf42ded0930aJakob Stoklund Olesen  /// Returns the Tail predecessor for the True side.
104870da6de2c3f3f40360e04882b9ddf42ded0930aJakob Stoklund Olesen  MachineBasicBlock *getTPred() const { return TBB == Tail ? Head : TBB; }
105870da6de2c3f3f40360e04882b9ddf42ded0930aJakob Stoklund Olesen
106870da6de2c3f3f40360e04882b9ddf42ded0930aJakob Stoklund Olesen  /// Returns the Tail predecessor for the  False side.
107870da6de2c3f3f40360e04882b9ddf42ded0930aJakob Stoklund Olesen  MachineBasicBlock *getFPred() const { return FBB == Tail ? Head : FBB; }
108870da6de2c3f3f40360e04882b9ddf42ded0930aJakob Stoklund Olesen
10933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// Information about each phi in the Tail block.
11033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  struct PHIInfo {
11133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    MachineInstr *PHI;
11233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    unsigned TReg, FReg;
11333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // Latencies from Cond+Branch, TReg, and FReg to DstReg.
11433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    int CondCycles, TCycles, FCycles;
11533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
11633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    PHIInfo(MachineInstr *phi)
11733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      : PHI(phi), TReg(0), FReg(0), CondCycles(0), TCycles(0), FCycles(0) {}
11833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  };
11933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
12033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  SmallVector<PHIInfo, 8> PHIs;
12133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
1221f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesenprivate:
1231f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  /// The branch condition determined by AnalyzeBranch.
1241f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  SmallVector<MachineOperand, 4> Cond;
1251f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen
12633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// Instructions in Head that define values used by the conditional blocks.
12733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// The hoisted instructions must be inserted after these instructions.
12833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  SmallPtrSet<MachineInstr*, 8> InsertAfter;
12933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
13033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// Register units clobbered by the conditional blocks.
13133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  BitVector ClobberedRegUnits;
13233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
13333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // Scratch pad for findInsertionPoint.
13433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  SparseSet<unsigned> LiveRegUnits;
13533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
13633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// Insertion point in Head for speculatively executed instructions form TBB
13733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// and FBB.
13833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  MachineBasicBlock::iterator InsertionPoint;
13933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
14033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// Return true if all non-terminator instructions in MBB can be safely
14133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// speculated.
14233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  bool canSpeculateInstrs(MachineBasicBlock *MBB);
14333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
14433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// Find a valid insertion point in Head.
14533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  bool findInsertionPoint();
14633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
147bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  /// Replace PHI instructions in Tail with selects.
148bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  void replacePHIInstrs();
149bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen
150bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  /// Insert selects and rewrite PHI operands to use them.
151bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  void rewritePHIOperands();
152bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen
15333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesenpublic:
15433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// runOnMachineFunction - Initialize per-function data structures.
15533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  void runOnMachineFunction(MachineFunction &MF) {
15633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    TII = MF.getTarget().getInstrInfo();
15733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    TRI = MF.getTarget().getRegisterInfo();
15833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    MRI = &MF.getRegInfo();
15933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    LiveRegUnits.clear();
16033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    LiveRegUnits.setUniverse(TRI->getNumRegUnits());
16133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    ClobberedRegUnits.clear();
16233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    ClobberedRegUnits.resize(TRI->getNumRegUnits());
16333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  }
16433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
16533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// canConvertIf - If the sub-CFG headed by MBB can be if-converted,
16633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// initialize the internal state, and return true.
16733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  bool canConvertIf(MachineBasicBlock *MBB);
16833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
16933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  /// convertIf - If-convert the last block passed to canConvertIf(), assuming
1701f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  /// it is possible. Add any erased blocks to RemovedBlocks.
1711f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  void convertIf(SmallVectorImpl<MachineBasicBlock*> &RemovedBlocks);
17233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen};
17333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen} // end anonymous namespace
17433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
17533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
17633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen/// canSpeculateInstrs - Returns true if all the instructions in MBB can safely
17733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen/// be speculated. The terminators are not considered.
17833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen///
17933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen/// If instructions use any values that are defined in the head basic block,
18033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen/// the defining instructions are added to InsertAfter.
18133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen///
18233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen/// Any clobbered regunits are added to ClobberedRegUnits.
18333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen///
18433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesenbool SSAIfConv::canSpeculateInstrs(MachineBasicBlock *MBB) {
18533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // Reject any live-in physregs. It's probably CPSR/EFLAGS, and very hard to
18633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // get right.
18733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  if (!MBB->livein_empty()) {
18833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    DEBUG(dbgs() << "BB#" << MBB->getNumber() << " has live-ins.\n");
18933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    return false;
19033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  }
19133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
19233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  unsigned InstrCount = 0;
19386fc3100b552c8d400160581c2a00f2fd7b83b45Jakob Stoklund Olesen
19486fc3100b552c8d400160581c2a00f2fd7b83b45Jakob Stoklund Olesen  // Check all instructions, except the terminators. It is assumed that
19586fc3100b552c8d400160581c2a00f2fd7b83b45Jakob Stoklund Olesen  // terminators never have side effects or define any used register values.
19633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  for (MachineBasicBlock::iterator I = MBB->begin(),
19733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen       E = MBB->getFirstTerminator(); I != E; ++I) {
19833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    if (I->isDebugValue())
19933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      continue;
20033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
20133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    if (++InstrCount > BlockInstrLimit && !Stress) {
20233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      DEBUG(dbgs() << "BB#" << MBB->getNumber() << " has more than "
20333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen                   << BlockInstrLimit << " instructions.\n");
20433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      return false;
20533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    }
20633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
20733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // There shouldn't normally be any phis in a single-predecessor block.
20833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    if (I->isPHI()) {
20933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      DEBUG(dbgs() << "Can't hoist: " << *I);
21033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      return false;
21133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    }
21233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
21333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // Don't speculate loads. Note that it may be possible and desirable to
21433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // speculate GOT or constant pool loads that are guaranteed not to trap,
21533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // but we don't support that for now.
21633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    if (I->mayLoad()) {
21733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      DEBUG(dbgs() << "Won't speculate load: " << *I);
21833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      return false;
21933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    }
22033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
22133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // We never speculate stores, so an AA pointer isn't necessary.
22233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    bool DontMoveAcrossStore = true;
223dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (!I->isSafeToMove(TII, nullptr, DontMoveAcrossStore)) {
22433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      DEBUG(dbgs() << "Can't speculate: " << *I);
22533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      return false;
22633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    }
22733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
22833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // Check for any dependencies on Head instructions.
22933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    for (MIOperands MO(I); MO.isValid(); ++MO) {
23033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      if (MO->isRegMask()) {
23133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        DEBUG(dbgs() << "Won't speculate regmask: " << *I);
23233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        return false;
23333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      }
23433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      if (!MO->isReg())
23533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        continue;
23633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      unsigned Reg = MO->getReg();
23733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
23833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      // Remember clobbered regunits.
23933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      if (MO->isDef() && TargetRegisterInfo::isPhysicalRegister(Reg))
24033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        for (MCRegUnitIterator Units(Reg, TRI); Units.isValid(); ++Units)
24133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen          ClobberedRegUnits.set(*Units);
24233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
24333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      if (!MO->readsReg() || !TargetRegisterInfo::isVirtualRegister(Reg))
24433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        continue;
24533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      MachineInstr *DefMI = MRI->getVRegDef(Reg);
24633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      if (!DefMI || DefMI->getParent() != Head)
24733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        continue;
24833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      if (InsertAfter.insert(DefMI))
24933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        DEBUG(dbgs() << "BB#" << MBB->getNumber() << " depends on " << *DefMI);
25033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      if (DefMI->isTerminator()) {
25133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        DEBUG(dbgs() << "Can't insert instructions below terminator.\n");
25233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        return false;
25333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      }
25433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    }
25533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  }
25633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  return true;
25733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen}
25833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
25933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
26033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen/// Find an insertion point in Head for the speculated instructions. The
26133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen/// insertion point must be:
26233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen///
26333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen/// 1. Before any terminators.
26433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen/// 2. After any instructions in InsertAfter.
26533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen/// 3. Not have any clobbered regunits live.
26633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen///
26733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen/// This function sets InsertionPoint and returns true when successful, it
26833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen/// returns false if no valid insertion point could be found.
26933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen///
27033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesenbool SSAIfConv::findInsertionPoint() {
27133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // Keep track of live regunits before the current position.
27233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // Only track RegUnits that are also in ClobberedRegUnits.
27333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  LiveRegUnits.clear();
27433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  SmallVector<unsigned, 8> Reads;
27533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  MachineBasicBlock::iterator FirstTerm = Head->getFirstTerminator();
27633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  MachineBasicBlock::iterator I = Head->end();
27733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  MachineBasicBlock::iterator B = Head->begin();
27833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  while (I != B) {
27933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    --I;
28033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // Some of the conditional code depends in I.
28133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    if (InsertAfter.count(I)) {
28233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      DEBUG(dbgs() << "Can't insert code after " << *I);
28333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      return false;
28433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    }
28533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
28633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // Update live regunits.
28733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    for (MIOperands MO(I); MO.isValid(); ++MO) {
28833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      // We're ignoring regmask operands. That is conservatively correct.
28933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      if (!MO->isReg())
29033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        continue;
29133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      unsigned Reg = MO->getReg();
29233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      if (!TargetRegisterInfo::isPhysicalRegister(Reg))
29333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        continue;
29433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      // I clobbers Reg, so it isn't live before I.
29533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      if (MO->isDef())
29633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        for (MCRegUnitIterator Units(Reg, TRI); Units.isValid(); ++Units)
29733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen          LiveRegUnits.erase(*Units);
29833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      // Unless I reads Reg.
29933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      if (MO->readsReg())
30033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        Reads.push_back(Reg);
30133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    }
30233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // Anything read by I is live before I.
30333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    while (!Reads.empty())
30433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      for (MCRegUnitIterator Units(Reads.pop_back_val(), TRI); Units.isValid();
30533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen           ++Units)
30633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        if (ClobberedRegUnits.test(*Units))
30733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen          LiveRegUnits.insert(*Units);
30833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
30933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // We can't insert before a terminator.
31033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    if (I != FirstTerm && I->isTerminator())
31133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      continue;
31233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
31333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // Some of the clobbered registers are live before I, not a valid insertion
31433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // point.
31533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    if (!LiveRegUnits.empty()) {
31633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      DEBUG({
31733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        dbgs() << "Would clobber";
31833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        for (SparseSet<unsigned>::const_iterator
31933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen             i = LiveRegUnits.begin(), e = LiveRegUnits.end(); i != e; ++i)
32033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen          dbgs() << ' ' << PrintRegUnit(*i, TRI);
32133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        dbgs() << " live before " << *I;
32233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      });
32333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      continue;
32433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    }
32533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
32633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // This is a valid insertion point.
32733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    InsertionPoint = I;
32833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    DEBUG(dbgs() << "Can insert before " << *I);
32933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    return true;
33033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  }
33133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  DEBUG(dbgs() << "No legal insertion point found.\n");
33233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  return false;
33333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen}
33433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
33533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
33633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
33733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen/// canConvertIf - analyze the sub-cfg rooted in MBB, and return true if it is
33833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen/// a potential candidate for if-conversion. Fill out the internal state.
33933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen///
34033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesenbool SSAIfConv::canConvertIf(MachineBasicBlock *MBB) {
34133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  Head = MBB;
342dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  TBB = FBB = Tail = nullptr;
34333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
34433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  if (Head->succ_size() != 2)
34533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    return false;
34633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  MachineBasicBlock *Succ0 = Head->succ_begin()[0];
34733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  MachineBasicBlock *Succ1 = Head->succ_begin()[1];
34833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
34933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // Canonicalize so Succ0 has MBB as its single predecessor.
35033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  if (Succ0->pred_size() != 1)
35133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    std::swap(Succ0, Succ1);
35233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
35333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  if (Succ0->pred_size() != 1 || Succ0->succ_size() != 1)
35433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    return false;
35533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
35633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  Tail = Succ0->succ_begin()[0];
35733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
35833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // This is not a triangle.
35933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  if (Tail != Succ1) {
36033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // Check for a diamond. We won't deal with any critical edges.
36133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    if (Succ1->pred_size() != 1 || Succ1->succ_size() != 1 ||
36233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        Succ1->succ_begin()[0] != Tail)
36333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      return false;
36433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    DEBUG(dbgs() << "\nDiamond: BB#" << Head->getNumber()
36533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen                 << " -> BB#" << Succ0->getNumber()
36633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen                 << "/BB#" << Succ1->getNumber()
36733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen                 << " -> BB#" << Tail->getNumber() << '\n');
36833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
36933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // Live-in physregs are tricky to get right when speculating code.
37033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    if (!Tail->livein_empty()) {
37133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      DEBUG(dbgs() << "Tail has live-ins.\n");
37233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      return false;
37333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    }
37433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  } else {
37533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    DEBUG(dbgs() << "\nTriangle: BB#" << Head->getNumber()
37633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen                 << " -> BB#" << Succ0->getNumber()
37733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen                 << " -> BB#" << Tail->getNumber() << '\n');
37833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  }
37933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
38033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // This is a triangle or a diamond.
38133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // If Tail doesn't have any phis, there must be side effects.
38233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  if (Tail->empty() || !Tail->front().isPHI()) {
38333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    DEBUG(dbgs() << "No phis in tail.\n");
38433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    return false;
38533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  }
38633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
38733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // The branch we're looking to eliminate must be analyzable.
38833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  Cond.clear();
38933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  if (TII->AnalyzeBranch(*Head, TBB, FBB, Cond)) {
39033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    DEBUG(dbgs() << "Branch not analyzable.\n");
39133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    return false;
39233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  }
39333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
39433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // This is weird, probably some sort of degenerate CFG.
39533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  if (!TBB) {
39633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    DEBUG(dbgs() << "AnalyzeBranch didn't find conditional branch.\n");
39733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    return false;
39833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  }
39933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
40033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // AnalyzeBranch doesn't set FBB on a fall-through branch.
40133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // Make sure it is always set.
40233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  FBB = TBB == Succ0 ? Succ1 : Succ0;
40333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
40433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // Any phis in the tail block must be convertible to selects.
40533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  PHIs.clear();
406870da6de2c3f3f40360e04882b9ddf42ded0930aJakob Stoklund Olesen  MachineBasicBlock *TPred = getTPred();
407870da6de2c3f3f40360e04882b9ddf42ded0930aJakob Stoklund Olesen  MachineBasicBlock *FPred = getFPred();
40833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  for (MachineBasicBlock::iterator I = Tail->begin(), E = Tail->end();
40933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen       I != E && I->isPHI(); ++I) {
41033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    PHIs.push_back(&*I);
41133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    PHIInfo &PI = PHIs.back();
41233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // Find PHI operands corresponding to TPred and FPred.
41333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    for (unsigned i = 1; i != PI.PHI->getNumOperands(); i += 2) {
41433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      if (PI.PHI->getOperand(i+1).getMBB() == TPred)
41533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        PI.TReg = PI.PHI->getOperand(i).getReg();
41633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      if (PI.PHI->getOperand(i+1).getMBB() == FPred)
41733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen        PI.FReg = PI.PHI->getOperand(i).getReg();
41833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    }
41933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    assert(TargetRegisterInfo::isVirtualRegister(PI.TReg) && "Bad PHI");
42033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    assert(TargetRegisterInfo::isVirtualRegister(PI.FReg) && "Bad PHI");
42133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
42233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // Get target information.
42333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    if (!TII->canInsertSelect(*Head, Cond, PI.TReg, PI.FReg,
42433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen                              PI.CondCycles, PI.TCycles, PI.FCycles)) {
42533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      DEBUG(dbgs() << "Can't convert: " << *PI.PHI);
42633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      return false;
42733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    }
42833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  }
42933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
43033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // Check that the conditional instructions can be speculated.
43133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  InsertAfter.clear();
43233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  ClobberedRegUnits.reset();
43333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  if (TBB != Tail && !canSpeculateInstrs(TBB))
43433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    return false;
43533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  if (FBB != Tail && !canSpeculateInstrs(FBB))
43633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    return false;
43733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
43833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // Try to find a valid insertion point for the speculated instructions in the
43933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // head basic block.
44033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  if (!findInsertionPoint())
44133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    return false;
44233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
443786556c26847befdb011298fd7b36ae86fd150b0Jakob Stoklund Olesen  if (isTriangle())
444786556c26847befdb011298fd7b36ae86fd150b0Jakob Stoklund Olesen    ++NumTrianglesSeen;
445786556c26847befdb011298fd7b36ae86fd150b0Jakob Stoklund Olesen  else
446786556c26847befdb011298fd7b36ae86fd150b0Jakob Stoklund Olesen    ++NumDiamondsSeen;
44733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  return true;
44833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen}
44933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
450bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen/// replacePHIInstrs - Completely replace PHI instructions with selects.
451bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen/// This is possible when the only Tail predecessors are the if-converted
452bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen/// blocks.
453bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesenvoid SSAIfConv::replacePHIInstrs() {
454bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  assert(Tail->pred_size() == 2 && "Cannot replace PHIs");
45533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  MachineBasicBlock::iterator FirstTerm = Head->getFirstTerminator();
45633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  assert(FirstTerm != Head->end() && "No terminators");
45733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  DebugLoc HeadDL = FirstTerm->getDebugLoc();
45833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
45933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // Convert all PHIs to select instructions inserted before FirstTerm.
46033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  for (unsigned i = 0, e = PHIs.size(); i != e; ++i) {
46133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    PHIInfo &PI = PHIs[i];
46233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    DEBUG(dbgs() << "If-converting " << *PI.PHI);
46333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    unsigned DstReg = PI.PHI->getOperand(0).getReg();
46433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    TII->insertSelect(*Head, FirstTerm, HeadDL, DstReg, Cond, PI.TReg, PI.FReg);
46536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    DEBUG(dbgs() << "          --> " << *std::prev(FirstTerm));
46633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    PI.PHI->eraseFromParent();
467dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    PI.PHI = nullptr;
46833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  }
469bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen}
470bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen
471bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen/// rewritePHIOperands - When there are additional Tail predecessors, insert
472bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen/// select instructions in Head and rewrite PHI operands to use the selects.
473bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen/// Keep the PHI instructions in Tail to handle the other predecessors.
474bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesenvoid SSAIfConv::rewritePHIOperands() {
475bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  MachineBasicBlock::iterator FirstTerm = Head->getFirstTerminator();
476bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  assert(FirstTerm != Head->end() && "No terminators");
477bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  DebugLoc HeadDL = FirstTerm->getDebugLoc();
478bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen
479bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  // Convert all PHIs to select instructions inserted before FirstTerm.
480bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  for (unsigned i = 0, e = PHIs.size(); i != e; ++i) {
481bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen    PHIInfo &PI = PHIs[i];
482bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen    DEBUG(dbgs() << "If-converting " << *PI.PHI);
483bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen    unsigned PHIDst = PI.PHI->getOperand(0).getReg();
484bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen    unsigned DstReg = MRI->createVirtualRegister(MRI->getRegClass(PHIDst));
485bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen    TII->insertSelect(*Head, FirstTerm, HeadDL, DstReg, Cond, PI.TReg, PI.FReg);
48636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    DEBUG(dbgs() << "          --> " << *std::prev(FirstTerm));
487bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen
488bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen    // Rewrite PHI operands TPred -> (DstReg, Head), remove FPred.
489bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen    for (unsigned i = PI.PHI->getNumOperands(); i != 1; i -= 2) {
490bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen      MachineBasicBlock *MBB = PI.PHI->getOperand(i-1).getMBB();
491bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen      if (MBB == getTPred()) {
492bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen        PI.PHI->getOperand(i-1).setMBB(Head);
493bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen        PI.PHI->getOperand(i-2).setReg(DstReg);
494bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen      } else if (MBB == getFPred()) {
495bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen        PI.PHI->RemoveOperand(i-1);
496bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen        PI.PHI->RemoveOperand(i-2);
497bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen      }
498bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen    }
499bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen    DEBUG(dbgs() << "          --> " << *PI.PHI);
500bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  }
501bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen}
502bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen
503bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen/// convertIf - Execute the if conversion after canConvertIf has determined the
504bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen/// feasibility.
505bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen///
506bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen/// Any basic blocks erased will be added to RemovedBlocks.
507bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen///
508bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesenvoid SSAIfConv::convertIf(SmallVectorImpl<MachineBasicBlock*> &RemovedBlocks) {
509bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  assert(Head && Tail && TBB && FBB && "Call canConvertIf first.");
510bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen
511786556c26847befdb011298fd7b36ae86fd150b0Jakob Stoklund Olesen  // Update statistics.
512786556c26847befdb011298fd7b36ae86fd150b0Jakob Stoklund Olesen  if (isTriangle())
513786556c26847befdb011298fd7b36ae86fd150b0Jakob Stoklund Olesen    ++NumTrianglesConv;
514786556c26847befdb011298fd7b36ae86fd150b0Jakob Stoklund Olesen  else
515786556c26847befdb011298fd7b36ae86fd150b0Jakob Stoklund Olesen    ++NumDiamondsConv;
516786556c26847befdb011298fd7b36ae86fd150b0Jakob Stoklund Olesen
517bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  // Move all instructions into Head, except for the terminators.
518bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  if (TBB != Tail)
519bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen    Head->splice(InsertionPoint, TBB, TBB->begin(), TBB->getFirstTerminator());
520bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  if (FBB != Tail)
521bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen    Head->splice(InsertionPoint, FBB, FBB->begin(), FBB->getFirstTerminator());
522bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen
523bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  // Are there extra Tail predecessors?
524bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  bool ExtraPreds = Tail->pred_size() != 2;
525bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  if (ExtraPreds)
526bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen    rewritePHIOperands();
527bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  else
528bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen    replacePHIInstrs();
52933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
53033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // Fix up the CFG, temporarily leave Head without any successors.
53133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  Head->removeSuccessor(TBB);
53233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  Head->removeSuccessor(FBB);
53333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  if (TBB != Tail)
53433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    TBB->removeSuccessor(Tail);
53533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  if (FBB != Tail)
53633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    FBB->removeSuccessor(Tail);
53733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
53833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // Fix up Head's terminators.
53933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // It should become a single branch or a fallthrough.
540bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  DebugLoc HeadDL = Head->getFirstTerminator()->getDebugLoc();
54133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  TII->RemoveBranch(*Head);
54233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
54333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // Erase the now empty conditional blocks. It is likely that Head can fall
54433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  // through to Tail, and we can join the two blocks.
5451f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  if (TBB != Tail) {
5461f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen    RemovedBlocks.push_back(TBB);
5471f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen    TBB->eraseFromParent();
5481f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  }
5491f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  if (FBB != Tail) {
5501f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen    RemovedBlocks.push_back(FBB);
5511f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen    FBB->eraseFromParent();
5521f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  }
55333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
55433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  assert(Head->succ_empty() && "Additional head successors?");
555bc70ff3cb977fd69e120d89b0e04f316d87cdbefJakob Stoklund Olesen  if (!ExtraPreds && Head->isLayoutSuccessor(Tail)) {
55633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // Splice Tail onto the end of Head.
55733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    DEBUG(dbgs() << "Joining tail BB#" << Tail->getNumber()
55833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen                 << " into head BB#" << Head->getNumber() << '\n');
55933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    Head->splice(Head->end(), Tail,
56033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen                     Tail->begin(), Tail->end());
56133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    Head->transferSuccessorsAndUpdatePHIs(Tail);
5621f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen    RemovedBlocks.push_back(Tail);
5631f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen    Tail->eraseFromParent();
56433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  } else {
56533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    // We need a branch to Tail, let code placement work it out later.
56633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    DEBUG(dbgs() << "Converting to unconditional branch.\n");
56733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    SmallVector<MachineOperand, 0> EmptyCond;
568dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    TII->InsertBranch(*Head, Tail, nullptr, EmptyCond, HeadDL);
56933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen    Head->addSuccessor(Tail);
57033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  }
57133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  DEBUG(dbgs() << *Head);
57233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen}
57333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
57433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
57533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
57633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//                           EarlyIfConverter Pass
57733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
57833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
57933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesennamespace {
58033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesenclass EarlyIfConverter : public MachineFunctionPass {
58133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  const TargetInstrInfo *TII;
58233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  const TargetRegisterInfo *TRI;
5830fac6aa076450f5474feb2ec697b7d63d33fa567Jakob Stoklund Olesen  const MCSchedModel *SchedModel;
58433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  MachineRegisterInfo *MRI;
5851f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  MachineDominatorTree *DomTree;
58647730a774dd6392744ee62c7385665c780e1c4e1Jakob Stoklund Olesen  MachineLoopInfo *Loops;
5879f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen  MachineTraceMetrics *Traces;
5889f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen  MachineTraceMetrics::Ensemble *MinInstr;
58933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  SSAIfConv IfConv;
59033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
59133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesenpublic:
59233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  static char ID;
59333242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  EarlyIfConverter() : MachineFunctionPass(ID) {}
59436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void getAnalysisUsage(AnalysisUsage &AU) const override;
59536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool runOnMachineFunction(MachineFunction &MF) override;
59636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const char *getPassName() const override { return "Early If-Conversion"; }
59733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
59833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesenprivate:
59933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  bool tryConvertIf(MachineBasicBlock*);
6001f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  void updateDomTree(ArrayRef<MachineBasicBlock*> Removed);
60147730a774dd6392744ee62c7385665c780e1c4e1Jakob Stoklund Olesen  void updateLoops(ArrayRef<MachineBasicBlock*> Removed);
6029f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen  void invalidateTraces();
6039f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen  bool shouldConvertIf();
60433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen};
60533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen} // end anonymous namespace
60633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
60733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesenchar EarlyIfConverter::ID = 0;
60833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesenchar &llvm::EarlyIfConverterID = EarlyIfConverter::ID;
60933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
61033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund OlesenINITIALIZE_PASS_BEGIN(EarlyIfConverter,
61133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen                      "early-ifcvt", "Early If Converter", false, false)
61233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund OlesenINITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo)
6131f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund OlesenINITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
6149f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund OlesenINITIALIZE_PASS_DEPENDENCY(MachineTraceMetrics)
61533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund OlesenINITIALIZE_PASS_END(EarlyIfConverter,
61633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen                      "early-ifcvt", "Early If Converter", false, false)
61733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
61833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesenvoid EarlyIfConverter::getAnalysisUsage(AnalysisUsage &AU) const {
61933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  AU.addRequired<MachineBranchProbabilityInfo>();
6201f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  AU.addRequired<MachineDominatorTree>();
6211f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  AU.addPreserved<MachineDominatorTree>();
62247730a774dd6392744ee62c7385665c780e1c4e1Jakob Stoklund Olesen  AU.addRequired<MachineLoopInfo>();
62347730a774dd6392744ee62c7385665c780e1c4e1Jakob Stoklund Olesen  AU.addPreserved<MachineLoopInfo>();
6249f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen  AU.addRequired<MachineTraceMetrics>();
6259f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen  AU.addPreserved<MachineTraceMetrics>();
62633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  MachineFunctionPass::getAnalysisUsage(AU);
62733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen}
62833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
6291f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen/// Update the dominator tree after if-conversion erased some blocks.
6301f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesenvoid EarlyIfConverter::updateDomTree(ArrayRef<MachineBasicBlock*> Removed) {
6311f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  // convertIf can remove TBB, FBB, and Tail can be merged into Head.
6321f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  // TBB and FBB should not dominate any blocks.
6331f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  // Tail children should be transferred to Head.
6341f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  MachineDomTreeNode *HeadNode = DomTree->getNode(IfConv.Head);
6351f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  for (unsigned i = 0, e = Removed.size(); i != e; ++i) {
6361f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen    MachineDomTreeNode *Node = DomTree->getNode(Removed[i]);
6371f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen    assert(Node != HeadNode && "Cannot erase the head node");
6381f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen    while (Node->getNumChildren()) {
6391f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen      assert(Node->getBlock() == IfConv.Tail && "Unexpected children");
6401f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen      DomTree->changeImmediateDominator(Node->getChildren().back(), HeadNode);
6411f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen    }
6421f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen    DomTree->eraseNode(Removed[i]);
6431f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  }
6441f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen}
6451f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen
64647730a774dd6392744ee62c7385665c780e1c4e1Jakob Stoklund Olesen/// Update LoopInfo after if-conversion.
64747730a774dd6392744ee62c7385665c780e1c4e1Jakob Stoklund Olesenvoid EarlyIfConverter::updateLoops(ArrayRef<MachineBasicBlock*> Removed) {
64847730a774dd6392744ee62c7385665c780e1c4e1Jakob Stoklund Olesen  if (!Loops)
64947730a774dd6392744ee62c7385665c780e1c4e1Jakob Stoklund Olesen    return;
65047730a774dd6392744ee62c7385665c780e1c4e1Jakob Stoklund Olesen  // If-conversion doesn't change loop structure, and it doesn't mess with back
65147730a774dd6392744ee62c7385665c780e1c4e1Jakob Stoklund Olesen  // edges, so updating LoopInfo is simply removing the dead blocks.
65247730a774dd6392744ee62c7385665c780e1c4e1Jakob Stoklund Olesen  for (unsigned i = 0, e = Removed.size(); i != e; ++i)
65347730a774dd6392744ee62c7385665c780e1c4e1Jakob Stoklund Olesen    Loops->removeBlock(Removed[i]);
65447730a774dd6392744ee62c7385665c780e1c4e1Jakob Stoklund Olesen}
65547730a774dd6392744ee62c7385665c780e1c4e1Jakob Stoklund Olesen
6569f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen/// Invalidate MachineTraceMetrics before if-conversion.
6579f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesenvoid EarlyIfConverter::invalidateTraces() {
658ef6c76c984f821ea866902a7f9e695b16e971468Jakob Stoklund Olesen  Traces->verifyAnalysis();
6599f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen  Traces->invalidate(IfConv.Head);
6609f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen  Traces->invalidate(IfConv.Tail);
6619f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen  Traces->invalidate(IfConv.TBB);
6629f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen  Traces->invalidate(IfConv.FBB);
663ef6c76c984f821ea866902a7f9e695b16e971468Jakob Stoklund Olesen  Traces->verifyAnalysis();
6649f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen}
6659f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen
666eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen// Adjust cycles with downward saturation.
667eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesenstatic unsigned adjCycles(unsigned Cyc, int Delta) {
668eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  if (Delta < 0 && Cyc + Delta > Cyc)
669eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    return 0;
670eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  return Cyc + Delta;
671eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen}
672eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen
6739f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen/// Apply cost model and heuristics to the if-conversion in IfConv.
6749f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen/// Return true if the conversion is a good idea.
6759f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen///
6769f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesenbool EarlyIfConverter::shouldConvertIf() {
677d6cf5f4224d0e600ebb810f1da09aabaeea7e6f3Jakob Stoklund Olesen  // Stress testing mode disables all cost considerations.
678d6cf5f4224d0e600ebb810f1da09aabaeea7e6f3Jakob Stoklund Olesen  if (Stress)
679d6cf5f4224d0e600ebb810f1da09aabaeea7e6f3Jakob Stoklund Olesen    return true;
680d6cf5f4224d0e600ebb810f1da09aabaeea7e6f3Jakob Stoklund Olesen
6819f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen  if (!MinInstr)
6829f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen    MinInstr = Traces->getEnsemble(MachineTraceMetrics::TS_MinInstrCount);
68384ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen
684eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  MachineTraceMetrics::Trace TBBTrace = MinInstr->getTrace(IfConv.getTPred());
685eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  MachineTraceMetrics::Trace FBBTrace = MinInstr->getTrace(IfConv.getFPred());
68684ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen  DEBUG(dbgs() << "TBB: " << TBBTrace << "FBB: " << FBBTrace);
687eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  unsigned MinCrit = std::min(TBBTrace.getCriticalPath(),
688eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen                              FBBTrace.getCriticalPath());
689eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen
690eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  // Set a somewhat arbitrary limit on the critical path extension we accept.
691eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  unsigned CritLimit = SchedModel->MispredictPenalty/2;
692eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen
693eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  // If-conversion only makes sense when there is unexploited ILP. Compute the
694eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  // maximum-ILP resource length of the trace after if-conversion. Compare it
695eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  // to the shortest critical path.
696eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  SmallVector<const MachineBasicBlock*, 1> ExtraBlocks;
697eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  if (IfConv.TBB != IfConv.Tail)
698eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    ExtraBlocks.push_back(IfConv.TBB);
699eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  unsigned ResLength = FBBTrace.getResourceLength(ExtraBlocks);
700eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  DEBUG(dbgs() << "Resource length " << ResLength
701eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen               << ", minimal critical path " << MinCrit << '\n');
702eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  if (ResLength > MinCrit + CritLimit) {
703eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    DEBUG(dbgs() << "Not enough available ILP.\n");
70484ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen    return false;
70584ef6ba44394f983d985b02e328cbb2dd779e4b0Jakob Stoklund Olesen  }
706eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen
707eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  // Assume that the depth of the first head terminator will also be the depth
708eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  // of the select instruction inserted, as determined by the flag dependency.
709eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  // TBB / FBB data dependencies may delay the select even more.
710eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  MachineTraceMetrics::Trace HeadTrace = MinInstr->getTrace(IfConv.Head);
711eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  unsigned BranchDepth =
712eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    HeadTrace.getInstrCycles(IfConv.Head->getFirstTerminator()).Depth;
713eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  DEBUG(dbgs() << "Branch depth: " << BranchDepth << '\n');
714eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen
715eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  // Look at all the tail phis, and compute the critical path extension caused
716eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  // by inserting select instructions.
717eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  MachineTraceMetrics::Trace TailTrace = MinInstr->getTrace(IfConv.Tail);
718eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  for (unsigned i = 0, e = IfConv.PHIs.size(); i != e; ++i) {
719eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    SSAIfConv::PHIInfo &PI = IfConv.PHIs[i];
720eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    unsigned Slack = TailTrace.getInstrSlack(PI.PHI);
721eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    unsigned MaxDepth = Slack + TailTrace.getInstrCycles(PI.PHI).Depth;
722eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    DEBUG(dbgs() << "Slack " << Slack << ":\t" << *PI.PHI);
723eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen
724eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    // The condition is pulled into the critical path.
725eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    unsigned CondDepth = adjCycles(BranchDepth, PI.CondCycles);
726eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    if (CondDepth > MaxDepth) {
727eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen      unsigned Extra = CondDepth - MaxDepth;
728eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen      DEBUG(dbgs() << "Condition adds " << Extra << " cycles.\n");
729eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen      if (Extra > CritLimit) {
730eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen        DEBUG(dbgs() << "Exceeds limit of " << CritLimit << '\n');
731eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen        return false;
732eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen      }
733eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    }
734eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen
735eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    // The TBB value is pulled into the critical path.
736eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    unsigned TDepth = adjCycles(TBBTrace.getPHIDepth(PI.PHI), PI.TCycles);
737eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    if (TDepth > MaxDepth) {
738eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen      unsigned Extra = TDepth - MaxDepth;
739eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen      DEBUG(dbgs() << "TBB data adds " << Extra << " cycles.\n");
740eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen      if (Extra > CritLimit) {
741eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen        DEBUG(dbgs() << "Exceeds limit of " << CritLimit << '\n');
742eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen        return false;
743eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen      }
744eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    }
745eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen
746eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    // The FBB value is pulled into the critical path.
747eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    unsigned FDepth = adjCycles(FBBTrace.getPHIDepth(PI.PHI), PI.FCycles);
748eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    if (FDepth > MaxDepth) {
749eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen      unsigned Extra = FDepth - MaxDepth;
750eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen      DEBUG(dbgs() << "FBB data adds " << Extra << " cycles.\n");
751eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen      if (Extra > CritLimit) {
752eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen        DEBUG(dbgs() << "Exceeds limit of " << CritLimit << '\n');
753eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen        return false;
754eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen      }
755eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen    }
756eb74c08192d9c9425b2d8cf08852e9e787a87881Jakob Stoklund Olesen  }
7579f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen  return true;
7589f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen}
7599f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen
76033242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen/// Attempt repeated if-conversion on MBB, return true if successful.
76133242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen///
76233242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesenbool EarlyIfConverter::tryConvertIf(MachineBasicBlock *MBB) {
7631f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  bool Changed = false;
7649f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen  while (IfConv.canConvertIf(MBB) && shouldConvertIf()) {
7651f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen    // If-convert MBB and update analyses.
7669f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen    invalidateTraces();
7671f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen    SmallVector<MachineBasicBlock*, 4> RemovedBlocks;
7681f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen    IfConv.convertIf(RemovedBlocks);
7691f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen    Changed = true;
7701f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen    updateDomTree(RemovedBlocks);
77147730a774dd6392744ee62c7385665c780e1c4e1Jakob Stoklund Olesen    updateLoops(RemovedBlocks);
7721f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  }
7731f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  return Changed;
77433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen}
77533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
77633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesenbool EarlyIfConverter::runOnMachineFunction(MachineFunction &MF) {
77733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  DEBUG(dbgs() << "********** EARLY IF-CONVERSION **********\n"
778986d76d7b3844b9a2f3d01a48975952749267a93David Blaikie               << "********** Function: " << MF.getName() << '\n');
779dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Only run if conversion if the target wants it.
780dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!MF.getTarget()
781dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines           .getSubtarget<TargetSubtargetInfo>()
782dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines           .enableEarlyIfConversion())
783dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return false;
784dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
78533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  TII = MF.getTarget().getInstrInfo();
78633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  TRI = MF.getTarget().getRegisterInfo();
787e6521b57cc475e3606fd90e48363cc27aa17cc80Jakob Stoklund Olesen  SchedModel =
788e6521b57cc475e3606fd90e48363cc27aa17cc80Jakob Stoklund Olesen    MF.getTarget().getSubtarget<TargetSubtargetInfo>().getSchedModel();
78933242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  MRI = &MF.getRegInfo();
7901f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  DomTree = &getAnalysis<MachineDominatorTree>();
79147730a774dd6392744ee62c7385665c780e1c4e1Jakob Stoklund Olesen  Loops = getAnalysisIfAvailable<MachineLoopInfo>();
7929f63e104271eb91e545fa8cdb16fb9e10a8a9578Jakob Stoklund Olesen  Traces = &getAnalysis<MachineTraceMetrics>();
793dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MinInstr = nullptr;
79433242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
79533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  bool Changed = false;
79633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  IfConv.runOnMachineFunction(MF);
79733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
7981f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  // Visit blocks in dominator tree post-order. The post-order enables nested
7991f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  // if-conversion in a single pass. The tryConvertIf() function may erase
8001f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  // blocks, but only blocks dominated by the head block. This makes it safe to
8011f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  // update the dominator tree while the post-order iterator is still active.
8021f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen  for (po_iterator<MachineDominatorTree*>
8031f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen       I = po_begin(DomTree), E = po_end(DomTree); I != E; ++I)
8041f523dc45e29874bf8101e50b42ba707ffc8aff9Jakob Stoklund Olesen    if (tryConvertIf(I->getBlock()))
80533242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen      Changed = true;
80633242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen
80733242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen  return Changed;
80833242fd3ed5586091e73254b58dd1825e9d53c60Jakob Stoklund Olesen}
809