summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2016-05-05 06:00:56 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2016-05-05 06:00:56 +0000
commit911d0e3c21e232047fa52b53616adccd7c87fc75 (patch)
tree9ebc971fbfe331e2dfd3ed55c4a27f298fe774af
parent0c090362329baf08e3ac367e1c5415c3f3f183cc (diff)
downloadbcm5719-llvm-911d0e3c21e232047fa52b53616adccd7c87fc75.tar.gz
bcm5719-llvm-911d0e3c21e232047fa52b53616adccd7c87fc75.zip
[X86] Use the right type when folding xor (truncate (shift)) -> setcc
The result type of setcc is dependent on whether or not AVX512 is present. We had an X86-specific DAG-combine which assumed that the result type should be i8 when it could be i1. This meant that we would generate illegal setccs which LowerSETCC did not like. Instead, use an appropriate type and zero extend to i8. Also, there were some scenarios where the fold should have fired but didn't because we were overly cautious about the types. This meant that we generated: shrl $31, %edi andl $1, %edi kmovw %edi, %k0 kxnorw %k0, %k0, %k1 kshiftrw $15, %k1, %k1 kxorw %k1, %k0, %k0 kmovw %k0, %eax instead of: testl %edi, %edi setns %al This fixes PR27638. llvm-svn: 268609
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp12
-rw-r--r--llvm/test/CodeGen/X86/setcc.ll24
2 files changed, 33 insertions, 3 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 531a0a15341..d3457ed841f 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -27307,8 +27307,9 @@ static SDValue combineIntegerAbs(SDNode *N, SelectionDAG &DAG) {
/// into:
/// SETGT(X, -1)
static SDValue foldXorTruncShiftIntoCmp(SDNode *N, SelectionDAG &DAG) {
- // This is only worth doing if the output type is i8.
- if (N->getValueType(0) != MVT::i8)
+ // This is only worth doing if the output type is i8 or i1.
+ EVT ResultType = N->getValueType(0);
+ if (ResultType != MVT::i8 && ResultType != MVT::i1)
return SDValue();
SDValue N0 = N->getOperand(0);
@@ -27343,8 +27344,13 @@ static SDValue foldXorTruncShiftIntoCmp(SDNode *N, SelectionDAG &DAG) {
SDLoc DL(N);
SDValue ShiftOp = Shift.getOperand(0);
EVT ShiftOpTy = ShiftOp.getValueType();
- SDValue Cond = DAG.getSetCC(DL, MVT::i8, ShiftOp,
+ const TargetLowering &TLI = DAG.getTargetLoweringInfo();
+ EVT SetCCResultType = TLI.getSetCCResultType(DAG.getDataLayout(),
+ *DAG.getContext(), ResultType);
+ SDValue Cond = DAG.getSetCC(DL, SetCCResultType, ShiftOp,
DAG.getConstant(-1, DL, ShiftOpTy), ISD::SETGT);
+ if (SetCCResultType != ResultType)
+ Cond = DAG.getNode(ISD::ZERO_EXTEND, DL, ResultType, Cond);
return Cond;
}
diff --git a/llvm/test/CodeGen/X86/setcc.ll b/llvm/test/CodeGen/X86/setcc.ll
index b4847c54ffa..d5874344fd1 100644
--- a/llvm/test/CodeGen/X86/setcc.ll
+++ b/llvm/test/CodeGen/X86/setcc.ll
@@ -54,3 +54,27 @@ entry:
%add = shl nuw nsw i32 %conv4.2, 16
ret i32 %add
}
+
+define i8 @t5(i32 %a) #0 {
+entry:
+; CHECK-LABEL: t5:
+; CHECK: testl %edi, %edi
+; CHECK: setns %al
+ %.lobit = lshr i32 %a, 31
+ %trunc = trunc i32 %.lobit to i8
+ %.not = xor i8 %trunc, 1
+ ret i8 %.not
+}
+
+define zeroext i1 @t6(i32 %a) #0 {
+entry:
+; CHECK-LABEL: t6:
+; CHECK: testl %edi, %edi
+; CHECK: setns %al
+ %.lobit = lshr i32 %a, 31
+ %trunc = trunc i32 %.lobit to i1
+ %.not = xor i1 %trunc, 1
+ ret i1 %.not
+}
+
+attributes #0 = { "target-cpu"="skylake-avx512" }
OpenPOWER on IntegriCloud