re PR target/23435 (Unrecognizable insn (in extract_insn, at recog.c))
authorKazu Hirata <kazu@codesourcery.com>
Tue, 22 Nov 2005 20:42:54 +0000 (20:42 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Tue, 22 Nov 2005 20:42:54 +0000 (20:42 +0000)
gcc/
PR target/23435
* m68k.md (zero_extendsidi2): Force operands[1] to a register
if both operands[0] and operands[1] are memory.

gcc/testsuite/
PR target/23435
* gcc.c-torture/compile/pr23435.c: New.

From-SVN: r107373

gcc/ChangeLog
gcc/config/m68k/m68k.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr23435.c [new file with mode: 0644]

index f16711a73099969fff95b317fb07d641f27fe1da..39501c98e68fd5d08a2915378fa7f7eeb43e6f7c 100644 (file)
@@ -1,3 +1,9 @@
+2005-11-22  Kazu Hirata  <kazu@codesourcery.com>
+
+       PR target/23435
+       * m68k.md (zero_extendsidi2): Force operands[1] to a register
+       if both operands[0] and operands[1] are memory.
+
 2005-11-22  Andrew Pinski  <pinskia@physics.uc.edu>
 
        PR middle-end/23606
index 1a4df3bdf7d8caf021f09fe5a1e8fe30cbb3dc3b..8a6a555681d5d949393d102c8cd2804b106ebd4c 100644 (file)
   [(set (match_operand:DI 0 "nonimmediate_operand" "")
        (zero_extend:DI (match_operand:SI 1 "nonimmediate_src_operand" "")))]
   ""
-  "")
+{
+  if (GET_CODE (operands[0]) == MEM
+      && GET_CODE (operands[1]) == MEM)
+    operands[1] = force_reg (SImode, operands[1]);
+})
 
 (define_insn_and_split "*zero_extendsidi2"
   [(set (match_operand:DI 0 "nonimmediate_operand" "")
index c75ea547a70a6c4f921a93c2a9b93203d0efc10a..ae58dc0cd7a91d32a12a53c50779d63b603732a5 100644 (file)
@@ -1,3 +1,8 @@
+2005-11-22  Kazu Hirata  <kazu@codesourcery.com>
+
+       PR target/23435
+       * gcc.c-torture/compile/pr23435.c: New.
+
 2005-11-22  Joseph S. Myers  <joseph@codesourcery.com>
 
        * gcc.c-torture/execute/floatunsisf-1.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr23435.c b/gcc/testsuite/gcc.c-torture/compile/pr23435.c
new file mode 100644 (file)
index 0000000..fb41af1
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR target/23435.
+
+   On m68k-none-elf, this used to cause an unrecognized insn because
+   zero_extendsidi2 accepted operands that are both memory even though
+   such a pattern did not exist.  */
+
+void
+foo (unsigned long *a, unsigned long long *p)
+{
+  *p = *a;
+}