LCOV - code coverage report
Current view: top level - include/llvm/Analysis - InstructionSimplify.h (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 18 34 52.9 %
Date: 2018-10-20 13:21:21 Functions: 0 7 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===-- InstructionSimplify.h - Fold instrs into simpler forms --*- 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             : // This file declares routines for folding instructions into simpler forms
      11             : // that do not require creating new instructions.  This does constant folding
      12             : // ("add i32 1, 1" -> "2") but can also handle non-constant operands, either
      13             : // returning a constant ("and i32 %x, 0" -> "0") or an already existing value
      14             : // ("and i32 %x, %x" -> "%x").  If the simplification is also an instruction
      15             : // then it dominates the original instruction.
      16             : //
      17             : // These routines implicitly resolve undef uses. The easiest way to be safe when
      18             : // using these routines to obtain simplified values for existing instructions is
      19             : // to always replace all uses of the instructions with the resulting simplified
      20             : // values. This will prevent other code from seeing the same undef uses and
      21             : // resolving them to different values.
      22             : //
      23             : // These routines are designed to tolerate moderately incomplete IR, such as
      24             : // instructions that are not connected to basic blocks yet. However, they do
      25             : // require that all the IR that they encounter be valid. In particular, they
      26             : // require that all non-constant values be defined in the same function, and the
      27             : // same call context of that function (and not split between caller and callee
      28             : // contexts of a directly recursive call, for example).
      29             : //
      30             : //===----------------------------------------------------------------------===//
      31             : 
      32             : #ifndef LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H
      33             : #define LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H
      34             : 
      35             : #include "llvm/IR/Instruction.h"
      36             : #include "llvm/IR/Operator.h"
      37             : #include "llvm/IR/User.h"
      38             : 
      39             : namespace llvm {
      40             : class Function;
      41             : template <typename T, typename... TArgs> class AnalysisManager;
      42             : template <class T> class ArrayRef;
      43             : class AssumptionCache;
      44             : class DominatorTree;
      45             : class ImmutableCallSite;
      46             : class DataLayout;
      47             : class FastMathFlags;
      48             : struct LoopStandardAnalysisResults;
      49             : class OptimizationRemarkEmitter;
      50             : class Pass;
      51             : class TargetLibraryInfo;
      52             : class Type;
      53             : class Value;
      54             : class MDNode;
      55             : class BinaryOperator;
      56             : 
      57             : /// InstrInfoQuery provides an interface to query additional information for
      58             : /// instructions like metadata or keywords like nsw, which provides conservative
      59             : /// results if the users specified it is safe to use.
      60             : struct InstrInfoQuery {
      61    70113018 :   InstrInfoQuery(bool UMD) : UseInstrInfo(UMD) {}
      62    56763874 :   InstrInfoQuery() : UseInstrInfo(true) {}
      63             :   bool UseInstrInfo = true;
      64             : 
      65           0 :   MDNode *getMetadata(const Instruction *I, unsigned KindID) const {
      66    36565451 :     if (UseInstrInfo)
      67             :       return I->getMetadata(KindID);
      68             :     return nullptr;
      69             :   }
      70             : 
      71           0 :   template <class InstT> bool hasNoUnsignedWrap(const InstT *Op) const {
      72     2683472 :     if (UseInstrInfo)
      73     2569447 :       return Op->hasNoUnsignedWrap();
      74             :     return false;
      75             :   }
      76           0 : 
      77           0 :   template <class InstT> bool hasNoSignedWrap(const InstT *Op) const {
      78     5369601 :     if (UseInstrInfo)
      79        1421 :       return Op->hasNoSignedWrap();
      80             :     return false;
      81           0 :   }
      82           0 : 
      83           0 :   bool isExact(const BinaryOperator *Op) const {
      84           0 :     if (UseInstrInfo && isa<PossiblyExactOperator>(Op))
      85             :       return cast<PossiblyExactOperator>(Op)->isExact();
      86             :     return false;
      87           0 :   }
      88     2616422 : };
      89     2569571 : 
      90             : struct SimplifyQuery {
      91             :   const DataLayout &DL;
      92           0 :   const TargetLibraryInfo *TLI = nullptr;
      93           0 :   const DominatorTree *DT = nullptr;
      94           0 :   AssumptionCache *AC = nullptr;
      95             :   const Instruction *CxtI = nullptr;
      96             : 
      97           0 :   // Wrapper to query additional information for instructions like metadata or
      98           0 :   // keywords like nsw, which provides conservative results if those cannot
      99           0 :   // be safely used.
     100             :   const InstrInfoQuery IIQ;
     101             : 
     102             :   SimplifyQuery(const DataLayout &DL, const Instruction *CXTI = nullptr)
     103    44310328 :       : DL(DL), CxtI(CXTI) {}
     104       55169 : 
     105           0 :   SimplifyQuery(const DataLayout &DL, const TargetLibraryInfo *TLI,
     106             :                 const DominatorTree *DT = nullptr,
     107             :                 AssumptionCache *AC = nullptr,
     108             :                 const Instruction *CXTI = nullptr, bool UseInstrInfo = true)
     109     7509763 :       : DL(DL), TLI(TLI), DT(DT), AC(AC), CxtI(CXTI), IIQ(UseInstrInfo) {}
     110             :   SimplifyQuery getWithInstruction(Instruction *I) const {
     111    11451715 :     SimplifyQuery Copy(*this);
     112    11433733 :     Copy.CxtI = I;
     113    12453546 :     return Copy;
     114             :   }
     115             : };
     116             : 
     117             : // NOTE: the explicit multiple argument versions of these functions are
     118             : // deprecated.
     119             : // Please use the SimplifyQuery versions in new code.
     120             : 
     121             : /// Given operands for an Add, fold the result or return null.
     122             : Value *SimplifyAddInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW,
     123             :                        const SimplifyQuery &Q);
     124             : 
     125             : /// Given operands for a Sub, fold the result or return null.
     126             : Value *SimplifySubInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW,
     127             :                        const SimplifyQuery &Q);
     128             : 
     129         165 : /// Given operands for an FAdd, fold the result or return null.
     130             : Value *SimplifyFAddInst(Value *LHS, Value *RHS, FastMathFlags FMF,
     131    52195723 :                         const SimplifyQuery &Q);
     132    52195723 : 
     133             : /// Given operands for an FSub, fold the result or return null.
     134             : Value *SimplifyFSubInst(Value *LHS, Value *RHS, FastMathFlags FMF,
     135             :                         const SimplifyQuery &Q);
     136             : 
     137             : /// Given operands for an FMul, fold the result or return null.
     138             : Value *SimplifyFMulInst(Value *LHS, Value *RHS, FastMathFlags FMF,
     139             :                         const SimplifyQuery &Q);
     140             : 
     141             : /// Given operands for a Mul, fold the result or return null.
     142             : Value *SimplifyMulInst(Value *LHS, Value *RHS, const SimplifyQuery &Q);
     143             : 
     144             : /// Given operands for an SDiv, fold the result or return null.
     145             : Value *SimplifySDivInst(Value *LHS, Value *RHS, const SimplifyQuery &Q);
     146             : 
     147             : /// Given operands for a UDiv, fold the result or return null.
     148             : Value *SimplifyUDivInst(Value *LHS, Value *RHS, const SimplifyQuery &Q);
     149             : 
     150             : /// Given operands for an FDiv, fold the result or return null.
     151             : Value *SimplifyFDivInst(Value *LHS, Value *RHS, FastMathFlags FMF,
     152             :                         const SimplifyQuery &Q);
     153             : 
     154             : /// Given operands for an SRem, fold the result or return null.
     155             : Value *SimplifySRemInst(Value *LHS, Value *RHS, const SimplifyQuery &Q);
     156             : 
     157             : /// Given operands for a URem, fold the result or return null.
     158             : Value *SimplifyURemInst(Value *LHS, Value *RHS, const SimplifyQuery &Q);
     159             : 
     160             : /// Given operands for an FRem, fold the result or return null.
     161             : Value *SimplifyFRemInst(Value *LHS, Value *RHS, FastMathFlags FMF,
     162             :                         const SimplifyQuery &Q);
     163             : 
     164             : /// Given operands for a Shl, fold the result or return null.
     165             : Value *SimplifyShlInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW,
     166             :                        const SimplifyQuery &Q);
     167             : 
     168             : /// Given operands for a LShr, fold the result or return null.
     169             : Value *SimplifyLShrInst(Value *Op0, Value *Op1, bool isExact,
     170             :                         const SimplifyQuery &Q);
     171             : 
     172             : /// Given operands for a AShr, fold the result or return nulll.
     173             : Value *SimplifyAShrInst(Value *Op0, Value *Op1, bool isExact,
     174             :                         const SimplifyQuery &Q);
     175             : 
     176             : /// Given operands for an And, fold the result or return null.
     177             : Value *SimplifyAndInst(Value *LHS, Value *RHS, const SimplifyQuery &Q);
     178             : 
     179             : /// Given operands for an Or, fold the result or return null.
     180             : Value *SimplifyOrInst(Value *LHS, Value *RHS, const SimplifyQuery &Q);
     181             : 
     182             : /// Given operands for an Xor, fold the result or return null.
     183             : Value *SimplifyXorInst(Value *LHS, Value *RHS, const SimplifyQuery &Q);
     184             : 
     185             : /// Given operands for an ICmpInst, fold the result or return null.
     186             : Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
     187             :                         const SimplifyQuery &Q);
     188             : 
     189             : /// Given operands for an FCmpInst, fold the result or return null.
     190             : Value *SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
     191             :                         FastMathFlags FMF, const SimplifyQuery &Q);
     192             : 
     193             : /// Given operands for a SelectInst, fold the result or return null.
     194             : Value *SimplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal,
     195             :                           const SimplifyQuery &Q);
     196             : 
     197             : /// Given operands for a GetElementPtrInst, fold the result or return null.
     198             : Value *SimplifyGEPInst(Type *SrcTy, ArrayRef<Value *> Ops,
     199             :                        const SimplifyQuery &Q);
     200             : 
     201             : /// Given operands for an InsertValueInst, fold the result or return null.
     202             : Value *SimplifyInsertValueInst(Value *Agg, Value *Val, ArrayRef<unsigned> Idxs,
     203             :                                const SimplifyQuery &Q);
     204             : 
     205             : /// Given operands for an InsertElement, fold the result or return null.
     206             : Value *SimplifyInsertElementInst(Value *Vec, Value *Elt, Value *Idx,
     207             :                                  const SimplifyQuery &Q);
     208             : 
     209             : /// Given operands for an ExtractValueInst, fold the result or return null.
     210             : Value *SimplifyExtractValueInst(Value *Agg, ArrayRef<unsigned> Idxs,
     211             :                                 const SimplifyQuery &Q);
     212             : 
     213             : /// Given operands for an ExtractElementInst, fold the result or return null.
     214             : Value *SimplifyExtractElementInst(Value *Vec, Value *Idx,
     215             :                                   const SimplifyQuery &Q);
     216             : 
     217             : /// Given operands for a CastInst, fold the result or return null.
     218             : Value *SimplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty,
     219             :                         const SimplifyQuery &Q);
     220             : 
     221             : /// Given operands for a ShuffleVectorInst, fold the result or return null.
     222             : Value *SimplifyShuffleVectorInst(Value *Op0, Value *Op1, Constant *Mask,
     223             :                                  Type *RetTy, const SimplifyQuery &Q);
     224             : 
     225             : //=== Helper functions for higher up the class hierarchy.
     226             : 
     227             : /// Given operands for a CmpInst, fold the result or return null.
     228             : Value *SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
     229             :                        const SimplifyQuery &Q);
     230             : 
     231             : /// Given operands for a BinaryOperator, fold the result or return null.
     232             : Value *SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
     233             :                      const SimplifyQuery &Q);
     234             : 
     235             : /// Given operands for an FP BinaryOperator, fold the result or return null.
     236             : /// In contrast to SimplifyBinOp, try to use FastMathFlag when folding the
     237             : /// result. In case we don't need FastMathFlags, simply fall to SimplifyBinOp.
     238             : Value *SimplifyFPBinOp(unsigned Opcode, Value *LHS, Value *RHS,
     239             :                        FastMathFlags FMF, const SimplifyQuery &Q);
     240             : 
     241             : /// Given a callsite, fold the result or return null.
     242             : Value *SimplifyCall(ImmutableCallSite CS, const SimplifyQuery &Q);
     243             : 
     244             : /// Given a function and iterators over arguments, fold the result or return
     245             : /// null.
     246             : Value *SimplifyCall(ImmutableCallSite CS, Value *V, User::op_iterator ArgBegin,
     247             :                     User::op_iterator ArgEnd, const SimplifyQuery &Q);
     248             : 
     249             : /// Given a function and set of arguments, fold the result or return null.
     250             : Value *SimplifyCall(ImmutableCallSite CS, Value *V, ArrayRef<Value *> Args,
     251             :                     const SimplifyQuery &Q);
     252             : 
     253             : /// See if we can compute a simplified version of this instruction. If not,
     254             : /// return null.
     255             : Value *SimplifyInstruction(Instruction *I, const SimplifyQuery &Q,
     256             :                            OptimizationRemarkEmitter *ORE = nullptr);
     257             : 
     258             : /// Replace all uses of 'I' with 'SimpleV' and simplify the uses recursively.
     259             : ///
     260             : /// This first performs a normal RAUW of I with SimpleV. It then recursively
     261             : /// attempts to simplify those users updated by the operation. The 'I'
     262             : /// instruction must not be equal to the simplified value 'SimpleV'.
     263             : ///
     264             : /// The function returns true if any simplifications were performed.
     265             : bool replaceAndRecursivelySimplify(Instruction *I, Value *SimpleV,
     266             :                                    const TargetLibraryInfo *TLI = nullptr,
     267             :                                    const DominatorTree *DT = nullptr,
     268             :                                    AssumptionCache *AC = nullptr);
     269             : 
     270             : /// Recursively attempt to simplify an instruction.
     271             : ///
     272             : /// This routine uses SimplifyInstruction to simplify 'I', and if successful
     273             : /// replaces uses of 'I' with the simplified value. It then recurses on each
     274             : /// of the users impacted. It returns true if any simplifications were
     275             : /// performed.
     276             : bool recursivelySimplifyInstruction(Instruction *I,
     277             :                                     const TargetLibraryInfo *TLI = nullptr,
     278             :                                     const DominatorTree *DT = nullptr,
     279             :                                     AssumptionCache *AC = nullptr);
     280             : 
     281             : // These helper functions return a SimplifyQuery structure that contains as
     282             : // many of the optional analysis we use as are currently valid.  This is the
     283             : // strongly preferred way of constructing SimplifyQuery in passes.
     284             : const SimplifyQuery getBestSimplifyQuery(Pass &, Function &);
     285             : template <class T, class... TArgs>
     286             : const SimplifyQuery getBestSimplifyQuery(AnalysisManager<T, TArgs...> &,
     287             :                                          Function &);
     288             : const SimplifyQuery getBestSimplifyQuery(LoopStandardAnalysisResults &,
     289             :                                          const DataLayout &);
     290             : } // end namespace llvm
     291             : 
     292             : #endif
     293             : 

Generated by: LCOV version 1.13