https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114030
Bug ID: 114030 Summary: redundant load of inline function's arguments Product: gcc Version: 13.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: absoler at smail dot nju.edu.cn Target Milestone: --- hi, here's the code. Redundant load will be introduced compiled with gcc-13.2.0 -O3. ``` // https://godbolt.org/z/3oGWq6anq union U0 { int f0; long long f1; int f2; const unsigned char f3; char f4; }; union U2 { char f0; unsigned short f1; unsigned short f2; }; /* --- GLOBAL VARIABLES --- */ int g_3 = 0xD86E52D8L; union U0 g_34 = {-1L}; union U2 g_35 = {0L}; int g_49 = 0xDC590CB2L; int g_54[6][5] = {{0L,0L,0L,0L,0L},{0x6833E1ABL,(-2L),0x6833E1ABL,(-2L),0x6833E1ABL},{0L,0L,0L,0L,0L},{0x6833E1ABL,(-2L),0x6833E1ABL,(-2L),0x6833E1ABL},{0L,0L,0L,0L,0L},{0x6833E1ABL,(-2L),0x6833E1ABL,(-2L),0x6833E1ABL}}; union U2 g_81 = {0L}; /* --- FORWARD DECLARATIONS --- */ static char(safe_rshift_func_int8_t_s_s)(char left, int right) { return ((left < 0) || (((int)right) < 0) || (((int)right) >= 32)) ? ((left)) : (left >> ((int)right));} static unsigned char(safe_lshift_func_uint8_t_u_u)(unsigned char left, unsigned int right) { return ((((unsigned int)right) >= 32) || (left > ((255) >> ((unsigned int)right)))) ? ((left)) : (left << ((unsigned int)right));} static char(safe_lshift_func_int8_t_s_s)(char left, int right) { return ((left < 0) || (((int)right) < 0) || (((int)right) >= 32) || (left > ((127) >> ((int)right)))) ? ((left)) : (left << ((int)right));} void func_1(void); void func_31(union U0 p_32, union U2 p_33); int func_42(union U0 p_43, int * p_44); void func_1() { func_31(g_34, g_35); } void func_31(union U0 g, union U2 h) { int *i = &g_3; g_34.f2 = 1; *i = func_42((safe_rshift_func_int8_t_s_s(0, g.f4), g), &g_49); } int func_42(union U0 j, int *k) { unsigned l_51 = 4294967295UL; int *l = &g_3; *l = g_54[4][0] |= ~safe_lshift_func_uint8_t_u_u(safe_lshift_func_int8_t_s_s((0x7BD129AC07F4C733LL ^ l_51), 6), j.f3); return j.f0; } ``` compiled binary is: ``` 00000000004015b0 <func_1>: func_1(): /root/myCSmith/test/output2.c:57 4015b0: movzbl 0x2b49(%rip),%ecx # 404100 <g_34> # not necessary 4015b7: mov 0x2b43(%rip),%edx # 404100 <g_34> safe_lshift_func_uint8_t_u_u(): /root/myCSmith/test/output2.c:62 4015bd: mov $0xffffff33,%eax func_31(): /root/myCSmith/test/output2.c:62 4015c2: movl $0x1,0x2b34(%rip) # 404100 <g_34> safe_lshift_func_uint8_t_u_u(): /root/myCSmith/test/output2.c:49 4015cc: cmp $0x1f,%cl 4015cf: ja 4015ec <func_1+0x3c> /root/myCSmith/test/output2.c:49 (discriminator 1) 4015d1: mov $0xff,%esi 4015d6: sar %cl,%esi 4015d8: cmp $0xcb,%esi 4015de: jle 4015ec <func_1+0x3c> /root/myCSmith/test/output2.c:49 (discriminator 3) 4015e0: mov $0xcc,%eax 4015e5: shl %cl,%eax func_42(): /root/myCSmith/test/output2.c:69 (discriminator 2) 4015e7: movzbl %al,%eax 4015ea: not %eax /root/myCSmith/test/output2.c:68 4015ec: or %eax,0x2ade(%rip) # 4040d0 <g_54+0x50> func_31(): /root/myCSmith/test/output2.c:63 (discriminator 2) 4015f2: mov %edx,0x2b10(%rip) # 404108 <g_3> func_1(): /root/myCSmith/test/output2.c:58 4015f8: retq 4015f9: nopl 0x0(%rax) ``` the load at address 0x4015b0 is redundant. This behavior is regression with gcc-13.2.0 and a necessary flag -O3, and can be triggered with gcc-8.2.0 with -O2 flag. if compiled with gcc-13.2.0 -O2, there won't be such a load operation.