aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2011-11-10 13:46:27 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2011-11-10 13:46:27 +0000
commitc07a8cb3c903f5152e013748f773adecdb82122e (patch)
treec2b4709a3f92857670cb47250ae665dc6acc197b
parent98dd3b733fc0ca686b25c067bd0e38feebd6b565 (diff)
downloadgcc-c07a8cb3c903f5152e013748f773adecdb82122e.zip
gcc-c07a8cb3c903f5152e013748f773adecdb82122e.tar.gz
gcc-c07a8cb3c903f5152e013748f773adecdb82122e.tar.bz2
re PR tree-optimization/51070 (ICE verify_gimple failed)
2011-11-10 Richard Guenther <rguenther@suse.de> PR tree-optimization/51070 * tree-loop-distribution.c (generate_builtin): Do not replace the loop with a builtin if the partition contains statements which results are used outside of the loop. (pass_loop_distribution): Verify and collect. * gcc.dg/torture/pr51070.c: New testcase. From-SVN: r181255
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr51070.c34
-rw-r--r--gcc/tree-loop-distribution.c103
4 files changed, 103 insertions, 47 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 52fc3f4..ee388f6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
2011-11-10 Richard Guenther <rguenther@suse.de>
+ PR tree-optimization/51070
+ * tree-loop-distribution.c (generate_builtin): Do not replace
+ the loop with a builtin if the partition contains statements which
+ results are used outside of the loop.
+ (pass_loop_distribution): Verify and collect.
+
+2011-11-10 Richard Guenther <rguenther@suse.de>
+
PR tree-optimization/51030
* tree-ssa-phiopt.c (jump_function_from_stmt): New function.
(value_replacement): Use it to handle trivial non-empty
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 68a3415..c04d8dc 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2011-11-10 Richard Guenther <rguenther@suse.de>
+ PR tree-optimization/51070
+ * gcc.dg/torture/pr51070.c: New testcase.
+
+2011-11-10 Richard Guenther <rguenther@suse.de>
+
PR tree-optimization/51030
* gcc.dg/tree-ssa/phi-opt-6.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/torture/pr51070.c b/gcc/testsuite/gcc.dg/torture/pr51070.c
new file mode 100644
index 0000000..cc06a90
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr51070.c
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+
+int
+func_4 (int si1, int si2)
+{
+ return si1;
+}
+
+int
+func_14 (int left, int right)
+{
+ return 1;
+}
+
+int
+func_37 (int left, int right)
+{
+ return left;
+}
+
+int g_92[1024];
+int g_95[1024];
+int g_224;
+int g_352[1024];
+int
+func_9 ()
+{
+ for (; g_224; g_224 += 1)
+ {
+ g_95[0] = func_4 (func_37 (g_92[g_224], 0), 0);
+ g_92[g_224] = 0, g_352[g_224] = func_14 (0, 0);
+ }
+ return 0;
+}
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c
index 810b974..0daef06 100644
--- a/gcc/tree-loop-distribution.c
+++ b/gcc/tree-loop-distribution.c
@@ -63,6 +63,48 @@ static bitmap remaining_stmts;
predecessor a node that writes to memory. */
static bitmap upstream_mem_writes;
+/* Returns true when DEF is an SSA_NAME defined in LOOP and used after
+ the LOOP. */
+
+static bool
+ssa_name_has_uses_outside_loop_p (tree def, loop_p loop)
+{
+ imm_use_iterator imm_iter;
+ use_operand_p use_p;
+
+ FOR_EACH_IMM_USE_FAST (use_p, imm_iter, def)
+ if (loop != loop_containing_stmt (USE_STMT (use_p)))
+ return true;
+
+ return false;
+}
+
+/* Returns true when STMT defines a scalar variable used after the
+ loop. */
+
+static bool
+stmt_has_scalar_dependences_outside_loop (gimple stmt)
+{
+ tree name;
+
+ switch (gimple_code (stmt))
+ {
+ case GIMPLE_ASSIGN:
+ name = gimple_assign_lhs (stmt);
+ break;
+
+ case GIMPLE_PHI:
+ name = gimple_phi_result (stmt);
+ break;
+
+ default:
+ return false;
+ }
+
+ return TREE_CODE (name) == SSA_NAME
+ && ssa_name_has_uses_outside_loop_p (name, loop_containing_stmt (stmt));
+}
+
/* Update the PHI nodes of NEW_LOOP. NEW_LOOP is a duplicate of
ORIG_LOOP. */
@@ -330,10 +372,18 @@ generate_builtin (struct loop *loop, bitmap partition, bool copy_p)
{
gimple stmt = gsi_stmt (bsi);
- if (gimple_code (stmt) != GIMPLE_LABEL
- && !is_gimple_debug (stmt)
- && bitmap_bit_p (partition, x++)
- && is_gimple_assign (stmt)
+ if (gimple_code (stmt) == GIMPLE_LABEL
+ || is_gimple_debug (stmt))
+ continue;
+
+ if (!bitmap_bit_p (partition, x++))
+ continue;
+
+ /* If the stmt has uses outside of the loop fail. */
+ if (stmt_has_scalar_dependences_outside_loop (stmt))
+ goto end;
+
+ if (is_gimple_assign (stmt)
&& !is_gimple_reg (gimple_assign_lhs (stmt)))
{
/* Don't generate the builtins when there are more than
@@ -824,48 +874,6 @@ fuse_partitions_with_similar_memory_accesses (struct graph *rdg,
}
}
-/* Returns true when DEF is an SSA_NAME defined in LOOP and used after
- the LOOP. */
-
-static bool
-ssa_name_has_uses_outside_loop_p (tree def, loop_p loop)
-{
- imm_use_iterator imm_iter;
- use_operand_p use_p;
-
- FOR_EACH_IMM_USE_FAST (use_p, imm_iter, def)
- if (loop != loop_containing_stmt (USE_STMT (use_p)))
- return true;
-
- return false;
-}
-
-/* Returns true when STMT defines a scalar variable used after the
- loop. */
-
-static bool
-stmt_has_scalar_dependences_outside_loop (gimple stmt)
-{
- tree name;
-
- switch (gimple_code (stmt))
- {
- case GIMPLE_ASSIGN:
- name = gimple_assign_lhs (stmt);
- break;
-
- case GIMPLE_PHI:
- name = gimple_phi_result (stmt);
- break;
-
- default:
- return false;
- }
-
- return TREE_CODE (name) == SSA_NAME
- && ssa_name_has_uses_outside_loop_p (name, loop_containing_stmt (stmt));
-}
-
/* Returns true when STMT will be code generated in a partition of RDG
different than PART and that will not be code generated as a
builtin. */
@@ -1311,6 +1319,7 @@ struct gimple_opt_pass pass_loop_distribution =
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
- 0 /* todo_flags_finish */
+ TODO_ggc_collect
+ | TODO_verify_ssa /* todo_flags_finish */
}
};