Fix constant folding to ALWAYS work.
authorChris Lattner <sabre@nondot.org>
Tue, 27 May 2003 19:16:07 +0000 (19:16 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 27 May 2003 19:16:07 +0000 (19:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6355 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/ConstantFold.cpp

index d5f98bd201e8671028af048fa21fcc2be7267443..7644c1e4196183bc9b7c34febf2e54ef839910fa 100644 (file)
@@ -6,6 +6,7 @@
 
 #include "llvm/ConstantHandling.h"
 #include "llvm/iPHINode.h"
+#include "llvm/InstrTypes.h"
 #include "llvm/DerivedTypes.h"
 #include <cmath>
 
@@ -45,26 +46,15 @@ Constant *ConstantFoldInstruction(Instruction *I) {
     }
   }
 
+  if (isa<BinaryOperator>(I))
+    return ConstantExpr::get(I->getOpcode(), Op0, Op1);    
+
   switch (I->getOpcode()) {
   case Instruction::Cast:
-    return ConstRules::get(*Op0, *Op0)->castTo(Op0, I->getType());
-  case Instruction::Add:     return *Op0 + *Op1;
-  case Instruction::Sub:     return *Op0 - *Op1;
-  case Instruction::Mul:     return *Op0 * *Op1;
-  case Instruction::Div:     return *Op0 / *Op1;
-  case Instruction::Rem:     return *Op0 % *Op1;
-  case Instruction::And:     return *Op0 & *Op1;
-  case Instruction::Or:      return *Op0 | *Op1;
-  case Instruction::Xor:     return *Op0 ^ *Op1;
-
-  case Instruction::SetEQ:   return *Op0 == *Op1;
-  case Instruction::SetNE:   return *Op0 != *Op1;
-  case Instruction::SetLE:   return *Op0 <= *Op1;
-  case Instruction::SetGE:   return *Op0 >= *Op1;
-  case Instruction::SetLT:   return *Op0 <  *Op1;
-  case Instruction::SetGT:   return *Op0 >  *Op1;
-  case Instruction::Shl:     return *Op0 << *Op1;
-  case Instruction::Shr:     return *Op0 >> *Op1;
+    return ConstantExpr::getCast(Op0, I->getType());
+  case Instruction::Shl:
+  case Instruction::Shr:
+    return ConstantExpr::getShift(I->getOpcode(), Op0, Op1);
   case Instruction::GetElementPtr: {
     std::vector<Constant*> IdxList;
     IdxList.reserve(I->getNumOperands()-1);
@@ -74,7 +64,7 @@ Constant *ConstantFoldInstruction(Instruction *I) {
         IdxList.push_back(C);
       else
         return 0;  // Non-constant operand
-    return ConstantFoldGetElementPtr(Op0, IdxList);
+    return ConstantExpr::getGetElementPtr(Op0, IdxList);
   }
   default:
     return 0;