diff options
author | Evan Cheng <evan.cheng@apple.com> | 2008-03-25 20:08:07 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2008-03-25 20:08:07 +0000 |
commit | 5d00cb423a9033583f5bdb46d5bfee2dd23cf02e (patch) | |
tree | cf75442b4cf9f93ed3b27eef5bd8a601353c94b9 /lib | |
parent | e5cd803324dd81ea77ff22796f919cda8de5181d (diff) | |
download | external_llvm-5d00cb423a9033583f5bdb46d5bfee2dd23cf02e.zip external_llvm-5d00cb423a9033583f5bdb46d5bfee2dd23cf02e.tar.gz external_llvm-5d00cb423a9033583f5bdb46d5bfee2dd23cf02e.tar.bz2 |
Handle a special case xor undef, undef -> 0. Technically this should be transformed to undef. But this is such a common idiom (misuse) we are going to handle it.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48792 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 3 | ||||
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 7 | ||||
-rw-r--r-- | lib/VMCore/ConstantFold.cpp | 7 |
3 files changed, 15 insertions, 2 deletions
diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 2229743..e24a294 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -2119,6 +2119,9 @@ SDOperand DAGCombiner::visitXOR(SDNode *N) { if (FoldedVOp.Val) return FoldedVOp; } + // fold (xor undef, undef) -> 0. This is a common idiom (misuse). + if (N0.getOpcode() == ISD::UNDEF && N1.getOpcode() == ISD::UNDEF) + return DAG.getConstant(0, VT); // fold (xor x, undef) -> undef if (N0.getOpcode() == ISD::UNDEF) return N0; diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 05f7edb..ed564b2 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -2245,6 +2245,12 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT, // Fold a bunch of operators when the RHS is undef. if (N2.getOpcode() == ISD::UNDEF) { switch (Opcode) { + case ISD::XOR: + if (N1.getOpcode() == ISD::UNDEF) + // Handle undef ^ undef -> 0 special case. This is a common + // idiom (misuse). + return getConstant(0, VT); + // fallthrough case ISD::ADD: case ISD::ADDC: case ISD::ADDE: @@ -2258,7 +2264,6 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT, case ISD::SDIV: case ISD::UREM: case ISD::SREM: - case ISD::XOR: return N2; // fold op(arg1, undef) -> undef case ISD::MUL: case ISD::AND: diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp index 762a24a..7b21817 100644 --- a/lib/VMCore/ConstantFold.cpp +++ b/lib/VMCore/ConstantFold.cpp @@ -474,9 +474,14 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode, // Handle UndefValue up front if (isa<UndefValue>(C1) || isa<UndefValue>(C2)) { switch (Opcode) { + case Instruction::Xor: + if (isa<UndefValue>(C1) && isa<UndefValue>(C2)) + // Handle undef ^ undef -> 0 special case. This is a common + // idiom (misuse). + return Constant::getNullValue(C1->getType()); + // Fallthrough case Instruction::Add: case Instruction::Sub: - case Instruction::Xor: return UndefValue::get(C1->getType()); case Instruction::Mul: case Instruction::And: |