From: Richard Biener Date: Wed, 10 May 2017 10:01:23 +0000 (+0000) Subject: Backport PRs 79666, 79732, 79756, 79894 X-Git-Tag: releases/gcc-5.5.0~372 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=76be39c51c3a7206a144e1c0740284746778a9cb;p=thirdparty%2Fgcc.git Backport PRs 79666, 79732, 79756, 79894 2017-05-10 Richard Biener Backport from mainline 2017-03-06 Richard Biener PR fortran/79894 * trans.c (gfc_add_modify_loc): Weaken assert. 2017-03-02 Richard Biener PR c/79756 * c-common.c (c_common_mark_addressable_vec): Look through C_MAYBE_CONST_EXPR. * gcc.dg/vector-1.c: New testcase. 2017-02-28 Richard Biener PR tree-optimization/79732 * tree-inline.c (expand_call_inline): Handle anonymous SSA lhs properly when inlining a function without return value. * gcc.dg/torture/pr79732.c: New testcase. 2017-02-22 Richard Biener PR tree-optimization/79666 * tree-vrp.c (extract_range_from_binary_expr_1): Make sure to not symbolically negate if that may introduce undefined overflow. * gcc.dg/torture/pr79666.c: New testcase. From-SVN: r247829 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9d509b935b1e..b26b35523691 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,20 @@ +2017-05-10 Richard Biener + + Backport from mainline + 2017-02-28 Richard Biener + + PR tree-optimization/79732 + * tree-inline.c (expand_call_inline): Handle anonymous + SSA lhs properly when inlining a function without return + value. + + 2017-02-22 Richard Biener + + PR tree-optimization/79666 + * tree-vrp.c (extract_range_from_binary_expr_1): Make sure + to not symbolically negate if that may introduce undefined + overflow. + 2017-05-10 Richard Biener Backport from mainline diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 5251b684d064..bd8449932be8 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,10 @@ +2017-05-10 Richard Biener + + Backport from mainline + PR c/79756 + * c-common.c (c_common_mark_addressable_vec): Look through + C_MAYBE_CONST_EXPR. + 2017-03-22 Martin Liska Backport from mainline diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 2914dae4955f..aa81d1944b89 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -10473,6 +10473,8 @@ complete_array_type (tree *ptype, tree initial_value, bool do_default) void c_common_mark_addressable_vec (tree t) { + if (TREE_CODE (t) == C_MAYBE_CONST_EXPR) + t = C_MAYBE_CONST_EXPR_EXPR (t); while (handled_component_p (t)) t = TREE_OPERAND (t, 0); if (!VAR_P (t) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index b3f4403ba9c2..f4424d49aec6 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2017-05-10 Richard Biener + + Backport from mainline + 2017-03-06 Richard Biener + + PR fortran/79894 + * trans.c (gfc_add_modify_loc): Weaken assert. + 2017-05-01 Janus Weil Backport from trunk diff --git a/gcc/fortran/trans.c b/gcc/fortran/trans.c index d52e0623e657..8bbbeec64f4a 100644 --- a/gcc/fortran/trans.c +++ b/gcc/fortran/trans.c @@ -163,11 +163,11 @@ gfc_add_modify_loc (location_t loc, stmtblock_t * pblock, tree lhs, tree rhs) tree t1, t2; t1 = TREE_TYPE (rhs); t2 = TREE_TYPE (lhs); - /* Make sure that the types of the rhs and the lhs are the same + /* Make sure that the types of the rhs and the lhs are compatible for scalar assignments. We should probably have something similar for aggregates, but right now removing that check just breaks everything. */ - gcc_assert (t1 == t2 + gcc_assert (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2) || AGGREGATE_TYPE_P (TREE_TYPE (lhs))); #endif diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d2b6972e1577..cb54cdcd45ff 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,21 @@ +2017-05-10 Richard Biener + + Backport from mainline + 2017-03-02 Richard Biener + + PR c/79756 + * gcc.dg/vector-1.c: New testcase. + + 2017-02-28 Richard Biener + + PR tree-optimization/79732 + * gcc.dg/torture/pr79732.c: New testcase. + + 2017-02-22 Richard Biener + + PR tree-optimization/79666 + * gcc.dg/torture/pr79666.c: New testcase. + 2017-05-10 Richard Biener Backport from mainline diff --git a/gcc/testsuite/gcc.dg/torture/pr79666.c b/gcc/testsuite/gcc.dg/torture/pr79666.c new file mode 100644 index 000000000000..3d83229521ce --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr79666.c @@ -0,0 +1,30 @@ +/* { dg-do run } */ + +struct +{ + unsigned a:6; +} b; + +int c, e, g = 7; +signed char d, f = 6, h = -10; + +void fn1 () +{ + for (; c < 9; c++) + { + if (f) + g = ~(~0 / (g ^ e)); + b.a = ~0; + d = ~((h ^ b.a) & 132 & (~(f && g) | (d && 1))); + e = ~0; + if (d < 127 || f < 1) + continue; + g = 0; + } +} + +int main () +{ + fn1 (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr79732.c b/gcc/testsuite/gcc.dg/torture/pr79732.c new file mode 100644 index 000000000000..7231ba4f1399 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr79732.c @@ -0,0 +1,5 @@ +/* { dg-do link } */ + +int bar () __attribute__ ((alias ("foo"))); +void foo () { } +int main () { return bar(); } diff --git a/gcc/testsuite/gcc.dg/vector-1.c b/gcc/testsuite/gcc.dg/vector-1.c new file mode 100644 index 000000000000..a5eaa2a8c2df --- /dev/null +++ b/gcc/testsuite/gcc.dg/vector-1.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-std=gnu90" } */ + +typedef int V __attribute__ ((vector_size(4))); +void fn1 () +{ + (V){(1,0)}[0] = 0; +} diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 71d9d239535a..e8c066015f5f 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -4757,7 +4757,7 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id) { tree name = gimple_call_lhs (stmt); tree var = SSA_NAME_VAR (name); - tree def = ssa_default_def (cfun, var); + tree def = var ? ssa_default_def (cfun, var) : NULL; if (def) { @@ -4768,6 +4768,11 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id) } else { + if (!var) + { + var = create_tmp_reg_fn (cfun, TREE_TYPE (name), NULL); + SET_SSA_NAME_VAR_OR_IDENTIFIER (name, var); + } /* Otherwise make this variable undefined. */ gsi_remove (&stmt_gsi, true); set_ssa_default_def (cfun, var, name); diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index b25783830c83..5f14ee902859 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -2797,8 +2797,17 @@ extract_range_from_binary_expr_1 (value_range_t *vr, min = build_symbolic_expr (expr_type, sym_min_op0, neg_min_op0, min); else if (sym_min_op1) - min = build_symbolic_expr (expr_type, sym_min_op1, - neg_min_op1 ^ minus_p, min); + { + /* We may not negate if that might introduce + undefined overflow. */ + if (! minus_p + || neg_min_op1 + || TYPE_OVERFLOW_WRAPS (expr_type)) + min = build_symbolic_expr (expr_type, sym_min_op1, + neg_min_op1 ^ minus_p, min); + else + min = NULL_TREE; + } /* Likewise for the upper bound. */ if (sym_max_op0 == sym_max_op1) @@ -2807,8 +2816,17 @@ extract_range_from_binary_expr_1 (value_range_t *vr, max = build_symbolic_expr (expr_type, sym_max_op0, neg_max_op0, max); else if (sym_max_op1) - max = build_symbolic_expr (expr_type, sym_max_op1, - neg_max_op1 ^ minus_p, max); + { + /* We may not negate if that might introduce + undefined overflow. */ + if (! minus_p + || neg_max_op1 + || TYPE_OVERFLOW_WRAPS (expr_type)) + max = build_symbolic_expr (expr_type, sym_max_op1, + neg_max_op1 ^ minus_p, max); + else + max = NULL_TREE; + } } else {