From: Richard Biener Date: Fri, 12 Feb 2016 14:04:29 +0000 (+0000) Subject: backport: [multiple changes] X-Git-Tag: releases/gcc-4.9.4~327 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fcd2467dbcd4a1dbe7d9261aae9afc53863a1327;p=thirdparty%2Fgcc.git backport: [multiple changes] 2016-02-12 Richard Biener Backport from mainline 2016-02-09 Richard Biener PR tree-optimization/69715 * tree-ssa.c (execute_update_addresses_taken): Mark non-decl LHS on calls as non-rewritable. * gcc.dg/torture/pr69715.c: New testcase. 2016-02-01 Richard Biener PR tree-optimization/69579 * tree-ssa-loop-ivcanon.c (propagate_constants_for_unrolling): Do not propagate through abnormal PHI results. * gcc.dg/setjmp-6.c: New testcase. 2016-02-01 Richard Biener PR tree-optimization/69574 * tree-chrec.c (hide_evolution_in_other_loops_than_loop): Instead of asserting return chrec_dont_know. * gcc.dg/torture/pr69574.c: New testcase. From-SVN: r233378 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2c3133d1bdfa..17c8a2485c7b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,24 @@ +2016-02-12 Richard Biener + + Backport from mainline + 2016-02-09 Richard Biener + + PR tree-optimization/69715 + * tree-ssa.c (execute_update_addresses_taken): Mark non-decl + LHS on calls as non-rewritable. + + 2016-02-01 Richard Biener + + PR tree-optimization/69579 + * tree-ssa-loop-ivcanon.c (propagate_constants_for_unrolling): + Do not propagate through abnormal PHI results. + + 2016-02-01 Richard Biener + + PR tree-optimization/69574 + * tree-chrec.c (hide_evolution_in_other_loops_than_loop): Instead + of asserting return chrec_dont_know. + 2016-02-11 Richard Biener Backport from mainline diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9a7f198a98b4..835010156d56 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,21 @@ +2016-02-12 Richard Biener + + Backport from mainline + 2016-02-09 Richard Biener + + PR tree-optimization/69715 + * gcc.dg/torture/pr69715.c: New testcase. + + 2016-02-01 Richard Biener + + PR tree-optimization/69579 + * gcc.dg/setjmp-6.c: New testcase. + + 2016-02-01 Richard Biener + + PR tree-optimization/69574 + * gcc.dg/torture/pr69574.c: New testcase. + 2016-02-11 Richard Biener Backport from mainline diff --git a/gcc/testsuite/gcc.dg/setjmp-6.c b/gcc/testsuite/gcc.dg/setjmp-6.c new file mode 100644 index 000000000000..0781f0559528 --- /dev/null +++ b/gcc/testsuite/gcc.dg/setjmp-6.c @@ -0,0 +1,25 @@ +/* PR69569 */ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +#include + +jmp_buf buf; + +struct str { + int Count; +}; +int fun2(struct str *p1) +{ + int i = 1; + while (1) { + setjmp(buf); + break; + } + for (; i;) { + i = 0; + for (; i < (p1 ? p1->Count : 1); i++) + fun2(p1); + } + return 1; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr69574.c b/gcc/testsuite/gcc.dg/torture/pr69574.c new file mode 100644 index 000000000000..feaac24043bb --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr69574.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ + +typedef unsigned mytype; + +struct S { + mytype *pu; +}; + +mytype f(struct S *e) +{ + mytype x; + if(&x != e->pu) + __builtin_memcpy(&x, e->pu, sizeof(unsigned)); + return x; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr69715.c b/gcc/testsuite/gcc.dg/torture/pr69715.c new file mode 100644 index 000000000000..cecc82cdf584 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr69715.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ + +struct __attribute__((may_alias)) S { long long low; int high; }; +struct S foo (void); +long double +bar (void) +{ + long double a; + *(struct S *)&a = foo (); + return a; +} diff --git a/gcc/tree-chrec.c b/gcc/tree-chrec.c index b9350f015e2c..c6c5015d7b91 100644 --- a/gcc/tree-chrec.c +++ b/gcc/tree-chrec.c @@ -730,12 +730,12 @@ hide_evolution_in_other_loops_than_loop (tree chrec, /* There is no evolution in this loop. */ return initial_condition (chrec); + else if (flow_loop_nested_p (loop, chloop)) + return hide_evolution_in_other_loops_than_loop (CHREC_LEFT (chrec), + loop_num); + else - { - gcc_assert (flow_loop_nested_p (loop, chloop)); - return hide_evolution_in_other_loops_than_loop (CHREC_LEFT (chrec), - loop_num); - } + return chrec_dont_know; default: return chrec; diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c index b475b067bb5b..00f26b8dd915 100644 --- a/gcc/tree-ssa-loop-ivcanon.c +++ b/gcc/tree-ssa-loop-ivcanon.c @@ -1072,7 +1072,9 @@ propagate_constants_for_unrolling (basic_block bb) tree result = gimple_phi_result (phi); tree arg = gimple_phi_arg_def (phi, 0); - if (gimple_phi_num_args (phi) == 1 && TREE_CODE (arg) == INTEGER_CST) + if (! SSA_NAME_OCCURS_IN_ABNORMAL_PHI (result) + && gimple_phi_num_args (phi) == 1 + && TREE_CODE (arg) == INTEGER_CST) { propagate_into_all_uses (result, arg); gsi_remove (&gsi, true); diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index 20f061ffaf0c..8ea1853fa892 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -1474,7 +1474,8 @@ execute_update_addresses_taken (void) tree lhs = gimple_get_lhs (stmt); if (lhs && TREE_CODE (lhs) != SSA_NAME - && non_rewritable_lvalue_p (lhs)) + && ((code == GIMPLE_CALL && ! DECL_P (lhs)) + || non_rewritable_lvalue_p (lhs))) { decl = get_base_address (lhs); if (DECL_P (decl))