aboutsummaryrefslogtreecommitdiffstats
path: root/lib/VMCore/ConstantFold.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-01-12 21:13:12 +0000
committerChris Lattner <sabre@nondot.org>2004-01-12 21:13:12 +0000
commitcbfd40654177d6c2b7fcb94272c3a8064d5b8297 (patch)
treede071e9366bf94b0446eae55b1958147406fb811 /lib/VMCore/ConstantFold.cpp
parent8b0f0cb9088a7746fea2ba23821e50d87cef4a56 (diff)
downloadexternal_llvm-cbfd40654177d6c2b7fcb94272c3a8064d5b8297.zip
external_llvm-cbfd40654177d6c2b7fcb94272c3a8064d5b8297.tar.gz
external_llvm-cbfd40654177d6c2b7fcb94272c3a8064d5b8297.tar.bz2
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10807 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/ConstantFold.cpp')
-rw-r--r--lib/VMCore/ConstantFold.cpp52
1 files changed, 49 insertions, 3 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;