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);
+}

Reply via email to