summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-forwprop.c
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2009-05-15 13:13:02 +0100
committerJoseph Myers <jsm28@gcc.gnu.org>2009-05-15 13:13:02 +0100
commit16b29cc4d6294f78af7026dbf5aae68b03531da3 (patch)
tree3515881bf8eb12526689a646dc2ac11b970093fe /gcc/tree-ssa-forwprop.c
parent934432b66c473da1d248bb5f61dc8549bf14db81 (diff)
downloadgcc-16b29cc4d6294f78af7026dbf5aae68b03531da3.tar.gz
tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Also recurse on an invariant address if a conversion from a pointer type to a...
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Also recurse on an invariant address if a conversion from a pointer type to a wider integer type is involved. testsuite: * gcc.c-torture/compile/ptr-conv-1.c: New test. From-SVN: r147570
Diffstat (limited to 'gcc/tree-ssa-forwprop.c')
-rw-r--r--gcc/tree-ssa-forwprop.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index 65b02af27f6..ef78703c8ee 100644
--- a/gcc/tree-ssa-forwprop.c
+++ b/gcc/tree-ssa-forwprop.c
@@ -739,7 +739,11 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
address which we cannot do in a single statement. */
if (!single_use_p
|| (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (def_rhs))
- && !is_gimple_min_invariant (def_rhs)))
+ && (!is_gimple_min_invariant (def_rhs)
+ || (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
+ && POINTER_TYPE_P (TREE_TYPE (def_rhs))
+ && (TYPE_PRECISION (TREE_TYPE (lhs))
+ > TYPE_PRECISION (TREE_TYPE (def_rhs)))))))
return forward_propagate_addr_expr (lhs, def_rhs);
gimple_assign_set_rhs1 (use_stmt, unshare_expr (def_rhs));