]> granicus.if.org Git - llvm/commitdiff
[X86] Turn (and (shl X, C1), C2) into (shl (and X, (C1 >> C2), C2) if the AND could...
authorCraig Topper <craig.topper@intel.com>
Fri, 19 Apr 2019 05:48:13 +0000 (05:48 +0000)
committerCraig Topper <craig.topper@intel.com>
Fri, 19 Apr 2019 05:48:13 +0000 (05:48 +0000)
Could get further improvements by recognizing (i64 and (anyext (i32 shl))).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@358737 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelDAGToDAG.cpp
test/CodeGen/X86/narrow-shl-cst.ll

index 67ba3c50a3a1bc6472576c1580fcdb1072022412..c98cea8a74b1ae33cff6a541a7b44c02326672da 100644 (file)
@@ -4009,6 +4009,9 @@ void X86DAGToDAGISel::Select(SDNode *Node) {
         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)) ||
index 0100a8ce7723e2555358d0a879f5df5730f6292d..86fc7a17e5de874d2ec1cfd732c31baf837ce674 100644 (file)
@@ -201,9 +201,8 @@ define i64 @test16(i64 %x, i64* %y) nounwind {
 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
@@ -225,9 +224,8 @@ define i64 @test18(i64 %x) nounwind {
 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