From 5a945e36167f962e8b67e8af9e81dfba9bd515bb Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 12 Jan 2004 21:13:12 +0000 Subject: Rename ConstantHandling.* -> ConstantFolding.* Move a bunch of (now) private stuff from ConstantFolding.h into ConstantFolding.cpp. This _finally_ gets us to a place where we have a sane constant folder. The rules are: 1. LLVM clients now use ConstantExpr::get* methods to fold constants. If they cannot be folded, a constantexpr is created, so these methods always return valid Constant*'s. 2. The implementation of ConstantExpr::get* uses the functions exposed by ConstantFolding.h to try to fold constants. If they cannot be folded, they should return a null pointer. 3. The implementation of ConstantFolding can do whatever it wants, and only has one client (Constants.cpp) This cuts down on the wierd dependencies, and eliminates the two interfaces. The old constanthandling interface was especially bad for clients to use because almost none of them took the failure condition into consideration, thus leading to obscure problems. llvm-svn: 10807 --- llvm/lib/VMCore/ConstantFolding.h | 78 ++++++++------------------------------- 1 file changed, 16 insertions(+), 62 deletions(-) (limited to 'llvm/lib/VMCore/ConstantFolding.h') diff --git a/llvm/lib/VMCore/ConstantFolding.h b/llvm/lib/VMCore/ConstantFolding.h index dc5d0cfbfae..7aa1683bd71 100644 --- a/llvm/lib/VMCore/ConstantFolding.h +++ b/llvm/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 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 &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 &IdxList); } // End llvm namespace #endif -- cgit v1.2.3