[Bug tree-optimization/24021] VRP does not work with floating points

aldyh at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Feb 9 16:35:03 GMT 2022


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=24021

Aldy Hernandez <aldyh at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jeffreyalaw at gmail dot com,
                   |                            |richard.guenther at gmail dot com

--- Comment #6 from Aldy Hernandez <aldyh at gcc dot gnu.org> ---
Preview of what's to come.

Implementing a bare bones frange class and associated relational operators in
range-ops we can get:

void link_error();
void func();

int foo(float f)
{
  if (f > 3.0)
    {
      func();
      if (f < 2.0)
        link_error();
    }
}

Folding statement: if (f_2(D) > 3.0e+0)
Not folded
Folding statement: func ();
Not folded
Folding statement: if (f_2(D) < 2.0e+0)
Folding predicate f_2(D) < 2.0e+0 to 0
Folded into: if (0 != 0)

And we can also get symbolics:

int bar(float f, float g)
{
  if (f > g)
    {
      func();
      if (f < g)
        link_error();
    }
}

Folding statement: if (f_2(D) < g_3(D))
 folding with relation f_2(D) > g_3(D)
Folding predicate f_2(D) < g_3(D) to 0
Folded into: if (0 != 0)

My proof of concept has ranger dumps looking like:

=========== BB 2 ============
Imports: f_2(D)  
Exports: f_2(D)  
f_2(D)  float VARYING
    <bb 2> :
    if (f_2(D) > 3.0e+0)
      goto <bb 3>; [INV]
    else
      goto <bb 5>; [INV]

2->3  (T) f_2(D) :      float (3.0e+0, +Inf]
2->5  (F) f_2(D) :      float [-Inf, 3.0e+0]


Interestingly, since the threader uses ranger, I had to turn off the threader
for the above snippets, because ethread gets the first one before evrp even
gets a whack at it:

  [1] Registering jump thread: (2, 3) incoming edge;  (3, 5) nocopy; 
path: 2->3->5 SUCCESS
Removing basic block 3
;; basic block 3, loop depth 0
;;  pred:      
func ();
if (f_2(D) < 2.0e+0)
  goto <bb 4>; [INV]
else
  goto <bb 5>; [INV]
;;  succ:       4
;;              5

As I've mentioned, I'm hoping some floating expert can take this across to goal
line, as my head will start spinning as soon as we start talking about NANs and
such.  The range-op work will likely require floating specialized knowledge.


More information about the Gcc-bugs mailing list