diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-11-22 11:02:19 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-11-22 11:02:19 +0100 |
commit | aaa49b45f6e1fbfc07ae25496b0d9361161a4c80 (patch) | |
tree | 0a3100c52e199af135731b092476284d5cd2ecaa /gcc | |
parent | a2998ed1dc4389e2d648ba376f1eca2c165a2717 (diff) | |
download | gcc-aaa49b45f6e1fbfc07ae25496b0d9361161a4c80.zip gcc-aaa49b45f6e1fbfc07ae25496b0d9361161a4c80.tar.gz gcc-aaa49b45f6e1fbfc07ae25496b0d9361161a4c80.tar.bz2 |
re PR debug/83084 (-fcompare-debug failure on ppc64le)
PR debug/83084
* valtrack.c (propagate_for_debug_subst, propagate_for_debug): Reset
debug insns if they would contain UNSPEC_VOLATILE or volatile asm.
(dead_debug_insert_temp): Likewise, but also ignore even non-volatile
asm.
* g++.dg/opt/pr83084.C: New test.
From-SVN: r255051
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr83084.C | 16 | ||||
-rw-r--r-- | gcc/valtrack.c | 13 |
4 files changed, 37 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ace7c7c..edd3621 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2017-11-22 Jakub Jelinek <jakub@redhat.com> + PR debug/83084 + * valtrack.c (propagate_for_debug_subst, propagate_for_debug): Reset + debug insns if they would contain UNSPEC_VOLATILE or volatile asm. + (dead_debug_insert_temp): Likewise, but also ignore even non-volatile + asm. + PR middle-end/82875 * optabs.c (expand_doubleword_mult, expand_binop): Before calling expand_binop with *mul_widen_optab, make sure at least one of the diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b7e0c47..7bfd96b8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,11 +1,12 @@ 2017-11-22 Jakub Jelinek <jakub@redhat.com> + PR debug/83084 + * g++.dg/opt/pr83084.C: New test. + PR middle-end/82875 * gcc.dg/pr82875.c: New test. * gcc.c-torture/compile/pr82875.c: New test. -2017-11-22 Jakub Jelinek <jakub@redhat.com> - PR debug/83034 * gcc.dg/pr83034.c: New test. diff --git a/gcc/testsuite/g++.dg/opt/pr83084.C b/gcc/testsuite/g++.dg/opt/pr83084.C new file mode 100644 index 0000000..d21e308 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr83084.C @@ -0,0 +1,16 @@ +// PR debug/83084 +// { dg-do compile } +// { dg-options "-O2 -fcompare-debug -Wno-return-type" } + +enum E { F }; +template <E = F> struct A { + bool foo (); + int b; +}; +template <> bool A<>::foo () { + int a; + do + if (a) + return false; + while (__atomic_compare_exchange_n (&b, &a, 0, 1, 4, 0)); +} diff --git a/gcc/valtrack.c b/gcc/valtrack.c index 38af3f0..d4bab00 100644 --- a/gcc/valtrack.c +++ b/gcc/valtrack.c @@ -171,10 +171,13 @@ propagate_for_debug_subst (rtx from, const_rtx old_rtx, void *data) if (REG_P (*iter) && ++cnt > 1) { rtx dval = make_debug_expr_from_rtl (old_rtx); + rtx to = pair->to; + if (volatile_insn_p (to)) + to = gen_rtx_UNKNOWN_VAR_LOC (); /* Emit a debug bind insn. */ rtx bind = gen_rtx_VAR_LOCATION (GET_MODE (old_rtx), - DEBUG_EXPR_TREE_DECL (dval), pair->to, + DEBUG_EXPR_TREE_DECL (dval), to, VAR_INIT_STATUS_INITIALIZED); rtx_insn *bind_insn = emit_debug_insn_before (bind, pair->insn); df_insn_rescan (bind_insn); @@ -217,6 +220,8 @@ propagate_for_debug (rtx_insn *insn, rtx_insn *last, rtx dest, rtx src, dest, propagate_for_debug_subst, &p); if (loc == INSN_VAR_LOCATION_LOC (insn)) continue; + if (volatile_insn_p (loc)) + loc = gen_rtx_UNKNOWN_VAR_LOC (); INSN_VAR_LOCATION_LOC (insn) = loc; df_insn_rescan (insn); } @@ -660,6 +665,12 @@ dead_debug_insert_temp (struct dead_debug_local *debug, unsigned int uregno, } return 0; } + /* Asm in DEBUG_INSN is never useful, we can't emit debug info for + that. And for volatile_insn_p, it is actually harmful + - DEBUG_INSNs shouldn't have any side-effects. */ + else if (GET_CODE (src) == ASM_OPERANDS + || volatile_insn_p (src)) + set = NULL_RTX; } /* ??? Should we try to extract it from a PARALLEL? */ |