From patchwork Tue Jul 20 12:40:18 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Fix SIGN/ZERO_EXTEND confusion in expand_debug_expr (PR debug/45003) From: Jakub Jelinek X-Patchwork-Id: 59305 Message-Id: <20100720124018.GA19172@tyan-ft48-01.lab.bos.redhat.com> To: Richard Guenther Cc: gcc-patches@gcc.gnu.org Date: Tue, 20 Jul 2010 14:40:18 +0200 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 PR debug/45003 * cfgexpand.c (expand_debug_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 --- 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; +}