Thread overview
[Issue 4383] New: Optimizer doesn't keep floating point values on the stack if used more than once
Jun 24, 2010
Don
Jun 24, 2010
Don
Jun 24, 2010
BCS
Jun 24, 2010
Don
Jun 25, 2010
BCS
Jun 25, 2010
Don
Jun 26, 2010
BCS
June 24, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4383

           Summary: Optimizer doesn't keep floating point values on the
                    stack if used more than once
           Product: D
           Version: D1 & D2
          Platform: Other
        OS/Version: All
            Status: NEW
          Keywords: performance
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody@puremagic.com
        ReportedBy: clugdbug@yahoo.com.au


--- Comment #0 from Don <clugdbug@yahoo.com.au> 2010-06-24 05:51:03 PDT ---
Consider this example code.

int main(string[] args) {
    real x = args.length == 2 ? 6.0 : 4.0; // just to defeat the optimiser
//    real y = x * 2;  // (1)
    real y = x + x;    // (2)
    return cast(int)y;
}
------------------

After the first line, x is in ST(0). Here's how the compiler calculates y.
Case (1) y = x * 2

            fadd    ST(0),ST

Case (2)  y = x + x
                fstp    tbyte ptr [ESP]  // store x
                fld     tbyte ptr [ESP]  // load x
                fld     tbyte ptr [ESP]  // load x again
                faddp   ST(1),ST

It's very interesting that in the first case, the compiler is able to eliminate
the store of x, yet it doesn't do it in the second case.
The compiler's inability to do this is the primary cause of DMD's poor floating
point performance.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
June 24, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4383


Don <clugdbug@yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Severity|normal                      |enhancement


-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
June 24, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4383


BCS <shro8822@vandals.uidaho.edu> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |shro8822@vandals.uidaho.edu


--- Comment #1 from BCS <shro8822@vandals.uidaho.edu> 2010-06-24 06:59:59 PDT ---
Sounds like a prime case for a keyhole optimization. Does DMD have the infrastructure in place to do that?

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
June 24, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4383



--- Comment #2 from Don <clugdbug@yahoo.com.au> 2010-06-24 12:52:21 PDT ---
(In reply to comment #1)
> Sounds like a prime case for a keyhole optimization. Does DMD have the infrastructure in place to do that?

Yes, there's pinholeopt() in cod3.c. But this optimisation should be done
earlier.
Although it seems as though you could replace:
fstp XXX; fld XXX;  with fst XXX; there's unfortunately no fst instruction for
80-bit reals, and for doubles and floats it can change the rounding.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
June 25, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4383



--- Comment #3 from BCS <shro8822@vandals.uidaho.edu> 2010-06-25 07:07:22 PDT ---
(In reply to comment #2)
> (In reply to comment #1)
> > Sounds like a prime case for a keyhole optimization. Does DMD have the infrastructure in place to do that?
> 
> Yes, there's pinholeopt() in cod3.c. But this optimisation should be done
> earlier.

Agreed, but (done wrong now) + (done right later) > (done right later)

> Although it seems as though you could replace:
> fstp XXX; fld XXX;  with fst XXX; there's unfortunately no fst instruction for
> 80-bit reals, and for doubles and floats it can change the rounding.

I was primarily thinking of removing total nop cases (store+load+never used again). Also you could include a speed/accuracy trade-off flag. Or not.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
June 25, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4383



--- Comment #4 from Don <clugdbug@yahoo.com.au> 2010-06-25 09:32:15 PDT ---
(In reply to comment #3)
> (In reply to comment #2)
> > (In reply to comment #1)
> > > Sounds like a prime case for a keyhole optimization. Does DMD have the infrastructure in place to do that?
> > 
> > Yes, there's pinholeopt() in cod3.c. But this optimisation should be done
> > earlier.
> 
> Agreed, but (done wrong now) + (done right later) > (done right later)
> 
> > Although it seems as though you could replace:
> > fstp XXX; fld XXX;  with fst XXX; there's unfortunately no fst instruction for
> > 80-bit reals, and for doubles and floats it can change the rounding.
> 
> I was primarily thinking of removing total nop cases (store+load+never used
> again).

That's why it needs to be done earlier. pinhole doesn't know if values are used again.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
June 26, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4383



--- Comment #5 from BCS <shro8822@vandals.uidaho.edu> 2010-06-26 08:28:26 PDT ---
(In reply to comment #4)
> (In reply to comment #3)
> > I was primarily thinking of removing total nop cases (store+load+never used
> > again).
> 
> That's why it needs to be done earlier. pinhole doesn't know if values are used again.

So a pinhole optimizer doesn't see enough. Got it.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------