Commit b147c5b9 by Richard Guenther Committed by Richard Biener

re PR middle-end/47968 (ICE: in gen_lowpart_general, at rtlhooks.c:51 when…

re PR middle-end/47968 (ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float)

2011-03-04  Richard Guenther  <rguenther@suse.de>

	PR middle-end/47968
	* expmed.c (extract_bit_field_1): Prefer vector modes that
	vec_extract patterns can handle.

	* gcc.dg/torture/pr47968.c: New testcase.

From-SVN: r170673
parent 8750672f
2011-03-04 Richard Guenther <rguenther@suse.de> 2011-03-04 Richard Guenther <rguenther@suse.de>
PR middle-end/47968
* expmed.c (extract_bit_field_1): Prefer vector modes that
vec_extract patterns can handle.
2011-03-04 Richard Guenther <rguenther@suse.de>
PR middle-end/47975 PR middle-end/47975
* optabs.c (optab_for_tree_code): Do not use VECTOR_MODE_P. * optabs.c (optab_for_tree_code): Do not use VECTOR_MODE_P.
......
...@@ -1205,7 +1205,6 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize, ...@@ -1205,7 +1205,6 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
&& GET_MODE_INNER (GET_MODE (op0)) != tmode) && GET_MODE_INNER (GET_MODE (op0)) != tmode)
{ {
enum machine_mode new_mode; enum machine_mode new_mode;
int nunits = GET_MODE_NUNITS (GET_MODE (op0));
if (GET_MODE_CLASS (tmode) == MODE_FLOAT) if (GET_MODE_CLASS (tmode) == MODE_FLOAT)
new_mode = MIN_MODE_VECTOR_FLOAT; new_mode = MIN_MODE_VECTOR_FLOAT;
...@@ -1221,8 +1220,7 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize, ...@@ -1221,8 +1220,7 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
new_mode = MIN_MODE_VECTOR_INT; new_mode = MIN_MODE_VECTOR_INT;
for (; new_mode != VOIDmode ; new_mode = GET_MODE_WIDER_MODE (new_mode)) for (; new_mode != VOIDmode ; new_mode = GET_MODE_WIDER_MODE (new_mode))
if (GET_MODE_NUNITS (new_mode) == nunits if (GET_MODE_SIZE (new_mode) == GET_MODE_SIZE (GET_MODE (op0))
&& GET_MODE_SIZE (new_mode) == GET_MODE_SIZE (GET_MODE (op0))
&& targetm.vector_mode_supported_p (new_mode)) && targetm.vector_mode_supported_p (new_mode))
break; break;
if (new_mode != VOIDmode) if (new_mode != VOIDmode)
......
2011-03-04 Richard Guenther <rguenther@suse.de> 2011-03-04 Richard Guenther <rguenther@suse.de>
PR middle-end/47968
* gcc.dg/torture/pr47968.c: New testcase.
2011-03-04 Richard Guenther <rguenther@suse.de>
PR middle-end/47975 PR middle-end/47975
* gcc.dg/torture/pr47975.c: New testcase. * gcc.dg/torture/pr47975.c: New testcase.
......
/* { dg-do compile } */
typedef __attribute__ ((vector_size (16))) float float4;
typedef __attribute__ ((vector_size (16))) double double2;
float foo (double2 d2)
{
float4 f4 = (float4) d2;
return *(float *) &f4;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment