Hi Sébastien,

After applying your patch, I get an assertion failure in
emit_return_into_block, at function.c:5600 when trying to compile
anything (line is "gcc_assert (ANY_RETURN_P (pat));").

Any ideas?

Doh - I should have checked further. The problem is the return_internal pattern. emit_return_into_block() expects that in a return insn that contains more than one piece of RTL, the first piece of RTL will be (return). This is not (currently) true for the lm23.

Fixing that let the build proceed as far as truncdfsf2.c in libgcc, This then fails with a return insn that does not match the return pattern. This turns out to be because the "return" pattern should really be an expander that will work when conditions are not being tested. The simplest way to fix this was to create an expander and rename "return" to "basic_return".

Next there is seg-fault building ffssi2 in newlib. I do not have a fix for this one yet, but at least libgcc builds now.

OK to apply ?

Cheers
  Nick

gcc/ChangeLog
2012-08-21  Nick Clifton  <ni...@redhat.com>

        * config/lm32/lm32.md (return_internal): Place the (return) as the
        first element in the vector.
        (return): Changed into an expander.
        (basic_return): Renamed version of previous return pattern.

 Index: gcc/config/lm32/lm32.md
===================================================================
--- gcc/config/lm32/lm32.md     (revision 190564)
+++ gcc/config/lm32/lm32.md     (working copy)
@@ -629,16 +629,22 @@
 )

 (define_insn "return_internal"
-  [(use (match_operand:SI 0 "register_operand" "r"))
-   (return)]
+  [(return)
+   (use (match_operand:SI 0 "register_operand" "r"))]
   ""
   "b        %0"
   [(set_attr "type" "uibranch")]
 )

-(define_insn "return"
+(define_expand "return"
   [(return)]
   "lm32_can_use_return ()"
+  "lm32_expand_epilogue (); DONE;"
+)
+
+(define_insn "basic_return"
+  [(return)]
+  "lm32_can_use_return ()"
   "ret"
   [(set_attr "type" "uibranch")]
 )

Reply via email to