From: Richard Biener Date: Tue, 20 Nov 2018 14:47:49 +0000 (+0000) Subject: backport: [multiple changes] X-Git-Tag: releases/gcc-7.4.0~36 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=19319573cd0de3e247361efb6ac2ff294612284e;p=thirdparty%2Fgcc.git backport: [multiple changes] 2018-11-20 Richard Biener Backport from mainline 2018-03-12 Richard Biener PR tree-optimization/84777 * tree-ssa-loop-ch.c (should_duplicate_loop_header_p): For force-vectorize loops ignore whether we are optimizing for size. 2018-01-26 Richard Biener PR rtl-optimization/84003 * dse.c (record_store): Only record redundant stores when the earlier store aliases at least all accesses the later one does. * g++.dg/torture/pr77745.C: Mark foo noinline to trigger latent bug in DSE if NOINLINE is appropriately defined. * g++.dg/torture/pr77745-2.C: New testcase including pr77745.C and defining NOINLINE. From-SVN: r266318 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2ab631f9c1fe..ac62043af560 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2018-11-20 Richard Biener + + Backport from mainline + 2018-03-12 Richard Biener + + PR tree-optimization/84777 + * tree-ssa-loop-ch.c (should_duplicate_loop_header_p): For + force-vectorize loops ignore whether we are optimizing for size. + + 2018-01-26 Richard Biener + + PR rtl-optimization/84003 + * dse.c (record_store): Only record redundant stores when + the earlier store aliases at least all accesses the later one does. + 2018-11-20 Xuepeng Guo Backport from mainline diff --git a/gcc/dse.c b/gcc/dse.c index 174865bbc40b..f638f38a403e 100644 --- a/gcc/dse.c +++ b/gcc/dse.c @@ -1450,7 +1450,12 @@ record_store (rtx body, bb_info_t bb_info) && offset >= s_info->begin && offset + width <= s_info->end && all_positions_needed_p (s_info, offset - s_info->begin, - width)) + width) + /* We can only remove the later store if the earlier aliases + at least all accesses the later one. */ + && (MEM_ALIAS_SET (mem) == MEM_ALIAS_SET (s_info->mem) + || alias_set_subset_of (MEM_ALIAS_SET (mem), + MEM_ALIAS_SET (s_info->mem)))) { if (GET_MODE (mem) == BLKmode) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c8dabcce523b..244e42dfd54c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2018-11-20 Richard Biener + + Backport from mainline + 2018-01-26 Richard Biener + + PR rtl-optimization/84003 + * g++.dg/torture/pr77745.C: Mark foo noinline to trigger + latent bug in DSE if NOINLINE is appropriately defined. + * g++.dg/torture/pr77745-2.C: New testcase including pr77745.C + and defining NOINLINE. + 2018-11-20 Eric Botcazou * gcc.c-torture/execute/20181120-1.c: New test. diff --git a/gcc/testsuite/g++.dg/torture/pr77745-2.C b/gcc/testsuite/g++.dg/torture/pr77745-2.C new file mode 100644 index 000000000000..7861089a817d --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr77745-2.C @@ -0,0 +1,4 @@ +// { dg-do run } + +#define NOINLINE __attribute__((noinline)) +#include "pr77745.C" diff --git a/gcc/testsuite/g++.dg/torture/pr77745.C b/gcc/testsuite/g++.dg/torture/pr77745.C index 59d86b5c501e..6285bc14a43b 100644 --- a/gcc/testsuite/g++.dg/torture/pr77745.C +++ b/gcc/testsuite/g++.dg/torture/pr77745.C @@ -1,8 +1,12 @@ // { dg-do run } +#ifndef NOINLINE +#define NOINLINE /* */ +#endif + inline void* operator new(__SIZE_TYPE__, void* __p) noexcept { return __p; } -long foo(char *c1, char *c2) +long NOINLINE foo(char *c1, char *c2) { long *p1 = new (c1) long; *p1 = 100; diff --git a/gcc/tree-ssa-loop-ch.c b/gcc/tree-ssa-loop-ch.c index 86be34a1ac71..923efa42a69d 100644 --- a/gcc/tree-ssa-loop-ch.c +++ b/gcc/tree-ssa-loop-ch.c @@ -57,7 +57,8 @@ should_duplicate_loop_header_p (basic_block header, struct loop *loop, be true, since quite often it is possible to verify that the condition is satisfied in the first iteration and therefore to eliminate it. Jump threading handles these cases now. */ - if (optimize_loop_for_size_p (loop)) + if (optimize_loop_for_size_p (loop) + && !loop->force_vectorize) { if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file,