Fix strstr folding (PR tree-optimization/79196).
authorMartin Liska <mliska@suse.cz>
Mon, 23 Jan 2017 14:57:43 +0000 (15:57 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Mon, 23 Jan 2017 14:57:43 +0000 (14:57 +0000)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/asan/pr79196.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/strlenopt-30.c
gcc/tree-ssa-strlen.c

index 851fbc5..577c5f4 100644 (file)
@@ -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
index cb4c19d..9cc906c 100644 (file)
@@ -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 (file)
index 0000000..66a31b9
--- /dev/null
@@ -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");
+}
index 089b3a2..a85df68 100644 (file)
@@ -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" } } */
index 2e7ac2c..141115e 100644 (file)
@@ -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))