LLVM: lib/Transforms/Utils/BreakCriticalEdges.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

35using namespace llvm;

36

37#define DEBUG_TYPE "break-crit-edges"

38

39STATISTIC(NumBroken, "Number of blocks inserted");

40

41namespace {

42struct BreakCriticalEdges : public FunctionPass {

43 static char ID;

46 }

47

49 auto *DTWP = getAnalysisIfAvailable();

50 auto *DT = DTWP ? &DTWP->getDomTree() : nullptr;

51

52 auto *PDTWP = getAnalysisIfAvailable();

53 auto *PDT = PDTWP ? &PDTWP->getPostDomTree() : nullptr;

54

55 auto *LIWP = getAnalysisIfAvailable();

56 auto *LI = LIWP ? &LIWP->getLoopInfo() : nullptr;

58 F, CriticalEdgeSplittingOptions(DT, LI, nullptr, PDT));

59 NumBroken += N;

60 return N > 0;

61 }

62

63 void getAnalysisUsage(AnalysisUsage &AU) const override {

66

67

69 }

70};

71}

72

73char BreakCriticalEdges::ID = 0;

75 "Break critical edges in CFG", false, false)

76

77

79

81 return new BreakCriticalEdges();

82}

83

89 NumBroken += N;

90 if (N == 0)

95 return PA;

96}

97

98

99

100

101

104 const Twine &BBName) {

106 return nullptr;

107

109}

110

114 const Twine &BBName) {

117

118

119

120

122 return nullptr;

123

124 if (Options.IgnoreUnreachableDests &&

126 return nullptr;

127

130

131

132

133 if (LI) {

134 if (Loop *TIL = LI->getLoopFor(TIBB)) {

135

136

137

138

139

140

141

142

143

144

146 if (P == TIBB)

147 continue;

148 if (LI->getLoopFor(P) != TIL) {

149

150 LoopPreds.clear();

151 break;

152 }

154 }

155

156

159 })) {

160 if (Options.PreserveLoopSimplify)

161 return nullptr;

162 LoopPreds.clear();

163 }

164 }

165 }

166

167

169 if (BBName.str() != "")

171 else

174 "_crit_edge");

175

178 if (auto *LoopMD = TI->getMetadata(LLVMContext::MD_loop))

179 NewBI->setMetadata(LLVMContext::MD_loop, LoopMD);

180

181

184 F.insert(++FBBI, NewBB);

185

186

188

189

190

191 {

192 unsigned BBIdx = 0;

194

195

196

198

199

200

201

202

203

207 }

208 }

209

210 unsigned NumSplitIdenticalEdges = 1;

211

212

213

214

215 if (Options.MergeIdenticalEdges) {

216 for (unsigned i = SuccNum+1, e = TI->getNumSuccessors(); i != e; ++i) {

218

219

221

222

224

225

226 NumSplitIdenticalEdges++;

227 }

228 }

229

230

233 auto *MSSAU = Options.MSSAU;

234 if (MSSAU)

235 MSSAU->wireOldPredecessorsToNewImmediatePredecessor(

236 DestBB, NewBB, {TIBB}, Options.MergeIdenticalEdges);

237

238 if (!DT && !PDT && !LI)

239 return NewBB;

240

241 if (DT || PDT) {

242

243

244

245

246

247

248

249

250

256

257 if (DT)

258 DT->applyUpdates(Updates);

259 if (PDT)

260 PDT->applyUpdates(Updates);

261 }

262

263

