Rename ConstantHandling.* -> ConstantFolding.*
authorChris Lattner <sabre@nondot.org>
Mon, 12 Jan 2004 21:13:12 +0000 (21:13 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 12 Jan 2004 21:13:12 +0000 (21:13 +0000)
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

lib/VMCore/ConstantFold.cpp
lib/VMCore/ConstantFold.h
lib/VMCore/ConstantFolding.h
lib/VMCore/Constants.cpp

index ddec284942a238ae7665bb56b6a184b4c384ad81..ee74280c62cedaaed1aa3335581f4d7e7463d418 100644 (file)
@@ -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;
index dc5d0cfbfaea3bdad5c06ded2eb480acb8678e23..7aa1683bd7184c3af40a55390f8847f0321c5384 100644 (file)
@@ -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
index dc5d0cfbfaea3bdad5c06ded2eb480acb8678e23..7aa1683bd7184c3af40a55390f8847f0321c5384 100644 (file)
@@ -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
index 35681c0b65410210296a0a58ec447e968aa9eaae..0a1c213fd205595f41b5b554dd6bd8353976503e 100644 (file)
@@ -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"