aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-phiopt.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-12-07 13:21:51 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-12-07 13:21:51 +0000
commit5a40ae3c3acf7eaabc9599f5701adbd2f6ec607e (patch)
tree123746bec470ee8bada54b15b044d6fccb91166a /gcc/tree-ssa-phiopt.c
parentd78d986bfa059f3ad53c0be027ff8d3200404fec (diff)
downloadgcc-5a40ae3c3acf7eaabc9599f5701adbd2f6ec607e.zip
gcc-5a40ae3c3acf7eaabc9599f5701adbd2f6ec607e.tar.gz
gcc-5a40ae3c3acf7eaabc9599f5701adbd2f6ec607e.tar.bz2
re PR tree-optimization/83296 (missing -Wstringop-overflow due to missing range info for MAX_EXPR)
2017-12-07 Richard Biener <rguenther@suse.de> PR tree-optimization/83296 PR tree-optimization/67769 * tree-ssa-phiopt.c (conditional_replacement): Do not reset flow sensitive info in an unrelated BB. (value_replacement): Use reset_flow_sensitive_info. (minmax_replacement): Reset flow sensitive info on the def we move. Do not reset flow sensitive info in the whole BB we move the stmt to. (abs_replacement): Likewise. * g++.dg/warn/Wstringop-overflow-1.C: New testcase. From-SVN: r255466
Diffstat (limited to 'gcc/tree-ssa-phiopt.c')
-rw-r--r--gcc/tree-ssa-phiopt.c35
1 files changed, 17 insertions, 18 deletions
diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
index 6e0e186..85f51a4 100644
--- a/gcc/tree-ssa-phiopt.c
+++ b/gcc/tree-ssa-phiopt.c
@@ -672,7 +672,6 @@ conditional_replacement (basic_block cond_bb, basic_block middle_bb,
}
replace_phi_edge_with_variable (cond_bb, e1, phi, new_var);
- reset_flow_sensitive_info_in_bb (cond_bb);
/* Note that we optimized this PHI. */
return true;
@@ -1138,22 +1137,22 @@ value_replacement (basic_block cond_bb, basic_block middle_bb,
cond_rhs, false, rhs2))))))
{
gsi = gsi_for_stmt (cond);
+ /* Moving ASSIGN might change VR of lhs, e.g. when moving u_6
+ def-stmt in:
+ if (n_5 != 0)
+ goto <bb 3>;
+ else
+ goto <bb 4>;
+
+ <bb 3>:
+ # RANGE [0, 4294967294]
+ u_6 = n_5 + 4294967295;
+
+ <bb 4>:
+ # u_3 = PHI <u_6(3), 4294967295(2)> */
+ reset_flow_sensitive_info (lhs);
if (INTEGRAL_TYPE_P (TREE_TYPE (lhs)))
{
- /* Moving ASSIGN might change VR of lhs, e.g. when moving u_6
- def-stmt in:
- if (n_5 != 0)
- goto <bb 3>;
- else
- goto <bb 4>;
-
- <bb 3>:
- # RANGE [0, 4294967294]
- u_6 = n_5 + 4294967295;
-
- <bb 4>:
- # u_3 = PHI <u_6(3), 4294967295(2)> */
- SSA_NAME_RANGE_INFO (lhs) = NULL;
/* If available, we can use VR of phi result at least. */
tree phires = gimple_phi_result (phi);
struct range_info_def *phires_range_info
@@ -1166,7 +1165,7 @@ value_replacement (basic_block cond_bb, basic_block middle_bb,
for (int i = prep_cnt - 1; i >= 0; --i)
{
tree plhs = gimple_assign_lhs (prep_stmt[i]);
- SSA_NAME_RANGE_INFO (plhs) = NULL;
+ reset_flow_sensitive_info (plhs);
gsi_from = gsi_for_stmt (prep_stmt[i]);
gsi_move_before (&gsi_from, &gsi);
}
@@ -1490,6 +1489,8 @@ minmax_replacement (basic_block cond_bb, basic_block middle_bb,
/* Move the statement from the middle block. */
gsi = gsi_last_bb (cond_bb);
gsi_from = gsi_last_nondebug_bb (middle_bb);
+ reset_flow_sensitive_info (SINGLE_SSA_TREE_OPERAND (gsi_stmt (gsi_from),
+ SSA_OP_DEF));
gsi_move_before (&gsi_from, &gsi);
}
@@ -1508,7 +1509,6 @@ minmax_replacement (basic_block cond_bb, basic_block middle_bb,
gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
replace_phi_edge_with_variable (cond_bb, e1, phi, result);
- reset_flow_sensitive_info_in_bb (cond_bb);
return true;
}
@@ -1636,7 +1636,6 @@ abs_replacement (basic_block cond_bb, basic_block middle_bb,
}
replace_phi_edge_with_variable (cond_bb, e1, phi, result);
- reset_flow_sensitive_info_in_bb (cond_bb);
/* Note that we optimized this PHI. */
return true;