Home | History | Annotate | Download | only in IR
      1 //===-- ConstantFolding.h - Internal Constant Folding Interface -*- 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 defines the (internal) constant folding interfaces for LLVM.  These
     11 // interfaces are used by the ConstantExpr::get* methods to automatically fold
     12 // constants when possible.
     13 //
     14 // These operators may return a null object if they don't know how to perform
     15 // the specified operation on the specified constant types.
     16 //
     17 //===----------------------------------------------------------------------===//
     18 
     19 #ifndef CONSTANTFOLDING_H
     20 #define CONSTANTFOLDING_H
     21 
     22 #include "llvm/ADT/ArrayRef.h"
     23 
     24 namespace llvm {
     25   class Value;
     26   class Constant;
     27   class Type;
     28 
     29   // Constant fold various types of instruction...
     30   Constant *ConstantFoldCastInstruction(
     31     unsigned opcode,     ///< The opcode of the cast
     32     Constant *V,         ///< The source constant
     33     Type *DestTy   ///< The destination type
     34   );
     35   Constant *ConstantFoldSelectInstruction(Constant *Cond,
     36                                           Constant *V1, Constant *V2);
     37   Constant *ConstantFoldExtractElementInstruction(Constant *Val, Constant *Idx);
     38   Constant *ConstantFoldInsertElementInstruction(Constant *Val, Constant *Elt,
     39                                                  Constant *Idx);
     40   Constant *ConstantFoldShuffleVectorInstruction(Constant *V1, Constant *V2,
     41                                                  Constant *Mask);
     42   Constant *ConstantFoldExtractValueInstruction(Constant *Agg,
     43                                                 ArrayRef<unsigned> Idxs);
     44   Constant *ConstantFoldInsertValueInstruction(Constant *Agg, Constant *Val,
     45                                                ArrayRef<unsigned> Idxs);
     46   Constant *ConstantFoldBinaryInstruction(unsigned Opcode, Constant *V1,
     47                                           Constant *V2);
     48   Constant *ConstantFoldCompareInstruction(unsigned short predicate,
     49                                            Constant *C1, Constant *C2);
     50   Constant *ConstantFoldGetElementPtr(Constant *C, bool inBounds,
     51                                       ArrayRef<Constant *> Idxs);
     52   Constant *ConstantFoldGetElementPtr(Constant *C, bool inBounds,
     53                                       ArrayRef<Value *> Idxs);
     54 } // End llvm namespace
     55 
     56 #endif
     57