https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112478

--- Comment #3 from Michael T. Kloos <Michael at MichaelKloos dot com> ---
Created attachment 56560
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=56560&action=edit
Sample program to reproduce the bug

I have created and attached a small simple program which shows the bug.  

If compiled with an earlier version of GCC, it runs fine.  If compiled with a
later version, after the aforementioned commit, it goes into an infinite loop.  

The problem is that the ra register clobber is not being honored.  You can see
the difference in objdump disassembly of the the call_invert_and_sum()
function.

Here is the disassembly of the good version:
000101e0 <call_invert_and_sum>:
   101e0:       ff010113                add     sp,sp,-16
   101e4:       00112623                sw      ra,12(sp)
   101e8:       f21ff0ef                jal     10108 <invert_and_sum>
   101ec:       00c12083                lw      ra,12(sp)
   101f0:       01010113                add     sp,sp,16
   101f4:       00008067                ret

Here is the disassembly of the bad version:
000101e0 <call_invert_and_sum>:
   101e0:       f29ff0ef                jal     10108 <invert_and_sum>
   101e4:       00008067                ret

This should make it very clear why the program gets trapped in an infinite loop
in the second example.

Reply via email to