diff options
author | Martin Liska <mliska@suse.cz> | 2017-01-23 15:57:43 +0100 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2017-01-23 14:57:43 +0000 |
commit | f368600fcd86f71c7bfc8a28f42434c539306da2 (patch) | |
tree | bb8e8a1499c3766b40fb7df9c7365562bd7be70c /gcc | |
parent | d886761fd048a6ad77dc7c927cbedfa503cfe01b (diff) | |
download | gcc-f368600fcd86f71c7bfc8a28f42434c539306da2.zip gcc-f368600fcd86f71c7bfc8a28f42434c539306da2.tar.gz gcc-f368600fcd86f71c7bfc8a28f42434c539306da2.tar.bz2 |
Fix strstr folding (PR tree-optimization/79196).
2017-01-23 Martin Liska <mliska@suse.cz>
PR tree-optimization/79196
* tree-ssa-strlen.c (fold_strstr_to_memcmp): Rename to ...
(fold_strstr_to_strncmp): ... this. Fold the pattern to strncmp
instead of memcmp.
(strlen_optimize_stmt): Call the renamed function.
2017-01-23 Martin Liska <mliska@suse.cz>
PR tree-optimization/79196
* gcc.dg/asan/pr79196.c: New test.
* gcc.dg/strlenopt-30.c: Update scanned pattern.
From-SVN: r244812
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/asan/pr79196.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/strlenopt-30.c | 2 | ||||
-rw-r--r-- | gcc/tree-ssa-strlen.c | 36 |
5 files changed, 50 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 851fbc5..577c5f4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-01-23 Martin Liska <mliska@suse.cz> + + PR tree-optimization/79196 + * tree-ssa-strlen.c (fold_strstr_to_memcmp): Rename to ... + (fold_strstr_to_strncmp): ... this. Fold the pattern to strncmp + instead of memcmp. + (strlen_optimize_stmt): Call the renamed function. + 2017-01-23 Michael Matz <matz@suse.de> PR tree-optimization/78384 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cb4c19d..9cc906c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2017-01-23 Martin Liska <mliska@suse.cz> + + PR tree-optimization/79196 + * gcc.dg/asan/pr79196.c: New test. + * gcc.dg/strlenopt-30.c: Update scanned pattern. + 2017-01-23 Michael Matz <matz@suse.de> PR tree-optimization/78384 diff --git a/gcc/testsuite/gcc.dg/asan/pr79196.c b/gcc/testsuite/gcc.dg/asan/pr79196.c new file mode 100644 index 0000000..66a31b9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/asan/pr79196.c @@ -0,0 +1,17 @@ +// PR tree-optimization/79196 +// { dg-do run } + +int +__attribute__((noinline)) +test(char *a) +{ + if (__builtin_strstr (a, "DROP CONVERSION") == a) + return 1; + + return 0; +} + +int main(int argc, char **argv) +{ + return test ("x"); +} diff --git a/gcc/testsuite/gcc.dg/strlenopt-30.c b/gcc/testsuite/gcc.dg/strlenopt-30.c index 089b3a2..a85df68 100644 --- a/gcc/testsuite/gcc.dg/strlenopt-30.c +++ b/gcc/testsuite/gcc.dg/strlenopt-30.c @@ -60,4 +60,4 @@ _Bool f7(char *s) return (t1 == s); } -/* { dg-final { scan-tree-dump-times "__builtin_memcmp" 5 "strlen" } } */ +/* { dg-final { scan-tree-dump-times "__builtin_strncmp" 5 "strlen" } } */ diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c index 2e7ac2c..141115e 100644 --- a/gcc/tree-ssa-strlen.c +++ b/gcc/tree-ssa-strlen.c @@ -2225,10 +2225,10 @@ handle_char_store (gimple_stmt_iterator *gsi) return true; } -/* Try to fold strstr (s, t) eq/ne s to memcmp (s, t, strlen (t)) eq/ne 0. */ +/* Try to fold strstr (s, t) eq/ne s to strncmp (s, t, strlen (t)) eq/ne 0. */ static void -fold_strstr_to_memcmp (tree rhs1, tree rhs2, gimple *stmt) +fold_strstr_to_strncmp (tree rhs1, tree rhs2, gimple *stmt) { if (TREE_CODE (rhs1) != SSA_NAME || TREE_CODE (rhs2) != SSA_NAME) @@ -2273,34 +2273,34 @@ fold_strstr_to_memcmp (tree rhs1, tree rhs2, gimple *stmt) if (arg1_len != NULL_TREE) { gimple_stmt_iterator gsi = gsi_for_stmt (call_stmt); - tree memcmp_decl = builtin_decl_explicit (BUILT_IN_MEMCMP); - gcall *memcmp_call = gimple_build_call (memcmp_decl, 3, + tree strncmp_decl = builtin_decl_explicit (BUILT_IN_STRNCMP); + gcall *strncmp_call = gimple_build_call (strncmp_decl, 3, arg0, arg1, arg1_len); - tree memcmp_lhs = make_ssa_name (integer_type_node); - gimple_set_vuse (memcmp_call, gimple_vuse (call_stmt)); - gimple_call_set_lhs (memcmp_call, memcmp_lhs); + tree strncmp_lhs = make_ssa_name (integer_type_node); + gimple_set_vuse (strncmp_call, gimple_vuse (call_stmt)); + gimple_call_set_lhs (strncmp_call, strncmp_lhs); gsi_remove (&gsi, true); - gsi_insert_before (&gsi, memcmp_call, GSI_SAME_STMT); - tree zero = build_zero_cst (TREE_TYPE (memcmp_lhs)); + gsi_insert_before (&gsi, strncmp_call, GSI_SAME_STMT); + tree zero = build_zero_cst (TREE_TYPE (strncmp_lhs)); if (is_gimple_assign (stmt)) { if (gimple_assign_rhs_code (stmt) == COND_EXPR) { tree cond = gimple_assign_rhs1 (stmt); - TREE_OPERAND (cond, 0) = memcmp_lhs; + TREE_OPERAND (cond, 0) = strncmp_lhs; TREE_OPERAND (cond, 1) = zero; } else { - gimple_assign_set_rhs1 (stmt, memcmp_lhs); + gimple_assign_set_rhs1 (stmt, strncmp_lhs); gimple_assign_set_rhs2 (stmt, zero); } } else { gcond *cond = as_a<gcond *> (stmt); - gimple_cond_set_lhs (cond, memcmp_lhs); + gimple_cond_set_lhs (cond, strncmp_lhs); gimple_cond_set_rhs (cond, zero); } update_stmt (stmt); @@ -2398,12 +2398,12 @@ strlen_optimize_stmt (gimple_stmt_iterator *gsi) enum tree_code cond_code = TREE_CODE (cond); if (cond_code == EQ_EXPR || cond_code == NE_EXPR) - fold_strstr_to_memcmp (TREE_OPERAND (cond, 0), - TREE_OPERAND (cond, 1), stmt); + fold_strstr_to_strncmp (TREE_OPERAND (cond, 0), + TREE_OPERAND (cond, 1), stmt); } else if (code == EQ_EXPR || code == NE_EXPR) - fold_strstr_to_memcmp (gimple_assign_rhs1 (stmt), - gimple_assign_rhs2 (stmt), stmt); + fold_strstr_to_strncmp (gimple_assign_rhs1 (stmt), + gimple_assign_rhs2 (stmt), stmt); } else if (TREE_CODE (lhs) != SSA_NAME && !TREE_SIDE_EFFECTS (lhs)) { @@ -2423,8 +2423,8 @@ strlen_optimize_stmt (gimple_stmt_iterator *gsi) { enum tree_code code = gimple_cond_code (cond); if (code == EQ_EXPR || code == NE_EXPR) - fold_strstr_to_memcmp (gimple_cond_lhs (stmt), - gimple_cond_rhs (stmt), stmt); + fold_strstr_to_strncmp (gimple_cond_lhs (stmt), + gimple_cond_rhs (stmt), stmt); } if (gimple_vdef (stmt)) |