This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Assign result of get_string_lenth to a SSA_NAME (PR tree-optimization/83552).
- From: Martin Liška <mliska at suse dot cz>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Jakub Jelinek <jakub at redhat dot com>, Prathamesh Kulkarni <prathamesh dot kulkarni at linaro dot org>
- Date: Fri, 22 Dec 2017 16:18:05 +0100
- Subject: [PATCH] Assign result of get_string_lenth to a SSA_NAME (PR tree-optimization/83552).
- Authentication-results: sourceware.org; auth=none
Hi.
In order to fix the PR, I save temporary expression to a SSA_NAME that
is then used in the gcall.
Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
Ready to be installed?
Martin
gcc/ChangeLog:
2017-12-22 Martin Liska <mliska@suse.cz>
PR tree-optimization/83552
* tree-ssa-strlen.c (fold_strstr_to_strncmp): Assign result
of get_string_lenth to a SSA_NAME.
gcc/testsuite/ChangeLog:
2017-12-22 Martin Liska <mliska@suse.cz>
PR tree-optimization/83552
* gcc.dg/pr83552.c: New test.
---
gcc/testsuite/gcc.dg/pr83552.c | 13 +++++++++++++
gcc/tree-ssa-strlen.c | 7 ++++++-
2 files changed, 19 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/gcc.dg/pr83552.c
diff --git a/gcc/testsuite/gcc.dg/pr83552.c b/gcc/testsuite/gcc.dg/pr83552.c
new file mode 100644
index 00000000000..993cdd26581
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr83552.c
@@ -0,0 +1,13 @@
+/* PR tree-optimization/83364 */
+/* { dg-options "-O2" } */
+
+char *b;
+char d[100];
+void a ();
+void
+c (void)
+{
+ __builtin_strcat (d, "12345");
+ if (__builtin_strstr (b, d) == b)
+ a ();
+}
diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c
index e812bd1e735..43dc22d5ce0 100644
--- a/gcc/tree-ssa-strlen.c
+++ b/gcc/tree-ssa-strlen.c
@@ -3005,12 +3005,17 @@ fold_strstr_to_strncmp (tree rhs1, tree rhs2, gimple *stmt)
{
gimple_stmt_iterator gsi = gsi_for_stmt (call_stmt);
tree strncmp_decl = builtin_decl_explicit (BUILT_IN_STRNCMP);
+
+ tree arg1_len_tmp = make_ssa_name (TREE_TYPE (arg1_len));
+ gassign *arg1_stmt = gimple_build_assign (arg1_len_tmp, arg1_len);
gcall *strncmp_call = gimple_build_call (strncmp_decl, 3,
- arg0, arg1, arg1_len);
+ arg0, arg1,
+ arg1_len_tmp);
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, arg1_stmt, GSI_SAME_STMT);
gsi_insert_before (&gsi, strncmp_call, GSI_SAME_STMT);
tree zero = build_zero_cst (TREE_TYPE (strncmp_lhs));