[Bug tree-optimization/89134] A missing optimization opportunity for a simple branch in loop

2019-01-31 Thread innat_xue at hotmail dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89134

--- Comment #8 from Feng Xue  ---
My mistake, transformation should be:

void f (std::map m)
{
for (auto it = m.begin (); it != m.end (); ++it) {
if (b) {
b = do_something();
} else {
++it;
break;
}
}

for (; it != m.end (); ++it);  /* get an empty loop */
}


(In reply to Feng Xue from comment #7)
> Even loop contains calls with side effects, but only in one condition branch
> path, we can still do some kind of optimization.
> 
> Suppose a loop as:
> 
> void f (std::map m)
> {
> for (auto it = m.begin (); it != m.end (); ++it) {
> if (b) {
> b = do_something();/* Has effect on b */
> } else {
>/* No effect on b */
> }
> }
> }
> 
> We can transform it to:
> 
> void f (std::map m)
> {
> for (auto it = m.begin (); it != m.end (); ++it) {
> if (b) {
> b = do_something();
> ++it;
> break;
> }
> }
> 
> for (; it != m.end (); ++it);  /* get an empty loop */
> }
> 
> This code takes less computation, especially when 'b' is always evaluated to
> be false.

[Bug tree-optimization/89134] A missing optimization opportunity for a simple branch in loop

2019-01-31 Thread innat_xue at hotmail dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89134

Feng Xue  changed:

   What|Removed |Added

 CC||innat_xue at hotmail dot com

--- Comment #7 from Feng Xue  ---
Even loop contains calls with side effects, but only in one condition branch
path, we can still do some kind of optimization.

Suppose a loop as:

void f (std::map m)
{
for (auto it = m.begin (); it != m.end (); ++it) {
if (b) {
b = do_something();/* Has effect on b */
} else {
   /* No effect on b */
}
}
}

We can transform it to:

void f (std::map m)
{
for (auto it = m.begin (); it != m.end (); ++it) {
if (b) {
b = do_something();
++it;
break;
}
}

for (; it != m.end (); ++it);  /* get an empty loop */
}

This code takes less computation, especially when 'b' is always evaluated to be
false.