summaryrefslogtreecommitdiffstats
path: root/lib/VMCore/ConstantFolding.h
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-07-30 16:24:25 +0000
committerChris Lattner <sabre@nondot.org>2002-07-30 16:24:25 +0000
commite56096aa415f2983ff1aae19be2647630295c1df (patch)
treef98731ebb1cb8ee4b1e695e4b00ae2bf59e770de /lib/VMCore/ConstantFolding.h
parent72de9ae46b68a3907f8721fbea24a4832eaea9ae (diff)
downloadexternal_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/VMCore/ConstantFolding.h')
-rw-r--r--lib/VMCore/ConstantFolding.h22
1 files changed, 21 insertions, 1 deletions
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);