diff options
author | Dan Gohman <gohman@apple.com> | 2009-03-05 19:32:48 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-03-05 19:32:48 +0000 |
commit | 4bfcf2a2a64785f3f0f0dd8fa6f4052d6cd7c08c (patch) | |
tree | e6efb093f9ff49415dc3f25dde1d398dd6a44fb4 /lib | |
parent | 8733db351a115a6f269e8814df2804f1b2172362 (diff) |
Fix the "test" optimization to recognize "dec" as an add of
negative one, as subtracts of immediates are canonicalized
to adds.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66180 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/X86/X86ISelLowering.cpp | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index d56e672e1f..33eee7a736 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -5382,13 +5382,19 @@ SDValue X86TargetLowering::EmitTest(SDValue Op, SelectionDAG &DAG) { UE = Op.getNode()->use_end(); UI != UE; ++UI) if (UI->getOpcode() == ISD::STORE) goto default_case; - // An add of one will be selected as an INC. if (ConstantSDNode *C = - dyn_cast<ConstantSDNode>(Op.getNode()->getOperand(1))) + dyn_cast<ConstantSDNode>(Op.getNode()->getOperand(1))) { + // An add of one will be selected as an INC. if (C->getAPIntValue() == 1) { Opcode = X86ISD::INC; break; } + // An add of negative one (subtract of one) will be selected as a DEC. + if (C->getAPIntValue().isAllOnesValue()) { + Opcode = X86ISD::DEC; + break; + } + } // Otherwise use a regular EFLAGS-setting add. Opcode = X86ISD::ADD; break; @@ -5399,13 +5405,6 @@ SDValue X86TargetLowering::EmitTest(SDValue Op, SelectionDAG &DAG) { UE = Op.getNode()->use_end(); UI != UE; ++UI) if (UI->getOpcode() == ISD::STORE) goto default_case; - // A subtract of one will be selected as a DEC. - if (ConstantSDNode *C = - dyn_cast<ConstantSDNode>(Op.getNode()->getOperand(1))) - if (C->getAPIntValue() == 1) { - Opcode = X86ISD::DEC; - break; - } // Otherwise use a regular EFLAGS-setting sub. Opcode = X86ISD::SUB; break; |