diff options
| author | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-03-29 21:55:34 +0000 |
|---|---|---|
| committer | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-03-29 21:55:34 +0000 |
| commit | 322fdac266361c0ef845fc64c121799e474cc3d6 (patch) | |
| tree | 18115d4fa6067f3978ea8494f5cb4225fd5f12cb | |
| parent | 1bca435e6afe9988a874bb9305b5018084f9437d (diff) | |
| download | ppe42-gcc-322fdac266361c0ef845fc64c121799e474cc3d6.tar.gz ppe42-gcc-322fdac266361c0ef845fc64c121799e474cc3d6.zip | |
* convert.c (convert_to_pointer): Preserve the TREE_OVERFLOW
and TREE_CONSTANT_OVERFLOW bits of the argument. Return
quickly if the argument is already of the correct type.
Call fold_build1 instead of build1. Tidy up blank lines.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@112511 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/ChangeLog | 7 | ||||
| -rw-r--r-- | gcc/convert.c | 15 |
2 files changed, 19 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8a29a797602..b028b30aa7d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2006-03-29 Roger Sayle <roger@eyesopen.com> + + * convert.c (convert_to_pointer): Preserve the TREE_OVERFLOW + and TREE_CONSTANT_OVERFLOW bits of the argument. Return + quickly if the argument is already of the correct type. + Call fold_build1 instead of build1. Tidy up blank lines. + 2006-03-29 David Edelsohn <edelsohn@gnu.org> * genemit.c (main): Add tm-constrs.h to included headers. diff --git a/gcc/convert.c b/gcc/convert.c index ba5f6fd7e73..97977040755 100644 --- a/gcc/convert.c +++ b/gcc/convert.c @@ -33,22 +33,31 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA #include "toplev.h" #include "langhooks.h" #include "real.h" -/* Convert EXPR to some pointer or reference type TYPE. +/* Convert EXPR to some pointer or reference type TYPE. EXPR must be pointer, reference, integer, enumeral, or literal zero; in other cases error is called. */ tree convert_to_pointer (tree type, tree expr) { + if (TREE_TYPE (expr) == type) + return expr; + if (integer_zerop (expr)) - return build_int_cst (type, 0); + { + tree t = build_int_cst (type, 0); + if (TREE_OVERFLOW (expr) || TREE_CONSTANT_OVERFLOW (expr)) + t = force_fit_type (t, 0, TREE_OVERFLOW (expr), + TREE_CONSTANT_OVERFLOW (expr)); + return t; + } switch (TREE_CODE (TREE_TYPE (expr))) { case POINTER_TYPE: case REFERENCE_TYPE: - return build1 (NOP_EXPR, type, expr); + return fold_build1 (NOP_EXPR, type, expr); case INTEGER_TYPE: case ENUMERAL_TYPE: |

