From: Richard Sandiford Date: Mon, 11 May 2015 09:35:53 +0000 (+0000) Subject: re PR rtl-optimization/66076 (ICE: in vec_safe_grow, at vec.h:618 with -funroll-loops... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=cb6f459119104ddbba18330d329ada209f9bdc25;p=gcc.git 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 ::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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 88d8934bc11..5deba76159c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-05-11 Richard Sandiford + + PR rtl-optimization/66076 + * rtlanal.c (generic_subrtx_iterator ::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 * config/arm/arm-protos.h (arm_declare_function_name): Declare. diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 00d90809cb4..68d99319403 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -104,7 +104,10 @@ generic_subrtx_iterator ::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 9dda2942bb6..3b327b75b7f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-05-11 Richard Sandiford + + PR rtl-optimization/66076 + * gcc.dg/torture/pr66076.c: New test. + 2015-05-10 Thomas Koenig 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 00000000000..7e7d34daac1 --- /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; +}