[Committed] Remove recursive call from convert_to_integer
Roger Sayle
roger@eyesopen.com
Thu May 26 05:06:00 GMT 2005
The following tiny clean-up removes a potential unbounded recursion
problem from the middle-end's convert_to_integer function. When
converting a pointer or reference type to an integer, we perform
the conversion in two steps; first to an unsigned integer type of
the width of the pointer, and from there truncate/widen to the
desired destination type.
The potential problem is that the second conversion is implemented
via a recursive call to convert_to_integer rather than directly
building a NOP_EXPR (if required). With a patch, I'm working on
this recursive call creates problems as the behaviour of
convert_to_integer for casts is to first strip the cast using
get_unwidened and then call convert. Clearly this can create
problems as the mutual recursion infinitely adds/removes casts.
The following patch both avoids problems and improves performance
by constructing the required NOP_EXPR directly, rather than
recursively invoke convert_to_integer.
This patch has been tested on x86_64-unknown-linux-gnu with a full
"make bootstrap", all default languages, and regression tested with
a top-level "make -k check" with no new failures.
Committed to mainline CVS.
2005-05-25 Roger Sayle <roger@eyesopen.com>
* convert.c (convert_to_integer) <POINTER_TYPE>: Avoid recursive
call to convert_to_integer by building the NOP_EXPR directly.
Index: convert.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/convert.c,v
retrieving revision 1.62
diff -c -3 -p -r1.62 convert.c
*** convert.c 3 May 2005 08:08:23 -0000 1.62
--- convert.c 23 May 2005 20:50:26 -0000
*************** convert_to_integer (tree type, tree expr
*** 411,423 ****
case POINTER_TYPE:
case REFERENCE_TYPE:
if (integer_zerop (expr))
! expr = integer_zero_node;
! else
! expr = fold (build1 (CONVERT_EXPR,
! lang_hooks.types.type_for_size (POINTER_SIZE, 0),
! expr));
! return convert_to_integer (type, expr);
case INTEGER_TYPE:
case ENUMERAL_TYPE:
--- 411,424 ----
case POINTER_TYPE:
case REFERENCE_TYPE:
if (integer_zerop (expr))
! return build_int_cst (type, 0);
! /* Convert to an unsigned integer of the correct width first,
! and from there widen/truncate to the required type. */
! expr = fold_build1 (CONVERT_EXPR,
! lang_hooks.types.type_for_size (POINTER_SIZE, 0),
! expr);
! return fold_build1 (NOP_EXPR, type, expr);
case INTEGER_TYPE:
case ENUMERAL_TYPE:
Roger
--
More information about the Gcc-patches
mailing list