[GHC] #14754: -O1 changes result at runtime

GHC ghc-devs at haskell.org
Sun Feb 4 00:35:36 UTC 2018


#14754: -O1 changes result at runtime
-------------------------------------+-------------------------------------
        Reporter:  Bodigrim          |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  highest           |            Milestone:  8.4.1
       Component:  Compiler          |              Version:  8.4.1-alpha1
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Incorrect result  |  Unknown/Multiple
  at runtime                         |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by bgamari):

 Indeed the problem here is that the CBE logic in the above patch find
 these two blocks to be equivalent:
 {{{
   c4N2: // global
       _s4Kg::I64 = _s4Kg::I64;
       _s4Kf::I64 = _s4Kr::I64;
       goto c4M3;
   c4N5: // global
       _s4Kf::I64 = _s4Kg::I64;
       _s4Kg::I64 = _s4Kr::I64;
       goto c4M3;
 }}}

 The reason is that the implementation walks the two blocks, zipping
 together their nodes and building a correspondence between their local
 registers. In the first node we have
 {{{
     c4N2                 c4N5
     ----------------     ---------------
     s4Kg = s4Kg          s4Kf = s4Kg
 }}}
 As the RHSs of the assignments are identical, this results in the
 correspondence `s4Kg(c4N2) ~> s4Kf(s4N5)`. We then consider the second
 pair of nodes:
 {{{
     c4N2                 c4N5
     ----------------     ---------------
     s4Kf = s4Kr          s4Kg = s4Kr
 }}}
 Since the implementation binding occurrences are simply added to the
 register substitution instead of compared, these two nodes are considered
 to be equivalent. This is clearly wrong. I'll need to revisit this in the
 future but in the meantime I'm going to revert.
 implementation fails to take into account that logic registers may live
 beyond the

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14754#comment:5>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list