Commit b6d3c031 by Jan Hubicka Committed by Jan Hubicka

re PR middle-end/67966 (ICE in convert_move, at expr.c:282)


	PR middle-end/67966
	* tree.c (verify_type): Verify that TYPE_MODE match
 	between TYPE_CANONICAL and type.
 	* expr.c (store_expr_with_bounds): Revert my previous change.
 	* expmed.c (store_bit_field_1): Revert prevoius change.
 	* gimple-expr.c (useless_type_conversion_p): Require TYPE_MODE
 	to match for all types.

From-SVN: r229132
parent e9122ef6
2015-10-11 Jan Hubicka <hubicka@ucw.cz>
PR middle-end/67966
* tree.c (verify_type): Verify that TYPE_MODE match
between TYPE_CANONICAL and type.
* expr.c (store_expr_with_bounds): Revert my previous change.
* expmed.c (store_bit_field_1): Revert prevoius change.
* gimple-expr.c (useless_type_conversion_p): Require TYPE_MODE
to match for all types.
2015-10-21 Nathan Sidwell <nathan@codesourcery.com> 2015-10-21 Nathan Sidwell <nathan@codesourcery.com>
* omp-low.c (check_omp_nesting_restrictions): Check OpenACC loop * omp-low.c (check_omp_nesting_restrictions): Check OpenACC loop
...@@ -757,14 +757,6 @@ store_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize, ...@@ -757,14 +757,6 @@ store_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
} }
} }
/* We allow move between structures of same size but different mode.
If source is in memory and the mode differs, simply change the memory. */
if (GET_MODE (value) == BLKmode && GET_MODE (op0) != BLKmode)
{
gcc_assert (MEM_P (value));
value = adjust_address_nv (value, GET_MODE (op0), 0);
}
/* Storing an lsb-aligned field in a register /* Storing an lsb-aligned field in a register
can be done with a movstrict instruction. */ can be done with a movstrict instruction. */
......
...@@ -5425,14 +5425,6 @@ store_expr_with_bounds (tree exp, rtx target, int call_param_p, ...@@ -5425,14 +5425,6 @@ store_expr_with_bounds (tree exp, rtx target, int call_param_p,
temp = convert_modes (GET_MODE (target), TYPE_MODE (TREE_TYPE (exp)), temp = convert_modes (GET_MODE (target), TYPE_MODE (TREE_TYPE (exp)),
temp, TYPE_UNSIGNED (TREE_TYPE (exp))); temp, TYPE_UNSIGNED (TREE_TYPE (exp)));
/* We allow move between structures of same size but different mode.
If source is in memory and the mode differs, simply change the memory. */
if (GET_MODE (temp) == BLKmode && GET_MODE (target) != BLKmode)
{
gcc_assert (MEM_P (temp));
temp = adjust_address_nv (temp, GET_MODE (target), 0);
}
/* If value was not generated in the target, store it there. /* If value was not generated in the target, store it there.
Convert the value to TARGET's type first if necessary and emit the Convert the value to TARGET's type first if necessary and emit the
pending incrementations that have been queued when expanding EXP. pending incrementations that have been queued when expanding EXP.
......
...@@ -87,10 +87,8 @@ useless_type_conversion_p (tree outer_type, tree inner_type) ...@@ -87,10 +87,8 @@ useless_type_conversion_p (tree outer_type, tree inner_type)
if (inner_type == outer_type) if (inner_type == outer_type)
return true; return true;
/* Changes in machine mode are never useless conversions unless we /* Changes in machine mode are never useless conversions unless. */
deal with aggregate types in which case we defer to later checks. */ if (TYPE_MODE (inner_type) != TYPE_MODE (outer_type))
if (TYPE_MODE (inner_type) != TYPE_MODE (outer_type)
&& !AGGREGATE_TYPE_P (inner_type))
return false; return false;
/* If both the inner and outer types are integral types, then the /* If both the inner and outer types are integral types, then the
...@@ -270,10 +268,9 @@ useless_type_conversion_p (tree outer_type, tree inner_type) ...@@ -270,10 +268,9 @@ useless_type_conversion_p (tree outer_type, tree inner_type)
use the types in move operations. */ use the types in move operations. */
else if (AGGREGATE_TYPE_P (inner_type) else if (AGGREGATE_TYPE_P (inner_type)
&& TREE_CODE (inner_type) == TREE_CODE (outer_type)) && TREE_CODE (inner_type) == TREE_CODE (outer_type))
return (!TYPE_SIZE (outer_type) return (TYPE_MODE (outer_type) != BLKmode
|| (TYPE_SIZE (inner_type) || operand_equal_p (TYPE_SIZE (inner_type),
&& operand_equal_p (TYPE_SIZE (inner_type), TYPE_SIZE (outer_type), 0));
TYPE_SIZE (outer_type), 0)));
else if (TREE_CODE (inner_type) == OFFSET_TYPE else if (TREE_CODE (inner_type) == OFFSET_TYPE
&& TREE_CODE (outer_type) == OFFSET_TYPE) && TREE_CODE (outer_type) == OFFSET_TYPE)
......
...@@ -13408,6 +13408,14 @@ verify_type (const_tree t) ...@@ -13408,6 +13408,14 @@ verify_type (const_tree t)
error_found = true; error_found = true;
} }
if (COMPLETE_TYPE_P (t) && TYPE_CANONICAL (t)
&& TYPE_MODE (t) != TYPE_MODE (TYPE_CANONICAL (t)))
{
error ("TYPE_MODE of TYPE_CANONICAL is not compatible");
debug_tree (ct);
error_found = true;
}
/* Check various uses of TYPE_MINVAL. */ /* Check various uses of TYPE_MINVAL. */
if (RECORD_OR_UNION_TYPE_P (t)) if (RECORD_OR_UNION_TYPE_P (t))
......
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