Patchwork Fix SIGN/ZERO_EXTEND confusion in expand_debug_expr (PR debug/45003)

login
register
mail settings
Submitter Jakub Jelinek
Date July 20, 2010, 12:40 p.m.
Message ID <20100720124018.GA19172@tyan-ft48-01.lab.bos.redhat.com>
Download mbox | patch
Permalink /patch/59305/
State New
Headers show

Comments

Jakub Jelinek - July 20, 2010, 12:40 p.m.
Hi!

As the attached testcase shows, expand_debug_expr was generating wrong
extension (based on TYPE_UNSIGNED of the result rather than operand,
so for unsigned short x; DEBUG y => (int) x was SIGN_EXTEND instead of
ZERO_EXTEND and vice versa).

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux.  Ok for
trunk?

2010-07-20  Jakub Jelinek  <jakub@redhat.com>

	PR debug/45003
	* cfgexpand.c (expand_debug_expr) <case NOP_EXPR>: Use ZERO_EXTEND
	or SIGN_EXTEND depending on TYPE_UNSIGNED of the operand's type
	instead of the result's type.

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


	Jakub
Richard Guenther - July 20, 2010, 12:41 p.m.
On Tue, 20 Jul 2010, Jakub Jelinek wrote:

> Hi!
> 
> As the attached testcase shows, expand_debug_expr was generating wrong
> extension (based on TYPE_UNSIGNED of the result rather than operand,
> so for unsigned short x; DEBUG y => (int) x was SIGN_EXTEND instead of
> ZERO_EXTEND and vice versa).
> 
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux.  Ok for
> trunk?

Ok.

Thanks,
Richard.

> 2010-07-20  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR debug/45003
> 	* cfgexpand.c (expand_debug_expr) <case NOP_EXPR>: Use ZERO_EXTEND
> 	or SIGN_EXTEND depending on TYPE_UNSIGNED of the operand's type
> 	instead of the result's type.
> 
> 	* gcc.dg/guality/pr45003-1.c: New test.
> 
> --- gcc/cfgexpand.c.jj	2010-06-20 17:13:36.000000000 +0200
> +++ gcc/cfgexpand.c	2010-07-20 11:21:17.000000000 +0200
> @@ -2164,7 +2164,7 @@ expand_debug_expr (tree exp)
>  	  op0 = simplify_gen_subreg (mode, op0, inner_mode,
>  				     subreg_lowpart_offset (mode,
>  							    inner_mode));
> -	else if (unsignedp)
> +	else if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))))
>  	  op0 = gen_rtx_ZERO_EXTEND (mode, op0);
>  	else
>  	  op0 = gen_rtx_SIGN_EXTEND (mode, op0);
> --- gcc/testsuite/gcc.dg/guality/pr45003-1.c.jj	2010-07-20 13:56:34.000000000 +0200
> +++ gcc/testsuite/gcc.dg/guality/pr45003-1.c	2010-07-20 13:58:38.000000000 +0200
> @@ -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");
> +  asm volatile ("nop" : : "D" (a));	/* { dg-final { gdb-test 10 "a" "0x8078" } } */
> +  return 0;
> +}
> +
> +int __attribute__((noinline))
> +bar (short *p)
> +{
> +  unsigned int a = *p;
> +  asm volatile ("nop");
> +  asm volatile ("nop" : : "D" (a));	/* { dg-final { gdb-test 19 "a" "0xffff8078" } } */
> +  return 0;
> +}
> +
> +int
> +main ()
> +{
> +  unsigned short us = 0x8078;
> +  foo (&us);
> +  short s = -32648;
> +  bar (&s);
> +  return 0;
> +}
> 
> 	Jakub
> 
>

Patch

--- gcc/cfgexpand.c.jj	2010-06-20 17:13:36.000000000 +0200
+++ gcc/cfgexpand.c	2010-07-20 11:21:17.000000000 +0200
@@ -2164,7 +2164,7 @@  expand_debug_expr (tree exp)
 	  op0 = simplify_gen_subreg (mode, op0, inner_mode,
 				     subreg_lowpart_offset (mode,
 							    inner_mode));
-	else if (unsignedp)
+	else if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))))
 	  op0 = gen_rtx_ZERO_EXTEND (mode, op0);
 	else
 	  op0 = gen_rtx_SIGN_EXTEND (mode, op0);
--- gcc/testsuite/gcc.dg/guality/pr45003-1.c.jj	2010-07-20 13:56:34.000000000 +0200
+++ gcc/testsuite/gcc.dg/guality/pr45003-1.c	2010-07-20 13:58:38.000000000 +0200
@@ -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");
+  asm volatile ("nop" : : "D" (a));	/* { dg-final { gdb-test 10 "a" "0x8078" } } */
+  return 0;
+}
+
+int __attribute__((noinline))
+bar (short *p)
+{
+  unsigned int a = *p;
+  asm volatile ("nop");
+  asm volatile ("nop" : : "D" (a));	/* { dg-final { gdb-test 19 "a" "0xffff8078" } } */
+  return 0;
+}
+
+int
+main ()
+{
+  unsigned short us = 0x8078;
+  foo (&us);
+  short s = -32648;
+  bar (&s);
+  return 0;
+}