[TargetLowering] SimplifyDemandedBits ISD::SRA multi-use handling
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Tue, 21 Jan 2020 15:11:46 +0000 (15:11 +0000)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Tue, 21 Jan 2020 15:12:07 +0000 (15:12 +0000)
Call SimplifyMultipleUseDemandedBits to peek through extended source args with multiple uses

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
llvm/test/CodeGen/X86/const-shift-of-constmasked.ll

index 4cd9072..9ae331b 100644 (file)
@@ -1534,6 +1534,16 @@ bool TargetLowering::SimplifyDemandedBits(
       if (Known.One[BitWidth - ShAmt - 1])
         // New bits are known one.
         Known.One.setHighBits(ShAmt);
+
+      // Attempt to avoid multi-use ops if we don't need anything from them.
+      if (!InDemandedMask.isAllOnesValue() || !DemandedElts.isAllOnesValue()) {
+        SDValue DemandedOp0 = SimplifyMultipleUseDemandedBits(
+            Op0, InDemandedMask, DemandedElts, TLO.DAG, Depth + 1);
+        if (DemandedOp0) {
+          SDValue NewOp = TLO.DAG.getNode(ISD::SRA, dl, VT, DemandedOp0, Op1);
+          return TLO.CombineTo(Op, NewOp);
+        }
+      }
     }
     break;
   }
index 08ef740..e52b3af 100644 (file)
@@ -1870,9 +1870,9 @@ define i64 @test_i64_18446744065119617024_mask_ashr_1(i64 %a0) {
 define i64 @test_i64_18446744065119617024_mask_ashr_32(i64 %a0) {
 ; X32-LABEL: test_i64_18446744065119617024_mask_ashr_32:
 ; X32:       # %bb.0:
-; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %edx
+; X32-NEXT:    movl %edx, %eax
 ; X32-NEXT:    andl $-2, %eax
-; X32-NEXT:    movl %eax, %edx
 ; X32-NEXT:    sarl $31, %edx
 ; X32-NEXT:    retl
 ;