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);