X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FVMCore%2FConstantFold.h;h=546b37e605fc1cd74550e7feb59cd6d700106f74;hb=61b91bc156bb9e3d9017a9e93d567f8dccfa3f68;hp=2203b9728d52eea25f9268f922ce898f1b36aa1d;hpb=4c1061f58c7149e884c81851b8a8f61483264560;p=oota-llvm.git diff --git a/lib/VMCore/ConstantFold.h b/lib/VMCore/ConstantFold.h index 2203b9728d5..546b37e605f 100644 --- a/lib/VMCore/ConstantFold.h +++ b/lib/VMCore/ConstantFold.h @@ -34,7 +34,6 @@ #define LLVM_CONSTANTHANDLING_H #include "llvm/Constants.h" -#include "llvm/Instruction.h" #include "llvm/Type.h" class PointerType; @@ -63,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; @@ -126,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); @@ -157,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); } @@ -198,47 +209,16 @@ inline ConstantBool *operator<=(const Constant &V1, // Implement higher level instruction folding type instructions //===----------------------------------------------------------------------===// -inline Constant *ConstantFoldCastInstruction(const Constant *V, - const Type *DestTy) { - return ConstRules::get(*V)->castTo(V, DestTy); -} - -inline Constant *ConstantFoldUnaryInstruction(unsigned Opcode, - const Constant *V) { - switch (Opcode) { - case Instruction::Not: return ~*V; - } - return 0; -} - -inline Constant *ConstantFoldBinaryInstruction(unsigned Opcode, - const Constant *V1, - const Constant *V2) { - 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::Rem: 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; -} - -inline Constant *ConstantFoldShiftInstruction(unsigned Opcode, - const Constant *V1, - const Constant *V2) { - switch (Opcode) { - case Instruction::Shl: return *V1 << *V2; - case Instruction::Shr: return *V1 >> *V2; - default: return 0; - } -} +// ConstantFoldInstruction - Attempt to constant fold the specified instruction. +// If successful, the constant result is returned, if not, null is returned. +// +Constant *ConstantFoldInstruction(Instruction *I); + +// Constant fold various types of instruction... +Constant *ConstantFoldCastInstruction(const Constant *V, const Type *DestTy); +Constant *ConstantFoldBinaryInstruction(unsigned Opcode, const Constant *V1, + const Constant *V2); +Constant *ConstantFoldShiftInstruction(unsigned Opcode, const Constant *V1, + const Constant *V2); #endif