From: Richard Biener Date: Mon, 26 Nov 2018 11:59:05 +0000 (+0000) Subject: backport: [multiple changes] X-Git-Tag: releases/gcc-7.4.0~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6f912a34e7b4e25a8007ff68a22764adf0b00165;p=thirdparty%2Fgcc.git backport: [multiple changes] 2018-11-26 Richard Biener Backport from mainline 2018-06-14 Richard Biener PR middle-end/86139 * tree-vect-generic.c (build_word_mode_vector_type): Remove duplicate and harmful type_hash_canon. 2018-06-15 Richard Biener PR middle-end/86076 * tree-cfg.c (move_stmt_op): unshare invariant addresses before adjusting their block. * gcc.dg/pr86076.c: New testcase. From-SVN: r266458 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0342b88be687..d057e26662bf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2018-11-26 Richard Biener + + Backport from mainline + 2018-06-14 Richard Biener + + PR middle-end/86139 + * tree-vect-generic.c (build_word_mode_vector_type): Remove + duplicate and harmful type_hash_canon. + + 2018-06-15 Richard Biener + + PR middle-end/86076 + * tree-cfg.c (move_stmt_op): unshare invariant addresses + before adjusting their block. + 2018-11-22 Uros Bizjak Backport from mainline diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 542a9f937235..b5a5d8654c1a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2018-11-26 Richard Biener + + Backport from mainline + 2018-06-15 Richard Biener + + PR middle-end/86076 + * gcc.dg/pr86076.c: New testcase. + 2018-11-26 Matthias Klose * jit.dg/test-long-names.c: Fix build with -Wformat-security. diff --git a/gcc/testsuite/gcc.dg/pr86076.c b/gcc/testsuite/gcc.dg/pr86076.c new file mode 100644 index 000000000000..390ca47ba124 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr86076.c @@ -0,0 +1,26 @@ +/* { dg-do compile { target pthread } } */ +/* { dg-options "-O2 -ftree-parallelize-loops=2 -fno-tree-dce -fno-tree-pre -fno-tree-vrp --param max-loop-header-insns=1" } */ + +int __attribute__ ((noinline)) +lv (int tm) +{ + (void) tm; + + return 0; +} + +void +o7 (int uu) +{ + while (uu < 1) + while (uu != 0) + { + short int ca; + + ca = lv (0); + (void) ca; + ++uu; + } + + lv (lv (0)); +} diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 4f09c827d9ee..f9d75c5f64db 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -6640,7 +6640,16 @@ move_stmt_op (tree *tp, int *walk_subtrees, void *data) ; else if (block == p->orig_block || p->orig_block == NULL_TREE) - TREE_SET_BLOCK (t, p->new_block); + { + /* tree_node_can_be_shared says we can share invariant + addresses but unshare_expr copies them anyways. Make sure + to unshare before adjusting the block in place - we do not + always see a copy here. */ + if (TREE_CODE (t) == ADDR_EXPR + && is_gimple_min_invariant (t)) + *tp = t = unshare_expr (t); + TREE_SET_BLOCK (t, p->new_block); + } else if (flag_checking) { while (block && TREE_CODE (block) == BLOCK && block != p->orig_block) diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c index c1b3c24a0b4d..2e6dbcc0215a 100644 --- a/gcc/tree-vect-generic.c +++ b/gcc/tree-vect-generic.c @@ -89,12 +89,8 @@ build_word_mode_vector_type (int nunits) return vector_last_type; } - /* We build a new type, but we canonicalize it nevertheless, - because it still saves some memory. */ vector_last_nunits = nunits; - vector_last_type = type_hash_canon (nunits, - build_vector_type (vector_inner_type, - nunits)); + vector_last_type = build_vector_type (vector_inner_type, nunits); return vector_last_type; }