> Am 04.10.2023 um 16:16 schrieb Hanke Zhang <hkzhang...@gmail.com>:
> 
> Richard Biener <richard.guent...@gmail.com> 于2023年10月4日周三 16:43写道:
>> 
>>> On Wed, Oct 4, 2023 at 10:37 AM Richard Biener
>>> <richard.guent...@gmail.com> wrote:
>>> 
>>> On Tue, Oct 3, 2023 at 6:30 PM Hanke Zhang via Gcc <gcc@gcc.gnu.org> wrote:
>>>> 
>>>> Hi, I'm a little confused about the behavior of gcc when the function
>>>> is not inlined.
>>>> 
>>>> Here is an example code:
>>>> 
>>>> int __attribute__((noinline)) foo() {
>>>>    return 1;
>>>> }
>>>> 
>>>> int main() {
>>>>    if (foo()) {
>>>>        printf("foo() returned 1\n");
>>>>    } else {
>>>>        printf("foo() returned 0\n");
>>>>    }
>>>>    return 0;
>>>> }
>>>> 
>>>> After compiling this via `-O3 -flto`, the else block isn't been
>>>> optimized and still exists.
>>>> 
>>>> Even it's so obvious that the function will return '1', can't the
>>>> compiler see that? Does gcc only get this information by inlining the
>>>> function? Or is that what the gcc does?
>>>> 
>>>> If so, how to make a change to let gcc get this information then?
>>> 
>>> I think IPA-CP would be doing this but the issue is that historically
>>> 'noinline' also disabled other IPA transforms and we've kept that
>>> for backward compatibility even when we introduced the separate 'noipa'
>>> attribute.
> 
> Thanks. The initial example is a function that uses va_args as
> parameters. It cannot be inlined because of va_args, and then its
> return value cannot be predicted like above. For example, the
> following function:
> 
> int foo (int num, ...) {
>    va_list args;
>    va_start(args, num);
>    int a1 = va_arg(args, int);
>    int a2 = va_arg(args, int);
>    printf("a1 = %d, a2 = %d\n", a1, a2);
>    va_end(args);
>    return 1;
> }
> 
> int main() {
>    if (foo(2, rand(), rand())) {
>        printf("foo() returned 1\n");
>    } else {
>        printf("foo() returned 0\n");
>    }
>    return 0;
> }
> 
> Wouldn't such a function be optimized like 'noinline'?
> 
>> 
>> Oh, and I forgot that IIRC neither IPA CP nor IPA SRA handle return
>> functions in a way exposing this to optimization passes (there's no
>> way to encode this in fnspec, we'd need some return value value-range
>> and record that and make VRP/ranger query it on calls).
>> 
>> Richard.
>> 
> 
> Thanks. So, does that mean I have to let VRP/ranger be able to query
> the return value so that the else block can be optimized out?

Yes (and compute a return value range).

Richard 

>>> Richard.
>>> 
>>>> 
>>>> Thanks
>>>> Hanke Zhang

Reply via email to