1 //===-- ConstantFolding.h - Internal Constant Folding Interface -*- 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 // This file defines the (internal) constant folding interfaces for LLVM. These 10 // interfaces are used by the ConstantExpr::get* methods to automatically fold 11 // constants when possible. 12 // 13 // These operators may return a null object if they don't know how to perform 14 // the specified operation on the specified constant types. 15 // 16 //===----------------------------------------------------------------------===// 17 18 #ifndef LLVM_LIB_IR_CONSTANTFOLD_H 19 #define LLVM_LIB_IR_CONSTANTFOLD_H 20 21 #include "llvm/ADT/Optional.h" 22 23 namespace llvm { 24 template <typename T> class ArrayRef; 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 ArrayRef<int> Mask); 42 Constant *ConstantFoldExtractValueInstruction(Constant *Agg, 43 ArrayRef<unsigned> Idxs); 44 Constant *ConstantFoldInsertValueInstruction(Constant *Agg, Constant *Val, 45 ArrayRef<unsigned> Idxs); 46 Constant *ConstantFoldUnaryInstruction(unsigned Opcode, Constant *V); 47 Constant *ConstantFoldBinaryInstruction(unsigned Opcode, Constant *V1, 48 Constant *V2); 49 Constant *ConstantFoldCompareInstruction(unsigned short predicate, 50 Constant *C1, Constant *C2); 51 Constant *ConstantFoldGetElementPtr(Type *Ty, Constant *C, bool InBounds, 52 Optional<unsigned> InRangeIndex, 53 ArrayRef<Value *> Idxs); 54 } // End llvm namespace 55 56 #endif 57