Use -Wl,-x instead of -s: it is more portable, and in particular,
[oota-llvm.git] / lib / VMCore / ConstantFold.h
index 97413c59e31c547c3cfb5c831ad28d3010169d52..546b37e605fc1cd74550e7feb59cd6d700106f74 100644 (file)
@@ -62,15 +62,15 @@ protected:
 public:
   static AnnotationID AID;    // AnnotationID for this class
 
-  // Unary Operators...
-  virtual Constant *op_not(const Constant *V) const = 0;
-
   // 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;
 
@@ -125,12 +125,7 @@ private :
 };
 
 
-inline Constant *operator~(const Constant &V) {
-  return ConstRules::get(V)->op_not(&V);
-}
-
-
-
+// Standard binary operators...
 inline Constant *operator+(const Constant &V1, const Constant &V2) {
   assert(V1.getType() == V2.getType() && "Constant types must be identical!");
   return ConstRules::get(V1)->add(&V1, &V2);
@@ -156,13 +151,30 @@ inline Constant *operator%(const Constant &V1, const Constant &V2) {
   return ConstRules::get(V1)->rem(&V1, &V2);
 }
 
+// Logical Operators...
+inline Constant *operator&(const Constant &V1, const Constant &V2) {
+  assert(V1.getType() == V2.getType() && "Constant types must be identical!");
+  return ConstRules::get(V1)->op_and(&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)->op_or(&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)->op_xor(&V1, &V2);
+}
+
+// Shift Instructions...
 inline Constant *operator<<(const Constant &V1, const Constant &V2) {
-  assert(V1.getType()->isIntegral() && V2.getType() == Type::UByteTy);
+  assert(V1.getType()->isInteger() && V2.getType() == Type::UByteTy);
   return ConstRules::get(V1)->shl(&V1, &V2);
 }
 
 inline Constant *operator>>(const Constant &V1, const Constant &V2) {
-  assert(V1.getType()->isIntegral() && V2.getType() == Type::UByteTy);
+  assert(V1.getType()->isInteger() && V2.getType() == Type::UByteTy);
   return ConstRules::get(V1)->shr(&V1, &V2);
 }
 
@@ -204,7 +216,6 @@ Constant *ConstantFoldInstruction(Instruction *I);
 
 // Constant fold various types of instruction...
 Constant *ConstantFoldCastInstruction(const Constant *V, const Type *DestTy);
-Constant *ConstantFoldUnaryInstruction(unsigned Opcode, const Constant *V);
 Constant *ConstantFoldBinaryInstruction(unsigned Opcode, const Constant *V1,
                                         const Constant *V2);
 Constant *ConstantFoldShiftInstruction(unsigned Opcode, const Constant *V1,