aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-forwprop.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-01-30 18:28:19 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-01-30 18:28:19 +0000
commitc965e18748995d2ce9a13395152fd0da295da573 (patch)
treed57bbbc4b9b65da04a915f26455cd3254ace9c7e /gcc/tree-ssa-forwprop.c
parent5f71f3d3e0a2170cfb25d86bf7bae3803f180c74 (diff)
downloadgcc-c965e18748995d2ce9a13395152fd0da295da573.zip
gcc-c965e18748995d2ce9a13395152fd0da295da573.tar.gz
gcc-c965e18748995d2ce9a13395152fd0da295da573.tar.bz2
re PR middle-end/59993 (ICE: SSA corruption)
2014-01-30 Richard Biener <rguenther@suse.de> PR tree-optimization/59993 * tree-ssa-forwprop.c (associate_pointerplus): Check we can propagate form the earlier stmt and avoid the transform when the intermediate result is needed. * gcc.dg/torture/pr59993.c: New testcase. From-SVN: r207316
Diffstat (limited to 'gcc/tree-ssa-forwprop.c')
-rw-r--r--gcc/tree-ssa-forwprop.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index ebdd8f5..b229429 100644
--- a/gcc/tree-ssa-forwprop.c
+++ b/gcc/tree-ssa-forwprop.c
@@ -2926,11 +2926,13 @@ associate_pointerplus (gimple_stmt_iterator *gsi)
/* Associate (p +p off1) +p off2 as (p +p (off1 + off2)). */
ptr = gimple_assign_rhs1 (stmt);
off1 = gimple_assign_rhs2 (stmt);
- if (TREE_CODE (ptr) != SSA_NAME)
+ if (TREE_CODE (ptr) != SSA_NAME
+ || !has_single_use (ptr))
return false;
def_stmt = SSA_NAME_DEF_STMT (ptr);
if (!is_gimple_assign (def_stmt)
- || gimple_assign_rhs_code (def_stmt) != POINTER_PLUS_EXPR)
+ || gimple_assign_rhs_code (def_stmt) != POINTER_PLUS_EXPR
+ || !can_propagate_from (def_stmt))
return false;
ptr = gimple_assign_rhs1 (def_stmt);
off2 = gimple_assign_rhs2 (def_stmt);