Commit 51c213f7 by Richard Guenther Committed by Richard Biener

re PR middle-end/48989 (FAIL: gfortran.dg/lto/pr46036 f_lto_pr46036_0.o assemble)

2011-05-18  Richard Guenther  <rguenther@suse.de>

	PR middle-end/48989
	* tree-cfg.c (verify_gimple_assign_unary): Adjust TRUTH op
	operand verification.
	(verify_gimple_assign_binary): Likewise.
	* tree-ssa.c (useless_type_conversion_p): Preserve conversions
	to non-1-precision BOOLEAN_TYPEs.

From-SVN: r173854
parent 8f5e5434
2011-05-18 Richard Guenther <rguenther@suse.de>
PR middle-end/48989
* tree-cfg.c (verify_gimple_assign_unary): Adjust TRUTH op
operand verification.
(verify_gimple_assign_binary): Likewise.
* tree-ssa.c (useless_type_conversion_p): Preserve conversions
to non-1-precision BOOLEAN_TYPEs.
2011-05-18 Tom de Vries <tom@codesourcery.com> 2011-05-18 Tom de Vries <tom@codesourcery.com>
PR target/45098 PR target/45098
......
...@@ -3350,12 +3350,15 @@ verify_gimple_assign_unary (gimple stmt) ...@@ -3350,12 +3350,15 @@ verify_gimple_assign_unary (gimple stmt)
return false; return false;
case TRUTH_NOT_EXPR: case TRUTH_NOT_EXPR:
if (!useless_type_conversion_p (boolean_type_node, rhs1_type)) /* We require two-valued operand types. */
if (!(TREE_CODE (rhs1_type) == BOOLEAN_TYPE
|| (INTEGRAL_TYPE_P (rhs1_type)
&& TYPE_PRECISION (rhs1_type) == 1)))
{ {
error ("invalid types in truth not"); error ("invalid types in truth not");
debug_generic_expr (lhs_type); debug_generic_expr (lhs_type);
debug_generic_expr (rhs1_type); debug_generic_expr (rhs1_type);
return true; return true;
} }
break; break;
...@@ -3558,10 +3561,13 @@ do_pointer_plus_expr_check: ...@@ -3558,10 +3561,13 @@ do_pointer_plus_expr_check:
case TRUTH_OR_EXPR: case TRUTH_OR_EXPR:
case TRUTH_XOR_EXPR: case TRUTH_XOR_EXPR:
{ {
/* We allow only boolean typed or compatible argument and result. */ /* We require two-valued operand types. */
if (!useless_type_conversion_p (boolean_type_node, rhs1_type) if (!(TREE_CODE (rhs1_type) == BOOLEAN_TYPE
|| !useless_type_conversion_p (boolean_type_node, rhs2_type) || (INTEGRAL_TYPE_P (rhs1_type)
|| !useless_type_conversion_p (boolean_type_node, lhs_type)) && TYPE_PRECISION (rhs1_type) == 1))
|| !(TREE_CODE (rhs2_type) == BOOLEAN_TYPE
|| (INTEGRAL_TYPE_P (rhs2_type)
&& TYPE_PRECISION (rhs2_type) == 1)))
{ {
error ("type mismatch in binary truth expression"); error ("type mismatch in binary truth expression");
debug_generic_expr (lhs_type); debug_generic_expr (lhs_type);
...@@ -3570,7 +3576,7 @@ do_pointer_plus_expr_check: ...@@ -3570,7 +3576,7 @@ do_pointer_plus_expr_check:
return true; return true;
} }
return false; break;
} }
case LT_EXPR: case LT_EXPR:
......
...@@ -1306,6 +1306,13 @@ useless_type_conversion_p (tree outer_type, tree inner_type) ...@@ -1306,6 +1306,13 @@ useless_type_conversion_p (tree outer_type, tree inner_type)
|| TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type)) || TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
return false; return false;
/* Preserve conversions to BOOLEAN_TYPE if it is not of precision
one. */
if (TREE_CODE (inner_type) != BOOLEAN_TYPE
&& TREE_CODE (outer_type) == BOOLEAN_TYPE
&& TYPE_PRECISION (outer_type) != 1)
return false;
/* We don't need to preserve changes in the types minimum or /* We don't need to preserve changes in the types minimum or
maximum value in general as these do not generate code maximum value in general as these do not generate code
unless the types precisions are different. */ unless the types precisions are different. */
......
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