| //==-- ConstantFold.h - DL-independent 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 DataLayout-independent constant folding interface. |
| // When possible, the DataLayout-aware constant folding interface in |
| // Analysis/ConstantFolding.h should be preferred. |
| // |
| // 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_IR_CONSTANTFOLD_H |
| #define LLVM_IR_CONSTANTFOLD_H |
| |
| #include "llvm/IR/InstrTypes.h" |
| #include <optional> |
| |
| 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, |
| ArrayRef<int> 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(CmpInst::Predicate Predicate, |
| Constant *C1, Constant *C2); |
| Constant *ConstantFoldGetElementPtr(Type *Ty, Constant *C, bool InBounds, |
| std::optional<unsigned> InRangeIndex, |
| ArrayRef<Value *> Idxs); |
| } // End llvm namespace |
| |
| #endif |