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

            Bug ID: 71836
           Summary: Missing constant prop from const variable
           Product: gcc
           Version: 6.1.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pinskia at gcc dot gnu.org
  Target Milestone: ---
            Target: aarch64*-*-*

Take:
#include <stdio.h>
#include <float.h>

int main()
{
        float a[] __attribute__((aligned(0x20))) = {0, 1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16};
        float maxval = -FLT_MAX;        
        for (size_t i = 0; i < 16; i++)
                maxval = a[i] > maxval ? a[i] : maxval;

        printf("%g\n", maxval);
}
---- CUT ----
Currently on aarch64-linux-gnu we get:
  a = *.LC0;
  _17 = a[0];
  iftmp.0_18 = _17 > -3.4028234663852885981170418348451692544e+38 ? _17 :
-3.4028234663852885981170418348451692544e+38;
  _24 = a[1];
  iftmp.0_25 = iftmp.0_18 < _24 ? _24 : iftmp.0_18;
  _31 = a[2];


--- CUT ---
Depending on the scheduler, GCC can remove even more extra load/stores
(thunderx scheduler will cause GCC not to remove them while cortex-a57 will). 
But really any load/stores here is not useful as a[0] can be found in .LC0[0].

Reply via email to