Implement constant propogation of multiply and divide instructions!!
authorChris Lattner <sabre@nondot.org>
Sun, 7 Apr 2002 08:10:14 +0000 (08:10 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 7 Apr 2002 08:10:14 +0000 (08:10 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2134 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ConstantHandling.h
lib/VMCore/ConstantFold.cpp
lib/VMCore/ConstantFold.h
lib/VMCore/ConstantFolding.h

index 261174577c4f1c32db3475d6155f882ec65f554e..d0f50fac456e38939cb279be768de4ea2be60f51 100644 (file)
@@ -73,6 +73,8 @@ public:
                         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 ConstantBool *lessthan(const Constant *V1, 
                                  const Constant *V2) const = 0;
@@ -146,6 +148,11 @@ inline Constant *operator*(const Constant &V1, const Constant &V2) {
   return ConstRules::get(V1)->mul(&V1, &V2);
 }
 
+inline Constant *operator/(const Constant &V1, const Constant &V2) {
+  assert(V1.getType() == V2.getType() && "Constant types must be identical!");
+  return ConstRules::get(V1)->div(&V1, &V2);
+}
+
 inline ConstantBool *operator<(const Constant &V1, 
                                const Constant &V2) {
   assert(V1.getType() == V2.getType() && "Constant types must be identical!");
@@ -197,6 +204,8 @@ inline Constant *ConstantFoldBinaryInstruction(unsigned Opcode,
   switch (Opcode) {
   case Instruction::Add:     return *V1 + *V2;
   case Instruction::Sub:     return *V1 - *V2;
+  case Instruction::Mul:     return *V1 * *V2;
+  case Instruction::Div:     return *V1 / *V2;
 
   case Instruction::SetEQ:   return *V1 == *V2;
   case Instruction::SetNE:   return *V1 != *V2;
index 80374f339c5a930fcc0bd30d81d5483fb56deb5c..5a1cb745a2fedfe566f3020f1216c97fec8bc2ea 100644 (file)
@@ -47,6 +47,10 @@ class TemplateRules : public ConstRules {
                         const Constant *V2) const { 
     return SubClassName::Mul((const ArgType *)V1, (const ArgType *)V2);  
   }
+  virtual Constant *div(const Constant *V1, 
+                        const Constant *V2) const { 
+    return SubClassName::Div((const ArgType *)V1, (const ArgType *)V2);  
+  }
 
   virtual ConstantBool *lessthan(const Constant *V1, 
                                  const Constant *V2) const { 
@@ -107,6 +111,9 @@ class TemplateRules : public ConstRules {
   inline static Constant *Mul(const ArgType *V1, const ArgType *V2) {
     return 0;
   }
+  inline static Constant *Div(const ArgType *V1, const ArgType *V2) {
+    return 0;
+  }
   inline static ConstantBool *LessThan(const ArgType *V1, const ArgType *V2) {
     return 0;
   }
@@ -263,6 +270,13 @@ struct DirectRules
     return ConstantClass::get(*Ty, Result);
   }
 
+  inline static Constant *Div(const ConstantClass *V1, 
+                              const ConstantClass *V2) {
+    BuiltinType Result = (BuiltinType)V1->getValue() /
+                         (BuiltinType)V2->getValue();
+    return ConstantClass::get(*Ty, Result);
+  }
+
   inline static ConstantBool *LessThan(const ConstantClass *V1, 
                                        const ConstantClass *V2) {
     bool Result = (BuiltinType)V1->getValue() < (BuiltinType)V2->getValue();
index 261174577c4f1c32db3475d6155f882ec65f554e..d0f50fac456e38939cb279be768de4ea2be60f51 100644 (file)
@@ -73,6 +73,8 @@ public:
                         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 ConstantBool *lessthan(const Constant *V1, 
                                  const Constant *V2) const = 0;
@@ -146,6 +148,11 @@ inline Constant *operator*(const Constant &V1, const Constant &V2) {
   return ConstRules::get(V1)->mul(&V1, &V2);
 }
 
+inline Constant *operator/(const Constant &V1, const Constant &V2) {
+  assert(V1.getType() == V2.getType() && "Constant types must be identical!");
+  return ConstRules::get(V1)->div(&V1, &V2);
+}
+
 inline ConstantBool *operator<(const Constant &V1, 
                                const Constant &V2) {
   assert(V1.getType() == V2.getType() && "Constant types must be identical!");
@@ -197,6 +204,8 @@ inline Constant *ConstantFoldBinaryInstruction(unsigned Opcode,
   switch (Opcode) {
   case Instruction::Add:     return *V1 + *V2;
   case Instruction::Sub:     return *V1 - *V2;
+  case Instruction::Mul:     return *V1 * *V2;
+  case Instruction::Div:     return *V1 / *V2;
 
   case Instruction::SetEQ:   return *V1 == *V2;
   case Instruction::SetNE:   return *V1 != *V2;
index 261174577c4f1c32db3475d6155f882ec65f554e..d0f50fac456e38939cb279be768de4ea2be60f51 100644 (file)
@@ -73,6 +73,8 @@ public:
                         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 ConstantBool *lessthan(const Constant *V1, 
                                  const Constant *V2) const = 0;
@@ -146,6 +148,11 @@ inline Constant *operator*(const Constant &V1, const Constant &V2) {
   return ConstRules::get(V1)->mul(&V1, &V2);
 }
 
+inline Constant *operator/(const Constant &V1, const Constant &V2) {
+  assert(V1.getType() == V2.getType() && "Constant types must be identical!");
+  return ConstRules::get(V1)->div(&V1, &V2);
+}
+
 inline ConstantBool *operator<(const Constant &V1, 
                                const Constant &V2) {
   assert(V1.getType() == V2.getType() && "Constant types must be identical!");
@@ -197,6 +204,8 @@ inline Constant *ConstantFoldBinaryInstruction(unsigned Opcode,
   switch (Opcode) {
   case Instruction::Add:     return *V1 + *V2;
   case Instruction::Sub:     return *V1 - *V2;
+  case Instruction::Mul:     return *V1 * *V2;
+  case Instruction::Div:     return *V1 / *V2;
 
   case Instruction::SetEQ:   return *V1 == *V2;
   case Instruction::SetNE:   return *V1 != *V2;