This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c++/80561] New: Missed optimization: std::array data is aligned if array is aligned


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

            Bug ID: 80561
           Summary: Missed optimization: std::array data is aligned if
                    array is aligned
           Product: gcc
           Version: 6.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jzwinck at gmail dot com
  Target Milestone: ---

In the following code, GCC fails to recognize that the data inside a std::array
has the same alignment guarantees as the array itself.  The result is that
using std::array instead of a C-style array carries a significant runtime
penalty, as the alignment is checked unnecessarily and code is generated for
the unaligned case which should never be used.  I tested this using:

    g++ -std=c++14 -O3 -march=haswell

GCC 6.1, 6.3 and 7 all fail to optimize this.  Clang 3.7 through 4.0 optimizes
it as expected.

In the code below, you can swap the comment on the two typedefs to confirm that
GCC properly optimizes the C-style array.

The optimal code is 4 vmovupd, 2 vaddpd, and 1 vzeroupper.  The suboptimal code
is 73 instructions including 7 branches.

This was discussed on Stack Overflow:
http://stackoverflow.com/questions/43651923

---

#include <array>

static constexpr size_t my_elements = 8;

typedef std::array<double, my_elements> Vec __attribute__((aligned(32)));
// typedef double Vec[my_elements] __attribute__((aligned(32)));

void func(Vec& __restrict__ v1, const Vec& v2)
{
    for (unsigned i = 0; i < my_elements; ++i)
    {
        v1[i] += v2[i];
    }
}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]