------- Comment #3 from danglin at gcc dot gnu dot org 2006-11-25 20:15 ------- In print_c_condition, we have these two calls:
print_rtx_ptr_loc (cond); printf ("(%s)", cond); The generated assembly code is: 0x400000000000d4d0 <print_c_condition+216>: ldd -40(ret1),r26 0x400000000000d4d4 <print_c_condition+220>: ldo -30(sp),ret1 0x400000000000d4d8 <print_c_condition+224>: b,l 0x400000000000d3b8 <print_rtx_ptr_loc>,rp 0x400000000000d4dc <print_c_condition+228>: copy dp,r4 0x400000000000d4e0 <print_c_condition+232>: ldd -40(ret1),r25 0x400000000000d4e4 <print_c_condition+236>: copy r4,dp 0x400000000000d4e8 <print_c_condition+240>: addil L%0,dp,r1 0x400000000000d4ec <print_c_condition+244>: ldd 80(r1),r26 0x400000000000d4f0 <print_c_condition+248>: ldo -30(sp),ret1 0x400000000000d4f4 <print_c_condition+252>: b,l 0x400000000000d994 <.stub+60>,rp 0x400000000000d4f8 <print_c_condition+256>: nop The insn at 0x400000000000d4e0 is the problem. Register ret1 is the argument pointer. It's call clobbered, so it must be saved and restored if an argument (in this case cond) needs to be reloaded from the argument block on the stack. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29840