diff options
| author | Chris Lattner <sabre@nondot.org> | 2006-01-04 02:20:54 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2006-01-04 02:20:54 +0000 |
| commit | 6b52be6a899074ce83e52225680e5ae4eaa0ffce (patch) | |
| tree | 71b5467ca43d88c153ceb7b95ac923784359492e /llvm/lib/VMCore | |
| parent | f0f40681964c5720f2b2efd981ac8c33ea430ec1 (diff) | |
| download | bcm5719-llvm-6b52be6a899074ce83e52225680e5ae4eaa0ffce.tar.gz bcm5719-llvm-6b52be6a899074ce83e52225680e5ae4eaa0ffce.zip | |
implement constant folding of ==/!= on constant packed, simplify some code.
llvm-svn: 25074
Diffstat (limited to 'llvm/lib/VMCore')
| -rw-r--r-- | llvm/lib/VMCore/ConstantFolding.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/llvm/lib/VMCore/ConstantFolding.cpp b/llvm/lib/VMCore/ConstantFolding.cpp index e6a27155b44..4ac5292190c 100644 --- a/llvm/lib/VMCore/ConstantFolding.cpp +++ b/llvm/lib/VMCore/ConstantFolding.cpp @@ -385,6 +385,14 @@ struct ConstantPackedRules return 0; } static Constant *EqualTo(const ConstantPacked *V1, const ConstantPacked *V2) { + for (unsigned i = 0, e = V1->getNumOperands(); i != e; ++i) { + Constant *C = + ConstantExpr::getSetEQ(const_cast<Constant*>(V1->getOperand(i)), + const_cast<Constant*>(V2->getOperand(i))); + if (ConstantBool *CB = dyn_cast<ConstantBool>(C)) + return CB; + } + // Otherwise, could not decide from any element pairs. return 0; } }; @@ -951,15 +959,15 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode, case Instruction::SetGT: C = ConstRules::get(V1, V2).lessthan(V2, V1);break; case Instruction::SetNE: // V1 != V2 === !(V1 == V2) C = ConstRules::get(V1, V2).equalto(V1, V2); - if (C) return ConstantExpr::get(Instruction::Xor, C, ConstantBool::True); + if (C) return ConstantExpr::getNot(C); break; case Instruction::SetLE: // V1 <= V2 === !(V2 < V1) C = ConstRules::get(V1, V2).lessthan(V2, V1); - if (C) return ConstantExpr::get(Instruction::Xor, C, ConstantBool::True); + if (C) return ConstantExpr::getNot(C); break; case Instruction::SetGE: // V1 >= V2 === !(V1 < V2) C = ConstRules::get(V1, V2).lessthan(V1, V2); - if (C) return ConstantExpr::get(Instruction::Xor, C, ConstantBool::True); + if (C) return ConstantExpr::getNot(C); break; } |

