Hi, I've tried to see what is gonig on for PR target/24445 which is a 4.1 regression of SH.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24445 Comparing rtl dumps for the reduced testcase in the audit trail #4 of that PR with and without Jan's patch in #10, there is no return value copy in the rtl generated with the patched compiler in the first place. [.expand after the patch] (set (reg/f:SI 160) (const:SI (unspec [(symbol_ref:SI ("baz"))] 7))) (set (reg:SI 161) (plus:SI (reg:SI 12 r12) (reg/f:SI 160))) (set (reg/f:SI 159) (mem/u/c:SI (reg:SI 161))) (set (reg:SI 0 r0) (call (mem:SI (symbol_ref:SI ("bar"))))) (set (mem/c/i:SI (reg/f:SI 159)) (reg:SI 0 r0))) [.expand before the patch] (set (reg/f:SI 160) (const:SI (unspec [(symbol_ref:SI ("baz"))] 7))) (set (reg:SI 161) (plus:SI (reg:SI 12 r12) (reg/f:SI 160))) (set (reg/f:SI 159) (mem/u/c:SI (reg:SI 161))) (set (reg:SI 0 r0) (call (mem:SI (symbol_ref:SI ("bar"))))) (set (reg:SI 164) (reg:SI 0 r0)) (set (mem/c/i:SI (reg/f:SI 159)) (reg:SI 164)) The 2nd and 3rd insns are combined to (set (reg/f:SI 159) (mem/u/c:SI (plus:SI (reg:SI 12 r12) (reg/f:SI 160)))) at the combine pass. An optimization in local-alloc moves the PLT address calculation after the function call: [.lreg after the patch] (set (reg:SI 0 r0) (call (mem:SI (symbol_ref:SI ("bar"))))) (set (reg/f:SI 160) (const:SI (unspec [(symbol_ref:SI ("baz"))] 7))) (set (reg/f:SI 159) (mem/u/c:SI (plus:SI (reg:SI 12 r12) (reg/f:SI 160)))) (set (mem/c/i:SI (reg/f:SI 159)) (reg:SI 0 r0))) [.lreg before the patch] (set (reg:SI 0 r0) (call (mem:SI (symbol_ref:SI ("bar"))))) (set (reg:SI 164) (reg:SI 0 r0)) (set (reg/f:SI 160) (const:SI (unspec [(symbol_ref:SI ("baz"))] 7))) (set (reg/f:SI 159) (mem/u/c:SI (plus:SI (reg:SI 12 r12) (reg/f:SI 160)))) (set (mem/c/i:SI (reg/f:SI 159)) (reg:SI 164)) Then the reload pass complains that r0 can't be allocated to pseudo 160 in the former case because r0 is the unique index register of SH. I don't understand which part is problematic, though. How this PR should be fixed? Regards, kaz