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

            Bug ID: 80705
           Summary: Incorrect code generated for profile counter updates
                    due to SLP+LIM
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pthaugen at gcc dot gnu.org
                CC: dje at gcc dot gnu.org, wschmidt at gcc dot gnu.org
  Target Milestone: ---
              Host: powerpc64le-unknown-linux-gnu
            Target: powerpc64le-unknown-linux-gnu
             Build: powerpc64le-unknown-linux-gnu

Created attachment 41338
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=41338&action=edit
reduced testcase

The attached testcase shows a problem where profile counter updates are
incorrectly generated, which then leads to invalid profile info when the
original source is rebuilt with -fprofile-use.

Compile options used : -Ofast -mcpu=power8 -fprofile-generate

The problem occurs on the edge counter updates for the following inner loop:

         while (*s && *s!='\r' && *s!='\n' && *s!='"')

SLP vectorization combines adjacent counter writes on the exit paths from the
loop into vector store operations. LIM then comes along and hoists the initial
counter read outside the outer loop. This causes the problem because when the
inner loop is entered again the edge counters are initialized to the values
originally read from memory (i.e. values when the function was originally
entered) NOT the updated counter values that were written to memory when
exiting the inner loop. Aliasing problem?

Reply via email to