X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FVMCore%2FConstantFold.h;h=e12f27a7cb1ead40b9e0805e7b638937f52dd2c2;hb=4903c15b7d92802a4f0f28928a89bb4c0d5e212f;hp=8475e44f908a413055e33e4569c7dd1210b3fb24;hpb=6b7b91ab038eb468431725993dfe246726bc9743;p=oota-llvm.git diff --git a/lib/VMCore/ConstantFold.h b/lib/VMCore/ConstantFold.h index 8475e44f908..e12f27a7cb1 100644 --- a/lib/VMCore/ConstantFold.h +++ b/lib/VMCore/ConstantFold.h @@ -1,102 +1,56 @@ -//===-- ConstantHandling.h - Stuff for manipulating constants ---*- C++ -*-===// -// +//===-- ConstantFolding.h - Internal Constant Folding Interface -*- C++ -*-===// +// // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// //===----------------------------------------------------------------------===// // -// WARNING: These operators may return a null object if I don't know how to -// perform the specified operation on the specified constant types. +// 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 CONSTANTHANDLING_H -#define CONSTANTHANDLING_H +#ifndef CONSTANTFOLDING_H +#define CONSTANTFOLDING_H -#include "llvm/Constants.h" -#include "llvm/Type.h" +#include "llvm/ADT/ArrayRef.h" namespace llvm { - -class PointerType; - -struct ConstRules { - ConstRules() {} - - // Binary Operators... - virtual Constant *add(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *sub(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *mul(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *div(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *rem(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *op_and(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *op_or (const Constant *V1, const Constant *V2) const = 0; - virtual Constant *op_xor(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *shl(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *shr(const Constant *V1, const Constant *V2) const = 0; - - virtual ConstantBool *lessthan(const Constant *V1, - const Constant *V2) const = 0; - virtual ConstantBool *equalto(const Constant *V1, - const Constant *V2) const = 0; - - // Casting operators. ick - virtual ConstantBool *castToBool (const Constant *V) const = 0; - virtual ConstantSInt *castToSByte (const Constant *V) const = 0; - virtual ConstantUInt *castToUByte (const Constant *V) const = 0; - virtual ConstantSInt *castToShort (const Constant *V) const = 0; - virtual ConstantUInt *castToUShort(const Constant *V) const = 0; - virtual ConstantSInt *castToInt (const Constant *V) const = 0; - virtual ConstantUInt *castToUInt (const Constant *V) const = 0; - virtual ConstantSInt *castToLong (const Constant *V) const = 0; - virtual ConstantUInt *castToULong (const Constant *V) const = 0; - virtual ConstantFP *castToFloat (const Constant *V) const = 0; - virtual ConstantFP *castToDouble(const Constant *V) const = 0; - virtual Constant *castToPointer(const Constant *V, - const PointerType *Ty) const = 0; - - inline Constant *castTo(const Constant *V, const Type *Ty) const { - switch (Ty->getPrimitiveID()) { - case Type::BoolTyID: return castToBool(V); - case Type::UByteTyID: return castToUByte(V); - case Type::SByteTyID: return castToSByte(V); - case Type::UShortTyID: return castToUShort(V); - case Type::ShortTyID: return castToShort(V); - case Type::UIntTyID: return castToUInt(V); - case Type::IntTyID: return castToInt(V); - case Type::ULongTyID: return castToULong(V); - case Type::LongTyID: return castToLong(V); - case Type::FloatTyID: return castToFloat(V); - case Type::DoubleTyID: return castToDouble(V); - case Type::PointerTyID: - return castToPointer(V, reinterpret_cast(Ty)); - default: return 0; - } - } - - // ConstRules::get - Return an instance of ConstRules for the specified - // constant operands. - // - static ConstRules &get(const Constant *V1, const Constant *V2); -private: - ConstRules(const ConstRules &); // Do not implement - ConstRules &operator=(const ConstRules &); // Do not implement -}; - - -//===----------------------------------------------------------------------===// -// Implement higher level instruction folding type instructions -//===----------------------------------------------------------------------===// - -// Constant fold various types of instruction... -Constant *ConstantFoldCastInstruction(const Constant *V, const Type *DestTy); -Constant *ConstantFoldBinaryInstruction(unsigned Opcode, const Constant *V1, - const Constant *V2); -Constant *ConstantFoldGetElementPtr(const Constant *C, - const std::vector &IdxList); - + 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 Idxs); + Constant *ConstantFoldInsertValueInstruction(Constant *Agg, Constant *Val, + ArrayRef Idxs); + Constant *ConstantFoldBinaryInstruction(unsigned Opcode, Constant *V1, + Constant *V2); + Constant *ConstantFoldCompareInstruction(unsigned short predicate, + Constant *C1, Constant *C2); + Constant *ConstantFoldGetElementPtr(Constant *C, bool inBounds, + ArrayRef Idxs); + Constant *ConstantFoldGetElementPtr(Constant *C, bool inBounds, + ArrayRef Idxs); } // End llvm namespace #endif