diff options
author | Chris Lattner <sabre@nondot.org> | 2002-07-30 16:24:25 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-07-30 16:24:25 +0000 |
commit | e56096aa415f2983ff1aae19be2647630295c1df (patch) | |
tree | f98731ebb1cb8ee4b1e695e4b00ae2bf59e770de /lib | |
parent | 72de9ae46b68a3907f8721fbea24a4832eaea9ae (diff) | |
download | external_llvm-e56096aa415f2983ff1aae19be2647630295c1df.zip external_llvm-e56096aa415f2983ff1aae19be2647630295c1df.tar.gz external_llvm-e56096aa415f2983ff1aae19be2647630295c1df.tar.bz2 |
Implement constant propogation of logical (and, or, xor) expressions.
Fixes testcase: test/Regression/Transforms/ConstProp/logicaltest.ll
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3153 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/VMCore/ConstantFold.h | 22 | ||||
-rw-r--r-- | lib/VMCore/ConstantFolding.h | 22 |
2 files changed, 42 insertions, 2 deletions
diff --git a/lib/VMCore/ConstantFold.h b/lib/VMCore/ConstantFold.h index 97413c5..6135e5c 100644 --- a/lib/VMCore/ConstantFold.h +++ b/lib/VMCore/ConstantFold.h @@ -71,6 +71,9 @@ public: 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; @@ -130,7 +133,7 @@ inline Constant *operator~(const Constant &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,6 +159,23 @@ 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); return ConstRules::get(V1)->shl(&V1, &V2); diff --git a/lib/VMCore/ConstantFolding.h b/lib/VMCore/ConstantFolding.h index 97413c5..6135e5c 100644 --- a/lib/VMCore/ConstantFolding.h +++ b/lib/VMCore/ConstantFolding.h @@ -71,6 +71,9 @@ public: 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; @@ -130,7 +133,7 @@ inline Constant *operator~(const Constant &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,6 +159,23 @@ 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); return ConstRules::get(V1)->shl(&V1, &V2); |