Hi!

On the attached enhanced typeddwarf.c testcase there is no location
info for the 3 vars in f4 function with -O2 -m32 -g.  The parameter
is unused during expansion except for debug stmts, but DECL_INCOMING_RTL
isn't a hard register or MEM with hard register as address that would be
represented as ENTRY_VALUE.  But, if it is unused, then IMHO nothing should
modify the stack slot in which it has been passed to the function, thus
it should be fine to just use the DECL_INCOMING_RTL MEM.
Without this patch, we will use a pseudo that is loaded from the MEM,
but those pseudos will be quickly optimized away afterwards.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2011-05-05  Jakub Jelinek  <ja...@redhat.com>

        * cfgexpand.c (expand_debug_expr): For unused non-addressable
        parameters passed in memory prefer using DECL_INCOMING_RTL over
        the pseudos it will be copied into.

--- gcc/cfgexpand.c.jj  2011-05-02 18:39:28.000000000 +0200
+++ gcc/cfgexpand.c     2011-05-05 09:29:50.000000000 +0200
@@ -3160,6 +3160,20 @@ expand_debug_expr (tree exp)
                        ENTRY_VALUE_EXP (op0) = incoming;
                        goto adjust_mode;
                      }
+                   if (incoming
+                       && MEM_P (incoming)
+                       && !TREE_ADDRESSABLE (SSA_NAME_VAR (exp))
+                       && GET_MODE (incoming) != BLKmode
+                       && (XEXP (incoming, 0) == virtual_incoming_args_rtx
+                           || (GET_CODE (XEXP (incoming, 0)) == PLUS
+                               && XEXP (XEXP (incoming, 0), 0)
+                                  == virtual_incoming_args_rtx
+                               && CONST_INT_P (XEXP (XEXP (incoming, 0),
+                                                     1)))))
+                     {
+                       op0 = incoming;
+                       goto adjust_mode;
+                     }
                    op0 = expand_debug_expr (SSA_NAME_VAR (exp));
                    if (!op0)
                      return NULL;

        Jakub
/* { dg-do run { target { i?86-*-* x86_64-*-* } } } */
/* { dg-options "-g" } */

typedef __SIZE_TYPE__ size_t;
volatile int vv;
extern void *memcpy (void *, const void *, size_t);

__attribute__((noinline, noclone)) void
f1 (double a, double b, double c, float d, float e, int f, unsigned int g, long 
long h, unsigned long long i)
{
  double j = d;                 /* { dg-final { gdb-test 29 "j" "4" } } */
  long long l;                  /* { dg-final { gdb-test 29 "l" 
"4616189618054758400" } } */
  memcpy (&l, &j, sizeof (l));
  long long m;                  /* { dg-final { gdb-test 29 "m" 
"4613937818241073152" } } */
  memcpy (&m, &c, sizeof (l));
  float n = i;                  /* { dg-final { gdb-test 29 "n" "9" } } */
  double o = h;                 /* { dg-final { gdb-test 29 "o" "8" } } */
  float p = g;                  /* { dg-final { gdb-test 29 "p" "7" } } */
  double q = f;                 /* { dg-final { gdb-test 29 "q" "6" } } */
  unsigned long long r = a;     /* { dg-final { gdb-test 29 "r" "1" } } */
  long long s = c;              /* { dg-final { gdb-test 29 "s" "3" } } */
  unsigned t = d;               /* { dg-final { gdb-test 29 "t" "4" } } */
  int u = b;                    /* { dg-final { gdb-test 29 "u" "2" } } */
  float v = a;                  /* { dg-final { gdb-test 29 "v" "1" } } */
  double w = d / 4.0;           /* { dg-final { gdb-test 29 "w" "1" } } */
  double x = a + b + 1.0;       /* { dg-final { gdb-test 29 "x" "4" } } */
  double y = b + c + 2.0;       /* { dg-final { gdb-test 29 "y" "7" } } */
  float z = d + e + 3.0f;       /* { dg-final { gdb-test 29 "z" "12" } } */
  vv++;
}

__attribute__((noinline, noclone)) void
f2 (double a, double b, double c, float d, float e, int f, unsigned int g, long 
long h, unsigned long long i)
{
  double j = d;                 /* { dg-final { gdb-test 53 "j" "4" } } */
  long long l;                  /* { dg-final { gdb-test 53 "l" 
"4616189618054758400" } } */
  memcpy (&l, &j, sizeof (l));
  long long m;                  /* { dg-final { gdb-test 53 "m" 
"4613937818241073152" } } */
  memcpy (&m, &c, sizeof (l));
  float n = i;                  /* { dg-final { gdb-test 53 "n" "9" } } */
  double o = h;                 /* { dg-final { gdb-test 53 "o" "8" } } */
  float p = g;                  /* { dg-final { gdb-test 53 "p" "7" } } */
  double q = f;                 /* { dg-final { gdb-test 53 "q" "6" } } */
  unsigned long long r = a;     /* { dg-final { gdb-test 53 "r" "1" } } */
  long long s = c;              /* { dg-final { gdb-test 53 "s" "3" } } */
  unsigned t = d;               /* { dg-final { gdb-test 53 "t" "4" } } */
  int u = b;                    /* { dg-final { gdb-test 53 "u" "2" } } */
  float v = a;                  /* { dg-final { gdb-test 53 "v" "1" } } */
  double w = d / 4.0;           /* { dg-final { gdb-test 53 "w" "1" } } */
  double x = a + b - 3 + 1.0e20;/* { dg-final { gdb-test 53 "x" "1e+20" } } */
  double y = b + c * 7.0;       /* { dg-final { gdb-test 53 "y" "23" } } */
  float z = d + e + 3.0f;       /* { dg-final { gdb-test 53 "z" "12" } } */
  vv++;
  vv = a;
  vv = b;
  vv = c;
  vv = d;
  vv = e;
  vv = f;
  vv = g;
  vv = h;
  vv = i;
  vv = j;
}

__attribute__((noinline, noclone)) void
f3 (long long a, int b, long long c, unsigned d)
{
  long long w = (a > d) ? a : d;/* { dg-final { gdb-test 73 "w" "4" } } */
  long long x = a + b + 7;      /* { dg-final { gdb-test 73 "x" "10" } } */
  long long y = c + d + 0x912345678LL;/* { dg-final { gdb-test 73 "y" 
"38960125567" } } */
  int z = (x + y);              /* { dg-final { gdb-test 73 "z" "305419913" } } 
*/
  vv++;
}

__attribute__((noinline, noclone)) void
f4 (_Decimal32 a, _Decimal64 b, _Decimal128 c)
{
  _Decimal32 w = a * 8.0DF + 6.0DF;/* { dg-final { gdb-test 82 "(int)w" "70" } 
} */
  _Decimal64 x = b / 8.0DD - 6.0DD;/* { dg-final { gdb-test 82 "(int)x" "-4" } 
} */
  _Decimal128 y = -c / 8.0DL;   /* { dg-final { gdb-test 82 "(int)y" "-8" } } */
  vv++;
}

int
main ()
{
  f1 (1.0, 2.0, 3.0, 4.0f, 5.0f, 6, 7, 8, 9);
  f2 (1.0, 2.0, 3.0, 4.0f, 5.0f, 6, 7, 8, 9);
  f3 (1, 2, 3, 4);
  f4 (8.0DF, 16.0DD, 64.0DL);
  return 0;
}

Reply via email to