Check zero/sign extended hard registers.
authorH.J. Lu <hongjiu.lu@intel.com>
Fri, 18 Mar 2011 00:29:15 +0000 (00:29 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Fri, 18 Mar 2011 00:29:15 +0000 (17:29 -0700)
gcc/

2011-03-17  H.J. Lu  <hongjiu.lu@intel.com>

PR middle-end/47725
* combine.c (cant_combine_insn_p): Check zero/sign extended
hard registers.

gcc/testsuite/

2011-03-17  H.J. Lu  <hongjiu.lu@intel.com>

PR middle-end/47725
* gcc.dg/torture/pr47725.c: New.

From-SVN: r171124

gcc/ChangeLog
gcc/combine.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr47725.c [new file with mode: 0644]

index 8fe2386135f6d115ee0e34e43ab46c56cdbf955c..81498ff4c96eb6e242025952b8f9f5f2914dcd14 100644 (file)
@@ -1,3 +1,9 @@
+2011-03-17  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR middle-end/47725
+       * combine.c (cant_combine_insn_p): Check zero/sign extended
+       hard registers.
+
 2011-03-17  Anatoly Sokolov  <aesok@post.ru>
 
        * config/v850/v850.h (OUTPUT_ADDR_CONST_EXTRA): Remove.
index f9d33b3d539120c6a76c0d24b85e1e36ca9ba5f0..67aecf1510001a8d99852645da61f21bfea6a621 100644 (file)
@@ -2137,6 +2137,12 @@ cant_combine_insn_p (rtx insn)
     return 0;
   src = SET_SRC (set);
   dest = SET_DEST (set);
+  if (GET_CODE (src) == ZERO_EXTEND
+      || GET_CODE (src) == SIGN_EXTEND)
+    src = XEXP (src, 0);
+  if (GET_CODE (dest) == ZERO_EXTEND
+      || GET_CODE (dest) == SIGN_EXTEND)
+    dest = XEXP (dest, 0);
   if (GET_CODE (src) == SUBREG)
     src = SUBREG_REG (src);
   if (GET_CODE (dest) == SUBREG)
index c72c0e48cd1eacc896948fc9e1b1772909d7a60b..51f748c2e227a6b4c648d27a1af458f87681ea5b 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-17  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR middle-end/47725
+       * gcc.dg/torture/pr47725.c: New.
+
 2011-03-17  Jason Merrill  <jason@redhat.com>
 
        * g++.dg/cpp0x/constexpr-overflow2.C: New.
diff --git a/gcc/testsuite/gcc.dg/torture/pr47725.c b/gcc/testsuite/gcc.dg/torture/pr47725.c
new file mode 100644 (file)
index 0000000..03d5d36
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+struct _Unwind_Context
+{
+  void *reg[17];
+  void *ra;
+};
+extern void bar (struct _Unwind_Context *);
+void
+__frame_state_for (void *pc_target)
+{
+  struct _Unwind_Context context;
+  __builtin_memset (&context, 0, sizeof (struct _Unwind_Context));
+  context.ra = pc_target;
+  bar (&context);
+}