PR lto/51698 and the state of LTO + transactional memory
Aldy Hernandez
aldyh@redhat.com
Wed Jan 25 13:00:00 GMT 2012
>> Second, it seems that by design, LTO prefers builtins to user-provided
>> versions of them. In particular, lto_symtab_prevailing_decl() stipulates
>> that builtins are their own prevailing decl. So even if we lowered TM
>> before LTO streaming, user provided builtins wouldn't be preferred (and thus
>> inlined) as we would expect into application code.
>
> Hmm, so you say you have sth like
>
> void *memcpy(void *dst, void *src, size_t n) { ...implementation... }
> void foo()
> {
> memcpy (...);
> }
>
> and expect it to be inlined from the supplied body instead of using the
> builtin expander?
Yes. Ultimately we want to do exactly that with TM instrumented code.
> I think we could make this work ... at least under a sort-of ODR, that
> all bodies (from different TUs) and the builtin have the same behavior.
>
> Mind to file an enhancement bug? Does it work without LTO?
Without LTO the memcpy gets inlined correctly. This is what I am using:
houston:/build/t/gcc$ cat a.c
char *dst, *src;
void *memcpy(void *, const void *, __SIZE_TYPE__);
main()
{
memcpy(dst, src, 123);
}
houston:/build/t/gcc$ cat b.c
extern int putchar(int);
void *memcpy(void *dst,
const void *src,
__SIZE_TYPE__ n)
{
putchar(13);
}
houston:/build/t/gcc$ ./xgcc -B./ -flto -O3 a.c b.c -save-temps -o a.out
However, with LTO, somewhere around constant propagation (ccp2), we
decide the memcpy is no longer needed and remove it altogether. So it
looks like the builtin was preferred.
I will file an enhancement PR with the above example.
Thanks for looking into this.
More information about the Gcc-patches
mailing list