Home | History | Annotate | Line # | Download | only in Utils
      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;
     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:
    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;
    117   PredicateAssume(Value *Op, IntrinsicInst *AssumeInst, Value *Condition)
    118       : PredicateBase(PT_Assume, Op, Condition), AssumeInst(AssumeInst) {}
    119   PredicateAssume() = delete;
    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;
    133   static bool classof(const PredicateBase *PB) {
    134     return PB->Type == PT_Branch || PB->Type == PT_Switch;
    135   }
    136 
    137 protected:
    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;
    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;
    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;
    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;
    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 
    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:
    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