diff options
author | Richard Biener <rguenther@suse.de> | 2017-12-07 13:21:51 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-12-07 13:21:51 +0000 |
commit | 5a40ae3c3acf7eaabc9599f5701adbd2f6ec607e (patch) | |
tree | 123746bec470ee8bada54b15b044d6fccb91166a | |
parent | d78d986bfa059f3ad53c0be027ff8d3200404fec (diff) | |
download | gcc-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
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wstringop-overflow-1.C | 15 | ||||
-rw-r--r-- | gcc/tree-ssa-phiopt.c | 35 |
4 files changed, 50 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dab026a..3f6fbaa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +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. + 2017-12-07 Segher Boessenkool <segher@kernel.crashing.org> PR target/43871 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d85142f..bb44c70 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2017-12-07 Richard Biener <rguenther@suse.de> + + PR tree-optimization/83296 + PR tree-optimization/67769 + * g++.dg/warn/Wstringop-overflow-1.C: New testcase. + 2017-12-07 Julia Koval <julia.koval@intel.com> * gcc.target/i386/avx512-check.h: Handle bit_VAES. diff --git a/gcc/testsuite/g++.dg/warn/Wstringop-overflow-1.C b/gcc/testsuite/g++.dg/warn/Wstringop-overflow-1.C new file mode 100644 index 0000000..ce5157b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstringop-overflow-1.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// { dg-additional-options "-O2 -Wstringop-overflow=2" } + +struct S { + char a[5]; + void (*pf)(void); +}; + +void f (struct S *s, int n) +{ + if (n < sizeof s->a + 1) + n = sizeof s->a + 1; + + __builtin_strncpy (s->a, "123456", n); // { dg-warning "writing 6" } +} 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; |