[Bug c++/47357] New: volatile member function is not treated as volatile
yottui at yahoo dot co.jp
gcc-bugzilla@gcc.gnu.org
Wed Jan 19 09:56:00 GMT 2011
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47357
Summary: volatile member function is not treated as volatile
Product: gcc
Version: 4.5.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: yottui@yahoo.co.jp
When I execute the following test code with '-O2 -msse2' compiler options, it
outputs the wrong value.
I'm expecting that pC[1] will be 2.
operator[](int) is defined as volatile. However v is not treated as volatile.
And I tried (volatile const u &) instead of (const u &) when the casting, but
it's not affected.
-- begin test case --
//g++ -O2 -msse2 test.cpp
#include <stdio.h>
#include <stdint.h>
#include <emmintrin.h>
#define NELEM 1
struct int4
{
__m128i v;
int4(__m128i a) : v(a) {}
int4(int a0, int a1, int a2, int a3)
: v(_mm_setr_epi32(a0, a1, a2, a3)) {}
operator __m128i() const { return v; }
int operator [](int i) volatile const
{
union u {
__m128i m128;
int i32[4];
};
return ((const u &)v).i32[i];
}
};
inline int4 operator <<(const int4 & a, const int4 & b)
{ return int4(a[0]<<b[0], a[1]<<b[1], a[2]<<b[2], a[3]<<b[3]); }
__attribute__((noinline)) void shift_left(
int n, const __m128i a[], const __m128i b[], __m128i c[])
{
for ( int j = 0; j < n; ++j )
{
c[j] = int4(a[j]) << int4(b[j]);
}
}
int main( int argc, char * argv[] )
{
__m128i * a = new __m128i[NELEM+1];
__m128i * b = new __m128i[NELEM+1];
__m128i * c = new __m128i[NELEM+1];
a = (__m128i *)(-sizeof(*a) & (intptr_t)&a[1]);
b = (__m128i *)(-sizeof(*b) & (intptr_t)&b[1]);
c = (__m128i *)(-sizeof(*c) & (intptr_t)&c[1]);
for ( int i = 0; i < NELEM*4; ++i )
{
((int *)a)[i] = i;
((int *)b)[i] = i & 31;
((int *)c)[i] = 0;
}
shift_left(NELEM, a, b, c);
const int * pA = (const int *)a;
const int * pB = (const int *)b;
const int * pC = (const int *)c;
for ( int i = 0; i < NELEM*4; ++i )
{
printf("%08x << %08x = %08x\n",
pA[i], pB[i], pC[i]);
}
}
-- end test case --
-- begin output --
00000000 << 00000000 = 58a00000
00000001 << 00000001 = e9000000
00000002 << 00000002 = b5f40000
00000003 << 00000003 = 00000000
-- end output --
More information about the Gcc-bugs
mailing list