LLVM 22.0.0git
JumpThreading.h
Go to the documentation of this file.
1//===- JumpThreading.h - thread control through conditional BBs -*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9/// \file
10/// See the comments on JumpThreadingPass.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_TRANSFORMS_SCALAR_JUMPTHREADING_H
15#define LLVM_TRANSFORMS_SCALAR_JUMPTHREADING_H
16
17#include "llvm/ADT/ArrayRef.h"
18#include "llvm/ADT/DenseSet.h"
19#include "llvm/ADT/SmallSet.h"
24#include "llvm/IR/ValueHandle.h"
27#include <utility>
28
29namespace llvm {
30
31class AAResults;
32class BasicBlock;
33class BinaryOperator;
34class BranchInst;
35class CmpInst;
36class Constant;
37class Function;
38class Instruction;
39class IntrinsicInst;
40class LazyValueInfo;
41class LoadInst;
42class PHINode;
43class SelectInst;
44class SwitchInst;
47class Value;
48
49/// A private "module" namespace for types and utilities used by
50/// JumpThreading.
51/// These are implementation details and should not be used by clients.
52namespace jumpthreading {
53
54// These are at global scope so static functions can use them too.
57
58// This is used to keep track of what kind of constant we're currently hoping
59// to find.
61
62} // end namespace jumpthreading
63
64/// This pass performs 'jump threading', which looks at blocks that have
65/// multiple predecessors and multiple successors. If one or more of the
66/// predecessors of the block can be proven to always jump to one of the
67/// successors, we forward the edge from the predecessor to the successor by
68/// duplicating the contents of this block.
69///
70/// An example of when this can occur is code like this:
71///
72/// if () { ...
73/// X = 4;
74/// }
75/// if (X < 3) {
76///
77/// In this case, the unconditional branch at the end of the first if can be
78/// revectored to the false side of the second if.
79class JumpThreadingPass : public PassInfoMixin<JumpThreadingPass> {
80 Function *F = nullptr;
81 FunctionAnalysisManager *FAM = nullptr;
82 TargetLibraryInfo *TLI = nullptr;
83 TargetTransformInfo *TTI = nullptr;
84 LazyValueInfo *LVI = nullptr;
85 AAResults *AA = nullptr;
86 std::unique_ptr<DomTreeUpdater> DTU;
87 BlockFrequencyInfo *BFI = nullptr;
88 BranchProbabilityInfo *BPI = nullptr;
89 bool ChangedSinceLastAnalysisUpdate = false;
90 bool HasGuards = false;
91#ifndef LLVM_ENABLE_ABI_BREAKING_CHECKS
93#else
95#endif
96
97 // JumpThreading must not processes blocks unreachable from entry. It's a
98 // waste of compute time and can potentially lead to hangs.
100
101 unsigned BBDupThreshold;
102 unsigned DefaultBBDupThreshold;
103
104public:
105 LLVM_ABI JumpThreadingPass(int T = -1);
106
107 // Glue for old PM.
110 LazyValueInfo *LVI, AAResults *AA,
111 std::unique_ptr<DomTreeUpdater> DTU,
113
115
116 DomTreeUpdater *getDomTreeUpdater() const { return DTU.get(); }
120 LLVM_ABI void updateSSA(BasicBlock *BB, BasicBlock *NewBB,
121 ValueToValueMapTy &ValueMapping);
125 BasicBlock *PredBB);
127 const SmallVectorImpl<BasicBlock *> &PredBBs,
128 BasicBlock *SuccBB);
130 const SmallVectorImpl<BasicBlock *> &PredBBs,
131 BasicBlock *SuccBB);
133 BasicBlock *BB, const SmallVectorImpl<BasicBlock *> &PredBBs);
134
138 SmallPtrSet<Value *, 4> &RecursionSet, Instruction *CxtI = nullptr);
139 bool
143 Instruction *CxtI = nullptr) {
144 SmallPtrSet<Value *, 4> RecursionSet;
145 return computeValueKnownInPredecessorsImpl(V, BB, Result, Preference,
146 RecursionSet, CxtI);
147 }
148
150 BasicBlock *PredPredBB,
151 Value *cond,
152 const DataLayout &DL);
155 BasicBlock *PredBB, BasicBlock *BB,
156 BasicBlock *SuccBB);
157 LLVM_ABI bool
160 Instruction *CxtI = nullptr);
161
165
168 SelectInst *SI, PHINode *SIUse, unsigned Idx);
169
170 LLVM_ABI bool tryToUnfoldSelect(CmpInst *CondCmp, BasicBlock *BB);
173
176 BranchInst *BI);
177
178private:
179 BasicBlock *splitBlockPreds(BasicBlock *BB, ArrayRef<BasicBlock *> Preds,
180 const char *Suffix);
181 void updateBlockFreqAndEdgeWeight(BasicBlock *PredBB, BasicBlock *BB,
182 BasicBlock *NewBB, BasicBlock *SuccBB,
185 bool HasProfile);
186 /// Check if the block has profile metadata for its outgoing edges.
187 bool doesBlockHaveProfileData(BasicBlock *BB);
188
189 /// Returns analysis preserved by the pass.
190 PreservedAnalyses getPreservedAnalysis() const;
191
192 /// Helper function to run "external" analysis in the middle of JumpThreading.
193 /// It takes care of updating/invalidating other existing analysis
194 /// before/after running the "external" one.
195 template <typename AnalysisT>
196 typename AnalysisT::Result *runExternalAnalysis();
197
198 /// Returns an existing instance of BPI if any, otherwise nullptr. By
199 /// "existing" we mean either cached result provided by FunctionAnalysisManger
200 /// or created by preceding call to 'getOrCreateBPI'.
201 BranchProbabilityInfo *getBPI();
202
203 /// Returns an existing instance of BFI if any, otherwise nullptr. By
204 /// "existing" we mean either cached result provided by FunctionAnalysisManger
205 /// or created by preceding call to 'getOrCreateBFI'.
206 BlockFrequencyInfo *getBFI();
207
208 /// Returns an existing instance of BPI if any, otherwise:
209 /// if 'HasProfile' is true creates new instance through
210 /// FunctionAnalysisManager, otherwise nullptr.
211 BranchProbabilityInfo *getOrCreateBPI(bool Force = false);
212
213 /// Returns an existing instance of BFI if any, otherwise:
214 /// if 'HasProfile' is true creates new instance through
215 /// FunctionAnalysisManager, otherwise nullptr.
216 BlockFrequencyInfo *getOrCreateBFI(bool Force = false);
217
218 // Internal overload of evaluateOnPredecessorEdge().
220 Value *cond, const DataLayout &DL,
221 SmallPtrSet<Value *, 8> &Visited);
222};
223
224} // end namespace llvm
225
226#endif // LLVM_TRANSFORMS_SCALAR_JUMPTHREADING_H
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define LLVM_ABI
Definition Compiler.h:213
This file defines the DenseSet and SmallDenseSet classes.
#define F(x, y, z)
Definition MD5.cpp:54
#define T
const SmallVectorImpl< MachineOperand > & Cond
This file defines the SmallSet class.
This file defines the SmallVector class.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
LLVM Basic Block Representation.
Definition BasicBlock.h:62
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Conditional or Unconditional Branch instruction.
Analysis providing branch probability information.
This class is the base class for the comparison instructions.
Definition InstrTypes.h:664
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:63
A wrapper class for inspecting calls to intrinsic functions.
LLVM_ABI bool simplifyPartiallyRedundantLoad(LoadInst *LI)
simplifyPartiallyRedundantLoad - If LoadI is an obviously partially redundant load instruction,...
LLVM_ABI bool processBranchOnXOR(BinaryOperator *BO)
processBranchOnXOR - We have an otherwise unthreadable conditional branch on a xor instruction in the...
LLVM_ABI bool processGuards(BasicBlock *BB)
Try to propagate a guard from the current BB into one of its predecessors in case if another branch o...
LLVM_ABI void updateSSA(BasicBlock *BB, BasicBlock *NewBB, ValueToValueMapTy &ValueMapping)
Update the SSA form.
bool computeValueKnownInPredecessors(Value *V, BasicBlock *BB, jumpthreading::PredValueInfo &Result, jumpthreading::ConstantPreference Preference, Instruction *CxtI=nullptr)
LLVM_ABI void findLoopHeaders(Function &F)
findLoopHeaders - We do not want jump threading to turn proper loop structures into irreducible loops...
LLVM_ABI bool maybeMergeBasicBlockIntoOnlyPred(BasicBlock *BB)
Merge basic block BB into its sole predecessor if possible.
LLVM_ABI JumpThreadingPass(int T=-1)
LLVM_ABI void cloneInstructions(ValueToValueMapTy &ValueMapping, BasicBlock::iterator BI, BasicBlock::iterator BE, BasicBlock *NewBB, BasicBlock *PredBB)
Clone instructions in range [BI, BE) to NewBB.
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
LLVM_ABI Constant * evaluateOnPredecessorEdge(BasicBlock *BB, BasicBlock *PredPredBB, Value *cond, const DataLayout &DL)
LLVM_ABI bool processBranchOnPHI(PHINode *PN)
processBranchOnPHI - We have an otherwise unthreadable conditional branch on a PHI node (or freeze PH...
LLVM_ABI bool maybethreadThroughTwoBasicBlocks(BasicBlock *BB, Value *Cond)
Attempt to thread through two successive basic blocks.
LLVM_ABI bool computeValueKnownInPredecessorsImpl(Value *V, BasicBlock *BB, jumpthreading::PredValueInfo &Result, jumpthreading::ConstantPreference Preference, SmallPtrSet< Value *, 4 > &RecursionSet, Instruction *CxtI=nullptr)
computeValueKnownInPredecessors - Given a basic block BB and a value V, see if we can infer that the ...
LLVM_ABI void unfoldSelectInstr(BasicBlock *Pred, BasicBlock *BB, SelectInst *SI, PHINode *SIUse, unsigned Idx)
DomTreeUpdater * getDomTreeUpdater() const
LLVM_ABI bool runImpl(Function &F, FunctionAnalysisManager *FAM, TargetLibraryInfo *TLI, TargetTransformInfo *TTI, LazyValueInfo *LVI, AAResults *AA, std::unique_ptr< DomTreeUpdater > DTU, BlockFrequencyInfo *BFI, BranchProbabilityInfo *BPI)
LLVM_ABI bool processThreadableEdges(Value *Cond, BasicBlock *BB, jumpthreading::ConstantPreference Preference, Instruction *CxtI=nullptr)
LLVM_ABI bool processBlock(BasicBlock *BB)
processBlock - If there are any predecessors whose control can be threaded through to a successor,...
LLVM_ABI bool processImpliedCondition(BasicBlock *BB)
LLVM_ABI bool duplicateCondBranchOnPHIIntoPred(BasicBlock *BB, const SmallVectorImpl< BasicBlock * > &PredBBs)
duplicateCondBranchOnPHIIntoPred - PredBB contains an unconditional branch to BB which contains an i1...
LLVM_ABI void threadThroughTwoBasicBlocks(BasicBlock *PredPredBB, BasicBlock *PredBB, BasicBlock *BB, BasicBlock *SuccBB)
LLVM_ABI bool tryThreadEdge(BasicBlock *BB, const SmallVectorImpl< BasicBlock * > &PredBBs, BasicBlock *SuccBB)
tryThreadEdge - Thread an edge if it's safe and profitable to do so.
LLVM_ABI bool tryToUnfoldSelect(CmpInst *CondCmp, BasicBlock *BB)
tryToUnfoldSelect - Look for blocks of the form bb1: a = select br bb2
LLVM_ABI bool tryToUnfoldSelectInCurrBB(BasicBlock *BB)
tryToUnfoldSelectInCurrBB - Look for PHI/Select or PHI/CMP/Select in the same BB in the form bb: p = ...
LLVM_ABI void threadEdge(BasicBlock *BB, const SmallVectorImpl< BasicBlock * > &PredBBs, BasicBlock *SuccBB)
threadEdge - We have decided that it is safe and profitable to factor the blocks in PredBBs to one pr...
LLVM_ABI bool threadGuard(BasicBlock *BB, IntrinsicInst *Guard, BranchInst *BI)
Try to propagate the guard from BB which is the lower block of a diamond to one of its branches,...
This pass computes, caches, and vends lazy value constraint information.
An instruction for reading from memory.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
This class represents the LLVM 'select' instruction.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
Definition SmallSet.h:133
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Multiway switch.
Provides information about what library functions are available for the current target.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
LLVM Value Representation.
Definition Value.h:75
A private "module" namespace for types and utilities used by JumpThreading.
SmallVector< std::pair< Constant *, BasicBlock * >, 8 > PredValueInfoTy
SmallVectorImpl< std::pair< Constant *, BasicBlock * > > PredValueInfo
This is an optimization pass for GlobalISel generic memory operations.
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
A CRTP mix-in to automatically provide informational APIs needed for passes.
Definition PassManager.h:69