Skip to content

Optimisations cause incorrect runtime result in Integer calculation

Summary

The following program

module Main where

import Numeric.Natural
  ( Natural )

a, q :: Natural
a = fromIntegral ( 18446744073709551616 :: Integer )
q = 18446744073709551616

main :: IO ()
main = print ( fromIntegral ( a `div` q ) :: Word )

runs into the following strange behaviour:

GHC 8.10 -O0

> main
1

GHC 8.10 -O1

> main
1

GHC 9.0 -O0

> main
1

GHC 9.0 -O1

> main
0

Tagging @hsyl20 as I expect him to know about what's going on.

Steps to reproduce

Simply run the above program with either ghc -O0 or ghc -O1 to get the different results.

Further remarks

Changing fromIntegral to fromInteger causes GHC 9.0 with optimisations to return the correct result, so it might be an incorrect rewrite rule involving fromIntegral?

Environment

On GHC 9.0.1, Windows 10 x64.

Edited by sheaf
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information