]> granicus.if.org Git - llvm/commitdiff
[X86] Enable BuildSDIVPow2 for i16.
authorCraig Topper <craig.topper@intel.com>
Thu, 5 Sep 2019 18:49:52 +0000 (18:49 +0000)
committerCraig Topper <craig.topper@intel.com>
Thu, 5 Sep 2019 18:49:52 +0000 (18:49 +0000)
We're able to use a 32-bit ADD and CMOV here and should work
well with our other i16->i32 promotion optimizations.

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

lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/combine-sdiv.ll
test/CodeGen/X86/combine-srem.ll

index d7efb0a126dd4a061acfbbfe74f844898d7f4ded..136d124ab4ba69f8c3667f716833356f1680ba1f 100644 (file)
@@ -20098,8 +20098,9 @@ X86TargetLowering::BuildSDIVPow2(SDNode *N, const APInt &Divisor,
 
   // fold (sdiv X, pow2)
   EVT VT = N->getValueType(0);
-  // FIXME: Support i8/i16.
-  if ((VT != MVT::i32 && !(Subtarget.is64Bit() && VT == MVT::i64)))
+  // FIXME: Support i8.
+  if (VT != MVT::i16 && VT != MVT::i32 &&
+      !(Subtarget.is64Bit() && VT == MVT::i64))
     return SDValue();
 
   unsigned Lg2 = Divisor.countTrailingZeros();
index 59e13e7cea4db520d03bc2ec9e6064f0712fdf46..137e03228c0f2f2dafa77de2c2148ef3dc6c1a1c 100644 (file)
@@ -3168,10 +3168,10 @@ define i8 @combine_i8_sdiv_negpow2(i8 %x) {
 define i16 @combine_i16_sdiv_pow2(i16 %x) {
 ; CHECK-LABEL: combine_i16_sdiv_pow2:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    movswl %di, %eax
-; CHECK-NEXT:    shrl $27, %eax
-; CHECK-NEXT:    andl $15, %eax
-; CHECK-NEXT:    addl %edi, %eax
+; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
+; CHECK-NEXT:    leal 15(%rdi), %eax
+; CHECK-NEXT:    testw %di, %di
+; CHECK-NEXT:    cmovnsl %edi, %eax
 ; CHECK-NEXT:    cwtl
 ; CHECK-NEXT:    shrl $4, %eax
 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
@@ -3183,10 +3183,10 @@ define i16 @combine_i16_sdiv_pow2(i16 %x) {
 define i16 @combine_i16_sdiv_negpow2(i16 %x) {
 ; CHECK-LABEL: combine_i16_sdiv_negpow2:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    movswl %di, %eax
-; CHECK-NEXT:    shrl $23, %eax
-; CHECK-NEXT:    movzbl %al, %eax
-; CHECK-NEXT:    addl %edi, %eax
+; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
+; CHECK-NEXT:    leal 255(%rdi), %eax
+; CHECK-NEXT:    testw %di, %di
+; CHECK-NEXT:    cmovnsl %edi, %eax
 ; CHECK-NEXT:    cwtl
 ; CHECK-NEXT:    sarl $8, %eax
 ; CHECK-NEXT:    negl %eax
index 4148e5b6d35c9ac8d2be2e878325ac817e67b026..b08bb5b4dbdac48938c11510a89fa9da02281688 100644 (file)
@@ -480,13 +480,12 @@ define i16 @combine_i16_srem_pow2(i16 %x) {
 ; CHECK-LABEL: combine_i16_srem_pow2:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    movl %edi, %eax
-; CHECK-NEXT:    movswl %ax, %ecx
-; CHECK-NEXT:    shrl $27, %ecx
-; CHECK-NEXT:    andl $15, %ecx
-; CHECK-NEXT:    addl %edi, %ecx
+; CHECK-NEXT:    leal 15(%rax), %ecx
+; CHECK-NEXT:    testw %ax, %ax
+; CHECK-NEXT:    cmovnsl %edi, %ecx
 ; CHECK-NEXT:    andl $-16, %ecx
 ; CHECK-NEXT:    subl %ecx, %eax
-; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
+; CHECK-NEXT:    # kill: def $ax killed $ax killed $rax
 ; CHECK-NEXT:    retq
   %1 = srem i16 %x, 16
   ret i16 %1
@@ -496,13 +495,12 @@ define i16 @combine_i16_srem_negpow2(i16 %x) {
 ; CHECK-LABEL: combine_i16_srem_negpow2:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    movl %edi, %eax
-; CHECK-NEXT:    movswl %ax, %ecx
-; CHECK-NEXT:    shrl $23, %ecx
-; CHECK-NEXT:    movzbl %cl, %ecx
-; CHECK-NEXT:    addl %edi, %ecx
+; CHECK-NEXT:    leal 255(%rax), %ecx
+; CHECK-NEXT:    testw %ax, %ax
+; CHECK-NEXT:    cmovnsl %edi, %ecx
 ; CHECK-NEXT:    andl $-256, %ecx
 ; CHECK-NEXT:    subl %ecx, %eax
-; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
+; CHECK-NEXT:    # kill: def $ax killed $ax killed $rax
 ; CHECK-NEXT:    retq
   %1 = srem i16 %x, -256
   ret i16 %1