264 if (LI) {

265 if (Loop *TIL = LI->getLoopFor(TIBB)) {

266

267

268 if (Loop *DestLoop = LI->getLoopFor(DestBB)) {

269 if (TIL == DestLoop) {

270

271 DestLoop->addBasicBlockToLoop(NewBB, *LI);

272 } else if (TIL->contains(DestLoop)) {

273

274 TIL->addBasicBlockToLoop(NewBB, *LI);

275 } else if (DestLoop->contains(TIL)) {

276

277 DestLoop->addBasicBlockToLoop(NewBB, *LI);

278 } else {

279

280

281

282

283 assert(DestLoop->getHeader() == DestBB &&

284 "Should not create irreducible loops!");

285 if (Loop *P = DestLoop->getParentLoop())

286 P->addBasicBlockToLoop(NewBB, *LI);

287 }

288 }

289

290

291

292 if (!TIL->contains(DestBB)) {

293 assert(!TIL->contains(NewBB) &&

294 "Split point for loop exit is contained in loop!");

295

296

297 if (Options.PreserveLCSSA) {

298

299

302 DestBB);

303 }

304

305 if (!LoopPreds.empty()) {

306 assert(!DestBB->isEHPad() && "We don't split edges to EH pads!");

308 DestBB, LoopPreds, "split", DT, LI, MSSAU, Options.PreserveLCSSA);

309 if (Options.PreserveLCSSA)

311 }

312 }

313 }

314 }

315

316 return NewBB;

317}

318

319

320

321

322

325

326

327

330 Instruction *PredTerm = PredBB->getTerminator();

332 case Instruction::IndirectBr:

333 if (IBB)

334 return nullptr;

335 IBB = PredBB;

336 break;

337 case Instruction::Br:

338 case Instruction::Switch:

340 continue;

341 default:

342 return nullptr;

343 }

344 }

345

346 return IBB;

347}

348

350 bool IgnoreBlocksWithoutPHI,

353

354

355

357 for (auto &BB : F) {

360 }

361

362 if (Targets.empty())

363 return false;

364

365 bool ShouldUpdateAnalysis = BPI && BFI;

368 if (IgnoreBlocksWithoutPHI && Target->phis().empty())

369 continue;

370

373

374

375 if (!IBRPred || OtherPreds.empty())

376 continue;

377

378

379 auto FirstNonPHIIt = Target->getFirstNonPHIIt();

380 if (FirstNonPHIIt->isEHPad() || Target->isLandingPad())

381 continue;

382

383

385 if (ShouldUpdateAnalysis) {

386 EdgeProbabilities.reserve(Target->getTerminator()->getNumSuccessors());

387 for (unsigned I = 0, E = Target->getTerminator()->getNumSuccessors();

388 I < E; ++I)

391 }

392

393 BasicBlock *BodyBlock = Target->splitBasicBlock(FirstNonPHIIt, ".split");

394 if (ShouldUpdateAnalysis) {

395

398 }

399

400

401 if (IBRPred == Target)

402 IBRPred = BodyBlock;

403

404

405

406

409 if (!VMap.AtomMap.empty())

412

414 for (BasicBlock *Pred : OtherPreds) {

415

416

419 if (ShouldUpdateAnalysis)

420 BlockFreqForDirectSucc += BFI->getBlockFreq(Src) *

422 }

423 if (ShouldUpdateAnalysis) {

424 BFI->setBlockFreq(DirectSucc, BlockFreqForDirectSucc);

428 }

429

430

431

432

433

434

436 End = Target->getFirstNonPHIIt();

439

441 "Block was expected to only contain PHIs");

442

443 while (Indirect != End) {

447

448

449

451 Direct++;

452

453

454

455 Indirect++;

456

459 IBRPred);

461

462

463

467 MergePHI->addIncoming(DirPHI, DirectSucc);

470

473 }

474

476 }

477

479}

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

static BasicBlock * findIBRPredecessor(BasicBlock *BB, SmallVectorImpl< BasicBlock * > &OtherPreds)

Definition BreakCriticalEdges.cpp:324

static bool runOnFunction(Function &F, bool PostInlining)

This file provides various utilities for inspecting and working with the control flow graph in LLVM I...

static cl::opt< bool > SplitAllCriticalEdges("phi-elim-split-all-critical-edges", cl::init(false), cl::Hidden, cl::desc("Split all critical edges during " "PHI elimination"))

#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)

This file implements a set that has insertion order iteration characteristics.

This file defines the SmallVector class.

This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...

#define STATISTIC(VARNAME, DESC)

PassT::Result * getCachedResult(IRUnitT &IR) const

Get the cached result of an analysis pass for a given IR unit.

AnalysisUsage & addPreservedID(const void *ID)

AnalysisUsage & addPreserved()

Add the specified Pass class to the set of analyses preserved by this pass.

LLVM Basic Block Representation.

iterator begin()

