]> granicus.if.org Git - llvm/commitdiff
[TargetLowering] avoid miscompile in setcc transform (PR40657)
authorSanjay Patel <spatel@rotateright.com>
Sat, 9 Feb 2019 15:59:02 +0000 (15:59 +0000)
committerSanjay Patel <spatel@rotateright.com>
Sat, 9 Feb 2019 15:59:02 +0000 (15:59 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353615 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/TargetLowering.cpp
test/CodeGen/X86/setcc-combine.ll

index 484dbffefbb776b3e0130665ea68728027dbe103..b933f0324097e0057dc07d90f265bbc1bdc77abc 100644 (file)
@@ -3074,7 +3074,9 @@ SDValue TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
             return DAG.getSetCC(dl, VT, N0.getOperand(0),
                                 DAG.getConstant(0, dl, N0.getValueType()),
                                 Cond);
-          if (N0.getNode()->hasOneUse()) {
+          // The shift is not valid if this is a bool (i1).
+          // TODO: This transform needs evidence to justify its existence.
+          if (N0.getNode()->hasOneUse() && OpVT.getScalarSizeInBits() != 1) {
             assert(N0.getOpcode() == ISD::SUB && "Unexpected operation!");
             auto &DL = DAG.getDataLayout();
             // (Z-X) == X  --> Z == X<<1
index d7f0a264218f1e49dd2472ad2bebac632e036529..749d99bcaff63156c950a946b6586477e9cc64f7 100644 (file)
@@ -262,12 +262,15 @@ define void @test_i1_uge(i1 *%A2) {
   ret void
 }
 
-; FIXME: This should not get folded to 0.
+; This should not get folded to 0.
 
 define i64 @PR40657(i8 %var2, i8 %var9) {
 ; CHECK-LABEL: PR40657:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    xorl %eax, %eax
+; CHECK-NEXT:    notb %sil
+; CHECK-NEXT:    addb %dil, %sil
+; CHECK-NEXT:    movzbl %sil, %eax
+; CHECK-NEXT:    andl $1, %eax
 ; CHECK-NEXT:    retq
   %var6 = trunc i8 %var9 to i1
   %var7 = trunc i8 175 to i1