On 09/06/15 00:05, Tom de Vries wrote:
On 08/06/15 17:55, Thomas Schwinge wrote:
Hi Tom!
On Mon, 8 Jun 2015 12:43:01 +0200, Tom de Vries
<tom_devr...@mentor.com> wrote:
There are two problems in try_transform_to_exit_first_loop_alt:
1. In case the latch is not a singleton bb, the function should return
false rather than true.
2. The check for singleton bb should ignore debug-insns.
Attached patch fixes these problems.
Fix try_transform_to_exit_first_loop_alt
PR tree-optimization/66442
* gimple-iterator.h (gimple_seq_nondebug_singleton_p): Add function.
* tree-parloops.c (try_transform_to_exit_first_loop_alt): Return
false
if the loop latch is not a singleton. Use
gimple_seq_nondebug_singleton_p instead of gimple_seq_singleton_p.
Per my testing, the backport of this patch that you committed to
gomp-4_0-branch, r224219, introduces a number of regressions in your
OpenACC kernels test cases, specifically the »scan-tree-dump-times
parloops_oacc_kernels "(?n)pragma omp target
oacc_parallel.*num_gangs\\(32\\)" 1« tests. Would you please have a
look?
Hi Thomas,
I seem to have committed (to both trunk and gomp-4_0-branch) an older
version of the patch, which contained an incorrect version of
gimple_seq_nondebug_singleton_p.
I'll correct the mistake tomorrow morning.
Committed attached patch to trunk and propagated to gomp-4_0-branch.
Committed as obvious, since it changes gimple_seq_nondebug_singleton_p
into the tested and approved version.
Thanks,
- Tom
Fix gimple_seq_nondebug_singleton_p
2015-06-09 Tom de Vries <t...@codesourcery.com>
* gimple-iterator.h (gimple_seq_nondebug_singleton_p): Don't
always return false.
---
gcc/gimple-iterator.h | 22 ++++++++--------------
1 file changed, 8 insertions(+), 14 deletions(-)
diff --git a/gcc/gimple-iterator.h b/gcc/gimple-iterator.h
index d08245e..76fa456 100644
--- a/gcc/gimple-iterator.h
+++ b/gcc/gimple-iterator.h
@@ -351,33 +351,27 @@ static inline bool
gimple_seq_nondebug_singleton_p (gimple_seq seq)
{
gimple_stmt_iterator gsi;
+
+ /* Find a nondebug gimple. */
gsi.ptr = gimple_seq_first (seq);
gsi.seq = &seq;
gsi.bb = NULL;
-
- /* Not a singleton if the sequence is empty. */
- if (gsi_end_p (gsi))
- return false;
-
- /* Find a nondebug gimple. */
while (!gsi_end_p (gsi)
&& is_gimple_debug (gsi_stmt (gsi)))
gsi_next (&gsi);
- /* Not a nondebug singleton if there's no nondebug gimple. */
- if (is_gimple_debug (gsi_stmt (gsi)))
+ /* No nondebug gimple found, not a singleton. */
+ if (gsi_end_p (gsi))
return false;
- /* Find the next nondebug gimple. */
+ /* Find a next nondebug gimple. */
+ gsi_next (&gsi);
while (!gsi_end_p (gsi)
&& is_gimple_debug (gsi_stmt (gsi)))
gsi_next (&gsi);
- /* If there's a next nondebug gimple, it's not a nondebug singleton. */
- if (!gsi_end_p (gsi))
- return false;
-
- return true;
+ /* Only a singleton if there's no next nondebug gimple. */
+ return gsi_end_p (gsi);
}
#endif /* GCC_GIMPLE_ITERATOR_H */
--
1.9.1