1 //===- PredicateInfo.h - Build PredicateInfo ----------------------*-C++-*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 /// 10 /// \file 11 /// This file implements the PredicateInfo analysis, which creates an Extended 12 /// SSA form for operations used in branch comparisons and llvm.assume 13 /// comparisons. 14 /// 15 /// Copies of these operations are inserted into the true/false edge (and after 16 /// assumes), and information attached to the copies. All uses of the original 17 /// operation in blocks dominated by the true/false edge (and assume), are 18 /// replaced with uses of the copies. This enables passes to easily and sparsely 19 /// propagate condition based info into the operations that may be affected. 20 /// 21 /// Example: 22 /// %cmp = icmp eq i32 %x, 50 23 /// br i1 %cmp, label %true, label %false 24 /// true: 25 /// ret i32 %x 26 /// false: 27 /// ret i32 1 28 /// 29 /// will become 30 /// 31 /// %cmp = icmp eq i32, %x, 50 32 /// br i1 %cmp, label %true, label %false 33 /// true: 34 /// %x.0 = call \@llvm.ssa_copy.i32(i32 %x) 35 /// ret i32 %x.0 36 /// false: 37 /// ret i32 1 38 /// 39 /// Using getPredicateInfoFor on x.0 will give you the comparison it is 40 /// dominated by (the icmp), and that you are located in the true edge of that 41 /// comparison, which tells you x.0 is 50. 42 /// 43 /// In order to reduce the number of copies inserted, predicateinfo is only 44 /// inserted where it would actually be live. This means if there are no uses of 45 /// an operation dominated by the branch edges, or by an assume, the associated 46 /// predicate info is never inserted. 47 /// 48 /// 49 //===----------------------------------------------------------------------===// 50 51 #ifndef LLVM_TRANSFORMS_UTILS_PREDICATEINFO_H 52 #define LLVM_TRANSFORMS_UTILS_PREDICATEINFO_H 53 54 #include "llvm/ADT/DenseMap.h" 55 #include "llvm/ADT/DenseSet.h" 56 #include "llvm/ADT/SmallPtrSet.h" 57 #include "llvm/ADT/SmallSet.h" 58 #include "llvm/ADT/SmallVector.h" 59 #include "llvm/ADT/ilist.h" 60 #include "llvm/ADT/ilist_node.h" 61 #include "llvm/ADT/iterator.h" 62 #include "llvm/Analysis/AssumptionCache.h" 63 #include "llvm/Analysis/OrderedInstructions.h" 64 #include "llvm/IR/BasicBlock.h" 65 #include "llvm/IR/Dominators.h" 66 #include "llvm/IR/Instructions.h" 67 #include "llvm/IR/IntrinsicInst.h" 68 #include "llvm/IR/Module.h" 69 #include "llvm/IR/OperandTraits.h" 70 #include "llvm/IR/Type.h" 71 #include "llvm/IR/Use.h" 72 #include "llvm/IR/User.h" 73 #include "llvm/IR/Value.h" 74 #include "llvm/IR/ValueHandle.h" 75 #include "llvm/Pass.h" 76 #include "llvm/PassAnalysisSupport.h" 77 #include "llvm/Support/Casting.h" 78 #include "llvm/Support/Compiler.h" 79 #include "llvm/Support/ErrorHandling.h" 80 #include <algorithm> 81 #include <cassert> 82 #include <cstddef> 83 #include <iterator> 84 #include <memory> 85 #include <utility> 86 87 namespace llvm { 88 89 class DominatorTree; 90 class Function; 91 class Instruction; 92 class MemoryAccess; 93 class LLVMContext; 94 class raw_ostream; 95 96 enum PredicateType { PT_Branch, PT_Assume, PT_Switch }; 97 98 // Base class for all predicate information we provide. 99 // All of our predicate information has at least a comparison. 100 class PredicateBase : public ilist_node<PredicateBase> { 101 public: 102 PredicateType Type; 103 // The original operand before we renamed it. 104 // This can be use by passes, when destroying predicateinfo, to know 105 // whether they can just drop the intrinsic, or have to merge metadata. 106 Value *OriginalOp; 107 PredicateBase(const PredicateBase &) = delete; 108 PredicateBase &operator=(const PredicateBase &) = delete; 109 PredicateBase() = delete; 110 virtual ~PredicateBase() = default; 111 112 protected: 113 PredicateBase(PredicateType PT, Value *Op) : Type(PT), OriginalOp(Op) {} 114 }; 115 116 class PredicateWithCondition : public PredicateBase { 117 public: 118 Value *Condition; 119 static bool classof(const PredicateBase *PB) { 120 return PB->Type == PT_Assume || PB->Type == PT_Branch || 121 PB->Type == PT_Switch; 122 } 123 124 protected: 125 PredicateWithCondition(PredicateType PT, Value *Op, Value *Condition) 126 : PredicateBase(PT, Op), Condition(Condition) {} 127 }; 128 129 // Provides predicate information for assumes. Since assumes are always true, 130 // we simply provide the assume instruction, so you can tell your relative 131 // position to it. 132 class PredicateAssume : public PredicateWithCondition { 133 public: 134 IntrinsicInst *AssumeInst; 135 PredicateAssume(Value *Op, IntrinsicInst *AssumeInst, Value *Condition) 136 : PredicateWithCondition(PT_Assume, Op, Condition), 137 AssumeInst(AssumeInst) {} 138 PredicateAssume() = delete; 139 static bool classof(const PredicateBase *PB) { 140 return PB->Type == PT_Assume; 141 } 142 }; 143 144 // Mixin class for edge predicates. The FROM block is the block where the 145 // predicate originates, and the TO block is the block where the predicate is 146 // valid. 147 class PredicateWithEdge : public PredicateWithCondition { 148 public: 149 BasicBlock *From; 150 BasicBlock *To; 151 PredicateWithEdge() = delete; 152 static bool classof(const PredicateBase *PB) { 153 return PB->Type == PT_Branch || PB->Type == PT_Switch; 154 } 155 156 protected: 157 PredicateWithEdge(PredicateType PType, Value *Op, BasicBlock *From, 158 BasicBlock *To, Value *Cond) 159 : PredicateWithCondition(PType, Op, Cond), From(From), To(To) {} 160 }; 161 162 // Provides predicate information for branches. 163 class PredicateBranch : public PredicateWithEdge { 164 public: 165 // If true, SplitBB is the true successor, otherwise it's the false successor. 166 bool TrueEdge; 167 PredicateBranch(Value *Op, BasicBlock *BranchBB, BasicBlock *SplitBB, 168 Value *Condition, bool TakenEdge) 169 : PredicateWithEdge(PT_Branch, Op, BranchBB, SplitBB, Condition), 170 TrueEdge(TakenEdge) {} 171 PredicateBranch() = delete; 172 static bool classof(const PredicateBase *PB) { 173 return PB->Type == PT_Branch; 174 } 175 }; 176 177 class PredicateSwitch : public PredicateWithEdge { 178 public: 179 Value *CaseValue; 180 // This is the switch instruction. 181 SwitchInst *Switch; 182 PredicateSwitch(Value *Op, BasicBlock *SwitchBB, BasicBlock *TargetBB, 183 Value *CaseValue, SwitchInst *SI) 184 : PredicateWithEdge(PT_Switch, Op, SwitchBB, TargetBB, 185 SI->getCondition()), 186 CaseValue(CaseValue), Switch(SI) {} 187 PredicateSwitch() = delete; 188 static bool classof(const PredicateBase *PB) { 189 return PB->Type == PT_Switch; 190 } 191 }; 192 193 // This name is used in a few places, so kick it into their own namespace 194 namespace PredicateInfoClasses { 195 struct ValueDFS; 196 } 197 198 /// Encapsulates PredicateInfo, including all data associated with memory 199 /// accesses. 200 class PredicateInfo { 201 private: 202 // Used to store information about each value we might rename. 203 struct ValueInfo { 204 // Information about each possible copy. During processing, this is each 205 // inserted info. After processing, we move the uninserted ones to the 206 // uninserted vector. 207 SmallVector<PredicateBase *, 4> Infos; 208 SmallVector<PredicateBase *, 4> UninsertedInfos; 209 }; 210 // This owns the all the predicate infos in the function, placed or not. 211 iplist<PredicateBase> AllInfos; 212 213 public: 214 PredicateInfo(Function &, DominatorTree &, AssumptionCache &); 215 ~PredicateInfo(); 216 217 void verifyPredicateInfo() const; 218 219 void dump() const; 220 void print(raw_ostream &) const; 221 222 const PredicateBase *getPredicateInfoFor(const Value *V) const { 223 return PredicateMap.lookup(V); 224 } 225 226 protected: 227 // Used by PredicateInfo annotater, dumpers, and wrapper pass. 228 friend class PredicateInfoAnnotatedWriter; 229 friend class PredicateInfoPrinterLegacyPass; 230 231 private: 232 void buildPredicateInfo(); 233 void processAssume(IntrinsicInst *, BasicBlock *, SmallPtrSetImpl<Value *> &); 234 void processBranch(BranchInst *, BasicBlock *, SmallPtrSetImpl<Value *> &); 235 void processSwitch(SwitchInst *, BasicBlock *, SmallPtrSetImpl<Value *> &); 236 void renameUses(SmallPtrSetImpl<Value *> &); 237 using ValueDFS = PredicateInfoClasses::ValueDFS; 238 typedef SmallVectorImpl<ValueDFS> ValueDFSStack; 239 void convertUsesToDFSOrdered(Value *, SmallVectorImpl<ValueDFS> &); 240 Value *materializeStack(unsigned int &, ValueDFSStack &, Value *); 241 bool stackIsInScope(const ValueDFSStack &, const ValueDFS &) const; 242 void popStackUntilDFSScope(ValueDFSStack &, const ValueDFS &); 243 ValueInfo &getOrCreateValueInfo(Value *); 244 void addInfoFor(SmallPtrSetImpl<Value *> &OpsToRename, Value *Op, 245 PredicateBase *PB); 246 const ValueInfo &getValueInfo(Value *) const; 247 Function &F; 248 DominatorTree &DT; 249 AssumptionCache &AC; 250 OrderedInstructions OI; 251 // This maps from copy operands to Predicate Info. Note that it does not own 252 // the Predicate Info, they belong to the ValueInfo structs in the ValueInfos 253 // vector. 254 DenseMap<const Value *, const PredicateBase *> PredicateMap; 255 // This stores info about each operand or comparison result we make copies 256 // of. The real ValueInfos start at index 1, index 0 is unused so that we can 257 // more easily detect invalid indexing. 258 SmallVector<ValueInfo, 32> ValueInfos; 259 // This gives the index into the ValueInfos array for a given Value. Because 260 // 0 is not a valid Value Info index, you can use DenseMap::lookup and tell 261 // whether it returned a valid result. 262 DenseMap<Value *, unsigned int> ValueInfoNums; 263 // The set of edges along which we can only handle phi uses, due to critical 264 // edges. 265 DenseSet<std::pair<BasicBlock *, BasicBlock *>> EdgeUsesOnly; 266 // The set of ssa_copy declarations we created with our custom mangling. 267 SmallSet<AssertingVH<Function>, 20> CreatedDeclarations; 268 }; 269 270 // This pass does eager building and then printing of PredicateInfo. It is used 271 // by 272 // the tests to be able to build, dump, and verify PredicateInfo. 273 class PredicateInfoPrinterLegacyPass : public FunctionPass { 274 public: 275 PredicateInfoPrinterLegacyPass(); 276 277 static char ID; 278 bool runOnFunction(Function &) override; 279 void getAnalysisUsage(AnalysisUsage &AU) const override; 280 }; 281 282 /// Printer pass for \c PredicateInfo. 283 class PredicateInfoPrinterPass 284 : public PassInfoMixin<PredicateInfoPrinterPass> { 285 raw_ostream &OS; 286 287 public: 288 explicit PredicateInfoPrinterPass(raw_ostream &OS) : OS(OS) {} 289 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 290 }; 291 292 /// Verifier pass for \c PredicateInfo. 293 struct PredicateInfoVerifierPass : PassInfoMixin<PredicateInfoVerifierPass> { 294 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 295 }; 296 297 } // end namespace llvm 298 299 #endif // LLVM_TRANSFORMS_UTILS_PREDICATEINFO_H 300