ShiftedVal = (uint64_t)Val >> ShAmt;
if (NVT == MVT::i64 && !isUInt<32>(Val) && isUInt<32>(ShiftedVal))
return true;
+ // Also swap order when the AND can become MOVZX.
+ if (ShiftedVal == UINT8_MAX || ShiftedVal == UINT16_MAX)
+ return true;
}
ShiftedVal = Val >> ShAmt;
if ((!isInt<8>(Val) && isInt<8>(ShiftedVal)) ||
define i32 @test17(i32 %x) nounwind {
; CHECK-LABEL: test17:
; CHECK: # %bb.0:
-; CHECK-NEXT: movl %edi, %eax
+; CHECK-NEXT: movzbl %dil, %eax
; CHECK-NEXT: shll $10, %eax
-; CHECK-NEXT: andl $261120, %eax # imm = 0x3FC00
; CHECK-NEXT: retq
%and = shl i32 %x, 10
%shl = and i32 %and, 261120
define i32 @test19(i32 %x) nounwind {
; CHECK-LABEL: test19:
; CHECK: # %bb.0:
-; CHECK-NEXT: movl %edi, %eax
+; CHECK-NEXT: movzwl %di, %eax
; CHECK-NEXT: shll $10, %eax
-; CHECK-NEXT: andl $67107840, %eax # imm = 0x3FFFC00
; CHECK-NEXT: retq
%and = shl i32 %x, 10
%shl = and i32 %and, 67107840