re PR target/88998 (bad codegen with mmx instructions for unordered_map)

PR target/88998
	* config/i386/sse.md (sse2_cvtpi2pd): Add SSE alternatives.
	Disparage MMX alternative.
	(sse2_cvtpd2pi): Ditto.
	(sse2_cvttpd2pi): Ditto.

testsuite/ChangeLog:

	PR target/88998
	* g++.target/i386/pr88998.c: New test.

From-SVN: r268195
This commit is contained in:
Uros Bizjak 2019-01-23 20:10:58 +01:00 committed by Uros Bizjak
parent 4aab08286a
commit 3274c5a342
4 changed files with 73 additions and 17 deletions

View file

@ -1,3 +1,11 @@
2019-01-23 Uroš Bizjak <ubizjak@gmail.com>
PR target/88998
* config/i386/sse.md (sse2_cvtpi2pd): Add SSE alternatives.
Disparage MMX alternative.
(sse2_cvtpd2pi): Ditto.
(sse2_cvttpd2pi): Ditto.
2019-01-23 David Malcolm <dmalcolm@redhat.com>
PR driver/89014

View file

@ -4997,37 +4997,49 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define_insn "sse2_cvtpi2pd"
[(set (match_operand:V2DF 0 "register_operand" "=x,x")
(float:V2DF (match_operand:V2SI 1 "nonimmediate_operand" "y,m")))]
[(set (match_operand:V2DF 0 "register_operand" "=v,x")
(float:V2DF (match_operand:V2SI 1 "nonimmediate_operand" "vBm,?!y")))]
"TARGET_SSE2"
"cvtpi2pd\t{%1, %0|%0, %1}"
"@
%vcvtdq2pd\t{%1, %0|%0, %1}
cvtpi2pd\t{%1, %0|%0, %1}"
[(set_attr "type" "ssecvt")
(set_attr "unit" "mmx,*")
(set_attr "prefix_data16" "1,*")
(set_attr "unit" "*,mmx")
(set_attr "prefix_data16" "*,1")
(set_attr "prefix" "maybe_vex,*")
(set_attr "mode" "V2DF")])
(define_insn "sse2_cvtpd2pi"
[(set (match_operand:V2SI 0 "register_operand" "=y")
(unspec:V2SI [(match_operand:V2DF 1 "nonimmediate_operand" "xm")]
[(set (match_operand:V2SI 0 "register_operand" "=v,?!y")
(unspec:V2SI [(match_operand:V2DF 1 "nonimmediate_operand" "vBm,xm")]
UNSPEC_FIX_NOTRUNC))]
"TARGET_SSE2"
"cvtpd2pi\t{%1, %0|%0, %1}"
"@
* return TARGET_AVX ? \"vcvtpd2dq{x}\t{%1, %0|%0, %1}\" : \"cvtpd2dq\t{%1, %0|%0, %1}\";
cvtpd2pi\t{%1, %0|%0, %1}"
[(set_attr "type" "ssecvt")
(set_attr "unit" "mmx")
(set_attr "unit" "*,mmx")
(set_attr "amdfam10_decode" "double")
(set_attr "athlon_decode" "vector")
(set_attr "bdver1_decode" "double")
(set_attr "btver2_decode" "direct")
(set_attr "prefix_data16" "1")
(set_attr "mode" "DI")])
(set_attr "prefix_data16" "*,1")
(set_attr "prefix" "maybe_vex,*")
(set_attr "mode" "TI")])
(define_insn "sse2_cvttpd2pi"
[(set (match_operand:V2SI 0 "register_operand" "=y")
(fix:V2SI (match_operand:V2DF 1 "nonimmediate_operand" "xm")))]
[(set (match_operand:V2SI 0 "register_operand" "=v,?!y")
(fix:V2SI (match_operand:V2DF 1 "nonimmediate_operand" "vBm,xm")))]
"TARGET_SSE2"
"cvttpd2pi\t{%1, %0|%0, %1}"
"@
* return TARGET_AVX ? \"vcvttpd2dq{x}\t{%1, %0|%0, %1}\" : \"cvttpd2dq\t{%1, %0|%0, %1}\";
cvttpd2pi\t{%1, %0|%0, %1}"
[(set_attr "type" "ssecvt")
(set_attr "unit" "mmx")
(set_attr "unit" "*,mmx")
(set_attr "amdfam10_decode" "double")
(set_attr "athlon_decode" "vector")
(set_attr "bdver1_decode" "double")
(set_attr "prefix_data16" "1")
(set_attr "prefix_data16" "*,1")
(set_attr "prefix" "maybe_vex,*")
(set_attr "mode" "TI")])
(define_insn "sse2_cvtsi2sd"

View file

@ -1,3 +1,8 @@
2019-01-23 Uroš Bizjak <ubizjak@gmail.com>
PR target/88998
* g++.target/i386/pr88998.c: New test.
2019-01-23 Marek Polacek <polacek@redhat.com>
PR c++/88757 - qualified name treated wrongly as type.

View file

@ -0,0 +1,31 @@
// PR target/88998
// { dg-do run { target sse2_runtime } }
// { dg-options "-O2 -msse2 -mfpmath=387" }
// { dg-require-effective-target c++11 }
#include <cassert>
#include <unordered_map>
#include <x86intrin.h>
double
__attribute__((noinline))
prepare (int a, int b)
{
__m128i is = _mm_setr_epi32 (a, b, 0, 0);
__m128d ds = _mm_cvtepi32_pd (is);
return ds[0] + ds[1];
}
int
main (int, char **)
{
double d = prepare (1, 2);
std::unordered_map < int, int >m;
m.insert ({0, 0});
m.insert ({1, 1});
assert (m.load_factor () <= m.max_load_factor ());
assert (d == 3);
return 0;
}