From: Martin Liska Date: Mon, 23 Jan 2017 14:57:43 +0000 (+0100) Subject: Fix strstr folding (PR tree-optimization/79196). X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f368600fcd86f71c7bfc8a28f42434c539306da2;p=gcc.git Fix strstr folding (PR tree-optimization/79196). 2017-01-23 Martin Liska 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 PR tree-optimization/79196 * gcc.dg/asan/pr79196.c: New test. * gcc.dg/strlenopt-30.c: Update scanned pattern. From-SVN: r244812 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 851fbc5fb19..577c5f47d08 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-01-23 Martin Liska + + 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 PR tree-optimization/78384 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cb4c19d7642..9cc906c1977 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2017-01-23 Martin Liska + + PR tree-optimization/79196 + * gcc.dg/asan/pr79196.c: New test. + * gcc.dg/strlenopt-30.c: Update scanned pattern. + 2017-01-23 Michael Matz 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 00000000000..66a31b90f30 --- /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 089b3a2341d..a85df686ce2 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 2e7ac2c7786..141115ed12b 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 (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))