//==-- 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