Message ID | 49eca251-630e-b26c-5d66-4f8b322ee801@arm.com |
---|---|
State | New |
Headers | show |
Series | [1/8] parloops: Copy target and optimizations when creating a function clone | expand |
On Wed, 30 Aug 2023, Andre Vieira (lists) wrote: > When analyzing a loop and choosing a simdclone to use it is possible to choose > a simdclone that cannot be used 'inbranch' for a loop that can use partial > vectors. This may lead to the vectorizer deciding to use partial vectors > which are not supported for notinbranch simd clones. This patch fixes that by > disabling the use of partial vectors once a notinbranch simd clone has been > selected. OK. > gcc/ChangeLog: > > PR tree-optimization/110485 > * tree-vect-stmts.cc (vectorizable_simd_clone_call): Disable partial > vectors usage if a notinbranch simdclone has been selected. > > gcc/testsuite/ChangeLog: > > * gcc.dg/gomp/pr110485.c: New test. >
Rebased on top of trunk, minor change to check if loop_vinfo since we now do some slp vectorization for simd_clones. I assume the previous OK still holds. On 30/08/2023 13:54, Richard Biener wrote: > On Wed, 30 Aug 2023, Andre Vieira (lists) wrote: > >> When analyzing a loop and choosing a simdclone to use it is possible to choose >> a simdclone that cannot be used 'inbranch' for a loop that can use partial >> vectors. This may lead to the vectorizer deciding to use partial vectors >> which are not supported for notinbranch simd clones. This patch fixes that by >> disabling the use of partial vectors once a notinbranch simd clone has been >> selected. > > OK. > >> gcc/ChangeLog: >> >> PR tree-optimization/110485 >> * tree-vect-stmts.cc (vectorizable_simd_clone_call): Disable partial >> vectors usage if a notinbranch simdclone has been selected. >> >> gcc/testsuite/ChangeLog: >> >> * gcc.dg/gomp/pr110485.c: New test. >> > diff --git a/gcc/testsuite/gcc.dg/gomp/pr110485.c b/gcc/testsuite/gcc.dg/gomp/pr110485.c new file mode 100644 index 0000000000000000000000000000000000000000..ba6817a127f40246071e32ccebf692cc4d121d15 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/pr110485.c @@ -0,0 +1,19 @@ +/* PR 110485 */ +/* { dg-do compile } */ +/* { dg-additional-options "-Ofast -fdump-tree-vect-details" } */ +/* { dg-additional-options "-march=znver4 --param=vect-partial-vector-usage=1" { target x86_64-*-* } } */ +#pragma omp declare simd notinbranch uniform(p) +extern double __attribute__ ((const)) bar (double a, double p); + +double a[1024]; +double b[1024]; + +void foo (int n) +{ + #pragma omp simd + for (int i = 0; i < n; ++i) + a[i] = bar (b[i], 71.2); +} + +/* { dg-final { scan-tree-dump-not "MASK_LOAD" "vect" } } */ +/* { dg-final { scan-tree-dump "can't use a fully-masked loop because a non-masked simd clone was selected." "vect" { target x86_64-*-* } } } */ diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc index a9156975d64c7a335ffd27614e87f9d11b23d1ba..731acc76350cae39c899a866584068cff247183a 100644 --- a/gcc/tree-vect-stmts.cc +++ b/gcc/tree-vect-stmts.cc @@ -4539,6 +4539,17 @@ vectorizable_simd_clone_call (vec_info *vinfo, stmt_vec_info stmt_info, ? boolean_true_node : boolean_false_node; simd_clone_info.safe_push (sll); } + + if (!bestn->simdclone->inbranch && loop_vinfo) + { + if (dump_enabled_p () + && LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo)) + dump_printf_loc (MSG_NOTE, vect_location, + "can't use a fully-masked loop because a" + " non-masked simd clone was selected.\n"); + LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo) = false; + } + STMT_VINFO_TYPE (stmt_info) = call_simd_clone_vec_info_type; DUMP_VECT_SCOPE ("vectorizable_simd_clone_call"); /* vect_model_simple_cost (vinfo, stmt_info, ncopies,
On Wed, 18 Oct 2023, Andre Vieira (lists) wrote: > Rebased on top of trunk, minor change to check if loop_vinfo since we now do > some slp vectorization for simd_clones. > > I assume the previous OK still holds. Ack. > On 30/08/2023 13:54, Richard Biener wrote: > > On Wed, 30 Aug 2023, Andre Vieira (lists) wrote: > > > >> When analyzing a loop and choosing a simdclone to use it is possible to > >> choose > >> a simdclone that cannot be used 'inbranch' for a loop that can use partial > >> vectors. This may lead to the vectorizer deciding to use partial vectors > >> which are not supported for notinbranch simd clones. This patch fixes that > >> by > >> disabling the use of partial vectors once a notinbranch simd clone has been > >> selected. > > > > OK. > > > >> gcc/ChangeLog: > >> > >> PR tree-optimization/110485 > >> * tree-vect-stmts.cc (vectorizable_simd_clone_call): Disable partial > >> vectors usage if a notinbranch simdclone has been selected. > >> > >> gcc/testsuite/ChangeLog: > >> > >> * gcc.dg/gomp/pr110485.c: New test. > >> > >
diff --git a/gcc/testsuite/gcc.dg/gomp/pr110485.c b/gcc/testsuite/gcc.dg/gomp/pr110485.c new file mode 100644 index 0000000000000000000000000000000000000000..ba6817a127f40246071e32ccebf692cc4d121d15 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/pr110485.c @@ -0,0 +1,19 @@ +/* PR 110485 */ +/* { dg-do compile } */ +/* { dg-additional-options "-Ofast -fdump-tree-vect-details" } */ +/* { dg-additional-options "-march=znver4 --param=vect-partial-vector-usage=1" { target x86_64-*-* } } */ +#pragma omp declare simd notinbranch uniform(p) +extern double __attribute__ ((const)) bar (double a, double p); + +double a[1024]; +double b[1024]; + +void foo (int n) +{ + #pragma omp simd + for (int i = 0; i < n; ++i) + a[i] = bar (b[i], 71.2); +} + +/* { dg-final { scan-tree-dump-not "MASK_LOAD" "vect" } } */ +/* { dg-final { scan-tree-dump "can't use a fully-masked loop because a non-masked simd clone was selected." "vect" { target x86_64-*-* } } } */ diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc index 35207de7acb410358220dbe8d1af82215b5091bf..664c3b5f7ca48fdb49383fb8a97f407465574479 100644 --- a/gcc/tree-vect-stmts.cc +++ b/gcc/tree-vect-stmts.cc @@ -4349,6 +4349,17 @@ vectorizable_simd_clone_call (vec_info *vinfo, stmt_vec_info stmt_info, ? boolean_true_node : boolean_false_node; STMT_VINFO_SIMD_CLONE_INFO (stmt_info).safe_push (sll); } + + if (!bestn->simdclone->inbranch) + { + if (dump_enabled_p () + && LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo)) + dump_printf_loc (MSG_NOTE, vect_location, + "can't use a fully-masked loop because a" + " non-masked simd clone was selected.\n"); + LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo) = false; + } + STMT_VINFO_TYPE (stmt_info) = call_simd_clone_vec_info_type; DUMP_VECT_SCOPE ("vectorizable_simd_clone_call"); /* vect_model_simple_cost (vinfo, stmt_info, ncopies,