[Bug tree-optimization/102983] [12 Regression] Dead Code Elimination Regression at -O3 (trunk vs 11.2.0)

2021-10-29 Thread amacleod at redhat dot com via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102983

Andrew Macleod  changed:

   What|Removed |Added

 Status|NEW |RESOLVED
 Resolution|--- |FIXED

--- Comment #4 from Andrew Macleod  ---
Rather than trying to fix this after the fact in the VRP folder when something
is simplified,  I fixed it directly inside ranger when it is processing gcond
statements.  
Ranger will now update the cache following any range_of_stmt calls on a gcond
so we will always be up to date.  This way non-vrp clients will also get the
same updates.

[Bug tree-optimization/102983] [12 Regression] Dead Code Elimination Regression at -O3 (trunk vs 11.2.0)

2021-10-29 Thread cvs-commit at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102983

--- Comment #3 from CVS Commits  ---
The master branch has been updated by Andrew Macleod :

https://gcc.gnu.org/g:cb596fd43667f92c4cb037a4ee8b2061c393ba60

commit r12-4788-gcb596fd43667f92c4cb037a4ee8b2061c393ba60
Author: Andrew MacLeod 
Date:   Thu Oct 28 13:31:17 2021 -0400

Perform on-entry propagation after range_of_stmt on a gcond.

Propagation is automatically done by the temporal cache when defs are
out of date from the names on the RHS, but a gcond has no LHS, and any
updates on the RHS are never propagated.  Always propagate them.

gcc/
PR tree-optimization/102983
* gimple-range-cache.h (propagate_updated_value): Make public.
* gimple-range.cc (gimple_ranger::range_of_stmt): Propagate exports
when processing gcond stmts.

gcc/testsuite/
* gcc.dg/pr102983.c: New.

[Bug tree-optimization/102983] [12 Regression] Dead Code Elimination Regression at -O3 (trunk vs 11.2.0)

2021-10-28 Thread amacleod at redhat dot com via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102983

--- Comment #2 from Andrew Macleod  ---
This is a bit more interesting.
The IL starts the pass as

  :
  if (c_3 < b_4)
goto ; [INV]
  else
goto ; [INV]

   :
  if (c_3 != 0)
goto ; [INV]
  else
goto ; [INV]

<...>
   :
  # c_3 = PHI <0(2), c_2(10)>
  # b_4 = PHI <0(2), b_16(10)>
  if (b_4 <= 0)
goto ; [INV]
  else
goto ; [INV]

so the initial condition is "if (c_3 < b_4)"
the initial attempt to calculate c_3 = PHI flows along and uses a value of b_4
determined by loop analysis of [0,1].  (we haven't gotten to propagating b_4
along the back edges yet)  so it ends up deciding c_3 has a range of [-INF, 1]
We then plod along, and eventually handle b_4, and propagate that b_4 is [0,0[
on the edge 11->3.

There is no direct dependency between c_3 and b_4, so there are no values going
stale due to this updated value.

Meanwhile, we eventually visit the if (c_3 < b_4) stmt, and b_4 is known to be
0, so the simplifier changes this to if (c_3 < 0). 

Ranger however, doesnt know this was simplified, and at the moment doesn't
think it needs to recalculate any outgoing ranges and update on-entry cache
values in successor blocks. It dDoesn't realize there is a reason to
recalculate it.

Whenever we successfully fold or simplify a conditional, we probably need to
check if any values should then be propagated.  I believe that it will happen
automatically for anything that is defined by the statement due to the nature
of the temporal cache.  Statements like GIMPLE_COND which have no LHS have no
triggers.

[Bug tree-optimization/102983] [12 Regression] Dead Code Elimination Regression at -O3 (trunk vs 11.2.0)

2021-10-28 Thread rguenth at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102983

Richard Biener  changed:

   What|Removed |Added

   Priority|P3  |P1

[Bug tree-optimization/102983] [12 Regression] Dead Code Elimination Regression at -O3 (trunk vs 11.2.0)

2021-10-28 Thread pinskia at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102983

Andrew Pinski  changed:

   What|Removed |Added

 Status|UNCONFIRMED |NEW
   Keywords||missed-optimization
   Last reconfirmed||2021-10-28
 Ever confirmed|0   |1
   Target Milestone|--- |12.0

--- Comment #1 from Andrew Pinski  ---
Hmm:
   :
  if (c_3 < 0)
goto ; [INV]
  else
goto ; [INV]

   :
  if (c_3 != 0)
goto ; [INV]
  else
goto ; [INV]


=== BB 5 
Imports: c_3  b_4  
Exports: c_3  b_4  
c_3 int [-INF, 1]
b_4 int [0, 0]
 :
if (c_3 < 0)
  goto ; [INV]
else
  goto ; [INV]

5->6  (T) c_3 : int [-INF, -1]
5->6  (T) b_4 : int [0, 0]
5->9  (F) c_3 : int [0, 1]
5->9  (F) b_4 : int [0, 0]

=== BB 6 
Imports: c_3  
Exports: c_3  
c_3 int [-INF, 0]
b_4 int [0, 0]
 :
if (c_3 != 0)
  goto ; [INV]
else
  goto ; [INV]

6->7  (T) c_3 : int [-INF, -1]
6->8  (F) c_3 : int [0, 0]


H.