------- Comment #3 from kkojima at gcc dot gnu dot org 2008-07-12 23:53 ------- I've added a reduced testcase and confirmed that 4.2.4 works too. The RTL dumps show what is going on in the problematic case. The backend creates a REG_EQUAL note for the GOT access and CSE pass locates a memory access after the result is set to R0 according to this note. Unfortunately this results a spill failure because the above memory access requires R0 for reload. The attached patch removes this note. I'll test it when 4.3/4.4 can be built for SH again.
--- ORIG/trunk/gcc/config/sh/sh.md 2008-04-27 13:53:04.000000000 +0900 +++ INTEST/trunk/gcc/config/sh/sh.md 2008-07-13 08:38:15.000000000 +0900 @@ -8880,9 +8880,6 @@ label: /* ??? Should we have a special alias set for the GOT? */ insn = emit_move_insn (operands[0], mem); - set_unique_reg_note (insn, REG_EQUAL, - XVECEXP (XEXP (operands[1], 0), 0, 0)); - DONE; }") -- kkojima at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |kkojima at gcc dot gnu dot | |org Status|UNCONFIRMED |NEW Ever Confirmed|0 |1 Keywords| |ice-on-valid-code Known to fail| |4.3.1 4.4.0 Known to work| |4.2.4 Last reconfirmed|0000-00-00 00:00:00 |2008-07-12 23:53:41 date| | Summary|php-5.2.5, error: unable to |[4.3/4.4 Regression] SH: |find a register to spill in |spill failure in class |class 'R0_REGS' |'R0_REGS' with -fpic http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36782