[Bug regression/67609] New: [Regression] Generates wrong code for SSE2 _mm_load_pd
bisqwit at iki dot fi
gcc-bugzilla@gcc.gnu.org
Thu Sep 17 11:37:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67609
Bug ID: 67609
Summary: [Regression] Generates wrong code for SSE2 _mm_load_pd
Product: gcc
Version: 5.2.1
Status: UNCONFIRMED
Severity: major
Priority: P3
Component: regression
Assignee: unassigned at gcc dot gnu.org
Reporter: bisqwit at iki dot fi
Target Milestone: ---
For this program (needs -msse2 to compile).
#include <emmintrin.h>
__m128d reg;
void set_lower(double b)
{
double v[2];
_mm_store_pd(v, reg);
v[0] = b;
reg = _mm_load_pd(v);
}
On optimization levels -O1 and up, GCC 5.2 incorrectly generates code that
destroys the upper half of reg.
movapd %xmm0, %xmm1
movaps %xmm1, reg(%rip)
On -O0, the bug does not occur.
If the index expression is changed into an expression whose value is not known
at compile-time, the code will work properly.
GCC 4.9 does this correctly (if with bit too much labor):
movdqa reg(%rip), %xmm1
movaps %xmm1, -24(%rsp)
movsd %xmm0, -24(%rsp)
movapd -24(%rsp), %xmm2
movaps %xmm2, reg(%rip)
For comparison, Clang 3.4 and 3.5:
movlpd %xmm0, reg(%rip)
For comparison, Clang 3.6:
movaps reg(%rip), %xmm1
movsd %xmm0, %xmm1
movaps %xmm1, reg(%rip)
More information about the Gcc-bugs
mailing list