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

Reply via email to