aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2017-11-22 11:02:19 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2017-11-22 11:02:19 +0100
commitaaa49b45f6e1fbfc07ae25496b0d9361161a4c80 (patch)
tree0a3100c52e199af135731b092476284d5cd2ecaa /gcc
parenta2998ed1dc4389e2d648ba376f1eca2c165a2717 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/opt/pr83084.C16
-rw-r--r--gcc/valtrack.c13
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? */