http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45233
--- Comment #6 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-11-07 09:28:17 UTC --- (In reply to comment #5) > (In reply to comment #4) > > (In reply to comment #3) > > FWIW gcc-4.2.1 (Apple local) fails and clang passes the test (although clang's > asm at version 2.9 is a bit long-winded c.f. GCC's ... but that's quite an old > version). > > > > or not properly restoring the UNSPEC during reload (it's its duty, not > > > IRAs). > > > > I'll check this too. > > Thanks Richi, this seems to be the problem - it appears that the reload > legitimizer does not consider that the item might be 'undefined' (in the > mach-o, local-to-the-file sense) - and, therefore, there was no mechanism to > recreate the necessary indirection. > > so, this is a fix - which bootstraps and regtests: > > I'd very much like an opinion as to whether it's the _right_ fix ... this is > an > area with which I am not familiar and therefore could have missed some other > guard that's needed. > > It's clearly a very infrequent (perhaps even non-existent) occurrence outside > the particular asm test-case (which makes me wonder still if combine came to > the right decision to remove the refs in the first place). Combine also asks the target whether the result is valid, so yes. > Index: gcc/config/rs6000/rs6000.c > =================================================================== > --- gcc/config/rs6000/rs6000.c (revision 181027) > +++ gcc/config/rs6000/rs6000.c (working copy) > @@ -6185,7 +6185,21 @@ rs6000_legitimize_reload_address (rtx x, enum mach > #if TARGET_MACHO > if (flag_pic) > { > - rtx offset = machopic_gen_offset (x); > + rtx offset; > + > + /* Reload might present us with a case where there is a reference to > + an undefined entity. */ > + if (!machopic_symbol_defined_p (x) && !MACHO_DYNAMIC_NO_PIC_P) > + { > + offset = gen_rtx_SYMBOL_REF (Pmode, > + machopic_indirection_name (x, > + false)); > + SYMBOL_REF_DATA (offset) = SYMBOL_REF_DATA (x); > + machopic_define_symbol (gen_const_mem (Pmode,offset)); > + x = offset; > + } > + > + offset = machopic_gen_offset (x); > x = gen_rtx_LO_SUM (GET_MODE (x), > gen_rtx_PLUS (Pmode, pic_offset_table_rtx, > gen_rtx_HIGH (Pmode, offset)), offset); I suppose you should post this to gcc-patches@.