https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92938
--- Comment #7 from jcmvbkbc at gcc dot gnu.org --- (In reply to Richard Biener from comment #6) > (In reply to jcmvbkbc from comment #5) > > (In reply to Andrew Pinski from comment #3) > > > I DON'T think it is a GCC issue. The code is broken. > > > > Even if I remove all attributes from this function I see this issue: > > > > static void bitmap_replace(unsigned long *dst, > > const unsigned long *old, > > const unsigned long *new, > > const unsigned long *mask, > > unsigned int nbits) > > { > > if ((__builtin_constant_p(nbits) && (nbits) <= 32 && (nbits) > 0)) > > *dst = (*old & ~(*mask)) | (*new & *mask); > > else > > __bitmap_replace(dst, old, new, mask, nbits); > > } > > > > Why is it broken? > > What do you expect? That it is either inlined or a call to __bitmap_replace > is emitted Yes, either any of these, or if a constprop function is generated it is either in the .init* section or it doesn't take a reference to a variable in .init*. > (with presumably is in .init* sections?)? It is not in .init*, but that's ok: the reference from .init to .text is present in the original source. It's the reference from .text* to .init* which is not present in the source but is generated by gcc that is the issue.