[PR89528] reset debug uses of return value when dropping dead RTL call

Richard Biener richard.guenther@gmail.com
Fri Apr 12 06:27:00 GMT 2019


On April 12, 2019 3:28:20 AM GMT+02:00, Alexandre Oliva <aoliva@redhat.com> wrote:
>On Apr  5, 2019, Richard Biener <richard.guenther@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;
> 	}
> 



More information about the Gcc-patches mailing list