1 //===- PredicateInfo.h - Build PredicateInfo ----------------------*-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 /// This file implements the PredicateInfo analysis, which creates an Extended 11 /// SSA form for operations used in branch comparisons and llvm.assume 12 /// comparisons. 13 /// 14 /// Copies of these operations are inserted into the true/false edge (and after 15 /// assumes), and information attached to the copies. All uses of the original 16 /// operation in blocks dominated by the true/false edge (and assume), are 17 /// replaced with uses of the copies. This enables passes to easily and sparsely 18 /// propagate condition based info into the operations that may be affected. 19 /// 20 /// Example: 21 /// %cmp = icmp eq i32 %x, 50 22 /// br i1 %cmp, label %true, label %false 23 /// true: 24 /// ret i32 %x 25 /// false: 26 /// ret i32 1 27 /// 28 /// will become 29 /// 30 /// %cmp = icmp eq i32, %x, 50 31 /// br i1 %cmp, label %true, label %false 32 /// true: 33 /// %x.0 = call \@llvm.ssa_copy.i32(i32 %x) 34 /// ret i32 %x.0 35 /// false: 36 /// ret i32 1 37 /// 38 /// Using getPredicateInfoFor on x.0 will give you the comparison it is 39 /// dominated by (the icmp), and that you are located in the true edge of that 40 /// comparison, which tells you x.0 is 50. 41 /// 42 /// In order to reduce the number of copies inserted, predicateinfo is only 43 /// inserted where it would actually be live. This means if there are no uses of 44 /// an operation dominated by the branch edges, or by an assume, the associated 45 /// predicate info is never inserted. 46 /// 47 /// 48 //===----------------------------------------------------------------------===// 49 50 #ifndef LLVM_TRANSFORMS_UTILS_PREDICATEINFO_H 51 #define LLVM_TRANSFORMS_UTILS_PREDICATEINFO_H 52 53 #include "llvm/ADT/DenseMap.h" 54 #include "llvm/ADT/ilist.h" 55 #include "llvm/ADT/ilist_node.h" 56 #include "llvm/IR/Instructions.h" 57 #include "llvm/IR/PassManager.h" 58 #include "llvm/IR/Value.h" 59 #include "llvm/Pass.h" 60 61 namespace llvm { 62 63 class AssumptionCache; 64 class DominatorTree; 65 class Function; 66 class IntrinsicInst; 67 class raw_ostream; 68 69 enum PredicateType { PT_Branch, PT_Assume, PT_Switch }; 70 71 /// Constraint for a predicate of the form "cmp Pred Op, OtherOp", where Op 72 /// is the value the constraint applies to (the ssa.copy result). 73 struct PredicateConstraint { 74 CmpInst::Predicate Predicate; 75 Value *OtherOp; 76 }; 77 78 // Base class for all predicate information we provide. 79 // All of our predicate information has at least a comparison. 80 class PredicateBase : public ilist_node<PredicateBase> { 81 public: 82 PredicateType Type; 83 // The original operand before we renamed it. 84 // This can be use by passes, when destroying predicateinfo, to know 85 // whether they can just drop the intrinsic, or have to merge metadata. 86 Value *OriginalOp; 87 // The renamed operand in the condition used for this predicate. For nested 88 // predicates, this is different to OriginalOp which refers to the initial 89 // operand. 90 Value *RenamedOp; 91 // The condition associated with this predicate. 92 Value *Condition; 93 94 PredicateBase(const PredicateBase &) = delete; 95 PredicateBase &operator=(const PredicateBase &) = delete; 96 PredicateBase() = delete; 97 virtual ~PredicateBase() = default; classof(const PredicateBase * PB)98 static bool classof(const PredicateBase *PB) { 99 return PB->Type == PT_Assume || PB->Type == PT_Branch || 100 PB->Type == PT_Switch; 101 } 102 103 /// Fetch condition in the form of PredicateConstraint, if possible. 104 Optional<PredicateConstraint> getConstraint() const; 105 106 protected: PredicateBase(PredicateType PT,Value * Op,Value * Condition)107 PredicateBase(PredicateType PT, Value *Op, Value *Condition) 108 : Type(PT), OriginalOp(Op), Condition(Condition) {} 109 }; 110 111 // Provides predicate information for assumes. Since assumes are always true, 112 // we simply provide the assume instruction, so you can tell your relative 113 // position to it. 114 class PredicateAssume : public PredicateBase { 115 public: 116 IntrinsicInst *AssumeInst; PredicateAssume(Value * Op,IntrinsicInst * AssumeInst,Value * Condition)117 PredicateAssume(Value *Op, IntrinsicInst *AssumeInst, Value *Condition) 118 : PredicateBase(PT_Assume, Op, Condition), AssumeInst(AssumeInst) {} 119 PredicateAssume() = delete; classof(const PredicateBase * PB)120 static bool classof(const PredicateBase *PB) { 121 return PB->Type == PT_Assume; 122 } 123 }; 124 125 // Mixin class for edge predicates. The FROM block is the block where the 126 // predicate originates, and the TO block is the block where the predicate is 127 // valid. 128 class PredicateWithEdge : public PredicateBase { 129 public: 130 BasicBlock *From; 131 BasicBlock *To; 132 PredicateWithEdge() = delete; classof(const PredicateBase * PB)133 static bool classof(const PredicateBase *PB) { 134 return PB->Type == PT_Branch || PB->Type == PT_Switch; 135 } 136 137 protected: PredicateWithEdge(PredicateType PType,Value * Op,BasicBlock * From,BasicBlock * To,Value * Cond)138 PredicateWithEdge(PredicateType PType, Value *Op, BasicBlock *From, 139 BasicBlock *To, Value *Cond) 140 : PredicateBase(PType, Op, Cond), From(From), To(To) {} 141 }; 142 143 // Provides predicate information for branches. 144 class PredicateBranch : public PredicateWithEdge { 145 public: 146 // If true, SplitBB is the true successor, otherwise it's the false successor. 147 bool TrueEdge; PredicateBranch(Value * Op,BasicBlock * BranchBB,BasicBlock * SplitBB,Value * Condition,bool TakenEdge)148 PredicateBranch(Value *Op, BasicBlock *BranchBB, BasicBlock *SplitBB, 149 Value *Condition, bool TakenEdge) 150 : PredicateWithEdge(PT_Branch, Op, BranchBB, SplitBB, Condition), 151 TrueEdge(TakenEdge) {} 152 PredicateBranch() = delete; classof(const PredicateBase * PB)153 static bool classof(const PredicateBase *PB) { 154 return PB->Type == PT_Branch; 155 } 156 }; 157 158 class PredicateSwitch : public PredicateWithEdge { 159 public: 160 Value *CaseValue; 161 // This is the switch instruction. 162 SwitchInst *Switch; PredicateSwitch(Value * Op,BasicBlock * SwitchBB,BasicBlock * TargetBB,Value * CaseValue,SwitchInst * SI)163 PredicateSwitch(Value *Op, BasicBlock *SwitchBB, BasicBlock *TargetBB, 164 Value *CaseValue, SwitchInst *SI) 165 : PredicateWithEdge(PT_Switch, Op, SwitchBB, TargetBB, 166 SI->getCondition()), 167 CaseValue(CaseValue), Switch(SI) {} 168 PredicateSwitch() = delete; classof(const PredicateBase * PB)169 static bool classof(const PredicateBase *PB) { 170 return PB->Type == PT_Switch; 171 } 172 }; 173 174 /// Encapsulates PredicateInfo, including all data associated with memory 175 /// accesses. 176 class PredicateInfo { 177 public: 178 PredicateInfo(Function &, DominatorTree &, AssumptionCache &); 179 ~PredicateInfo() = default; 180 181 void verifyPredicateInfo() const; 182 183 void dump() const; 184 void print(raw_ostream &) const; 185 getPredicateInfoFor(const Value * V)186 const PredicateBase *getPredicateInfoFor(const Value *V) const { 187 return PredicateMap.lookup(V); 188 } 189 190 protected: 191 // Used by PredicateInfo annotater, dumpers, and wrapper pass. 192 friend class PredicateInfoAnnotatedWriter; 193 friend class PredicateInfoPrinterLegacyPass; 194 friend class PredicateInfoBuilder; 195 196 private: 197 Function &F; 198 199 // This owns the all the predicate infos in the function, placed or not. 200 iplist<PredicateBase> AllInfos; 201 202 // This maps from copy operands to Predicate Info. Note that it does not own 203 // the Predicate Info, they belong to the ValueInfo structs in the ValueInfos 204 // vector. 205 DenseMap<const Value *, const PredicateBase *> PredicateMap; 206 }; 207 208 // This pass does eager building and then printing of PredicateInfo. It is used 209 // by 210 // the tests to be able to build, dump, and verify PredicateInfo. 211 class PredicateInfoPrinterLegacyPass : public FunctionPass { 212 public: 213 PredicateInfoPrinterLegacyPass(); 214 215 static char ID; 216 bool runOnFunction(Function &) override; 217 void getAnalysisUsage(AnalysisUsage &AU) const override; 218 }; 219 220 /// Printer pass for \c PredicateInfo. 221 class PredicateInfoPrinterPass 222 : public PassInfoMixin<PredicateInfoPrinterPass> { 223 raw_ostream &OS; 224 225 public: PredicateInfoPrinterPass(raw_ostream & OS)226 explicit PredicateInfoPrinterPass(raw_ostream &OS) : OS(OS) {} 227 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 228 }; 229 230 /// Verifier pass for \c PredicateInfo. 231 struct PredicateInfoVerifierPass : PassInfoMixin<PredicateInfoVerifierPass> { 232 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 233 }; 234 235 } // end namespace llvm 236 237 #endif // LLVM_TRANSFORMS_UTILS_PREDICATEINFO_H 238