From: Richard Biener Date: Fri, 30 Aug 2019 16:44:17 +0000 (+0000) Subject: Backport PRs 89677, 90071, 90194, 90213, 90474, 90637, 90930 X-Git-Tag: releases/gcc-7.5.0~195 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f2814a59d044bf71bf30c26e3ec9c378c385af8d;p=thirdparty%2Fgcc.git Backport PRs 89677, 90071, 90194, 90213, 90474, 90637, 90930 2019-08-30 Richard Biener Backport from mainline 2019-05-27 Richard Biener PR tree-optimization/90637 * tree-ssa-sink.c (statement_sink_location): Honor the computed sink location for single-uses. * gcc.dg/gomp/pr90637.c: New testcase. 2019-06-21 Richard Biener PR tree-optimization/90930 * tree-ssa-reassoc.c (rewrite_expr_tree_parallel): Set visited flag on new stmts to avoid re-processing them. 2019-05-15 Richard Biener PR c/90474 * c-common.c (c_common_mark_addressable_vec): Also mark a COMPOUND_LITERAL_EXPR_DECL addressable similar to c_mark_addressable. 2019-04-25 Richard Biener PR middle-end/90194 * match.pd: Add pattern to simplify view-conversion of an empty constructor. * g++.dg/torture/pr90194.C: New testcase. 2019-04-24 Richard Biener PR middle-end/90213 * gimple-fold.c (fold_const_aggregate_ref_1): Do multiplication by size and BITS_PER_UNIT on poly-wide-ints. 2019-04-15 Richard Biener PR tree-optimization/90071 * tree-ssa-reassoc.c (init_range_entry): Do not pick up abnormal operands from def stmts. * gcc.dg/torture/pr90071.c: New testcase. 2019-03-13 Richard Biener PR middle-end/89677 * tree-scalar-evolution.c (simplify_peeled_chrec): Do not throw FP expressions at tree-affine. * gcc.dg/torture/pr89677.c: New testcase. From-SVN: r275208 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ec53c7969f7c..a4610414723c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,44 @@ +2019-08-30 Richard Biener + + Backport from mainline + 2019-05-27 Richard Biener + + PR tree-optimization/90637 + * tree-ssa-sink.c (statement_sink_location): Honor the + computed sink location for single-uses. + + * gcc.dg/gomp/pr90637.c: New testcase. + + 2019-06-21 Richard Biener + + PR tree-optimization/90930 + * tree-ssa-reassoc.c (rewrite_expr_tree_parallel): Set visited + flag on new stmts to avoid re-processing them. + + 2019-04-25 Richard Biener + + PR middle-end/90194 + * match.pd: Add pattern to simplify view-conversion of an + empty constructor. + + 2019-04-24 Richard Biener + + PR middle-end/90213 + * gimple-fold.c (fold_const_aggregate_ref_1): Do multiplication + by size and BITS_PER_UNIT on poly-wide-ints. + + 2019-04-15 Richard Biener + + PR tree-optimization/90071 + * tree-ssa-reassoc.c (init_range_entry): Do not pick up + abnormal operands from def stmts. + + 2019-03-13 Richard Biener + + PR middle-end/89677 + * tree-scalar-evolution.c (simplify_peeled_chrec): Do not + throw FP expressions at tree-affine. + 2019-08-30 Segher Boessenkool Backport from trunk diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 5d5a8e5d479c..8c77a6ab9007 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,13 @@ +2019-08-30 Richard Biener + + Backport from mainline + 2019-05-15 Richard Biener + + PR c/90474 + * c-common.c (c_common_mark_addressable_vec): Also mark + a COMPOUND_LITERAL_EXPR_DECL addressable similar to + c_mark_addressable. + 2019-08-30 Jakub Jelinek Backported from mainline diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 45be4bd1cbe3..c3fb3b671cb7 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -6529,6 +6529,8 @@ c_common_mark_addressable_vec (tree t) return; if (!VAR_P (t) || !DECL_HARD_REGISTER (t)) TREE_ADDRESSABLE (t) = 1; + if (TREE_CODE (t) == COMPOUND_LITERAL_EXPR) + TREE_ADDRESSABLE (COMPOUND_LITERAL_EXPR_DECL (t)) = 1; } diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 4325aaeb3c9b..25b407497158 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -6318,14 +6318,11 @@ fold_const_aggregate_ref_1 (tree t, tree (*valueize) (tree)) = wi::sext (wi::to_offset (idx) - wi::to_offset (low_bound), TYPE_PRECISION (TREE_TYPE (idx))); + woffset *= tree_to_uhwi (unit_size); + woffset *= BITS_PER_UNIT; if (wi::fits_shwi_p (woffset)) { offset = woffset.to_shwi (); - /* TODO: This code seems wrong, multiply then check - to see if it fits. */ - offset *= tree_to_uhwi (unit_size); - offset *= BITS_PER_UNIT; - base = TREE_OPERAND (t, 0); ctor = get_base_constructor (base, &offset, valueize); /* Empty constructor. Always fold to 0. */ diff --git a/gcc/match.pd b/gcc/match.pd index e405d9e84e90..59ac91cc785d 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1753,6 +1753,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) && (TYPE_SIZE (TREE_TYPE (@0)) == TYPE_SIZE (TREE_TYPE (@1)))) (view_convert @1))) +/* Simplify a view-converted empty constructor. */ +(simplify + (view_convert CONSTRUCTOR@0) + (if (TREE_CODE (@0) != SSA_NAME + && CONSTRUCTOR_NELTS (@0) == 0) + { build_zero_cst (type); })) + /* Re-association barriers around constants and other re-association barriers can be removed. */ (simplify diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e4634e13ed37..1ec666b6c850 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,21 @@ +2019-08-30 Richard Biener + + Backport from mainline + 2019-04-25 Richard Biener + + PR middle-end/90194 + * g++.dg/torture/pr90194.C: New testcase. + + 2019-04-15 Richard Biener + + PR tree-optimization/90071 + * gcc.dg/torture/pr90071.c: New testcase. + + 2019-03-13 Richard Biener + + PR middle-end/89677 + * gcc.dg/torture/pr89677.c: New testcase. + 2019-08-30 Segher Boessenkool Backport from trunk diff --git a/gcc/testsuite/g++.dg/torture/pr90194.C b/gcc/testsuite/g++.dg/torture/pr90194.C new file mode 100644 index 000000000000..f0c3a77db8af --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr90194.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// { dg-additional-options "-g" } + +struct cb { + int yr; +}; + +void * +operator new (__SIZE_TYPE__, void *nq) +{ + return nq; +} + +void +af (int xn) +{ + new (&xn) cb { }; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr89677.c b/gcc/testsuite/gcc.dg/torture/pr89677.c new file mode 100644 index 000000000000..a45ca1f61a11 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr89677.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target int32plus } */ + +int a, b, d; +unsigned c; +float e, f, g; +void h() { + float *i = &g; + for (; c < 10; c += 3) + for (; d; d += 3) { + a = *i; + g = f + 0; + f = b + *i + (b - e + 305219) + -b + 3; + } +} diff --git a/gcc/testsuite/gcc.dg/torture/pr90071.c b/gcc/testsuite/gcc.dg/torture/pr90071.c new file mode 100644 index 000000000000..bfa7239139a4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr90071.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ + +int a; +static int b; + +void +foo () +{ + int d; + int e = (int) (__INTPTR_TYPE__) &&f; + void *g = &&h; +h: ++e; + if (a) + i: goto *g; + for (;;) + { + e = 0; + if (b) + goto i; + } +f: + goto *({ d || e < 0 || e >= 2; }); + &e; +} diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c index 790050a20c9b..95ad137b02ac 100644 --- a/gcc/tree-scalar-evolution.c +++ b/gcc/tree-scalar-evolution.c @@ -1413,6 +1413,11 @@ simplify_peeled_chrec (struct loop *loop, tree arg, tree init_cond) return build_polynomial_chrec (loop->num, init_cond, right); } + /* The affine code only deals with pointer and integer types. */ + if (!POINTER_TYPE_P (type) + && !INTEGRAL_TYPE_P (type)) + return chrec_dont_know; + /* Try harder to check if they are equal. */ tree_to_aff_combination_expand (left, type, &aff1, &peeled_chrec_map); tree_to_aff_combination_expand (step_val, type, &aff2, &peeled_chrec_map); diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index b4f13ef75c4d..0b31de324d26 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -2140,7 +2140,8 @@ init_range_entry (struct range_entry *r, tree exp, gimple *stmt) exp_type = boolean_type_node; } - if (TREE_CODE (arg0) != SSA_NAME) + if (TREE_CODE (arg0) != SSA_NAME + || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (arg0)) break; loc = gimple_location (stmt); switch (code) @@ -4593,6 +4594,7 @@ rewrite_expr_tree_parallel (gassign *stmt, int width, else { stmts[i] = build_and_add_sum (TREE_TYPE (last_rhs1), op1, op2, opcode); + gimple_set_visited (stmts[i], true); } if (dump_file && (dump_flags & TDF_DETAILS)) { diff --git a/gcc/tree-ssa-sink.c b/gcc/tree-ssa-sink.c index 7a9fcde4f942..ce591327c816 100644 --- a/gcc/tree-ssa-sink.c +++ b/gcc/tree-ssa-sink.c @@ -431,7 +431,10 @@ statement_sink_location (gimple *stmt, basic_block frombb, if (sinkbb == frombb) return false; - *togsi = gsi_for_stmt (use); + if (sinkbb == gimple_bb (use)) + *togsi = gsi_for_stmt (use); + else + *togsi = gsi_after_labels (sinkbb); return true; }