This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH][ada] Use fold_convert where applicable
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 5 Dec 2005 12:54:05 +0100 (CET)
- Subject: [PATCH][ada] Use fold_convert where applicable
Bootstrapped and tested on i686-pc-linux-gnu.
Ok for mainline?
Thanks,
Richard.
2005-12-02 Richard Guenther <rguenther@suse.de>
* utils.c (convert): Use fold_convert where appropriate.
Index: ada/utils.c
===================================================================
*** ada/utils.c (revision 107909)
--- ada/utils.c (working copy)
*************** convert (tree type, tree expr)
*** 2789,2797 ****
/* If the input is a biased type, adjust first. */
if (ecode == INTEGER_TYPE && TYPE_BIASED_REPRESENTATION_P (etype))
return convert (type, fold (build2 (PLUS_EXPR, TREE_TYPE (etype),
! fold (build1 (NOP_EXPR,
! TREE_TYPE (etype),
! expr)),
TYPE_MIN_VALUE (etype))));
/* If the input is a justified modular type, we need to extract the actual
--- 2789,2796 ----
/* If the input is a biased type, adjust first. */
if (ecode == INTEGER_TYPE && TYPE_BIASED_REPRESENTATION_P (etype))
return convert (type, fold (build2 (PLUS_EXPR, TREE_TYPE (etype),
! fold_convert (TREE_TYPE (etype),
! expr),
TYPE_MIN_VALUE (etype))));
/* If the input is a justified modular type, we need to extract the actual
*************** convert (tree type, tree expr)
*** 2940,2946 ****
else if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (etype)
|| (code == INTEGER_CST && ecode == INTEGER_CST
&& (type == TREE_TYPE (etype) || etype == TREE_TYPE (type))))
! return fold (build1 (NOP_EXPR, type, expr));
switch (code)
{
--- 2939,2945 ----
else if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (etype)
|| (code == INTEGER_CST && ecode == INTEGER_CST
&& (type == TREE_TYPE (etype) || etype == TREE_TYPE (type))))
! return fold_convert (type, expr);
switch (code)
{
*************** convert (tree type, tree expr)
*** 2948,2954 ****
return build1 (CONVERT_EXPR, type, expr);
case BOOLEAN_TYPE:
! return fold (build1 (NOP_EXPR, type, gnat_truthvalue_conversion (expr)));
case INTEGER_TYPE:
if (TYPE_HAS_ACTUAL_BOUNDS_P (type)
--- 2947,2953 ----
return build1 (CONVERT_EXPR, type, expr);
case BOOLEAN_TYPE:
! return fold_convert (type, gnat_truthvalue_conversion (expr));
case INTEGER_TYPE:
if (TYPE_HAS_ACTUAL_BOUNDS_P (type)
*************** convert (tree type, tree expr)
*** 2956,2965 ****
|| (ecode == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (etype))))
return unchecked_convert (type, expr, false);
else if (TYPE_BIASED_REPRESENTATION_P (type))
! return fold (build1 (CONVERT_EXPR, type,
! fold (build2 (MINUS_EXPR, TREE_TYPE (type),
! convert (TREE_TYPE (type), expr),
! TYPE_MIN_VALUE (type)))));
/* ... fall through ... */
--- 2955,2964 ----
|| (ecode == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (etype))))
return unchecked_convert (type, expr, false);
else if (TYPE_BIASED_REPRESENTATION_P (type))
! return fold_convert (type,
! fold_build2 (MINUS_EXPR, TREE_TYPE (type),
! convert (TREE_TYPE (type), expr),
! TYPE_MIN_VALUE (type)));
/* ... fall through ... */