+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>
PR target/45098
return false;
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");
- debug_generic_expr (lhs_type);
- debug_generic_expr (rhs1_type);
- return true;
+ error ("invalid types in truth not");
+ debug_generic_expr (lhs_type);
+ debug_generic_expr (rhs1_type);
+ return true;
}
break;
case TRUTH_OR_EXPR:
case TRUTH_XOR_EXPR:
{
- /* We allow only boolean typed or compatible argument and result. */
- if (!useless_type_conversion_p (boolean_type_node, rhs1_type)
- || !useless_type_conversion_p (boolean_type_node, rhs2_type)
- || !useless_type_conversion_p (boolean_type_node, lhs_type))
+ /* We require two-valued operand types. */
+ if (!(TREE_CODE (rhs1_type) == BOOLEAN_TYPE
+ || (INTEGRAL_TYPE_P (rhs1_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");
debug_generic_expr (lhs_type);
return true;
}
- return false;
+ break;
}
case LT_EXPR:
|| TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
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
maximum value in general as these do not generate code
unless the types precisions are different. */