diff mbox

Patch: Refactor number_of_iterations_exit

Message ID BLU179-W725347FDF7F2042C5A2E0EB6DF0@phx.gbl
State New
Headers show

Commit Message

Aditya K May 7, 2015, 4:27 p.m. UTC
Hi,
I refactored number_of_iterations_exit a little bit. I hope it is helpful.
The idea is to move the call to function dominated_by_p after some sanity checks so as to avoid call to it.


Thanks,
-Aditya


2015-05-07  Aditya Kumar  <hiraditya@msn.com>

        * tree-ssa-loop-niter.c (number_of_iterations_exit): Move call to dominated_by_p later in the function.

Comments

Richard Biener May 7, 2015, 5:47 p.m. UTC | #1
On May 7, 2015 6:27:28 PM GMT+02:00, Aditya K <hiraditya@msn.com> wrote:
>Hi,
>I refactored number_of_iterations_exit a little bit. I hope it is
>helpful.
>The idea is to move the call to function dominated_by_p after some
>sanity checks so as to avoid call to it.

The call is very cheap though.  Do you have data that shows it often passes when the later checks fail?

Richard.

>
>Thanks,
>-Aditya
>
>
>2015-05-07  Aditya Kumar  <hiraditya@msn.com>
>
>        * tree-ssa-loop-niter.c (number_of_iterations_exit): Move call
>to dominated_by_p later in the function.
>
>diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c
>index 042f8df..3d49bb8 100644
>--- a/gcc/tree-ssa-loop-niter.c
>+++ b/gcc/tree-ssa-loop-niter.c
>@@ -1959,11 +1959,6 @@ number_of_iterations_exit (struct loop *loop,
>edge exit,
>   affine_iv iv0, iv1;
>   bool safe;

>-  safe = dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src);
>-
>-  if (every_iteration && !safe)
>-    return false;
>-
>   niter->assumptions = boolean_false_node;
>   last = last_stmt (exit->src);
>   if (!last)
>@@ -1972,6 +1967,11 @@ number_of_iterations_exit (struct loop *loop,
>edge exit,
>   if (!stmt)
>     return false;

>+  safe = dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src);
>+
>+  if (every_iteration && !safe)
>+    return false;
>+
>   /* We want the condition for staying inside loop.  */
>   code = gimple_cond_code (stmt);
>   if (exit->flags & EDGE_TRUE_VALUE)
>
>
Aditya K May 7, 2015, 9:02 p.m. UTC | #2
----------------------------------------
> Subject: Re: Patch: Refactor number_of_iterations_exit
> From: richard.guenther@gmail.com
> Date: Thu, 7 May 2015 19:47:37 +0200
> To: hiraditya@msn.com; gcc-patches@gcc.gnu.org
>
> On May 7, 2015 6:27:28 PM GMT+02:00, Aditya K <hiraditya@msn.com> wrote:
>>Hi,
>>I refactored number_of_iterations_exit a little bit. I hope it is
>>helpful.
>>The idea is to move the call to function dominated_by_p after some
>>sanity checks so as to avoid call to it.
>
> The call is very cheap though. Do you have data that shows it often passes when the later checks fail?

I don't have any data. I was going through this code and realized that when last_stmt(exit->src)
would fail or when the last_stmt is not a conditional it would be pointless to find if exit->src dominates loop->latch
(which would be true for most simple loops, but then most simple loops would have conditionals as last statements. So I'm not very sure about this.)

-Aditya

>
> Richard.
>
>>
>>Thanks,
>>-Aditya
>>
>>
>>2015-05-07  Aditya Kumar  <hiraditya@msn.com>
>>
>>        * tree-ssa-loop-niter.c (number_of_iterations_exit): Move call
>>to dominated_by_p later in the function.
>>
>>diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c
>>index 042f8df..3d49bb8 100644
>>--- a/gcc/tree-ssa-loop-niter.c
>>+++ b/gcc/tree-ssa-loop-niter.c
>>@@ -1959,11 +1959,6 @@ number_of_iterations_exit (struct loop *loop,
>>edge exit,
>>   affine_iv iv0, iv1;
>>   bool safe;
>>
>>-  safe = dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src);
>>-
>>-  if (every_iteration && !safe)
>>-    return false;
>>-
>>   niter->assumptions = boolean_false_node;
>>   last = last_stmt (exit->src);
>>   if (!last)
>>@@ -1972,6 +1967,11 @@ number_of_iterations_exit (struct loop *loop,
>>edge exit,
>>   if (!stmt)
>>     return false;
>>
>>+  safe = dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src);
>>+
>>+  if (every_iteration && !safe)
>>+    return false;
>>+
>>   /* We want the condition for staying inside loop.  */
>>   code = gimple_cond_code (stmt);
>>   if (exit->flags & EDGE_TRUE_VALUE)
>>
>>
>
>
diff mbox

Patch

diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c
index 042f8df..3d49bb8 100644
--- a/gcc/tree-ssa-loop-niter.c
+++ b/gcc/tree-ssa-loop-niter.c
@@ -1959,11 +1959,6 @@  number_of_iterations_exit (struct loop *loop, edge exit,
   affine_iv iv0, iv1;
   bool safe;
 
-  safe = dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src);
-
-  if (every_iteration && !safe)
-    return false;
-
   niter->assumptions = boolean_false_node;
   last = last_stmt (exit->src);
   if (!last)
@@ -1972,6 +1967,11 @@  number_of_iterations_exit (struct loop *loop, edge exit,
   if (!stmt)
     return false;
 
+  safe = dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src);
+
+  if (every_iteration && !safe)
+    return false;
+
   /* We want the condition for staying inside loop.  */
   code = gimple_cond_code (stmt);
   if (exit->flags & EDGE_TRUE_VALUE)