| //===-- ConstantFolding.h - Internal Constant Folding Interface -*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines the (internal) constant folding interfaces for LLVM. These |
| // interfaces are used by the ConstantExpr::get* methods to automatically fold |
| // constants when possible. |
| // |
| // These operators may return a null object if they don't know how to perform |
| // the specified operation on the specified constant types. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_LIB_IR_CONSTANTFOLD_H |
| #define LLVM_LIB_IR_CONSTANTFOLD_H |
| |
| #include "llvm/ADT/Optional.h" |
| |
| namespace llvm { |
| template <typename T> class ArrayRef; |
| class Value; |
| class Constant; |
| class Type; |
| |
| // Constant fold various types of instruction... |
| Constant *ConstantFoldCastInstruction( |
| unsigned opcode, ///< The opcode of the cast |
| Constant *V, ///< The source constant |
| Type *DestTy ///< The destination type |
| ); |
| Constant *ConstantFoldSelectInstruction(Constant *Cond, |
| Constant *V1, Constant *V2); |
| Constant *ConstantFoldExtractElementInstruction(Constant *Val, Constant *Idx); |
| Constant *ConstantFoldInsertElementInstruction(Constant *Val, Constant *Elt, |
| Constant *Idx); |
| Constant *ConstantFoldShuffleVectorInstruction(Constant *V1, Constant *V2, |
| Constant *Mask); |
| Constant *ConstantFoldExtractValueInstruction(Constant *Agg, |
| ArrayRef<unsigned> Idxs); |
| Constant *ConstantFoldInsertValueInstruction(Constant *Agg, Constant *Val, |
| ArrayRef<unsigned> Idxs); |
| Constant *ConstantFoldUnaryInstruction(unsigned Opcode, Constant *V); |
| Constant *ConstantFoldBinaryInstruction(unsigned Opcode, Constant *V1, |
| Constant *V2); |
| Constant *ConstantFoldCompareInstruction(unsigned short predicate, |
| Constant *C1, Constant *C2); |
| Constant *ConstantFoldGetElementPtr(Type *Ty, Constant *C, bool InBounds, |
| Optional<unsigned> InRangeIndex, |
| ArrayRef<Value *> Idxs); |
| } // End llvm namespace |
| |
| #endif |