http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56221



             Bug #: 56221

           Summary: Generation of zero initializer for array new without

                    parenthesis

    Classification: Unclassified

           Product: gcc

           Version: 4.7.2

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: c++

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: neldev.onl...@gmail.com





Created attachment 29364

  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29364

Minimal test case



I could not find a duplicate so I guess this will be my first bug report for a

compiler :)



I was experimenting a little with expressive templates and stumbled upon a

peculiar bug that caused assembly output to explode by several orders of

magnitude. I managed to narrow it down to automatic vectorization of a zero

initializer that transformed a 4-instruction memset into some monstrosity.

Recompiling with -fno-tree-vectorize prevents this transformation.



However, the issue of this initializer which generated the memset still

remained.



I've attached a minimal test case that performs the following:

- Trigger unwanted generation of the array initializer.

- Triggering automatic vectorization at will by increasing the parameter to

array new beyond 16.

- Preventing the array initializer from being generated by uncommenting the

second constructor.

- Producing identical results by forcing array initializer generation by

uncommenting the third constructor.



A workaround would b to move the array new statement out of the constructor.



I'm not sure but this seems to be the result of some foul play between the CRTP

pattern and operator+. Removing either will prevent this bug from being

triggered.

Reply via email to