https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103542
Martin Sebor <msebor at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |missed-optimization Blocks| |56456 CC| |msebor at gcc dot gnu.org --- Comment #2 from Martin Sebor <msebor at gcc dot gnu.org> --- The IL for the function is below. It seems quite inefficient compared to GCC 9. void get_default_config.part.0 (const uint32_t id) { uint32_t error; uint32_t entry; unsigned int _4; uint32_t * _5; <bb 2> [local count: 118111600]: goto <bb 4>; [100.00%] <bb 3> [local count: 955630225]: entry_2 = entry_1 + 1; <bb 4> [local count: 1073741824]: # entry_1 = PHI <entry_2(3), 0(2)> _4 = config[id_3(D)].num_apples; if (entry_1 < _4) goto <bb 3>; [89.00%] else goto <bb 5>; [11.00%] <bb 5> [local count: 118111600]: config[id_3(D)].num_apples = 0; _5 = &config[id_3(D)].num_lemons; switch (id_3(D)) <default: <L4> [20.00%], case 0: <L0> [20.00%], case 1: <L1> [20.00%], case 2: <L2> [20.00%], case 3: <L3> [20.00%]> <bb 6> [local count: 23622320]: <L0>: MEM <struct fruit_config[4]> [(uint32_t *)&config][0].num_lemons = 0; goto <bb 11>; [100.00%] <bb 7> [local count: 23622320]: <L1>: MEM <struct fruit_config[4]> [(uint32_t *)&config][1].num_lemons = 0; goto <bb 11>; [100.00%] <bb 8> [local count: 23622320]: <L2>: MEM <struct fruit_config[4]> [(uint32_t *)&config][2].num_lemons = 0; goto <bb 11>; [100.00%] <bb 9> [local count: 23622320]: <L3>: MEM <struct fruit_config[4]> [(uint32_t *)&config][3].num_lemons = 0; goto <bb 11>; [100.00%] <bb 10> [local count: 23622320]: <L4>: MEM <struct fruit_config[4]> [(uint32_t *)&config][id_3(D)].num_lemons = 0; <<< -Warray-bounds <bb 11> [local count: 118111602]: # error_14 = PHI <0(7), 255(10), 0(6), 0(9), 0(8)> config[id_3(D)].num_lemons = 0; config[id_3(D)].lemons = 0B; foo (0); return; } In GCC 9 both the function and the final assembly are much more compact: et_default_config.part.0 (const uint32_t id) { struct fruit_config[4] * _2; sizetype _13; sizetype _14; <bb 2> [local count: 118111601]: _13 = (sizetype) id_3(D); _14 = _13 * 16; _2 = &config + _14; MEM[(unsigned int *)_2] = 0; config[id_3(D)].lemons = 0B; foo (0); [tail call] return; } Referenced Bugs: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56456 [Bug 56456] [meta-bug] bogus/missing -Warray-bounds