Hi,

This uses 'get_related_vectype_for_scalar_type' to construct a standard vectype
for any non scalar masks, which resolves the ICE caused by the sve type
attribute in SVE types used for simdclones.

Tested on aarch64-none-linux-gnu. OK for trunk?

PR target/123016
gcc/ChangeLog:

        * tree-vect-stmts.cc (vectorizable_simd_clone_call): use
        get_related_vectype_for_scalar_type to reconstruct standard vectype for
        non-scalar masks.

gcc/testsuite/ChangeLog:

        * gfortran.dg/vect/pr123016.f90: New test.

diff --git a/gcc/testsuite/gfortran.dg/vect/pr123016.f90 
b/gcc/testsuite/gfortran.dg/vect/pr123016.f90
new file mode 100644
index 
0000000000000000000000000000000000000000..1288352f339d86c45a604eadfdb88c5deb75b170
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/vect/pr123016.f90
@@ -0,0 +1,22 @@
+! { dg-do compile }
+! { dg-additional-options "-Ofast" }
+! { dg-additional-options "-mcpu=neoverse-v2" { target aarch64*-*-* } }"
+!GCC$ builtin (expf) attributes simd (notinbranch)
+      MODULE MODULE_CU_BMJ
+      INTEGER:: JTB
+      CONTAINS
+      SUBROUTINE BMJDRVRQVCUTEN
+REAL, DIMENSION(JTB) :: THEOLD,TOLDY2T
+      DO KTH=1,KTHM
+        TH=TH+DTH
+        DENOM=TH
+        IF (DENOM>EPS) THEN
+           QS=EXP(0/DENOM)
+        ELSE
+           QS=0.
+        ENDIF
+        THEOLD(KTH)=EXP(ELOCP*QS)
+      ENDDO
+      CALL SPLINE
+      END
+      END
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 
83983742467c2bbbff9095e4c46859e5ac9ba14d..4c29cb37c04d1f51a9d48a9cb1f8e1b1eea439b2
 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -4484,6 +4484,16 @@ vectorizable_simd_clone_call (vec_info *vinfo, 
stmt_vec_info stmt_info,
                  else
                    {
                      masktype = bestn_inbranch->simdclone->args[i].vector_type;
+                     /* The aarch64 port will add custom attributes to types
+                        for SVE simdclones which make the types different.  We
+                        should use canonincal types for masks within the
+                        vectorizer, hence we construct the related vectype
+                        here.  */
+                     masktype
+                       = get_related_vectype_for_scalar_type
+                         (TYPE_MODE (masktype),
+                          TREE_TYPE (masktype),
+                          TYPE_VECTOR_SUBPARTS (masktype));
                      callee_nelements = TYPE_VECTOR_SUBPARTS (masktype);
                    }
                  auto o = vector_unroll_factor (nunits, callee_nelements);

Reply via email to