]> gcc.gnu.org Git - gcc.git/commitdiff
re PR debug/45003 (VTA issues with sign/zero extension and debug temporaries)
authorJakub Jelinek <jakub@redhat.com>
Wed, 21 Jul 2010 08:50:57 +0000 (10:50 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 21 Jul 2010 08:50:57 +0000 (10:50 +0200)
PR debug/45003
* var-tracking.c (reverse_op): Also handle {SIGN,ZERO}_EXTEND of
a MEM.
* dwarf2out.c (loc_descriptor): Don't handle SIGN_EXTEND nor
ZERO_EXTEND here.

* gcc.dg/guality/pr45003-2.c: New test.
* gcc.dg/guality/pr45003-3.c: New test.

From-SVN: r162364

gcc/ChangeLog
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/guality/pr45003-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/guality/pr45003-3.c [new file with mode: 0644]
gcc/var-tracking.c

index 59ca430b23017103a68f523fcf96c3f62cce0c3d..2d702330376013ee7adf828fcd18be611e8e216b 100644 (file)
@@ -1,3 +1,11 @@
+2010-07-21  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/45003
+       * var-tracking.c (reverse_op): Also handle {SIGN,ZERO}_EXTEND of
+       a MEM.
+       * dwarf2out.c (loc_descriptor): Don't handle SIGN_EXTEND nor
+       ZERO_EXTEND here.
+
 2010-07-20  Richard Henderson  <rth@redhat.com>
 
        * vxworks.c (vxworks_emutls_var_fields): Pass locus to build_decls.
index 385d5da261cc0330f3bd4b8440d2e213a0bf70c7..ce35c9182e1e2f99033476de097b2ee9090d890d 100644 (file)
@@ -14254,11 +14254,6 @@ loc_descriptor (rtx rtl, enum machine_mode mode,
       loc_result = reg_loc_descriptor (rtl, initialized);
       break;
 
-    case SIGN_EXTEND:
-    case ZERO_EXTEND:
-      loc_result = loc_descriptor (XEXP (rtl, 0), mode, initialized);
-      break;
-
     case MEM:
       loc_result = mem_loc_descriptor (XEXP (rtl, 0), GET_MODE (rtl),
                                       initialized);
index e0e49363848212fa1a7170d9ee6e5863218547d6..3cac73836592ea5ac33c1149d80f207977da3b77 100644 (file)
@@ -2,6 +2,10 @@
 
        * gcc.dg/guality/asm-1.c: New test.
 
+       PR debug/45003
+       * gcc.dg/guality/pr45003-2.c: New test.
+       * gcc.dg/guality/pr45003-3.c: New test.
+
 2010-07-20  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR libfortran/44697
diff --git a/gcc/testsuite/gcc.dg/guality/pr45003-2.c b/gcc/testsuite/gcc.dg/guality/pr45003-2.c
new file mode 100644 (file)
index 0000000..dcdba23
--- /dev/null
@@ -0,0 +1,31 @@
+/* PR debug/45003 */
+/* { dg-do run { target { x86_64-*-* && lp64 } } } */
+/* { dg-options "-g" } */
+
+int __attribute__((noinline))
+foo (unsigned short *p)
+{
+  int a = *p;
+  asm volatile ("nop" : : "D" ((int) *p));
+  asm volatile ("nop" : : "D" ((int) *p));     /* { dg-final { gdb-test 10 "a" "0x8078" } } */
+  return 0;
+}
+
+int __attribute__((noinline))
+bar (short *p)
+{
+  unsigned int a = *p;
+  asm volatile ("nop" : : "D" ((unsigned int) *p));
+  asm volatile ("nop" : : "D" ((unsigned int) *p));    /* { dg-final { gdb-test 19 "a" "0xffff8078" } } */
+  return 0;
+}
+
+int
+main ()
+{
+  unsigned short us = 0x8078;
+  foo (&us);
+  short s = -32648;
+  bar (&s);
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/guality/pr45003-3.c b/gcc/testsuite/gcc.dg/guality/pr45003-3.c
new file mode 100644 (file)
index 0000000..3adc4f2
--- /dev/null
@@ -0,0 +1,31 @@
+/* PR debug/45003 */
+/* { dg-do run { target { x86_64-*-* && lp64 } } } */
+/* { dg-options "-g" } */
+
+int __attribute__((noinline))
+foo (unsigned short *p)
+{
+  int a = (short) *p;
+  asm volatile ("nop" : : "D" ((int) *p));
+  asm volatile ("nop" : : "D" ((int) *p));     /* { dg-final { gdb-test 10 "a" "-32648" } } */
+  return 0;
+}
+
+int __attribute__((noinline))
+bar (short *p)
+{
+  unsigned int a = (unsigned short) *p;
+  asm volatile ("nop" : : "D" ((unsigned int) *p));
+  asm volatile ("nop" : : "D" ((unsigned int) *p));    /* { dg-final { gdb-test 19 "a" "0x8078" } } */
+  return 0;
+}
+
+int
+main ()
+{
+  unsigned short us = 0x8078;
+  foo (&us);
+  short s = -32648;
+  bar (&s);
+  return 0;
+}
index e13f340b03feb8c6f822f75964eb9e23b151f595..d1c584a8435a480f9d68ee03e99c5eee473f7f71 100644 (file)
@@ -5187,16 +5187,19 @@ reverse_op (rtx val, const_rtx expr)
     case XOR:
     case NOT:
     case NEG:
+      if (!REG_P (XEXP (src, 0)))
+       return NULL_RTX;
+      break;
     case SIGN_EXTEND:
     case ZERO_EXTEND:
+      if (!REG_P (XEXP (src, 0)) && !MEM_P (XEXP (src, 0)))
+       return NULL_RTX;
       break;
     default:
       return NULL_RTX;
     }
 
-  if (!REG_P (XEXP (src, 0))
-      || !SCALAR_INT_MODE_P (GET_MODE (src))
-      || XEXP (src, 0) == cfa_base_rtx)
+  if (!SCALAR_INT_MODE_P (GET_MODE (src)) || XEXP (src, 0) == cfa_base_rtx)
     return NULL_RTX;
 
   v = cselib_lookup (XEXP (src, 0), GET_MODE (XEXP (src, 0)), 0);
This page took 0.118862 seconds and 5 git commands to generate.