aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2019-04-16 12:44:57 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2019-04-16 12:44:57 +0000
commit2689fcc80e2e34bf88f03c4ee69d31d9c8dcc368 (patch)
tree4b097cd4b629ec708d3de2184eadf240d20e8e3d
parent1ce6a0f5b05487678082f205d1b14a207adf9970 (diff)
downloadgcc-2689fcc80e2e34bf88f03c4ee69d31d9c8dcc368.zip
gcc-2689fcc80e2e34bf88f03c4ee69d31d9c8dcc368.tar.gz
gcc-2689fcc80e2e34bf88f03c4ee69d31d9c8dcc368.tar.bz2
[PR89528] reset debug uses of return value when dropping dead RTL call
When we remove an RTL call, we wouldn't clean up references to the return value of the call in debug insns. Make it so that we do. for gcc/ChangeLog PR debug/89528 * valtrack.c (dead_debug_insert_temp): Reset debug references to the return value of a call being removed. for gcc/testsuite/ChangeLog PR debug/89528 * gcc.dg/guality/pr89528.c: New. From-SVN: r270389
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.dg/guality/pr89528.c25
-rw-r--r--gcc/valtrack.c22
4 files changed, 40 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8ebd9c8..5f007ef 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2019-04-16 Alexandre Oliva <aoliva@redhat.com>
+
+ PR debug/89528
+ * valtrack.c (dead_debug_insert_temp): Reset debug references
+ to the return value of a call being removed.
+
2019-04-16 Claudiu Zissulescu <claziss@synopsys.com>
* config/arc/arc-protos.h (arc_register_move_cost): Remove.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7dc4f74..914e577 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2019-04-16 Alexandre Oliva <aoliva@redhat.com>
+ PR debug/89528
+ * gcc.dg/guality/pr89528.c: New.
+
PR rtl-optimization/86438
* gcc.dg/torture/pr86438.c: Split up too-wide shift.
diff --git a/gcc/testsuite/gcc.dg/guality/pr89528.c b/gcc/testsuite/gcc.dg/guality/pr89528.c
new file mode 100644
index 0000000..04a7e84
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/guality/pr89528.c
@@ -0,0 +1,25 @@
+/* PR debug/89528 */
+/* { dg-do run } */
+/* { dg-options "-g" } */
+
+#include <stdio.h>
+
+char b;
+int d, e;
+static int i = 1;
+void a(int l) { printf("", l); }
+char c(char l) { return l || b && l == 1 ? b : b % l; }
+short f(int l, int m) { return l * m; }
+short g(short l, short m) { return m || l == 767 && m == 1; }
+int h(int l, int m) { return (l ^ m & l ^ (m & 647) - m ^ m) < m; }
+static int j(int l) { return d == 0 || l == 647 && d == 1 ? l : l % d; }
+short k(int l) { return l >= 2 >> l; }
+void optimize_me_not() { asm(""); }
+static short n(void) {
+ int l_1127 = ~j(9 || 0) ^ 65535;
+ optimize_me_not(); /* { dg-final { gdb-test . "l_1127+1" "-65534" } } */
+ f(l_1127, i && e ^ 4) && g(0, 0);
+ e = 0;
+ return 5;
+}
+int main() { n(); }
diff --git a/gcc/valtrack.c b/gcc/valtrack.c
index 9b2bb33..1f67378 100644
--- a/gcc/valtrack.c
+++ b/gcc/valtrack.c
@@ -657,22 +657,12 @@ dead_debug_insert_temp (struct dead_debug_local *debug, unsigned int uregno,
{
dest = SET_DEST (set);
src = SET_SRC (set);
- /* Lose if the REG-setting insn is a CALL. */
- if (GET_CODE (src) == CALL)
- {
- while (uses)
- {
- cur = uses->next;
- XDELETE (uses);
- uses = cur;
- }
- 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))
+ /* Reset uses if the REG-setting insn is a CALL. 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. */
+ if (GET_CODE (src) == CALL || GET_CODE (src) == ASM_OPERANDS
+ || volatile_insn_p (src))
set = NULL_RTX;
}