diff options
| author | Sanjay Patel <spatel@rotateright.com> | 2016-04-09 16:02:52 +0000 |
|---|---|---|
| committer | Sanjay Patel <spatel@rotateright.com> | 2016-04-09 16:02:52 +0000 |
| commit | 4abae4e0faea4930ca7d941358ba535835cba1c0 (patch) | |
| tree | 317f10654af1f78a2ed4f32fdcce4b4a54156fac /llvm/lib/Target/X86 | |
| parent | 1cc5712763e6af3aa1f181680a9359280e6adc14 (diff) | |
| download | bcm5719-llvm-4abae4e0faea4930ca7d941358ba535835cba1c0.tar.gz bcm5719-llvm-4abae4e0faea4930ca7d941358ba535835cba1c0.zip | |
[x86] use BMI 'andn' for logic + compare ops
With BMI, we can use 'andn' to save an instruction when the result is only used in a compare.
This is related to one of the potential sequences to check 'isfinite' in:
https://llvm.org/bugs/show_bug.cgi?id=27164
Differential Revision: http://reviews.llvm.org/D18910
llvm-svn: 265875
Diffstat (limited to 'llvm/lib/Target/X86')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index bb670f98a12..8aea8c1b6de 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -14677,10 +14677,20 @@ SDValue X86TargetLowering::EmitTest(SDValue Op, unsigned X86CC, SDLoc dl, break; case ISD::AND: - // If the primary and result isn't used, don't bother using X86ISD::AND, + // If the primary 'and' result isn't used, don't bother using X86ISD::AND, // because a TEST instruction will be better. - if (!hasNonFlagsUse(Op)) - break; + if (!hasNonFlagsUse(Op)) { + SDValue Op0 = ArithOp->getOperand(0); + SDValue Op1 = ArithOp->getOperand(1); + EVT VT = ArithOp.getValueType(); + bool isAndn = isBitwiseNot(Op0) || isBitwiseNot(Op1); + bool isLegalAndnType = VT == MVT::i32 || VT == MVT::i64; + + // But if we can combine this into an ANDN operation, then create an AND + // now and allow it to be pattern matched into an ANDN. + if (!Subtarget.hasBMI() || !isAndn || !isLegalAndnType) + break; + } // FALL THROUGH case ISD::SUB: case ISD::OR: |

