Skip to content

Commit

Permalink
[X86] Fix a bug in TEST with immediate creation
Browse files Browse the repository at this point in the history
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
  • Loading branch information
topperc committed Jul 23, 2021
1 parent 04e21fb commit cc6d302
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 1 deletion.
3 changes: 3 additions & 0 deletions llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/X86/pr51175.ll
Expand Up @@ -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
Expand Down

0 comments on commit cc6d302

Please sign in to comment.