diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/VMCore/ConstantFold.cpp | 52 | ||||
-rw-r--r-- | lib/VMCore/ConstantFold.h | 78 | ||||
-rw-r--r-- | lib/VMCore/ConstantFolding.h | 78 | ||||
-rw-r--r-- | lib/VMCore/Constants.cpp | 2 |
4 files changed, 82 insertions, 128 deletions
diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp index ddec284..ee74280 100644 --- a/lib/VMCore/ConstantFold.cpp +++ b/lib/VMCore/ConstantFold.cpp @@ -1,4 +1,4 @@ -//===- ConstantHandling.cpp - Implement ConstantHandling.h ----------------===// +//===- ConstantFolding.cpp - LLVM constant folder -------------------------===// // // The LLVM Compiler Infrastructure // @@ -7,11 +7,13 @@ // //===----------------------------------------------------------------------===// // -// This file implements the various intrinsic operations, on constant values. +// This file implements folding of constants for LLVM. This implements the +// (internal) ConstantFolding.h interface, which is used by the +// ConstantExpr::get* methods to automatically fold constants when possible. // //===----------------------------------------------------------------------===// -#include "ConstantHandling.h" +#include "ConstantFolding.h" #include "llvm/Constants.h" #include "llvm/iPHINode.h" #include "llvm/InstrTypes.h" @@ -25,6 +27,50 @@ static unsigned getSize(const Type *Ty) { return S ? S : 8; // Treat pointers at 8 bytes } +namespace { + 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 Constant *lessthan(const Constant *V1, const Constant *V2) const =0; + virtual Constant *equalto(const Constant *V1, const Constant *V2) const = 0; + + // Casting operators. + virtual Constant *castToBool (const Constant *V) const = 0; + virtual Constant *castToSByte (const Constant *V) const = 0; + virtual Constant *castToUByte (const Constant *V) const = 0; + virtual Constant *castToShort (const Constant *V) const = 0; + virtual Constant *castToUShort(const Constant *V) const = 0; + virtual Constant *castToInt (const Constant *V) const = 0; + virtual Constant *castToUInt (const Constant *V) const = 0; + virtual Constant *castToLong (const Constant *V) const = 0; + virtual Constant *castToULong (const Constant *V) const = 0; + virtual Constant *castToFloat (const Constant *V) const = 0; + virtual Constant *castToDouble(const Constant *V) const = 0; + virtual Constant *castToPointer(const Constant *V, + const PointerType *Ty) const = 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 + }; +} + + Constant *llvm::ConstantFoldCastInstruction(const Constant *V, const Type *DestTy) { if (V->getType() == DestTy) return (Constant*)V; diff --git a/lib/VMCore/ConstantFold.h b/lib/VMCore/ConstantFold.h index dc5d0cf..7aa1683 100644 --- a/lib/VMCore/ConstantFold.h +++ b/lib/VMCore/ConstantFold.h @@ -1,4 +1,4 @@ -//===-- ConstantHandling.h - Stuff for manipulating constants ---*- C++ -*-===// +//===-- ConstantFolding.h - Internal Constant Folding Interface -*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -7,76 +7,30 @@ // //===----------------------------------------------------------------------===// // -// 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 I 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 <vector> namespace llvm { class Constant; class Type; - 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 Constant *lessthan(const Constant *V1, const Constant *V2) const = 0; - - virtual Constant *equalto(const Constant *V1, const Constant *V2) const = 0; - - // Casting operators. ick - virtual Constant *castToBool (const Constant *V) const = 0; - virtual Constant *castToSByte (const Constant *V) const = 0; - virtual Constant *castToUByte (const Constant *V) const = 0; - virtual Constant *castToShort (const Constant *V) const = 0; - virtual Constant *castToUShort(const Constant *V) const = 0; - virtual Constant *castToInt (const Constant *V) const = 0; - virtual Constant *castToUInt (const Constant *V) const = 0; - virtual Constant *castToLong (const Constant *V) const = 0; - virtual Constant *castToULong (const Constant *V) const = 0; - virtual Constant *castToFloat (const Constant *V) const = 0; - virtual Constant *castToDouble(const Constant *V) const = 0; - virtual Constant *castToPointer(const Constant *V, - const PointerType *Ty) const = 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<Constant*> &IdxList); - + + // 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<Constant*> &IdxList); } // End llvm namespace #endif diff --git a/lib/VMCore/ConstantFolding.h b/lib/VMCore/ConstantFolding.h index dc5d0cf..7aa1683 100644 --- a/lib/VMCore/ConstantFolding.h +++ b/lib/VMCore/ConstantFolding.h @@ -1,4 +1,4 @@ -//===-- ConstantHandling.h - Stuff for manipulating constants ---*- C++ -*-===// +//===-- ConstantFolding.h - Internal Constant Folding Interface -*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -7,76 +7,30 @@ // //===----------------------------------------------------------------------===// // -// 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 I 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 <vector> namespace llvm { class Constant; class Type; - 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 Constant *lessthan(const Constant *V1, const Constant *V2) const = 0; - - virtual Constant *equalto(const Constant *V1, const Constant *V2) const = 0; - - // Casting operators. ick - virtual Constant *castToBool (const Constant *V) const = 0; - virtual Constant *castToSByte (const Constant *V) const = 0; - virtual Constant *castToUByte (const Constant *V) const = 0; - virtual Constant *castToShort (const Constant *V) const = 0; - virtual Constant *castToUShort(const Constant *V) const = 0; - virtual Constant *castToInt (const Constant *V) const = 0; - virtual Constant *castToUInt (const Constant *V) const = 0; - virtual Constant *castToLong (const Constant *V) const = 0; - virtual Constant *castToULong (const Constant *V) const = 0; - virtual Constant *castToFloat (const Constant *V) const = 0; - virtual Constant *castToDouble(const Constant *V) const = 0; - virtual Constant *castToPointer(const Constant *V, - const PointerType *Ty) const = 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<Constant*> &IdxList); - + + // 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<Constant*> &IdxList); } // End llvm namespace #endif diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index 35681c0..0a1c213 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -12,7 +12,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Constants.h" -#include "ConstantHandling.h" +#include "ConstantFolding.h" #include "llvm/DerivedTypes.h" #include "llvm/iMemory.h" #include "llvm/SymbolTable.h" |