On Fri, Apr 5, 2019 at 9:05 AM Alexandre Oliva <ol...@gnu.org> wrote:
>
> 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.
>
> Regstrapped on x86_64- and i686-linux-gnu.  Ok to install?

Looks OK but can you adjust the testcase to actually test
something?  See recent added testcases (also remove -Og
from dg-options).

OK with that change.

Thanks,
Richard.

>
> 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..a66395fcc314
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/guality/pr89528.c
> @@ -0,0 +1,25 @@
> +/* PR debug/89528 */
> +/* { dg-do run } */
> +/* { dg-options "-Og -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();
> +  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;
>         }
>
>
>
> --
> Alexandre Oliva, freedom fighter   https://FSFLA.org/blogs/lxo
> Be the change, be Free!         FSF Latin America board member
> GNU Toolchain Engineer                Free Software Evangelist
> Hay que enGNUrecerse, pero sin perder la terGNUra jamás-GNUChe

Reply via email to