LLVM 24.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 CondBrInst;
35class CmpInst;
36class Constant;
37class Function;
38class Instruction;
39class IntrinsicInst;
40class LazyValueInfo;
41class LoadInst;
42class PHINode;
43struct ScalarOptions;
44class SelectInst;
45class SwitchInst;
48class Value;
49
50/// A private "module" namespace for types and utilities used by
51/// JumpThreading.
52/// These are implementation details and should not be used by clients.
53namespace jumpthreading {
54
55// These are at global scope so static functions can use them too.
58
59// This is used to keep track of what kind of constant we're currently hoping
60// to find.
62
63} // end namespace jumpthreading
64
65/// This pass performs 'jump threading', which looks at blocks that have
66/// multiple predecessors and multiple successors. If one or more of the
67/// predecessors of the block can be proven to always jump to one of the
68/// successors, we forward the edge from the predecessor to the successor by
69/// duplicating the contents of this block.
70///
71/// An example of when this can occur is code like this:
72///
73/// if () { ...
74/// X = 4;
75/// }
76/// if (X < 3) {
77///
78/// In this case, the unconditional branch at the end of the first if can be
79/// revectored to the false side of the second if.
80class JumpThreadingPass : public OptionalPassInfoMixin<JumpThreadingPass> {
81 const ScalarOptions *Opts = nullptr;
82 Function *F = nullptr;
83 FunctionAnalysisManager *FAM = nullptr;
84 TargetLibraryInfo *TLI = nullptr;
85 TargetTransformInfo *TTI = nullptr;
86 LazyValueInfo *LVI = nullptr;
87 AAResults *AA = nullptr;
88 std::unique_ptr<DomTreeUpdater> DTU;
89 BlockFrequencyInfo *BFI = nullptr;
90 BranchProbabilityInfo *BPI = nullptr;
91 bool ChangedSinceLastAnalysisUpdate = false;
92 bool HasGuards = false;
93#ifndef LLVM_ENABLE_ABI_BREAKING_CHECKS
95#else
97#endif
98
99 // JumpThreading must not processes blocks unreachable from entry. It's a
100 // waste of compute time and can potentially lead to hangs.
102
103 unsigned BBDupThreshold;
104 unsigned DefaultBBDupThreshold;
105
106public:
107 LLVM_ABI JumpThreadingPass(int T = -1);
108
109 // Glue for old PM.
112 LazyValueInfo *LVI, AAResults *AA,
113 std::unique_ptr<DomTreeUpdater> DTU,
115
117
118 DomTreeUpdater *getDomTreeUpdater() const { return DTU.get(); }
122 LLVM_ABI void updateSSA(BasicBlock *BB, BasicBlock *NewBB,
123 ValueToValueMapTy &ValueMapping);
127 BasicBlock *PredBB);
129 const SmallVectorImpl<BasicBlock *> &PredBBs,
130 BasicBlock *SuccBB);
132 const SmallVectorImpl<BasicBlock *> &PredBBs,
133 BasicBlock *SuccBB);
135 BasicBlock *BB, const SmallVectorImpl<BasicBlock *> &PredBBs);
136
140 SmallPtrSet<Value *, 4> &RecursionSet, Instruction *CtxI = nullptr);
141 bool
145 Instruction *CtxI = nullptr) {
146 SmallPtrSet<Value *, 4> RecursionSet;
147 return computeValueKnownInPredecessorsImpl(V, BB, Result, Preference,
148 RecursionSet, CtxI);
149 }
150
152 BasicBlock *PredPredBB,
153 Value *cond,
154 const DataLayout &DL);
157 BasicBlock *PredBB, BasicBlock *BB,
158 BasicBlock *SuccBB);
159 LLVM_ABI bool
162 Instruction *CtxI = nullptr);
163
167
170 SelectInst *SI, PHINode *SIUse, unsigned Idx);
171
172 LLVM_ABI bool tryToUnfoldSelect(CmpInst *CondCmp, BasicBlock *BB);
175
178 CondBrInst *BI);
179
180private:
181 BasicBlock *splitBlockPreds(BasicBlock *BB, ArrayRef<BasicBlock *> Preds,
182 const char *Suffix);
183 void updateBlockFreqAndEdgeWeight(BasicBlock *PredBB, BasicBlock *BB,
184 BasicBlock *NewBB, BasicBlock *SuccBB,
187 bool HasProfile);
188 /// Check if the block has profile metadata for its outgoing edges.
189 bool doesBlockHaveProfileData(BasicBlock *BB);
190
191 /// Returns analysis preserved by the pass.
192 PreservedAnalyses getPreservedAnalysis() const;
193
194 /// Helper function to run "external" analysis in the middle of JumpThreading.
195 /// It takes care of updating/invalidating other existing analysis
196 /// before/after running the "external" one.
197 template <typename AnalysisT>
198 typename AnalysisT::Result *runExternalAnalysis();
199
200 /// Returns an existing instance of BPI if any, otherwise nullptr. By
201 /// "existing" we mean either cached result provided by FunctionAnalysisManger
202 /// or created by preceding call to 'getOrCreateBPI'.
203 BranchProbabilityInfo *getBPI();
204
205 /// Returns an existing instance of BFI if any, otherwise nullptr. By
206 /// "existing" we mean either cached result provided by FunctionAnalysisManger
207 /// or created by preceding call to 'getOrCreateBFI'.
208 BlockFrequencyInfo *getBFI();
209
210 /// Returns an existing instance of BPI if any, otherwise:
211 /// if 'HasProfile' is true creates new instance through
212 /// FunctionAnalysisManager, otherwise nullptr.
213 BranchProbabilityInfo *getOrCreateBPI(bool Force = false);
214
215 /// Returns an existing instance of BFI if any, otherwise:
216 /// if 'HasProfile' is true creates new instance through
217 /// FunctionAnalysisManager, otherwise nullptr.
218 BlockFrequencyInfo *getOrCreateBFI(bool Force = false);
219
220 // Internal overload of evaluateOnPredecessorEdge().
222 Value *cond, const DataLayout &DL,
223 SmallPtrSet<Value *, 8> &Visited);
224};
225
226} // end namespace llvm
227
228#endif // LLVM_TRANSFORMS_SCALAR_JUMPTHREADING_H
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define LLVM_ABI
Definition Compiler.h:215
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.
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...
Analysis providing branch probability information.
This class is the base class for the comparison instructions.
Definition InstrTypes.h:728
Conditional Branch instruction.
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:64
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.
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 bool computeValueKnownInPredecessorsImpl(Value *V, BasicBlock *BB, jumpthreading::PredValueInfo &Result, jumpthreading::ConstantPreference Preference, SmallPtrSet< Value *, 4 > &RecursionSet, Instruction *CtxI=nullptr)
computeValueKnownInPredecessors - Given a basic block BB and a value V, see if we can infer that the ...
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 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 *CtxI=nullptr)
LLVM_ABI bool threadGuard(BasicBlock *BB, IntrinsicInst *Guard, CondBrInst *BI)
Try to propagate the guard from BB which is the lower block of a diamond to one of its branches,...
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 = ...
bool computeValueKnownInPredecessors(Value *V, BasicBlock *BB, jumpthreading::PredValueInfo &Result, jumpthreading::ConstantPreference Preference, Instruction *CtxI=nullptr)
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...
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:134
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 for passes that can be skipped.