Ticket #6121 (closed bug: fixed)

Opened 12 months ago

Last modified 11 months ago

Very poor constant folding

Reported by: augustss Owned by: igloo
Priority: high Milestone: 7.6.1
Component: Compiler Version: 7.4.1
Keywords: Cc:
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: Runtime performance bug Difficulty: Unknown
Test Case: lib/integer/integerConstantFolding Blocked By:
Blocking: Related Tickets:

Description

GHC seems to lack constant folding for encodeFloat/decodeFloat. For many examples, compile the numeric-limits package on hackage, or just this snippet:

epsilon :: Double
epsilon = r
  where r = 1 - encodeFloat (m-1) e
        (m, e) = decodeFloat (1 `asTypeOf` r)

This has a very simple value, but GHC refuses to compute it at compile time. This in turn inhibits other constant folding that should be going on.

Change History

Changed 12 months ago by simonpj

  • difficulty set to Unknown

Would you like to propose the specific constant-folding rules that you believe should be implemented?

Changed 11 months ago by simonmar

  • owner set to igloo
  • priority changed from normal to high
  • milestone set to 7.6.1

It looks like we should have constant folding for:

encodeFloatInteger :: Integer -> Int# -> Float#
encodeDoubleInteger :: Integer -> Int# -> Double#

decodeDoubleInteger :: Double# -> (# Integer, Int# #)

doubleFromInteger :: Integer -> Double#
floatFromInteger :: Integer -> Float#

which should be easy enough with the new Integer literals. Ian, could you look into that?

Changed 11 months ago by igloo

  • status changed from new to closed
  • resolution set to fixed

This now works in HEAD.

Changed 11 months ago by simonpj

  • testcase set to lib/integer/integerConstantFolding
Note: See TracTickets for help on using tickets.