Commit 33558beb by Richard Kenner

(fold...

(fold, case NOP_EXPR): Delete a pair of conversions back to the
original type when intermediate type is at least as wide.

From-SVN: r5046
parent 819126a6
......@@ -3342,6 +3342,22 @@ fold (expr)
case CONVERT_EXPR:
case FIX_TRUNC_EXPR:
/* Other kinds of FIX are not handled properly by fold_convert. */
/* In addition to the cases of two conversions in a row
handled below, if we are converting something to its own
type via an object of identical or wider precision, neither
conversion is needed. */
if ((TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
|| TREE_CODE (TREE_OPERAND (t, 0)) == CONVERT_EXPR)
&& TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)) == TREE_TYPE (t)
&& ((INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0)))
&& INTEGRAL_TYPE_P (TREE_TYPE (t)))
|| (FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0)))
&& FLOAT_TYPE_P (TREE_TYPE (t))))
&& (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0)))
>= TYPE_PRECISION (TREE_TYPE (t))))
return TREE_OPERAND (TREE_OPERAND (t, 0), 0);
/* Two conversions in a row are not needed unless:
- the intermediate type is narrower than both initial and final, or
- the intermediate type and innermost type differ in signedness,
......
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