Make CreateBinOp/CreateNeg/CreateNot do constant folding.
authorChris Lattner <sabre@nondot.org>
Wed, 23 Jul 2008 06:58:10 +0000 (06:58 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 23 Jul 2008 06:58:10 +0000 (06:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53950 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/IRBuilder.h

index b025d4c6578a229378eb08ec6e7536e165711742..9cc1d903f0f172b7c39fb8f4f4a11630e792779f 100644 (file)
@@ -243,15 +243,22 @@ public:
     return Insert(BinaryOperator::CreateXor(LHS, RHS), Name);
   }
 
-  BinaryOperator *CreateBinOp(Instruction::BinaryOps Opc,
-                              Value *LHS, Value *RHS, const char *Name = "") {
+  Value *CreateBinOp(Instruction::BinaryOps Opc,
+                     Value *LHS, Value *RHS, const char *Name = "") {
+    if (Constant *LC = dyn_cast<Constant>(LHS))
+      if (Constant *RC = dyn_cast<Constant>(RHS))
+        return ConstantExpr::get(Opc, LC, RC);
     return Insert(BinaryOperator::Create(Opc, LHS, RHS), Name);
   }
   
-  BinaryOperator *CreateNeg(Value *V, const char *Name = "") {
+  Value *CreateNeg(Value *V, const char *Name = "") {
+    if (Constant *VC = dyn_cast<Constant>(V))
+      return ConstantExpr::getNeg(VC);
     return Insert(BinaryOperator::CreateNeg(V), Name);
   }
-  BinaryOperator *CreateNot(Value *V, const char *Name = "") {
+  Value *CreateNot(Value *V, const char *Name = "") {
+    if (Constant *VC = dyn_cast<Constant>(V))
+      return ConstantExpr::getNot(VC);
     return Insert(BinaryOperator::CreateNot(V), Name);
   }