[X86] Fix a bug in TEST with immediate creation
authorCraig Topper <craig.topper@sifive.com>
Fri, 23 Jul 2021 06:25:33 +0000 (23:25 -0700)
committerCraig Topper <craig.topper@sifive.com>
Fri, 23 Jul 2021 16:03:53 +0000 (09:03 -0700)
This code tries to form a TEST from CMP+AND with an optional
truncate in between. If we looked through the truncate, we may
have extra bits in the AND mask that shouldn't participate in
the checks. Normally SimplifyDemendedBits takes care of this, but
the AND may have another user. So manually mask out any extra bits.

Fixes PR51175.

Differential Revision: https://reviews.llvm.org/D106634

llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
llvm/test/CodeGen/X86/pr51175.ll

index c263c62e2e2e1d756fbd318708def79d9e0f3c6a..e9c7ba44b524fd0992fd74c2eef1170fd41d3897 100644 (file)
@@ -5446,6 +5446,9 @@ void X86DAGToDAGISel::Select(SDNode *Node) {
       ConstantSDNode *C = dyn_cast<ConstantSDNode>(N0.getOperand(1));
       if (!C) break;
       uint64_t Mask = C->getZExtValue();
+      // We may have looked through a truncate so mask off any bits that
+      // shouldn't be part of the compare.
+      Mask &= maskTrailingOnes<uint64_t>(CmpVT.getScalarSizeInBits());
 
       // Check if we can replace AND+IMM64 with a shift. This is possible for
       // masks/ like 0xFF000000 or 0x00FFFFFF and if we care only about the zero
index 9800165cc9e7bcc62d41506ec4ad1277559e9520..26d7492d907196d54db2ddbf6200d4751cac3339 100644 (file)
@@ -15,7 +15,7 @@ define i32 @foo(i16 signext %0, i32 %1, i32* nocapture %2) {
 ; CHECK-NEXT:    andl $65527, %eax # imm = 0xFFF7
 ; CHECK-NEXT:    movl %eax, (%rdx)
 ; CHECK-NEXT:    xorl %eax, %eax
-; CHECK-NEXT:    testl $-9, %edi
+; CHECK-NEXT:    testb $-9, %dil
 ; CHECK-NEXT:    cmovel %esi, %eax
 ; CHECK-NEXT:    retq
   %4 = add i16 %0, 1