On Mon, Jun 30, 2025 at 8:59 AM Iain Sandoe <i...@sandoe.co.uk> wrote:
>
> Hi
>
> I am investigating the following;
>
> in the program code I have calls like
>
>  uint16_t x = __crt_func ( 10 );
>
> where the argument is guaranteed to be a compile-time uint16_t literal.
>
> So I’ve arranged a series of crts (built with -flto) where one is like
>
> 1/
>
> uint16_t
> __crt_func (const uint16_t in) { return in; }
>
> and others are like
>
> 2/
> uint16_t
> __crt_func (const uint16_t in) { return 5; }
>
> ====
>
> The objective is for an LTO build to eliminate code that becomes dead when 
> the crt returns the various constants.
>
> So, case (2) works fine - the calls get eliminated and the resulting dead 
> code too.
>
> However, case (1) is not doing what I expect.
>
> When I look at the ltrans0.ltrans.272.optimized, the __crt_func () body is 
> there (so it can see it) but still one call to the crt is made and then the 
> value from that call is used, instead of figuring out that this can all be 
> const-propagated &c.
>
> I’ve declared the crt
> uint16_t __crt_func (uint16_t) __attribute__((__const__));

That shouldn't be necessary.

> So…
> am I making a mistake
>  in expectation?

This ("guaranteed optimization").  But I'd say it's a bug in IPA CP
cost modeling,
I suggest to look at the WPA stage -fdump-ipa-cp-details and
-fdump-ipa-inline-details
dumps to figure why we decide it's not worth optimizing.

>  in how the crt is declared?
>
> any other insights?
>
> thanks
> Iain
>
>

Reply via email to