From: Richard Biener Date: Wed, 16 Sep 2015 14:27:52 +0000 (+0000) Subject: re PR tree-optimization/67253 (ICE at -O3 on x86_64-linux-gnu (verify_gimple failed)) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ae2ffe2a03f4de06e16addce7a62669d7c6eda5e;p=gcc.git re PR tree-optimization/67253 (ICE at -O3 on x86_64-linux-gnu (verify_gimple failed)) 2015-09-16 Richard Biener PR middle-end/67253 * cfgexpand.c (expand_gimple_stmt_1): Do not clobber location of possibly shared trees. * gcc.dg/torture/pr67253.c: New testcase. From-SVN: r227826 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2ec6aefd507..e09c84c38d2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-09-16 Richard Biener + + PR middle-end/67253 + * cfgexpand.c (expand_gimple_stmt_1): Do not clobber + location of possibly shared trees. + 2015-09-16 Richard Biener PR middle-end/67271 diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index d567a875dff..3036e6773ac 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -3587,7 +3587,9 @@ expand_gimple_stmt_1 (gimple stmt) tree rhs = gimple_assign_rhs1 (assign_stmt); gcc_assert (get_gimple_rhs_class (gimple_expr_code (stmt)) == GIMPLE_SINGLE_RHS); - if (gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (rhs)) + if (gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (rhs) + /* Do not put locations on possibly shared trees. */ + && !is_gimple_min_invariant (rhs)) SET_EXPR_LOCATION (rhs, gimple_location (stmt)); if (TREE_CLOBBER_P (rhs)) /* This is a clobber to mark the going out of scope for diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 87bcebfd00f..b54f0d131f2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-09-16 Richard Biener + + PR middle-end/67253 + * gcc.dg/torture/pr67253.c: New testcase. + 2015-09-16 Richard Biener PR middle-end/67271 diff --git a/gcc/testsuite/gcc.dg/torture/pr67253.c b/gcc/testsuite/gcc.dg/torture/pr67253.c new file mode 100644 index 00000000000..711106e6712 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr67253.c @@ -0,0 +1,62 @@ +/* { dg-do run } */ + +int *a, b, c, **d = &a, e, f, **h, i, j, k, l, m, *n, o, **q, r, s; + +void fn1 (int p) { } + +void +fn3 () +{ + for (; j; j++) + for (; k; k++) + l++; + f++; +} + +static int +fn4 (char p1, int *p2) +{ + for (; m < 1;) + { + fn1 (q == &p2); + for (; o; o++) + ; + n = p2; + return 0; + } + for (;;) + { + for (; s; s++) + b = r; + *d = 0; + } +} + +static int *fn2 (char, int, int *); + +static int +fn5 () +{ + int *g = &c; + fn3 (); + fn2 (0, 0, g); + return e; +} + +static int * +fn2 (char p1, int p2, int *p3) +{ + fn4 (0, p3); + fn1 (&p3 == h); + for (; i;) + fn5 (); + fn4 (0, p3); + return *d; +} + +int +main () +{ + fn5 (); + return 0; +}