Implement support for AArch64ISD::MOVI in computeKnownBits
authorAdrian Tong <adrian@platinumdragon.io>
Mon, 31 Oct 2022 17:22:17 +0000 (17:22 +0000)
committerAdrian Tong <adrian@platinumdragon.io>
Tue, 1 Nov 2022 15:50:08 +0000 (15:50 +0000)
This helps simplify a USHR+ORR into USRA on AArch64

Differential Revision: https://reviews.llvm.org/D137108

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
llvm/test/CodeGen/AArch64/fast-isel-cmp-vec.ll
llvm/test/CodeGen/AArch64/shift-accumulate.ll

index cc0d92f..6571ddd 100644 (file)
@@ -1972,6 +1972,12 @@ void AArch64TargetLowering::computeKnownBitsForTargetNode(
     Known = KnownBits::ashr(Known, Known2);
     break;
   }
+  case AArch64ISD::MOVI: {
+    ConstantSDNode *CN = cast<ConstantSDNode>(Op->getOperand(0));
+    Known =
+        KnownBits::makeConstant(APInt(Known.getBitWidth(), CN->getZExtValue()));
+    break;
+  }
   case AArch64ISD::LOADgot:
   case AArch64ISD::ADDlow: {
     if (!Subtarget->isTargetILP32())
@@ -23114,6 +23120,7 @@ bool AArch64TargetLowering::SimplifyDemandedBitsForTargetNode(
 
 bool AArch64TargetLowering::isTargetCanonicalConstantNode(SDValue Op) const {
   return Op.getOpcode() == AArch64ISD::DUP ||
+         Op.getOpcode() == AArch64ISD::MOVI ||
          (Op.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
           Op.getOperand(0).getOpcode() == AArch64ISD::DUP) ||
          TargetLowering::isTargetCanonicalConstantNode(Op);
index 644a0ef..ee2d940 100644 (file)
@@ -86,7 +86,6 @@ define <16 x i8> @icmp_constfold_v16i8(<16 x i8> %a) {
 ; CHECK-LABEL: icmp_constfold_v16i8:
 ; CHECK:       ; %bb.0:
 ; CHECK-NEXT:    movi.16b v0, #1
-; CHECK-NEXT:    and.16b v0, v0, v0
 ; CHECK-NEXT:    ret
   %1 = icmp eq <16 x i8> %a, %a
   br label %bb2
index eb43583..bea01fc 100644 (file)
@@ -129,8 +129,7 @@ define <8 x i16> @usra_with_movi_v8i16(<16 x i8> %0, <16 x i8> %1) {
 ; CHECK-NEXT:    movi v2.16b, #1
 ; CHECK-NEXT:    cmeq v0.16b, v0.16b, v1.16b
 ; CHECK-NEXT:    and v0.16b, v0.16b, v2.16b
-; CHECK-NEXT:    ushr v1.8h, v0.8h, #7
-; CHECK-NEXT:    orr v0.16b, v1.16b, v0.16b
+; CHECK-NEXT:    usra v0.8h, v0.8h, #7
 ; CHECK-NEXT:    ret
   %3 = icmp eq <16 x i8> %0, %1
   %4 = zext <16 x i1> %3 to <16 x i8>
@@ -148,8 +147,7 @@ define <4 x i32> @usra_with_movi_v4i32(<16 x i8> %0, <16 x i8> %1) {
 ; CHECK-NEXT:    movi v2.16b, #1
 ; CHECK-NEXT:    cmeq v0.16b, v0.16b, v1.16b
 ; CHECK-NEXT:    and v0.16b, v0.16b, v2.16b
-; CHECK-NEXT:    ushr v1.4s, v0.4s, #15
-; CHECK-NEXT:    orr v0.16b, v1.16b, v0.16b
+; CHECK-NEXT:    usra v0.4s, v0.4s, #15
 ; CHECK-NEXT:    ret
   %3 = icmp eq <16 x i8> %0, %1
   %4 = zext <16 x i1> %3 to <16 x i8>
@@ -167,8 +165,7 @@ define <2 x i64> @usra_with_movi_v2i64(<16 x i8> %0, <16 x i8> %1) {
 ; CHECK-NEXT:    movi v2.16b, #1
 ; CHECK-NEXT:    cmeq v0.16b, v0.16b, v1.16b
 ; CHECK-NEXT:    and v0.16b, v0.16b, v2.16b
-; CHECK-NEXT:    ushr v1.2d, v0.2d, #31
-; CHECK-NEXT:    orr v0.16b, v1.16b, v0.16b
+; CHECK-NEXT:    usra v0.2d, v0.2d, #31
 ; CHECK-NEXT:    ret
   %3 = icmp eq <16 x i8> %0, %1
   %4 = zext <16 x i1> %3 to <16 x i8>