Instruction iterator methods.

LLVM_ABI const_iterator getFirstInsertionPt() const

Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...

const Function * getParent() const

Return the enclosing method, or null if none.

static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)

Creates a new BasicBlock.

InstListType::iterator iterator

Instruction iterators...

LLVM_ABI InstListType::const_iterator getFirstNonPHIOrDbgOrLifetime(bool SkipPseudoOp=true) const

Returns a pointer to the first instruction in this block that is not a PHINode, a debug intrinsic,...

bool isEHPad() const

Return true if this basic block is an exception handling block.

const Instruction * getTerminator() const LLVM_READONLY

Returns the terminator instruction if the block is well formed or null if the block is not well forme...

LLVM_ABI void removePredecessor(BasicBlock *Pred, bool KeepOneInputPHIs=false)

Update PHI nodes in this BasicBlock before removal of predecessor Pred.

BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...

LLVM_ABI void setBlockFreq(const BasicBlock *BB, BlockFrequency Freq)

LLVM_ABI BlockFrequency getBlockFreq(const BasicBlock *BB) const

getblockFreq - Return block frequency.

Conditional or Unconditional Branch instruction.

static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)

Analysis providing branch probability information.

LLVM_ABI void eraseBlock(const BasicBlock *BB)

Forget analysis results for the given basic block.

LLVM_ABI void setEdgeProbability(const BasicBlock *Src, const SmallVectorImpl< BranchProbability > &Probs)

Set the raw probabilities for all edges from the given block.

LLVM_ABI BranchProbability getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const

Get an edge's probability, relative to other out-edges of the Src.

Analysis pass which computes a DominatorTree.

static constexpr UpdateKind Delete

static constexpr UpdateKind Insert

FunctionPass class - This class is used to implement most global optimizations.

BasicBlockListType::iterator iterator

LLVM_ABI unsigned getNumSuccessors() const LLVM_READONLY

Return the number of successors that this instruction has.

const DebugLoc & getDebugLoc() const

Return the debug location for this node as a DebugLoc.

LLVM_ABI void insertBefore(InstListType::iterator InsertPos)

Insert an unlinked instruction into a basic block immediately before the specified position.

LLVM_ABI InstListType::iterator eraseFromParent()

This method unlinks 'this' from the containing basic block and deletes it.

MDNode * getMetadata(unsigned KindID) const

Get the metadata of given kind attached to this Instruction.

LLVM_ABI BasicBlock * getSuccessor(unsigned Idx) const LLVM_READONLY

Return the specified successor. This instruction must be a terminator.

LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)

Set the metadata of the specified kind to the specified node.

unsigned getOpcode() const

Returns a member of one of the enums like Instruction::Add.

void setDebugLoc(DebugLoc Loc)

Set the debug location information for this instruction.

LLVM_ABI void setSuccessor(unsigned Idx, BasicBlock *BB)

Update the specified successor to point at the provided block.

LLVM_ABI void applyMergedLocation(DebugLoc LocA, DebugLoc LocB)

Merge 2 debug locations and apply it to the Instruction.

Analysis pass that exposes the LoopInfo for a function.

Represents a single loop in the control flow graph.

void addIncoming(Value *V, BasicBlock *BB)

Add an incoming value to the end of the PHI list.

void setIncomingBlock(unsigned i, BasicBlock *BB)

LLVM_ABI Value * removeIncomingValue(unsigned Idx, bool DeletePHIIfEmpty=true)

Remove an incoming value.

Value * getIncomingValueForBlock(const BasicBlock *BB) const

BasicBlock * getIncomingBlock(unsigned i) const

Return incoming basic block number i.

int getBasicBlockIndex(const BasicBlock *BB) const

Return the first index of the specified basic block in the value list for this PHI.

static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)

Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...

static LLVM_ABI PassRegistry * getPassRegistry()

getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...

A set of analyses that are preserved following a run of a transformation pass.

static PreservedAnalyses all()

Construct a special preserved set that preserves all passes.

PreservedAnalyses & preserve()

Mark an analysis as preserved.

void insert_range(Range &&R)

bool empty() const

Determine if the SetVector is empty or not.

A SetVector that performs no allocations if smaller than a certain size.

