Add instructions to fold unary and binary instructions.
authorChris Lattner <sabre@nondot.org>
Wed, 27 Jun 2001 23:31:34 +0000 (23:31 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 27 Jun 2001 23:31:34 +0000 (23:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@87 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 3227e3995f61f2c099863c936107cbf9f5ee8683..4facdc38e1fe156184c8107fe634aadfd9fd7524 100644 (file)
@@ -36,6 +36,7 @@
 #define LLVM_OPT_CONSTANTHANDLING_H
 
 #include "llvm/ConstPoolVals.h"
+#include "llvm/Instruction.h"
 #include "llvm/Type.h"
 
 //===----------------------------------------------------------------------===//
@@ -142,4 +143,35 @@ inline ConstPoolBool *operator<=(const ConstPoolVal &V1,
   return Result;      // !(V1 > V2)
 }
 
+
+//===----------------------------------------------------------------------===//
+//  Implement higher level instruction folding type instructions
+//===----------------------------------------------------------------------===//
+
+inline ConstPoolVal *ConstantFoldUnaryInstruction(unsigned Opcode, 
+                                                  ConstPoolVal *V) {
+  switch (Opcode) {
+  case Instruction::Not:  return !*V;
+  case Instruction::Neg:  return -*V;
+  }
+  return 0;
+}
+
+inline ConstPoolVal *ConstantFoldBinaryInstruction(unsigned Opcode,
+                                                   ConstPoolVal *V1, 
+                                                   ConstPoolVal *V2) {
+  switch (Opcode) {
+  case Instruction::Add:     return *V1 + *V2;
+  case Instruction::Sub:     return *V1 - *V2;
+
+  case Instruction::SetEQ:   return *V1 == *V2;
+  case Instruction::SetNE:   return *V1 != *V2;
+  case Instruction::SetLE:   return *V1 <= *V2;
+  case Instruction::SetGE:   return *V1 >= *V2;
+  case Instruction::SetLT:   return *V1 <  *V2;
+  case Instruction::SetGT:   return *V1 >  *V2;
+  }
+  return 0;
+}
+
 #endif
index 3227e3995f61f2c099863c936107cbf9f5ee8683..4facdc38e1fe156184c8107fe634aadfd9fd7524 100644 (file)
@@ -36,6 +36,7 @@
 #define LLVM_OPT_CONSTANTHANDLING_H
 
 #include "llvm/ConstPoolVals.h"
+#include "llvm/Instruction.h"
 #include "llvm/Type.h"
 
 //===----------------------------------------------------------------------===//
@@ -142,4 +143,35 @@ inline ConstPoolBool *operator<=(const ConstPoolVal &V1,
   return Result;      // !(V1 > V2)
 }
 
+
+//===----------------------------------------------------------------------===//
+//  Implement higher level instruction folding type instructions
+//===----------------------------------------------------------------------===//
+
+inline ConstPoolVal *ConstantFoldUnaryInstruction(unsigned Opcode, 
+                                                  ConstPoolVal *V) {
+  switch (Opcode) {
+  case Instruction::Not:  return !*V;
+  case Instruction::Neg:  return -*V;
+  }
+  return 0;
+}
+
+inline ConstPoolVal *ConstantFoldBinaryInstruction(unsigned Opcode,
+                                                   ConstPoolVal *V1, 
+                                                   ConstPoolVal *V2) {
+  switch (Opcode) {
+  case Instruction::Add:     return *V1 + *V2;
+  case Instruction::Sub:     return *V1 - *V2;
+
+  case Instruction::SetEQ:   return *V1 == *V2;
+  case Instruction::SetNE:   return *V1 != *V2;
+  case Instruction::SetLE:   return *V1 <= *V2;
+  case Instruction::SetGE:   return *V1 >= *V2;
+  case Instruction::SetLT:   return *V1 <  *V2;
+  case Instruction::SetGT:   return *V1 >  *V2;
+  }
+  return 0;
+}
+
 #endif
index 3227e3995f61f2c099863c936107cbf9f5ee8683..4facdc38e1fe156184c8107fe634aadfd9fd7524 100644 (file)
@@ -36,6 +36,7 @@
 #define LLVM_OPT_CONSTANTHANDLING_H
 
 #include "llvm/ConstPoolVals.h"
+#include "llvm/Instruction.h"
 #include "llvm/Type.h"
 
 //===----------------------------------------------------------------------===//
@@ -142,4 +143,35 @@ inline ConstPoolBool *operator<=(const ConstPoolVal &V1,
   return Result;      // !(V1 > V2)
 }
 
+
+//===----------------------------------------------------------------------===//
+//  Implement higher level instruction folding type instructions
+//===----------------------------------------------------------------------===//
+
+inline ConstPoolVal *ConstantFoldUnaryInstruction(unsigned Opcode, 
+                                                  ConstPoolVal *V) {
+  switch (Opcode) {
+  case Instruction::Not:  return !*V;
+  case Instruction::Neg:  return -*V;
+  }
+  return 0;
+}
+
+inline ConstPoolVal *ConstantFoldBinaryInstruction(unsigned Opcode,
+                                                   ConstPoolVal *V1, 
+                                                   ConstPoolVal *V2) {
+  switch (Opcode) {
+  case Instruction::Add:     return *V1 + *V2;
+  case Instruction::Sub:     return *V1 - *V2;
+
+  case Instruction::SetEQ:   return *V1 == *V2;
+  case Instruction::SetNE:   return *V1 != *V2;
+  case Instruction::SetLE:   return *V1 <= *V2;
+  case Instruction::SetGE:   return *V1 >= *V2;
+  case Instruction::SetLT:   return *V1 <  *V2;
+  case Instruction::SetGT:   return *V1 >  *V2;
+  }
+  return 0;
+}
+
 #endif