http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48616
Matthias Kretz <kretz at kde dot org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Target| |x86_64
--- Comment #3 from Matthias Kretz <kretz at kde dot org> 2011-04-15 12:11:35
UTC ---
(In reply to comment #1)
> I see no vectorized loop which makes me suspect if-conversion. Can you
> try if -ftree-loop-if-convert is enough to trigger the failure?
% /opt/gcc-4.6.0/bin/g++ -mxop -O2 -ftree-vectorize xop_miscompile.cpp &&
./a.out
FAIL: ┍ at /home/mkretz/src/Vc/tests/arithmetics.cpp:259:
FAIL: │ a[i] (16) == x (8) -> false
FAIL: ┕ testShift<int_v>
FAIL: ┍ at /home/mkretz/src/Vc/tests/arithmetics.cpp:259:
FAIL: │ a[i] (16) == x (8) -> false
FAIL: ┕ testShift<uint_v>
Testing done. 0 tests passed. 2 tests failed.
% /opt/gcc-4.6.0/bin/g++ -mxop -O2 -ftree-loop-if-convert xop_miscompile.cpp &&
./a.out
PASS: testShift<int_v>
PASS: testShift<uint_v>
Testing done. 2 tests passed. 0 tests failed.
(In reply to comment #2)
> You also haven't specified your target, whether you compile it as 32-bit or
> 64-bit and where exactly it misbehaves.
target is AMD64 (i.e. Bulldozer/Family 15h)
The failure is in line 1724, or more specifically in lines 1288 and 1290. The
operator>>= seems to get lost, so that the a[i] contain 16 instead of 16>>i.
XOP has an instruction for this shift. For operator<<= (lines 1287 and 1289)
GCC correctly translates the code to vpshad.