On April 12, 2019 3:28:20 AM GMT+02:00, Alexandre Oliva <aol...@redhat.com> wrote: >On Apr 5, 2019, Richard Biener <richard.guent...@gmail.com> wrote: > >> Looks OK but can you adjust the testcase to actually test >> something? > >Doh, I *knew* I'd failed to do something I should have ;-) > > >I resorted to the trick you used in pr89892.c, of using a more complex >expression to get UNSUPPORTED results instead of FAILs when the call >and >thus the variable are optimized out. How's this?
Looks good! Thanks, Richard. > >[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. >--- >gcc/testsuite/gcc.dg/guality/pr89528.c | 25 +++++++++++++++++++++++++ > gcc/valtrack.c | 22 ++++++---------------- > 2 files changed, 31 insertions(+), 16 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/guality/pr89528.c > >diff --git a/gcc/testsuite/gcc.dg/guality/pr89528.c >b/gcc/testsuite/gcc.dg/guality/pr89528.c >new file mode 100644 >index 000000000000..04a7e84d8755 >--- /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 9b2bb333c0a3..1f67378a867c 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; > } >