diff options
author | Duncan Sands <baldrick@free.fr> | 2012-06-13 09:42:13 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2012-06-13 09:42:13 +0000 |
commit | ee5a094ccf1f04d3fcc92ac4d2fc8a2926cbb232 (patch) | |
tree | e4bba8613607c38aa947509b4cf6f9e501af678a /lib/VMCore/Constants.cpp | |
parent | cc95b57d42a4af1cbb0a0e4a4efc2133116dd21c (diff) | |
download | llvm-ee5a094ccf1f04d3fcc92ac4d2fc8a2926cbb232.tar.gz llvm-ee5a094ccf1f04d3fcc92ac4d2fc8a2926cbb232.tar.bz2 llvm-ee5a094ccf1f04d3fcc92ac4d2fc8a2926cbb232.tar.xz |
When linearizing a multiplication, return at once if we see a factor of zero,
since then the entire expression must equal zero (similarly for other operations
with an absorbing element). With this in place a bunch of reassociate code for
handling constants is dead since it is all taken care of when linearizing. No
intended functionality change.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@158398 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/Constants.cpp')
-rw-r--r-- | lib/VMCore/Constants.cpp | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index 17bad97e6f..400b2741cd 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -2009,11 +2009,13 @@ Constant *ConstantExpr::getAShr(Constant *C1, Constant *C2, bool isExact) { /// getBinOpIdentity - Return the identity for the given binary operation, /// i.e. a constant C such that X op C = X and C op X = X for every X. It -/// is an error to call this for an operation that doesn't have an identity. +/// returns null if the operator doesn't have an identity. Constant *ConstantExpr::getBinOpIdentity(unsigned Opcode, Type *Ty) { switch (Opcode) { default: - llvm_unreachable("Not a binary operation with identity"); + // Doesn't have an identity. + return 0; + case Instruction::Add: case Instruction::Or: case Instruction::Xor: @@ -2027,6 +2029,25 @@ Constant *ConstantExpr::getBinOpIdentity(unsigned Opcode, Type *Ty) { } } +/// getBinOpAbsorber - Return the absorbing element for the given binary +/// operation, i.e. a constant C such that X op C = C and C op X = C for +/// every X. For example, this returns zero for integer multiplication. +/// It returns null if the operator doesn't have an absorbing element. +Constant *ConstantExpr::getBinOpAbsorber(unsigned Opcode, Type *Ty) { + switch (Opcode) { + default: + // Doesn't have an absorber. + return 0; + + case Instruction::Or: + return Constant::getAllOnesValue(Ty); + + case Instruction::And: + case Instruction::Mul: + return Constant::getNullValue(Ty); + } +} + // destroyConstant - Remove the constant from the constant table... // void ConstantExpr::destroyConstant() { |