On Tue, Nov 06, 2007 at 07:40:00PM +0100, Ulrich Weigand wrote: > H.J. Lu wrote: > > > Yes, it works for me. I tested it on Linux/ia32, Linux/intel64 > > and linux/ia64. There are no regressions. > > Thanks for testing! > > > gcc/ > > > > 2007-11-06 Ulrich Weigand <[EMAIL PROTECTED]> > > > > PR target/30961 > > * reload1.c (find_reloads): Also check in_reg when handling a > > simple move with an input reload and a destination of a hard > > register. > > > > gcc/testsuite/ > > > > 2007-11-06 H.J. Lu <[EMAIL PROTECTED]> > > > > PR target/30961 > > * gcc.target/i386/pr30961-1.c: New. > > This is OK, please check it in. >
There was a typo in the patch. This is the one I checked in. Thanks. H.J. --- gcc/ 2007-11-06 Ulrich Weigand <[EMAIL PROTECTED]> PR target/30961 * reload1.c (find_reloads): Also check in_reg when handling a simple move with an input reload and a destination of a hard register. gcc/testsuite/ 2007-11-06 H.J. Lu <[EMAIL PROTECTED]> PR target/30961 * gcc.target/i386/pr30961-1.c: New. --- gcc/reload.c.second 2007-10-03 06:23:52.000000000 -0700 +++ gcc/reload.c 2007-11-06 07:38:33.000000000 -0800 @@ -4462,7 +4462,8 @@ find_reloads (rtx insn, int replace, int if (rld[i].when_needed == RELOAD_FOR_INPUT && GET_CODE (PATTERN (insn)) == SET && REG_P (SET_DEST (PATTERN (insn))) - && SET_SRC (PATTERN (insn)) == rld[i].in + && (SET_SRC (PATTERN (insn)) == rld[i].in + || SET_SRC (PATTERN (insn)) == rld[i].in_reg) && !elimination_target_reg_p (SET_DEST (PATTERN (insn)))) { rtx dest = SET_DEST (PATTERN (insn)); --- gcc/testsuite/gcc.target/i386/pr30961-1.c.second 2007-11-06 07:38:33.000000000 -0800 +++ gcc/testsuite/gcc.target/i386/pr30961-1.c 2007-11-06 07:38:33.000000000 -0800 @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-O2" } */ + +double +convert (long long in) +{ + double f; + __builtin_memcpy( &f, &in, sizeof( in ) ); + return f; +} + +/* { dg-final { scan-assembler-not "movapd" } } */