diff options
author | Stam Markianos-Wright <stam.markianos-wright@arm.com> | 2021-03-25 15:29:41 +0000 |
---|---|---|
committer | Stam Markianos-Wright <stam.markianos-wright@arm.com> | 2021-03-25 15:29:41 +0000 |
commit | aac12084fc07319d5c8232c51dafa4e297bd5415 (patch) | |
tree | a709624d347cab7e194f12effc05a0865bbc5b4c | |
parent | de00a7bda94910835012bc7150be53b460a5c8b6 (diff) | |
download | gcc-aac12084fc07319d5c8232c51dafa4e297bd5415.zip gcc-aac12084fc07319d5c8232c51dafa4e297bd5415.tar.gz gcc-aac12084fc07319d5c8232c51dafa4e297bd5415.tar.bz2 |
tree-optimization/96974 - avoid ICE by replacing assert with standard failure
Minor patch to add a graceful exit in the rare case where an invalid
combination of TYPE_VECTOR_SUBPARTS for nunits_vectype and
*stmt_vectype_out is reached in vect_get_vector_types_for_stmt.
This resolves the ICE seen in PR tree-optimization/96974, however the issue
of correctly handling this rare vectorization combination is left for a
later patch.
Bootstrapped and reg-tested on aarch64-linux-gnu.
2021-03-25 Stam Markianos-Wright <stam.markianos-wright@arm.com>
gcc/ChangeLog:
PR tree-optimization/96974
* tree-vect-stmts.c (vect_get_vector_types_for_stmt): Replace assert
with graceful exit.
gcc/testsuite/ChangeLog:
PR tree-optimization/96974
* g++.target/aarch64/sve/pr96974.C: New test.
-rw-r--r-- | gcc/testsuite/g++.target/aarch64/sve/pr96974.C | 18 | ||||
-rw-r--r-- | gcc/tree-vect-stmts.c | 8 |
2 files changed, 24 insertions, 2 deletions
diff --git a/gcc/testsuite/g++.target/aarch64/sve/pr96974.C b/gcc/testsuite/g++.target/aarch64/sve/pr96974.C new file mode 100644 index 0000000..363241d --- /dev/null +++ b/gcc/testsuite/g++.target/aarch64/sve/pr96974.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-Ofast -march=armv8.2-a+sve -fdisable-tree-fre4 -fdump-tree-slp-details" } */ + +float a; +int +b () +{ return __builtin_lrintf(a); } + +struct c { + float d; + c() { + for (int e = 0; e < 9; e++) + coeffs[e] = d ? b() : 0; + } + int coeffs[10]; +} f; + +/* { dg-final { scan-tree-dump "Not vectorized: Incompatible number of vector subparts between" "slp1" } } */ diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index d791d3a..4c01e82 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -12148,8 +12148,12 @@ vect_get_vector_types_for_stmt (vec_info *vinfo, stmt_vec_info stmt_info, } } - gcc_assert (multiple_p (TYPE_VECTOR_SUBPARTS (nunits_vectype), - TYPE_VECTOR_SUBPARTS (*stmt_vectype_out))); + if (!multiple_p (TYPE_VECTOR_SUBPARTS (nunits_vectype), + TYPE_VECTOR_SUBPARTS (*stmt_vectype_out))) + return opt_result::failure_at (stmt, + "Not vectorized: Incompatible number " + "of vector subparts between %T and %T\n", + nunits_vectype, *stmt_vectype_out); if (dump_enabled_p ()) { |