[Bug c++/82789] New: Invalid code generated for std::array element-wise processing with -O3
nazarenkoal at gmail dot com
gcc-bugzilla@gcc.gnu.org
Tue Oct 31 20:38:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82789
Bug ID: 82789
Summary: Invalid code generated for std::array element-wise
processing with -O3
Product: gcc
Version: lto
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: nazarenkoal at gmail dot com
Target Milestone: ---
Version:
$ gcc --version
gcc (Ubuntu 7.2.0-8ubuntu3) 7.2.0
Not reproduced on:
gcc-6 (Ubuntu 6.4.0-8ubuntu1) 6.4.0 20171010
gcc-5 (Ubuntu 5.5.0-1ubuntu1) 5.4.1 20171010
OS:
$ lsb_release -a
LSB Version:
core-9.20160110ubuntu5-amd64:core-9.20160110ubuntu5-noarch:security-9.20160110ubuntu5-amd64:security-9.20160110ubuntu5-noarch
Distributor ID: Ubuntu
Description: Ubuntu 17.10
Release: 17.10
Codename: artful
Commandline:
gcc -DNDEBUG -O3 ./test_opt_2.cpp -o ./test_opt_2 -std=c++14 -lstdc++
Code:
#include <array>
#include <iostream>
template <typename A>
A l_and_r( A const & l, A const & r )
{
A res = {0};
for ( unsigned i=0; i<l.size(); ++i )
{
res[ i ] = l[ i ] & r[ i ];
}
return res;
}
template <typename A>
__attribute__ ((noinline))
A noopt_proxy( A const & a )
{
return A(a);
}
int main ()
{
std::array<unsigned char, 4> l = {0x01, 0x02, 0x04, 0x08 };
std::array<unsigned char, 4> r = {0x2f, 0x07, 0x0f, 0x1f };
auto ret_1 = l_and_r( noopt_proxy(l), noopt_proxy(r) );
std::cout << "l_and_r( l, r ): " << std::hex << (int)ret_1[0] << " "
<<(int)ret_1[1] << " " << (int)ret_1[2] << " " << (int)ret_1[3] << std::endl;
return 0;
}
Program output with -O0, -O1, -O2
l_and_r( l, r ): 1 2 4 8
Program output with -O3
l_and_r( l, r ): 2f 2 4 8
More information about the Gcc-bugs
mailing list