[PATCH] D95967: [DAGCombiner][SVE] Fix invalid use of getVectorNumElements() in visitSRA.

Huihui Zhang via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 3 12:17:34 PST 2021


huihuiz created this revision.
huihuiz added reviewers: efriedma, sdesmalen, paulwalker-arm, david-arm, kmclaughlin, c-rhodes.
huihuiz added a project: LLVM.
Herald added subscribers: ecnelises, psnobl, hiraditya, tschuett.
huihuiz requested review of this revision.

Make sure scalable property is preserved by using getVectorElementCount().


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D95967

Files:
  llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
  llvm/test/CodeGen/AArch64/DAGCombine_vscale.ll


Index: llvm/test/CodeGen/AArch64/DAGCombine_vscale.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/AArch64/DAGCombine_vscale.ll
@@ -0,0 +1,40 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s 2>%t | FileCheck %s
+; RUN: FileCheck --check-prefix=WARN --allow-empty %s <%t
+
+; WARN-NOT: warning
+
+; Check that DAGCombiner is not asserting with mis-matched vector element count, "Vector element counts must match in SIGN_EXTEND_INREG".
+; Also no warning message of "warning: Possible incorrect use of EVT::getVectorNumElements() for scalable vector.".
+
+define <vscale x 4 x i32> @sext_inreg(<vscale x 4 x i32> %a) {
+; CHECK-LABEL: sext_inreg:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    ptrue p0.s
+; CHECK-NEXT:    sxth z0.s, p0/m, z0.s
+; CHECK-NEXT:    ret
+  %in = insertelement <vscale x 4 x i32> undef, i32 16, i32 0
+  %splat = shufflevector <vscale x 4 x i32> %in, <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer
+  %sext = shl <vscale x 4 x i32> %a, %splat
+  %conv = ashr <vscale x 4 x i32> %sext, %splat
+  ret <vscale x 4 x i32> %conv
+}
+
+define <vscale x 4 x i32> @ashr_add_shl_v4i8(<vscale x 4 x i32> %a) {
+; CHECK-LABEL: ashr_add_shl_v4i8:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    mov w8, #16777216
+; CHECK-NEXT:    mov z1.s, w8
+; CHECK-NEXT:    lsl z0.s, z0.s, #24
+; CHECK-NEXT:    add z0.s, z0.s, z1.s
+; CHECK-NEXT:    asr z0.s, z0.s, #24
+; CHECK-NEXT:    ret
+  %in1 = insertelement <vscale x 4 x i32> undef, i32 24, i32 0
+  %splat1 = shufflevector <vscale x 4 x i32> %in1, <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer
+  %in2 = insertelement <vscale x 4 x i32> undef, i32 16777216, i32 0
+  %splat2 = shufflevector <vscale x 4 x i32> %in2, <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer
+  %conv = shl <vscale x 4 x i32> %a, %splat1
+  %sext = add <vscale x 4 x i32> %conv, %splat2
+  %conv1 = ashr <vscale x 4 x i32> %sext, %splat1
+  ret <vscale x 4 x i32> %conv1
+}
Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -8361,8 +8361,8 @@
     unsigned LowBits = OpSizeInBits - (unsigned)N1C->getZExtValue();
     EVT ExtVT = EVT::getIntegerVT(*DAG.getContext(), LowBits);
     if (VT.isVector())
-      ExtVT = EVT::getVectorVT(*DAG.getContext(),
-                               ExtVT, VT.getVectorNumElements());
+      ExtVT = EVT::getVectorVT(*DAG.getContext(), ExtVT,
+                               VT.getVectorElementCount());
     if (!LegalOperations ||
         TLI.getOperationAction(ISD::SIGN_EXTEND_INREG, ExtVT) ==
         TargetLowering::Legal)
@@ -8416,7 +8416,7 @@
       EVT TruncVT = EVT::getIntegerVT(Ctx, OpSizeInBits - N1C->getZExtValue());
 
       if (VT.isVector())
-        TruncVT = EVT::getVectorVT(Ctx, TruncVT, VT.getVectorNumElements());
+        TruncVT = EVT::getVectorVT(Ctx, TruncVT, VT.getVectorElementCount());
 
       // Determine the residual right-shift amount.
       int ShiftAmt = N1C->getZExtValue() - N01C->getZExtValue();
@@ -8456,7 +8456,7 @@
       unsigned ShiftAmt = N1C->getZExtValue();
       EVT TruncVT = EVT::getIntegerVT(Ctx, OpSizeInBits - ShiftAmt);
       if (VT.isVector())
-        TruncVT = EVT::getVectorVT(Ctx, TruncVT, VT.getVectorNumElements());
+        TruncVT = EVT::getVectorVT(Ctx, TruncVT, VT.getVectorElementCount());
 
       // TODO: The simple type check probably belongs in the default hook
       //       implementation and/or target-specific overrides (because


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D95967.321185.patch
Type: text/x-patch
Size: 3740 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210203/14d96050/attachment.bin>


More information about the llvm-commits mailing list