aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-01-07 19:39:11 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-01-07 19:39:11 +0100
commitc6a8f6de089b86578cd788b6ef168842fc9bd3c8 (patch)
tree98a65d5d31b70305f89310e6bee59826c2bb6216 /gcc
parentfe95fbf90773ebf53740e46a38ea5e923233a25b (diff)
downloadgcc-c6a8f6de089b86578cd788b6ef168842fc9bd3c8.zip
gcc-c6a8f6de089b86578cd788b6ef168842fc9bd3c8.tar.gz
gcc-c6a8f6de089b86578cd788b6ef168842fc9bd3c8.tar.bz2
re PR bootstrap/47187 (profiledbootstrap failure on i386)
PR bootstrap/47187 * value-prof.c (gimple_stringop_fixed_value): Handle lhs of the call properly. * gcc.dg/tree-prof/pr47187.c: New test. From-SVN: r168581
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-prof/pr47187.c23
-rw-r--r--gcc/value-prof.c17
4 files changed, 50 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 238eef6..1306743 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2011-01-07 Jakub Jelinek <jakub@redhat.com>
+
+ PR bootstrap/47187
+ * value-prof.c (gimple_stringop_fixed_value): Handle
+ lhs of the call properly.
+
2011-01-07 Jan Hubicka <jh@suse.cz>
PR lto/45375
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8ffb049..af10b24 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-01-07 Jakub Jelinek <jakub@redhat.com>
+
+ PR bootstrap/47187
+ * gcc.dg/tree-prof/pr47187.c: New test.
+
2011-01-07 Tobias Burnus <burnus@net-b.de>
PR fortran/41580
diff --git a/gcc/testsuite/gcc.dg/tree-prof/pr47187.c b/gcc/testsuite/gcc.dg/tree-prof/pr47187.c
new file mode 100644
index 0000000..467ce25
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-prof/pr47187.c
@@ -0,0 +1,23 @@
+/* PR bootstrap/47187 */
+/* { dg-options "-O2" } */
+
+char buf[64];
+char buf2[64];
+
+void *
+foo (char *p, long size)
+{
+ return __builtin_memcpy (buf, p, size);
+}
+
+int
+main (void)
+{
+ long i;
+ for (i = 0; i < 65536; i++)
+ if (foo ("abcdefghijkl", 12) != buf)
+ __builtin_abort ();
+ if (foo (buf2, 64) != buf)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/value-prof.c b/gcc/value-prof.c
index 414b948..0a36ed2 100644
--- a/gcc/value-prof.c
+++ b/gcc/value-prof.c
@@ -1,5 +1,5 @@
/* Transformations based on profile information for values.
- Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+ Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
This file is part of GCC.
@@ -1401,6 +1401,21 @@ gimple_stringop_fixed_value (gimple vcall_stmt, tree icall_size, int prob,
e_vj->probability = REG_BR_PROB_BASE;
e_vj->count = all - count;
+ /* Insert PHI node for the call result if necessary. */
+ if (gimple_call_lhs (vcall_stmt)
+ && TREE_CODE (gimple_call_lhs (vcall_stmt)) == SSA_NAME)
+ {
+ tree result = gimple_call_lhs (vcall_stmt);
+ gimple phi = create_phi_node (result, join_bb);
+ SSA_NAME_DEF_STMT (result) = phi;
+ gimple_call_set_lhs (vcall_stmt,
+ make_ssa_name (SSA_NAME_VAR (result), vcall_stmt));
+ add_phi_arg (phi, gimple_call_lhs (vcall_stmt), e_vj, UNKNOWN_LOCATION);
+ gimple_call_set_lhs (icall_stmt,
+ make_ssa_name (SSA_NAME_VAR (result), icall_stmt));
+ add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
+ }
+
/* Because these are all string op builtins, they're all nothrow. */
gcc_assert (!stmt_could_throw_p (vcall_stmt));
gcc_assert (!stmt_could_throw_p (icall_stmt));