Check zero/sign extended hard registers.
authorhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Feb 2011 16:50:43 +0000 (16:50 +0000)
committerhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Feb 2011 16:50:43 +0000 (16:50 +0000)
gcc/

2011-02-15  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-02-15  H.J. Lu  <hongjiu.lu@intel.com>

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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@170179 138bc75d-0d04-0410-961f-82ee72b054a4

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

index c360d46..8f4f569 100644 (file)
@@ -1,3 +1,9 @@
+2011-02-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR middle-end/47725
+       * combine.c (cant_combine_insn_p): Check zero/sign extended
+       hard registers.
+
 2011-02-15  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/47743
index f9d33b3..67aecf1 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 e60f6db..f9cb378 100644 (file)
@@ -1,3 +1,8 @@
+2011-02-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR middle-end/47725
+       * gcc.dg/torture/pr47725.c: New.
+
 2011-02-15  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/47743
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);
+}