This class consists of common code factored out of the SmallVector class to reduce code duplication b...

reference emplace_back(ArgTypes &&... Args)

void reserve(size_type N)

void push_back(const T &Elt)

This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.

Target - Wrapper for Target specific information.

Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...

LLVM_ABI std::string str() const

Return the twine contents as a std::string.

LLVM_ABI bool replaceUsesOfWith(Value *From, Value *To)

Replace uses of one Value with another.

DMAtomT AtomMap

Map {(InlinedAt, old atom number) -> new atom number}.

Type * getType() const

All values are typed, get the type of this value.

LLVM_ABI void replaceAllUsesWith(Value *V)

Change all uses of this to point to a new Value.

LLVM_ABI LLVMContext & getContext() const

All values hold a context through their type.

LLVM_ABI StringRef getName() const

Return a constant reference to the value's name.

const ParentTy * getParent() const

self_iterator getIterator()

unsigned ID

LLVM IR allows to use arbitrary numbers as calling convention identifiers.

This is an optimization pass for GlobalISel generic memory operations.

LLVM_ABI BasicBlock * CloneBasicBlock(const BasicBlock *BB, ValueToValueMapTy &VMap, const Twine &NameSuffix="", Function *F=nullptr, ClonedCodeInfo *CodeInfo=nullptr, bool MapAtoms=true)

Return a copy of the specified basic block, but without embedding the block into a particular functio...

auto successors(const MachineBasicBlock *BB)

LLVM_ABI FunctionPass * createBreakCriticalEdgesPass()

LLVM_ABI char & LoopSimplifyID

LLVM_ABI BasicBlock * SplitKnownCriticalEdge(Instruction *TI, unsigned SuccNum, const CriticalEdgeSplittingOptions &Options=CriticalEdgeSplittingOptions(), const Twine &BBName="")

If it is known that an edge is critical, SplitKnownCriticalEdge can be called directly,...

Definition BreakCriticalEdges.cpp:112

LLVM_ABI bool SplitIndirectBrCriticalEdges(Function &F, bool IgnoreBlocksWithoutPHI, BranchProbabilityInfo *BPI=nullptr, BlockFrequencyInfo *BFI=nullptr)

Definition BreakCriticalEdges.cpp:349

bool any_of(R &&range, UnaryPredicate P)

Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.

LLVM_ABI char & BreakCriticalEdgesID

bool isa(const From &Val)

isa - Return true if the parameter to the template is an instance of one of the template type argu...

LLVM_ABI BasicBlock * SplitBlockPredecessors(BasicBlock *BB, ArrayRef< BasicBlock * > Preds, const char *Suffix, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, bool PreserveLCSSA=false)

This method introduces at least one new basic block into the function and moves some of the predecess...

LLVM_ABI void createPHIsForSplitLoopExit(ArrayRef< BasicBlock * > Preds, BasicBlock *SplitBB, BasicBlock *DestBB)

When a loop exit edge is split, LCSSA form may require new PHIs in the new exit block.

LLVM_ABI void initializeBreakCriticalEdgesPass(PassRegistry &)

LLVM_ABI BasicBlock * SplitCriticalEdge(Instruction *TI, unsigned SuccNum, const CriticalEdgeSplittingOptions &Options=CriticalEdgeSplittingOptions(), const Twine &BBName="")

If this edge is a critical edge, insert a new node to split the critical edge.

Definition BreakCriticalEdges.cpp:102

LLVM_ABI bool isCriticalEdge(const Instruction *TI, unsigned SuccNum, bool AllowIdenticalEdges=false)

Return true if the specified edge is a critical edge.

ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy

decltype(auto) cast(const From &Val)

cast - Return the argument parameter cast to the specified type.

auto predecessors(const MachineBasicBlock *BB)

bool is_contained(R &&Range, const E &Element)

Returns true if Element is found in Range.

AnalysisManager< Function > FunctionAnalysisManager

Convenience typedef for the Function analysis manager.

LLVM_ABI void RemapSourceAtom(Instruction *I, ValueToValueMapTy &VM)

Remap source location atom.

PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)

Definition BreakCriticalEdges.cpp:84

Option class for critical edge splitting.