diff options
author | Chris Lattner <sabre@nondot.org> | 2002-10-31 04:14:01 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-10-31 04:14:01 +0000 |
commit | f2da7241f590aaae128ecce7732c6094084df2b6 (patch) | |
tree | 67f27d04dff4e39531201334e8166c7ad200da19 /lib | |
parent | 4932b31dce8fc065a91af2852314ee8c4403ee23 (diff) |
New isAssociative/isCommutative inspection methods, graciously contributed by
Casey Carter.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4459 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/VMCore/Instruction.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/lib/VMCore/Instruction.cpp b/lib/VMCore/Instruction.cpp index 2084e69ede..95267aacd0 100644 --- a/lib/VMCore/Instruction.cpp +++ b/lib/VMCore/Instruction.cpp @@ -97,3 +97,42 @@ const char *Instruction::getOpcodeName(unsigned OpCode) { return 0; } + + +/// isAssociative - Return true if the instruction is associative: +/// +/// Associative operators satisfy: x op (y op z) === (x op y) op z) +/// +/// In LLVM, the Add, Mul, And, Or, and Xor operators are associative, when not +/// applied to floating point types. +/// +bool Instruction::isAssociative(unsigned Opcode, const Type *Ty) { + if (Opcode == Add || Opcode == Mul || + Opcode == And || Opcode == Or || Opcode == Xor) { + // Floating point operations do not associate! + return !Ty->isFloatingPoint(); + } + return 0; +} + +/// isCommutative - Return true if the instruction is commutative: +/// +/// Commutative operators satistify: (x op y) === (y op x) +/// +/// In LLVM, these are the associative operators, plus SetEQ and SetNE, when +/// applied to any type. +/// +bool Instruction::isCommutative(unsigned op) { + switch (op) { + case Add: + case Mul: + case And: + case Or: + case Xor: + case SetEQ: + case SetNE: + return true; + default: + return false; + } +} |