diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2015-05-11 09:35:53 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2015-05-11 09:35:53 +0000 |
commit | cb6f459119104ddbba18330d329ada209f9bdc25 (patch) | |
tree | 6d3db918d04de28fb93c948686fd0bd5c282dd5e | |
parent | 258619bb2d420f54a510569cee8e642835f86023 (diff) | |
download | gcc-cb6f459119104ddbba18330d329ada209f9bdc25.zip gcc-cb6f459119104ddbba18330d329ada209f9bdc25.tar.gz gcc-cb6f459119104ddbba18330d329ada209f9bdc25.tar.bz2 |
re PR rtl-optimization/66076 (ICE: in vec_safe_grow, at vec.h:618 with -funroll-loops -mno-prefer-avx128 -march=bdver4)
gcc/
PR rtl-optimization/66076
* rtlanal.c (generic_subrtx_iterator <T>::add_single_to_queue):
Don't grow the heap array if it is already big enough from a
previous iteration.
gcc/testsuite/
PR rtl-optimization/66076
* gcc.dg/torture/pr66076.c: New test.
From-SVN: r222999
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/rtlanal.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr66076.c | 11 |
4 files changed, 27 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 88d8934..5deba76 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-05-11 Richard Sandiford <richard.sandiford@arm.com> + + PR rtl-optimization/66076 + * rtlanal.c (generic_subrtx_iterator <T>::add_single_to_queue): + Don't grow the heap array if it is already big enough from a + previous iteration. + 2015-05-11 Christian Bruel <christian.bruel@st.com> * config/arm/arm-protos.h (arm_declare_function_name): Declare. diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 00d9080..68d9931 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -104,7 +104,10 @@ generic_subrtx_iterator <T>::add_single_to_queue (array_type &array, return base; } gcc_checking_assert (i == LOCAL_ELEMS); - vec_safe_grow (array.heap, i + 1); + /* A previous iteration might also have moved from the stack to the + heap, in which case the heap array will already be big enough. */ + if (vec_safe_length (array.heap) <= i) + vec_safe_grow (array.heap, i + 1); base = array.heap->address (); memcpy (base, array.stack, sizeof (array.stack)); base[LOCAL_ELEMS] = x; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9dda294..3b327b7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-05-11 Richard Sandiford <richard.sandiford@arm.com> + + PR rtl-optimization/66076 + * gcc.dg/torture/pr66076.c: New test. + 2015-05-10 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/66041 diff --git a/gcc/testsuite/gcc.dg/torture/pr66076.c b/gcc/testsuite/gcc.dg/torture/pr66076.c new file mode 100644 index 0000000..7e7d34d --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr66076.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "" } */ +/* { dg-options "-mno-prefer-avx128 -march=bdver4" { target i?86-*-* x86_64-*-* } } */ + +void +f0a (char *result, char *arg1, char *arg4, char temp_6) +{ + int idx = 0; + for (idx = 0; idx < 416; idx += 1) + result[idx] = (arg1[idx] + arg4[idx]) * temp_6; +} |