diff options
author | Elena Demikhovsky <elena.demikhovsky@intel.com> | 2014-01-16 08:45:54 +0000 |
---|---|---|
committer | Elena Demikhovsky <elena.demikhovsky@intel.com> | 2014-01-16 08:45:54 +0000 |
commit | d1487261a0250aa2bca61d1eeb24ec00f801e659 (patch) | |
tree | 2075842ebe37f22396d6ddc85118a57451198578 /llvm/lib | |
parent | a9d2c67cc2ea6c0e3662ffcf4d4f3cd613a6b308 (diff) | |
download | bcm5719-llvm-d1487261a0250aa2bca61d1eeb24ec00f801e659.tar.gz bcm5719-llvm-d1487261a0250aa2bca61d1eeb24ec00f801e659.zip |
AVX-512: fixed a compare pattern
llvm-svn: 199366
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 431101b6eb7..27b2d0bb942 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -9544,6 +9544,11 @@ SDValue X86TargetLowering::EmitTest(SDValue Op, unsigned X86CC, SelectionDAG &DAG) const { SDLoc dl(Op); + if (Op.getValueType() == MVT::i1) + // KORTEST instruction should be selected + return DAG.getNode(X86ISD::CMP, dl, MVT::i32, Op, + DAG.getConstant(0, Op.getValueType())); + // CF and OF aren't always set the way we want. Determine which // of these we need. bool NeedCF = false; @@ -9560,15 +9565,14 @@ SDValue X86TargetLowering::EmitTest(SDValue Op, unsigned X86CC, NeedOF = true; break; } - // See if we can use the EFLAGS value from the operand instead of // doing a separate TEST. TEST always sets OF and CF to 0, so unless // we prove that the arithmetic won't overflow, we can't use OF or CF. if (Op.getResNo() != 0 || NeedOF || NeedCF) { // Emit a CMP with 0, which is the TEST pattern. - if (Op.getValueType() == MVT::i1) - return DAG.getNode(X86ISD::CMP, dl, MVT::i1, Op, - DAG.getConstant(0, MVT::i1)); + //if (Op.getValueType() == MVT::i1) + // return DAG.getNode(X86ISD::CMP, dl, MVT::i1, Op, + // DAG.getConstant(0, MVT::i1)); return DAG.getNode(X86ISD::CMP, dl, MVT::i32, Op, DAG.getConstant(0, Op.getValueType())); } @@ -9762,10 +9766,10 @@ SDValue X86TargetLowering::EmitCmp(SDValue Op0, SDValue Op1, unsigned X86CC, return EmitTest(Op0, X86CC, DAG); if (Op0.getValueType() == MVT::i1) { + // invert the value Op0 = DAG.getNode(ISD::XOR, dl, MVT::i1, Op0, DAG.getConstant(-1, MVT::i1)); - return DAG.getNode(X86ISD::CMP, dl, MVT::i1, Op0, - DAG.getConstant(0, MVT::i1)); + return EmitTest(Op0, X86CC, DAG); } } |