Hi, copy_addr_to_reg doesn't check of mode is valid before copy it to Pmode. This patch converts to Pmode if needed. OK for 4.7?
Thanks. H.J. -- diff --git a/gcc/ChangeLog.x32 b/gcc/ChangeLog.x32 index b85956c..3405300 100644 --- a/gcc/ChangeLog.x32 +++ b/gcc/ChangeLog.x32 @@ -1,5 +1,10 @@ 2011-03-12 H.J. Lu <hongjiu...@intel.com> + PR target/48084 + * explow.c (copy_addr_to_reg): Convert to Pmode if needed. + +2011-03-12 H.J. Lu <hongjiu...@intel.com> + * config/i386/i386.md (*tls_global_dynamic_64): Don't generate byte 0x66 before lea for TARGET_X32. diff --git a/gcc/explow.c b/gcc/explow.c index 460af1f..9b3c082 100644 --- a/gcc/explow.c +++ b/gcc/explow.c @@ -611,6 +611,8 @@ copy_to_reg (rtx x) rtx copy_addr_to_reg (rtx x) { + if (GET_MODE (x) != VOIDmode && GET_MODE (x) != Pmode) + x = convert_to_mode (Pmode, x, 1); return copy_to_mode_reg (Pmode, x); } diff --git a/gcc/testsuite/ChangeLog.x32 b/gcc/testsuite/ChangeLog.x32 index 06ba94e..3b7be1d 100644 --- a/gcc/testsuite/ChangeLog.x32 +++ b/gcc/testsuite/ChangeLog.x32 @@ -1,3 +1,8 @@ +2011-03-12 H.J. Lu <hongjiu...@intel.com> + + PR target/48084 + * gcc.target/i386/pr48084-5.c: New. + 2011-03-11 H.J. Lu <hongjiu...@intel.com> PR target/48084 diff --git a/gcc/testsuite/gcc.target/i386/pr48084-5.c b/gcc/testsuite/gcc.target/i386/pr48084-5.c new file mode 100644 index 0000000..d6ed8e5 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr48084-5.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-O0 -mrdrnd" } */ + +int +_rdrand16_step (unsigned short *__P) +{ + return __builtin_ia32_rdrand16_step (__P); +}