[llvm] dab0533 - [SVE] Fix PromoteIntRes_TRUNCATE not to call getVectorNumElements

Dylan Fleming via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 16 05:10:56 PDT 2021


Author: Dylan Fleming
Date: 2021-06-16T13:09:43+01:00
New Revision: dab05335a64250703ac528418d56301ce6c48bd6

URL: https://github.com/llvm/llvm-project/commit/dab05335a64250703ac528418d56301ce6c48bd6
DIFF: https://github.com/llvm/llvm-project/commit/dab05335a64250703ac528418d56301ce6c48bd6.diff

LOG: [SVE] Fix PromoteIntRes_TRUNCATE not to call getVectorNumElements

Reviewed By: sdesmalen

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

Added: 
    

Modified: 
    llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
    llvm/test/CodeGen/AArch64/sve-trunc.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
index 1584e0cba8cf0..997cc39d709ae 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
@@ -1239,17 +1239,17 @@ SDValue DAGTypeLegalizer::PromoteIntRes_TRUNCATE(SDNode *N) {
   case TargetLowering::TypeSplitVector: {
     EVT InVT = InOp.getValueType();
     assert(InVT.isVector() && "Cannot split scalar types");
-    unsigned NumElts = InVT.getVectorNumElements();
-    assert(NumElts == NVT.getVectorNumElements() &&
+    ElementCount NumElts = InVT.getVectorElementCount();
+    assert(NumElts == NVT.getVectorElementCount() &&
            "Dst and Src must have the same number of elements");
-    assert(isPowerOf2_32(NumElts) &&
+    assert(isPowerOf2_32(NumElts.getKnownMinValue()) &&
            "Promoted vector type must be a power of two");
 
     SDValue EOp1, EOp2;
     GetSplitVector(InOp, EOp1, EOp2);
 
     EVT HalfNVT = EVT::getVectorVT(*DAG.getContext(), NVT.getScalarType(),
-                                   NumElts/2);
+                                   NumElts.divideCoefficientBy(2));
     EOp1 = DAG.getNode(ISD::TRUNCATE, dl, HalfNVT, EOp1);
     EOp2 = DAG.getNode(ISD::TRUNCATE, dl, HalfNVT, EOp2);
 

diff  --git a/llvm/test/CodeGen/AArch64/sve-trunc.ll b/llvm/test/CodeGen/AArch64/sve-trunc.ll
index dbe965d1eceee..1f28876f2524c 100644
--- a/llvm/test/CodeGen/AArch64/sve-trunc.ll
+++ b/llvm/test/CodeGen/AArch64/sve-trunc.ll
@@ -183,3 +183,18 @@ entry:
   %out = trunc <vscale x 16 x i8> %in to <vscale x 16 x i1>
   ret <vscale x 16 x i1> %out
 }
+
+define void @trunc_promoteIntRes(<vscale x 4 x i64> %0, i16* %ptr) {
+; CHECK-LABEL: trunc_promoteIntRes:
+; CHECK:       // %bb.0: // %entry
+; CHECK-NEXT:    uzp1 z0.s, z0.s, z1.s
+; CHECK-NEXT:    ptrue p0.s
+; CHECK-NEXT:    st1h { z0.s }, p0, [x0]
+; CHECK-NEXT:    ret
+entry:
+  %1 = trunc <vscale x 4 x i64> %0 to <vscale x 4 x i16>
+  %2 = bitcast i16* %ptr to <vscale x 4 x i16>*
+  store <vscale x 4 x i16> %1, <vscale x 4 x i16>* %2, align 2
+  ret void
+}
+


        


More information about the llvm-commits mailing list