https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117132

            Bug ID: 117132
           Summary: A call to a function which returns a wider result can
                    be considered a sibling call
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: lh_mouse at 126 dot com
  Target Milestone: ---

(https://godbolt.org/z/besjxE9Pc)
```
extern long real_foo(long x, long y);
int my_foo_x_y(int x, int y) { return real_foo(x, y);  }
int my_foo_x(int x) { return real_foo(x, x);  }
```

GCC:
```
my_foo_x_y:
        sub     rsp, 8
        movsx   rsi, esi
        movsx   rdi, edi
        call    real_foo
        add     rsp, 8
        ret
my_foo_x:
        movsx   rdi, edi
        sub     rsp, 8
        mov     rsi, rdi
        call    real_foo
        add     rsp, 8
        ret
```

Clang:
```
my_foo_x_y:
        movsxd  rdi, edi
        movsxd  rsi, esi
        jmp     real_foo@PLT

my_foo_x:
        movsxd  rdi, edi
        mov     rsi, rdi
        jmp     real_foo@PLT
```

The call to `real_foo` returns a wider result than `my_foo_x` but both are
clearly sibling calls.

Reply via email to