[PR89528] reset debug uses of return value when dropping dead RTL call
authorAlexandre Oliva <aoliva@redhat.com>
Tue, 16 Apr 2019 12:44:57 +0000 (12:44 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Tue, 16 Apr 2019 12:44:57 +0000 (12:44 +0000)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/guality/pr89528.c [new file with mode: 0644]
gcc/valtrack.c

index 8ebd9c8f3f2840bd608f9ab94ad3cef1d1a1c956..5f007efe75ef820cd2ea70f58218c052ccb29857 100644 (file)
@@ -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.
index 7dc4f7411b6b84fe0cc8ebf757db8464224c1e16..914e5776867b3dcd43463028cff4d35234677a5e 100644 (file)
@@ -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 (file)
index 0000000..04a7e84
--- /dev/null
@@ -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(); }
index 9b2bb333c0a3baae7e3cf93e9b818ea8af5c0c86..1f67378a867c986086c333d125a5e00fe0ce9f4f 100644 (file)
@@ -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;
        }