https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114688
Bug ID: 114688 Summary: repeat load argument of an inline function Product: gcc Version: 13.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: absoler at smail dot nju.edu.cn Target Milestone: --- Hi, here's the case, regression from gcc-10, x86-64 ``` char g; int v; void foo(char p_17); void func_1() { foo(g); } void foo(char c) { v = (char)(2 - c) & c; } ``` -O2 produce this for `func_1`: ``` <func_1>: foo(): 401130: mov $0x2,%eax 401135: sub 0x2ef5(%rip),%al # 404030 <g> 40113b: and 0x2eef(%rip),%al # 404030 <g> 401141: movsbl %al,%eax 401144: mov %eax,0x2ee2(%rip) # 40402c <v> func_1(): 40114a: retq ``` it seems register allocator feels it's better to repeat load `g` instead of generating an extra `mov` to load it. while clang-trunk choose to do so: https://godbolt.org/z/bqxz8fMYn