diff options
author | Richard Guenther <rguenther@suse.de> | 2007-07-12 10:27:51 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2007-07-12 10:27:51 +0000 |
commit | 8f20c485050d550ccca1f4f4ed05ffd249c57c5f (patch) | |
tree | b01916e56bf1aadf986d4b4a11b1a17c5a1f24f0 /gcc/gimplify.c | |
parent | 44f51d597ed4102d6da3bd4cf631c5031b21c975 (diff) | |
download | gcc-8f20c485050d550ccca1f4f4ed05ffd249c57c5f.tar.gz |
gimplify.c (gimplify_conversion): Make sure that the result from maybe_fold_offset_to_reference is trivially...
2007-07-12 Richard Guenther <rguenther@suse.de>
* gimplify.c (gimplify_conversion): Make sure that the result
from maybe_fold_offset_to_reference is trivially convertible
to the desired type before doing the simplification.
(gimplify_expr): Likewise.
* fold-const.c (fold_binary): Use the correct types for
building the simplified expression.
From-SVN: r126577
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r-- | gcc/gimplify.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 3b5fa895238..12ed309538b 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -1648,7 +1648,11 @@ gimplify_conversion (tree *expr_p) && (tem = maybe_fold_offset_to_reference (TREE_OPERAND (*expr_p, 0), integer_zero_node, TREE_TYPE (TREE_TYPE (*expr_p))))) - *expr_p = build_fold_addr_expr_with_type (tem, TREE_TYPE (*expr_p)); + { + tree ptr_type = build_pointer_type (TREE_TYPE (tem)); + if (useless_type_conversion_p (TREE_TYPE (*expr_p), ptr_type)) + *expr_p = build_fold_addr_expr_with_type (tem, ptr_type); + } /* If we still have a conversion at the toplevel, then canonicalize some constructs. */ @@ -5987,9 +5991,12 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p, (TREE_OPERAND (*expr_p, 0), TREE_OPERAND (*expr_p, 1), TREE_TYPE (TREE_TYPE (*expr_p))))) { - *expr_p = build_fold_addr_expr_with_type (tmp, - TREE_TYPE (*expr_p)); - break; + tree ptr_type = build_pointer_type (TREE_TYPE (tmp)); + if (useless_type_conversion_p (TREE_TYPE (*expr_p), ptr_type)) + { + *expr_p = build_fold_addr_expr_with_type (tmp, ptr_type); + break; + } } /* Convert (void *)&a + 4 into (void *)&a[1]. */ if (TREE_CODE (TREE_OPERAND (*expr_p, 0)) == NOP_EXPR |