forked from OSchip/llvm-project
[X86] Fix a bug in TEST with immediate creation
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
This commit is contained in:
parent
04e21fbc44
commit
cc6d302c91
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue