From: Richard Biener Date: Thu, 24 Oct 2019 09:38:56 +0000 (+0000) Subject: backport: [multiple changes] X-Git-Tag: releases/gcc-7.5.0~49 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d23b9ce71519880d0dc73dfea464ac288498e3c0;p=thirdparty%2Fgcc.git backport: [multiple changes] 2019-10-24 Richard Biener Backport from mainline 2019-10-17 Richard Biener PR debug/91887 * dwarf2out.c (gen_formal_parameter_die): Also try to match context_die against a DW_TAG_GNU_formal_parameter_pack parent. * g++.dg/debug/dwarf2/pr91887.C: New testcase. 2019-09-19 Richard Biener PR tree-optimization/91812 * tree-ssa-phiprop.c (propagate_with_phi): Do not replace volatile loads. * gcc.dg/torture/pr91812.c: New testcase. From-SVN: r277370 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fe43786a8e12..33024b992507 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2019-10-24 Richard Biener + + Backport from mainline + 2019-10-17 Richard Biener + + PR debug/91887 + * dwarf2out.c (gen_formal_parameter_die): Also try to match + context_die against a DW_TAG_GNU_formal_parameter_pack parent. + + 2019-09-19 Richard Biener + + PR tree-optimization/91812 + * tree-ssa-phiprop.c (propagate_with_phi): Do not replace + volatile loads. + 2019-10-23 Eric Botcazou PR tree-optimization/92131 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index a7f560872c0b..5590845d2a43 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -21212,7 +21212,10 @@ gen_formal_parameter_die (tree node, tree origin, bool emit_name_p, /* If the contexts differ, we may not be talking about the same thing. */ - if (parm_die && parm_die->die_parent != context_die) + if (parm_die + && parm_die->die_parent != context_die + && (parm_die->die_parent->die_tag != DW_TAG_GNU_formal_parameter_pack + || parm_die->die_parent->die_parent != context_die)) { if (!DECL_ABSTRACT_P (node)) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9dfad63b9ab3..25a0ac91a958 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,16 @@ +2019-10-24 Richard Biener + + Backport from mainline + 2019-10-17 Richard Biener + + PR debug/91887 + * g++.dg/debug/dwarf2/pr91887.C: New testcase. + + 2019-09-19 Richard Biener + + PR tree-optimization/91812 + * gcc.dg/torture/pr91812.c: New testcase. + 2019-10-23 Eric Botcazou * gcc.c-torture/execute/20191023-1.c: New test. diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr91887.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr91887.C new file mode 100644 index 000000000000..6cd99cc9bb86 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr91887.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// { dg-require-effective-target c++11 } +// { dg-options "-g -fdebug-types-section" } +class A { +public: + A(); + template A(U); +}; +template struct B { typedef A type; }; +template +int Bind(R(Args...), typename B::type...) { return 0; } +void KeepBufferRefs(A, A) { A a, b(Bind(KeepBufferRefs, a, b)); } diff --git a/gcc/testsuite/gcc.dg/torture/pr91812.c b/gcc/testsuite/gcc.dg/torture/pr91812.c new file mode 100644 index 000000000000..ebc67a01e33f --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr91812.c @@ -0,0 +1,26 @@ +/* { dg-do compile } */ +/* { dg-skip-if "" { *-*-* } { "-fno-fat-lto-objects" } { "" } } */ +/* { dg-options "-fdump-tree-optimized-blocks" } */ + +unsigned register1; +unsigned register2; + +void busy_wait_for_register (int x) +{ + volatile unsigned* ptr; + switch(x) { + case 0x1111: + ptr = ®ister1; + break; + + case 0x2222: + ptr = ®ister2; + break; + + default: + return; + } + while (*ptr) {} +} + +/* { dg-final { scan-tree-dump "loop depth 1" "optimized" } } */ diff --git a/gcc/tree-ssa-phiprop.c b/gcc/tree-ssa-phiprop.c index 4f5f95df4f1b..9cb474114457 100644 --- a/gcc/tree-ssa-phiprop.c +++ b/gcc/tree-ssa-phiprop.c @@ -338,8 +338,15 @@ propagate_with_phi (basic_block bb, gphi *phi, struct phiprop_d *phivn, && (!type || types_compatible_p (TREE_TYPE (gimple_assign_lhs (use_stmt)), type)) - /* We cannot replace a load that may throw or is volatile. */ - && !stmt_can_throw_internal (use_stmt))) + /* We cannot replace a load that may throw or is volatile. + For volatiles the transform can change the number of + executions if the load is inside a loop but the address + computations outside (PR91812). We could relax this + if we guard against that appropriately. For loads that can + throw we could relax things if the moved loads all are + known to not throw. */ + && !stmt_can_throw_internal (use_stmt) + && !gimple_has_volatile_ops (use_stmt))) continue; /* Check if we can move the loads. The def stmt of the virtual use