+2005-03-13 Roger Sayle <roger@eyesopen.com>
+
+ PR middle-end/19331
+ * tree.c (get_unwidened): Treat CONVERT_EXPR and NOP_EXPR identically.
+ * fold-const.c (fold_sign_changed_comparison): Likewise.
+ (fold_binary): Optimize comparisons against widened operands if
+ the extension is represented by a CONVERT_EXPR, same as a NOP_EXPR.
+
2005-03-14 Eric Botcazou <ebotcazou@libertysurf.fr>
* config/sparc/sparc.c (struct_value_alias_set): New global variable.
tree arg0_inner, tmp;
tree inner_type, outer_type;
- if (TREE_CODE (arg0) != NOP_EXPR)
+ if (TREE_CODE (arg0) != NOP_EXPR
+ && TREE_CODE (arg0) != CONVERT_EXPR)
return NULL_TREE;
outer_type = TREE_TYPE (arg0);
return NULL_TREE;
if (TREE_CODE (arg1) != INTEGER_CST
- && !(TREE_CODE (arg1) == NOP_EXPR
+ && !((TREE_CODE (arg1) == NOP_EXPR
+ || TREE_CODE (arg1) == CONVERT_EXPR)
&& TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type))
return NULL_TREE;
else
arg1 = fold_convert (inner_type, arg1);
- return fold (build (code, type, arg0_inner, arg1));
+ return fold (build2 (code, type, arg0_inner, arg1));
}
/* Tries to replace &a[idx] CODE s * delta with &a[idx CODE delta], if s is
TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1)));
else if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
- && TREE_CODE (arg0) == NOP_EXPR)
+ && (TREE_CODE (arg0) == NOP_EXPR
+ || TREE_CODE (arg0) == CONVERT_EXPR))
{
/* If we are widening one operand of an integer comparison,
see if the other operand is similarly being widened. Perhaps we
&& TYPE_UNSIGNED (type));
tree win = op;
- while (TREE_CODE (op) == NOP_EXPR)
+ while (TREE_CODE (op) == NOP_EXPR
+ || TREE_CODE (op) == CONVERT_EXPR)
{
int bitschange
= TYPE_PRECISION (TREE_TYPE (op))
/* TYPE_UNSIGNED says whether this is a zero-extension.
Let's avoid computing it if it does not affect WIN
and if UNS will not be needed again. */
- if ((uns || TREE_CODE (op) == NOP_EXPR)
+ if ((uns
+ || TREE_CODE (op) == NOP_EXPR
+ || TREE_CODE (op) == CONVERT_EXPR)
&& TYPE_UNSIGNED (TREE_TYPE (op)))
{
uns = 1;