Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC
Commits:
bd38b76c by Cheng Shao at 2025-12-18T13:20:31-05:00
testsuite: improve coverage of foundation test
This patch refactors the `foundation` test a bit to improve coverage:
- Instead of using a hard-coded seed, a random seed is now taken from
the command line, and printed upon test failure. This improves test
coverage over many future CI runs, and shall a failure occur, the
seed is available in the CI log for local reproduction.
- The iterations count is bumped to 1000 instead of 100, similar to
the bump in `test-primops`. Runtime timeout is bumped 2x just to be
safe.
- Improve `newLCGGen` by using non-atomic loads/stores on a
`MutableByteArray#` for storing mutable `Word64`, this test doesn't
use parallelism in the first place
- Fixed a few compiler warnings and removed redundant pragmas and
imports
Co-authored-by: Codex
- - - - -
3 changed files:
- testsuite/tests/numeric/should_run/all.T
- testsuite/tests/numeric/should_run/foundation.hs
- testsuite/tests/numeric/should_run/foundation.stdout
Changes:
=====================================
testsuite/tests/numeric/should_run/all.T
=====================================
@@ -3,6 +3,8 @@
# extra run flags
# expected process return value, if not zero
+import random
+
test('arith001', normal, compile_and_run, [''])
test('arith002', normal, compile_and_run, [''])
test('arith003', normal, compile_and_run, [''])
@@ -82,7 +84,7 @@ test('IntegerToFloat', normal, compile_and_run, [''])
test('T20291', normal, compile_and_run, [''])
test('T22282', normal, compile_and_run, [''])
test('T22671', js_fragile(24259), compile_and_run, [''])
-test('foundation', [when(js_arch(), run_timeout_multiplier(2)), js_fragile(24259), extra_ways(['optasm','ghci','ghci-opt'])], compile_and_run, ['-package transformers -fno-break-points'])
+test('foundation', [run_timeout_multiplier(2), js_fragile(24259), extra_ways(['optasm','ghci','ghci-opt']), extra_run_opts(str(random.getrandbits(64)))], compile_and_run, ['-fno-break-points'])
test('T24066', normal, compile_and_run, [''])
test('div01', normal, compile_and_run, [''])
test('T24245', normal, compile_and_run, [''])
=====================================
testsuite/tests/numeric/should_run/foundation.hs
=====================================
@@ -10,9 +10,7 @@
compare the result of the primop wrappers with the results of interpretation.
-}
-{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeAbstractions #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DerivingStrategies #-}
@@ -25,28 +23,23 @@ module Main
( main
) where
+import Data.Array.Byte
import Data.Bits (Bits((.&.), bit), FiniteBits, finiteBitSize)
import Data.Word
import Data.Int
import GHC.Natural
import Data.Typeable
-import Data.Proxy
import GHC.Int
import GHC.Word
-import GHC.Word
import Data.Function
import GHC.Prim
import Control.Monad.Reader
-import System.IO
-import Foreign.Marshal.Alloc
-import Foreign.Storable
-import Foreign.Ptr
import Data.List (intercalate)
-import Data.IORef
+import System.Environment (getArgs)
+import Text.Read (readMaybe)
import Unsafe.Coerce
import GHC.Types
import Data.Char
-import Data.Semigroup
import System.Exit
import qualified GHC.Internal.PrimopWrappers as Wrapper
@@ -194,11 +187,16 @@ newtype LCGGen = LCGGen { randomWord64 :: IO Word64 }
data LCGParams = LCGParams { seed :: Word64, a :: Word64, c :: Word64, m :: Word64 }
newLCGGen :: LCGParams -> IO LCGGen
-newLCGGen LCGParams{..} = do
- var <- newIORef (fromIntegral seed)
- return $ LCGGen $ do
- atomicModifyIORef' var (\old_v -> let new_val = (old_v * a + c) `mod` m in (new_val, new_val))
-
+newLCGGen LCGParams {seed = W64# seed#, ..} = do
+ MutableByteArray mba# <- IO $ \s0 -> case newByteArray# 8# s0 of
+ (# s1, mba# #) -> case writeWord64Array# mba# 0# seed# s1 of
+ s2 -> (# s2, MutableByteArray mba# #)
+ pure $ LCGGen $ IO $ \s0 -> case readWord64Array# mba# 0# s0 of
+ (# s1, old_val# #) ->
+ let old_val = W64# old_val#
+ !new_val@(W64# new_val#) = (old_val * a + c) `mod` m
+ in case writeWord64Array# mba# 0# new_val# s1 of
+ s2 -> (# s2, new_val #)
runPropertyCheck (PropertyBinaryOp res desc s1 s2) =
if res then return Success
@@ -211,7 +209,7 @@ runPropertyCheck (PropertyAnd a1 a2) = (<>) <$> runPropertyCheck a1 <*> runPrope
runProperty :: Property -> ReaderT RunS IO Result
runProperty (Prop p) = do
- let iterations = 100
+ let iterations = 1000 :: Int
loop iterations iterations
where
loop iterations 0 = do
@@ -257,14 +255,15 @@ runTestInternal (Property name p) = do
nest label $ runProperty (property p)
-runTests :: Test -> IO ()
-runTests t = do
+runTests :: Word64 -> Test -> IO ()
+runTests seed t = do
-- These params are the same ones as glibc uses.
- h <- newLCGGen (LCGParams { seed = 1238123213, m = 2^31, a = 1103515245, c = 12345 })
+ h <- newLCGGen (LCGParams { seed, m = 2 ^ (31 :: Int), a = 1103515245, c = 12345 })
res <- runReaderT (runTestInternal t) (RunS 0 h [])
case res of
Success -> return ()
Failure tests -> do
+ putStrLn $ "Seed: " ++ show seed
putStrLn $ "These tests failed: \n" ++ intercalate " \n" (map (showStack 0 . reverse) tests)
exitFailure
@@ -455,7 +454,19 @@ instance TestPrimop LowerBitsAreDefined where
twoNonZero :: (a -> a -> b) -> a -> NonZero a -> b
twoNonZero f x (NonZero y) = f x y
-main = runTests (Group "ALL" [testNumberRefs, testPrimops])
+getSeedFromArgs :: IO Word64
+getSeedFromArgs = do
+ args <- getArgs
+ case args of
+ [arg] -> case readMaybe arg of
+ Just seed -> pure seed
+ Nothing -> die $ "Invalid seed (expected Word64): " ++ show arg
+ _ -> die "Usage: foundation <seed>"
+
+main :: IO ()
+main = do
+ seed <- getSeedFromArgs
+ runTests seed (Group "ALL" [testNumberRefs, testPrimops])
-- Test an interpreted primop vs a compiled primop
testPrimops = Group "primop"
=====================================
testsuite/tests/numeric/should_run/foundation.stdout
=====================================
@@ -3,1048 +3,1048 @@ Group ALL
Group Int
Group Integral
Running FromIntegral(Integer(a)) == a
- Passed 100 iterations
+ Passed 1000 iterations
Group Property
Running Eq
- Passed 100 iterations
+ Passed 1000 iterations
Running Show
- Passed 100 iterations
+ Passed 1000 iterations
Running Ord
- Passed 100 iterations
+ Passed 1000 iterations
Running <
- Passed 100 iterations
+ Passed 1000 iterations
Group Additive
Running a + azero == a
- Passed 100 iterations
+ Passed 1000 iterations
Running azero + a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running a + b == b + a
- Passed 100 iterations
+ Passed 1000 iterations
Group Multiplicative
Running a * 1 == a
- Passed 100 iterations
+ Passed 1000 iterations
Running 1 * a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running multiplication commutative
- Passed 100 iterations
+ Passed 1000 iterations
Running a * b == Integer(a) * Integer(b)
- Passed 100 iterations
+ Passed 1000 iterations
Group Divisible
Running (x `div` y) * y + (x `mod` y) == x
- Passed 100 iterations
+ Passed 1000 iterations
Group Precedence
Running + and - (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and - (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (2)
- Passed 100 iterations
+ Passed 1000 iterations
Group Int8
Group Integral
Running FromIntegral(Integer(a)) == a
- Passed 100 iterations
+ Passed 1000 iterations
Group Property
Running Eq
- Passed 100 iterations
+ Passed 1000 iterations
Running Show
- Passed 100 iterations
+ Passed 1000 iterations
Running Ord
- Passed 100 iterations
+ Passed 1000 iterations
Running <
- Passed 100 iterations
+ Passed 1000 iterations
Group Additive
Running a + azero == a
- Passed 100 iterations
+ Passed 1000 iterations
Running azero + a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running a + b == b + a
- Passed 100 iterations
+ Passed 1000 iterations
Group Multiplicative
Running a * 1 == a
- Passed 100 iterations
+ Passed 1000 iterations
Running 1 * a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running multiplication commutative
- Passed 100 iterations
+ Passed 1000 iterations
Running a * b == Integer(a) * Integer(b)
- Passed 100 iterations
+ Passed 1000 iterations
Group Divisible
Running (x `div` y) * y + (x `mod` y) == x
- Passed 100 iterations
+ Passed 1000 iterations
Group Precedence
Running + and - (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and - (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (2)
- Passed 100 iterations
+ Passed 1000 iterations
Group Int16
Group Integral
Running FromIntegral(Integer(a)) == a
- Passed 100 iterations
+ Passed 1000 iterations
Group Property
Running Eq
- Passed 100 iterations
+ Passed 1000 iterations
Running Show
- Passed 100 iterations
+ Passed 1000 iterations
Running Ord
- Passed 100 iterations
+ Passed 1000 iterations
Running <
- Passed 100 iterations
+ Passed 1000 iterations
Group Additive
Running a + azero == a
- Passed 100 iterations
+ Passed 1000 iterations
Running azero + a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running a + b == b + a
- Passed 100 iterations
+ Passed 1000 iterations
Group Multiplicative
Running a * 1 == a
- Passed 100 iterations
+ Passed 1000 iterations
Running 1 * a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running multiplication commutative
- Passed 100 iterations
+ Passed 1000 iterations
Running a * b == Integer(a) * Integer(b)
- Passed 100 iterations
+ Passed 1000 iterations
Group Divisible
Running (x `div` y) * y + (x `mod` y) == x
- Passed 100 iterations
+ Passed 1000 iterations
Group Precedence
Running + and - (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and - (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (2)
- Passed 100 iterations
+ Passed 1000 iterations
Group Int32
Group Integral
Running FromIntegral(Integer(a)) == a
- Passed 100 iterations
+ Passed 1000 iterations
Group Property
Running Eq
- Passed 100 iterations
+ Passed 1000 iterations
Running Show
- Passed 100 iterations
+ Passed 1000 iterations
Running Ord
- Passed 100 iterations
+ Passed 1000 iterations
Running <
- Passed 100 iterations
+ Passed 1000 iterations
Group Additive
Running a + azero == a
- Passed 100 iterations
+ Passed 1000 iterations
Running azero + a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running a + b == b + a
- Passed 100 iterations
+ Passed 1000 iterations
Group Multiplicative
Running a * 1 == a
- Passed 100 iterations
+ Passed 1000 iterations
Running 1 * a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running multiplication commutative
- Passed 100 iterations
+ Passed 1000 iterations
Running a * b == Integer(a) * Integer(b)
- Passed 100 iterations
+ Passed 1000 iterations
Group Divisible
Running (x `div` y) * y + (x `mod` y) == x
- Passed 100 iterations
+ Passed 1000 iterations
Group Precedence
Running + and - (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and - (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (2)
- Passed 100 iterations
+ Passed 1000 iterations
Group Int64
Group Integral
Running FromIntegral(Integer(a)) == a
- Passed 100 iterations
+ Passed 1000 iterations
Group Property
Running Eq
- Passed 100 iterations
+ Passed 1000 iterations
Running Show
- Passed 100 iterations
+ Passed 1000 iterations
Running Ord
- Passed 100 iterations
+ Passed 1000 iterations
Running <
- Passed 100 iterations
+ Passed 1000 iterations
Group Additive
Running a + azero == a
- Passed 100 iterations
+ Passed 1000 iterations
Running azero + a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running a + b == b + a
- Passed 100 iterations
+ Passed 1000 iterations
Group Multiplicative
Running a * 1 == a
- Passed 100 iterations
+ Passed 1000 iterations
Running 1 * a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running multiplication commutative
- Passed 100 iterations
+ Passed 1000 iterations
Running a * b == Integer(a) * Integer(b)
- Passed 100 iterations
+ Passed 1000 iterations
Group Divisible
Running (x `div` y) * y + (x `mod` y) == x
- Passed 100 iterations
+ Passed 1000 iterations
Group Precedence
Running + and - (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and - (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (2)
- Passed 100 iterations
+ Passed 1000 iterations
Group Integer
Group Integral
Running FromIntegral(Integer(a)) == a
- Passed 100 iterations
+ Passed 1000 iterations
Group Property
Running Eq
- Passed 100 iterations
+ Passed 1000 iterations
Running Show
- Passed 100 iterations
+ Passed 1000 iterations
Running Ord
- Passed 100 iterations
+ Passed 1000 iterations
Running <
- Passed 100 iterations
+ Passed 1000 iterations
Group Additive
Running a + azero == a
- Passed 100 iterations
+ Passed 1000 iterations
Running azero + a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running a + b == b + a
- Passed 100 iterations
+ Passed 1000 iterations
Group Multiplicative
Running a * 1 == a
- Passed 100 iterations
+ Passed 1000 iterations
Running 1 * a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running multiplication commutative
- Passed 100 iterations
+ Passed 1000 iterations
Running a * b == Integer(a) * Integer(b)
- Passed 100 iterations
+ Passed 1000 iterations
Group Divisible
Running (x `div` y) * y + (x `mod` y) == x
- Passed 100 iterations
+ Passed 1000 iterations
Group Precedence
Running + and - (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and - (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (2)
- Passed 100 iterations
+ Passed 1000 iterations
Group Word
Group Integral
Running FromIntegral(Integer(a)) == a
- Passed 100 iterations
+ Passed 1000 iterations
Group Property
Running Eq
- Passed 100 iterations
+ Passed 1000 iterations
Running Show
- Passed 100 iterations
+ Passed 1000 iterations
Running Ord
- Passed 100 iterations
+ Passed 1000 iterations
Running <
- Passed 100 iterations
+ Passed 1000 iterations
Group Additive
Running a + azero == a
- Passed 100 iterations
+ Passed 1000 iterations
Running azero + a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running a + b == b + a
- Passed 100 iterations
+ Passed 1000 iterations
Group Multiplicative
Running a * 1 == a
- Passed 100 iterations
+ Passed 1000 iterations
Running 1 * a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running multiplication commutative
- Passed 100 iterations
+ Passed 1000 iterations
Running a * b == Integer(a) * Integer(b)
- Passed 100 iterations
+ Passed 1000 iterations
Group Divisible
Running (x `div` y) * y + (x `mod` y) == x
- Passed 100 iterations
+ Passed 1000 iterations
Group Precedence
Running + and - (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and - (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (2)
- Passed 100 iterations
+ Passed 1000 iterations
Group Word8
Group Integral
Running FromIntegral(Integer(a)) == a
- Passed 100 iterations
+ Passed 1000 iterations
Group Property
Running Eq
- Passed 100 iterations
+ Passed 1000 iterations
Running Show
- Passed 100 iterations
+ Passed 1000 iterations
Running Ord
- Passed 100 iterations
+ Passed 1000 iterations
Running <
- Passed 100 iterations
+ Passed 1000 iterations
Group Additive
Running a + azero == a
- Passed 100 iterations
+ Passed 1000 iterations
Running azero + a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running a + b == b + a
- Passed 100 iterations
+ Passed 1000 iterations
Group Multiplicative
Running a * 1 == a
- Passed 100 iterations
+ Passed 1000 iterations
Running 1 * a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running multiplication commutative
- Passed 100 iterations
+ Passed 1000 iterations
Running a * b == Integer(a) * Integer(b)
- Passed 100 iterations
+ Passed 1000 iterations
Group Divisible
Running (x `div` y) * y + (x `mod` y) == x
- Passed 100 iterations
+ Passed 1000 iterations
Group Precedence
Running + and - (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and - (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (2)
- Passed 100 iterations
+ Passed 1000 iterations
Group Word16
Group Integral
Running FromIntegral(Integer(a)) == a
- Passed 100 iterations
+ Passed 1000 iterations
Group Property
Running Eq
- Passed 100 iterations
+ Passed 1000 iterations
Running Show
- Passed 100 iterations
+ Passed 1000 iterations
Running Ord
- Passed 100 iterations
+ Passed 1000 iterations
Running <
- Passed 100 iterations
+ Passed 1000 iterations
Group Additive
Running a + azero == a
- Passed 100 iterations
+ Passed 1000 iterations
Running azero + a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running a + b == b + a
- Passed 100 iterations
+ Passed 1000 iterations
Group Multiplicative
Running a * 1 == a
- Passed 100 iterations
+ Passed 1000 iterations
Running 1 * a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running multiplication commutative
- Passed 100 iterations
+ Passed 1000 iterations
Running a * b == Integer(a) * Integer(b)
- Passed 100 iterations
+ Passed 1000 iterations
Group Divisible
Running (x `div` y) * y + (x `mod` y) == x
- Passed 100 iterations
+ Passed 1000 iterations
Group Precedence
Running + and - (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and - (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (2)
- Passed 100 iterations
+ Passed 1000 iterations
Group Word32
Group Integral
Running FromIntegral(Integer(a)) == a
- Passed 100 iterations
+ Passed 1000 iterations
Group Property
Running Eq
- Passed 100 iterations
+ Passed 1000 iterations
Running Show
- Passed 100 iterations
+ Passed 1000 iterations
Running Ord
- Passed 100 iterations
+ Passed 1000 iterations
Running <
- Passed 100 iterations
+ Passed 1000 iterations
Group Additive
Running a + azero == a
- Passed 100 iterations
+ Passed 1000 iterations
Running azero + a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running a + b == b + a
- Passed 100 iterations
+ Passed 1000 iterations
Group Multiplicative
Running a * 1 == a
- Passed 100 iterations
+ Passed 1000 iterations
Running 1 * a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running multiplication commutative
- Passed 100 iterations
+ Passed 1000 iterations
Running a * b == Integer(a) * Integer(b)
- Passed 100 iterations
+ Passed 1000 iterations
Group Divisible
Running (x `div` y) * y + (x `mod` y) == x
- Passed 100 iterations
+ Passed 1000 iterations
Group Precedence
Running + and - (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and - (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (2)
- Passed 100 iterations
+ Passed 1000 iterations
Group Word64
Group Integral
Running FromIntegral(Integer(a)) == a
- Passed 100 iterations
+ Passed 1000 iterations
Group Property
Running Eq
- Passed 100 iterations
+ Passed 1000 iterations
Running Show
- Passed 100 iterations
+ Passed 1000 iterations
Running Ord
- Passed 100 iterations
+ Passed 1000 iterations
Running <
- Passed 100 iterations
+ Passed 1000 iterations
Group Additive
Running a + azero == a
- Passed 100 iterations
+ Passed 1000 iterations
Running azero + a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running a + b == b + a
- Passed 100 iterations
+ Passed 1000 iterations
Group Multiplicative
Running a * 1 == a
- Passed 100 iterations
+ Passed 1000 iterations
Running 1 * a == a
- Passed 100 iterations
+ Passed 1000 iterations
Running multiplication commutative
- Passed 100 iterations
+ Passed 1000 iterations
Running a * b == Integer(a) * Integer(b)
- Passed 100 iterations
+ Passed 1000 iterations
Group Divisible
Running (x `div` y) * y + (x `mod` y) == x
- Passed 100 iterations
+ Passed 1000 iterations
Group Precedence
Running + and - (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and - (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running + and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running - and * (2)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (1)
- Passed 100 iterations
+ Passed 1000 iterations
Running * and ^ (2)
- Passed 100 iterations
+ Passed 1000 iterations
Group primop
Running gtChar#
- Passed 100 iterations
+ Passed 1000 iterations
Running geChar#
- Passed 100 iterations
+ Passed 1000 iterations
Running eqChar#
- Passed 100 iterations
+ Passed 1000 iterations
Running neChar#
- Passed 100 iterations
+ Passed 1000 iterations
Running ltChar#
- Passed 100 iterations
+ Passed 1000 iterations
Running leChar#
- Passed 100 iterations
+ Passed 1000 iterations
Running ord#
- Passed 100 iterations
+ Passed 1000 iterations
Running int8ToInt#
- Passed 100 iterations
+ Passed 1000 iterations
Running intToInt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running negateInt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running plusInt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running subInt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running timesInt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running quotInt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running remInt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running quotRemInt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftLInt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftRAInt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftRLInt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running int8ToWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running eqInt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running geInt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running gtInt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running leInt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running ltInt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running neInt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running word8ToWord#
- Passed 100 iterations
+ Passed 1000 iterations
Running wordToWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running plusWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running subWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running timesWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running quotWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running remWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running quotRemWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running andWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running orWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running xorWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running notWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftLWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftRLWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running word8ToInt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running eqWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running geWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running gtWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running leWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running ltWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running neWord8#
- Passed 100 iterations
+ Passed 1000 iterations
Running int16ToInt#
- Passed 100 iterations
+ Passed 1000 iterations
Running intToInt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running negateInt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running plusInt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running subInt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running timesInt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running quotInt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running remInt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running quotRemInt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftLInt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftRAInt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftRLInt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running int16ToWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running eqInt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running geInt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running gtInt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running leInt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running ltInt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running neInt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running word16ToWord#
- Passed 100 iterations
+ Passed 1000 iterations
Running wordToWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running plusWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running subWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running timesWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running quotWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running remWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running quotRemWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running andWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running orWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running xorWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running notWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftLWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftRLWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running word16ToInt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running eqWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running geWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running gtWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running leWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running ltWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running neWord16#
- Passed 100 iterations
+ Passed 1000 iterations
Running int32ToInt#
- Passed 100 iterations
+ Passed 1000 iterations
Running intToInt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running negateInt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running plusInt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running subInt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running timesInt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running quotInt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running remInt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running quotRemInt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftLInt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftRAInt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftRLInt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running int32ToWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running eqInt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running geInt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running gtInt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running leInt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running ltInt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running neInt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running word32ToWord#
- Passed 100 iterations
+ Passed 1000 iterations
Running wordToWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running plusWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running subWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running timesWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running quotWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running remWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running quotRemWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running andWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running orWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running xorWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running notWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftLWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftRLWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running word32ToInt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running eqWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running geWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running gtWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running leWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running ltWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running neWord32#
- Passed 100 iterations
+ Passed 1000 iterations
Running int64ToInt#
- Passed 100 iterations
+ Passed 1000 iterations
Running intToInt64#
- Passed 100 iterations
+ Passed 1000 iterations
Running negateInt64#
- Passed 100 iterations
+ Passed 1000 iterations
Running plusInt64#
- Passed 100 iterations
+ Passed 1000 iterations
Running subInt64#
- Passed 100 iterations
+ Passed 1000 iterations
Running timesInt64#
- Passed 100 iterations
+ Passed 1000 iterations
Running quotInt64#
- Passed 100 iterations
+ Passed 1000 iterations
Running remInt64#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedIShiftL64#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedIShiftRA64#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedIShiftRL64#
- Passed 100 iterations
+ Passed 1000 iterations
Running int64ToWord64#
- Passed 100 iterations
+ Passed 1000 iterations
Running eqInt64#
- Passed 100 iterations
+ Passed 1000 iterations
Running geInt64#
- Passed 100 iterations
+ Passed 1000 iterations
Running gtInt64#
- Passed 100 iterations
+ Passed 1000 iterations
Running leInt64#
- Passed 100 iterations
+ Passed 1000 iterations
Running ltInt64#
- Passed 100 iterations
+ Passed 1000 iterations
Running neInt64#
- Passed 100 iterations
+ Passed 1000 iterations
Running word64ToWord#
- Passed 100 iterations
+ Passed 1000 iterations
Running wordToWord64#
- Passed 100 iterations
+ Passed 1000 iterations
Running plusWord64#
- Passed 100 iterations
+ Passed 1000 iterations
Running subWord64#
- Passed 100 iterations
+ Passed 1000 iterations
Running timesWord64#
- Passed 100 iterations
+ Passed 1000 iterations
Running quotWord64#
- Passed 100 iterations
+ Passed 1000 iterations
Running remWord64#
- Passed 100 iterations
+ Passed 1000 iterations
Running and64#
- Passed 100 iterations
+ Passed 1000 iterations
Running or64#
- Passed 100 iterations
+ Passed 1000 iterations
Running xor64#
- Passed 100 iterations
+ Passed 1000 iterations
Running not64#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftL64#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftRL64#
- Passed 100 iterations
+ Passed 1000 iterations
Running word64ToInt64#
- Passed 100 iterations
+ Passed 1000 iterations
Running eqWord64#
- Passed 100 iterations
+ Passed 1000 iterations
Running geWord64#
- Passed 100 iterations
+ Passed 1000 iterations
Running gtWord64#
- Passed 100 iterations
+ Passed 1000 iterations
Running leWord64#
- Passed 100 iterations
+ Passed 1000 iterations
Running ltWord64#
- Passed 100 iterations
+ Passed 1000 iterations
Running neWord64#
- Passed 100 iterations
+ Passed 1000 iterations
Running +#
- Passed 100 iterations
+ Passed 1000 iterations
Running -#
- Passed 100 iterations
+ Passed 1000 iterations
Running *#
- Passed 100 iterations
+ Passed 1000 iterations
Running timesInt2#
- Passed 100 iterations
+ Passed 1000 iterations
Running mulIntMayOflo#
- Passed 100 iterations
+ Passed 1000 iterations
Running quotInt#
- Passed 100 iterations
+ Passed 1000 iterations
Running remInt#
- Passed 100 iterations
+ Passed 1000 iterations
Running quotRemInt#
- Passed 100 iterations
+ Passed 1000 iterations
Running andI#
- Passed 100 iterations
+ Passed 1000 iterations
Running orI#
- Passed 100 iterations
+ Passed 1000 iterations
Running xorI#
- Passed 100 iterations
+ Passed 1000 iterations
Running notI#
- Passed 100 iterations
+ Passed 1000 iterations
Running negateInt#
- Passed 100 iterations
+ Passed 1000 iterations
Running addIntC#
- Passed 100 iterations
+ Passed 1000 iterations
Running subIntC#
- Passed 100 iterations
+ Passed 1000 iterations
Running >#
- Passed 100 iterations
+ Passed 1000 iterations
Running >=#
- Passed 100 iterations
+ Passed 1000 iterations
Running ==#
- Passed 100 iterations
+ Passed 1000 iterations
Running /=#
- Passed 100 iterations
+ Passed 1000 iterations
Running <#
- Passed 100 iterations
+ Passed 1000 iterations
Running <=#
- Passed 100 iterations
+ Passed 1000 iterations
Running chr#
- Passed 100 iterations
+ Passed 1000 iterations
Running int2Word#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedIShiftL#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedIShiftRA#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedIShiftRL#
- Passed 100 iterations
+ Passed 1000 iterations
Running plusWord#
- Passed 100 iterations
+ Passed 1000 iterations
Running addWordC#
- Passed 100 iterations
+ Passed 1000 iterations
Running subWordC#
- Passed 100 iterations
+ Passed 1000 iterations
Running plusWord2#
- Passed 100 iterations
+ Passed 1000 iterations
Running minusWord#
- Passed 100 iterations
+ Passed 1000 iterations
Running timesWord#
- Passed 100 iterations
+ Passed 1000 iterations
Running timesWord2#
- Passed 100 iterations
+ Passed 1000 iterations
Running quotWord#
- Passed 100 iterations
+ Passed 1000 iterations
Running remWord#
- Passed 100 iterations
+ Passed 1000 iterations
Running quotRemWord#
- Passed 100 iterations
+ Passed 1000 iterations
Running and#
- Passed 100 iterations
+ Passed 1000 iterations
Running or#
- Passed 100 iterations
+ Passed 1000 iterations
Running xor#
- Passed 100 iterations
+ Passed 1000 iterations
Running not#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftL#
- Passed 100 iterations
+ Passed 1000 iterations
Running uncheckedShiftRL#
- Passed 100 iterations
+ Passed 1000 iterations
Running word2Int#
- Passed 100 iterations
+ Passed 1000 iterations
Running gtWord#
- Passed 100 iterations
+ Passed 1000 iterations
Running geWord#
- Passed 100 iterations
+ Passed 1000 iterations
Running eqWord#
- Passed 100 iterations
+ Passed 1000 iterations
Running neWord#
- Passed 100 iterations
+ Passed 1000 iterations
Running ltWord#
- Passed 100 iterations
+ Passed 1000 iterations
Running leWord#
- Passed 100 iterations
+ Passed 1000 iterations
Running popCnt8#
- Passed 100 iterations
+ Passed 1000 iterations
Running popCnt16#
- Passed 100 iterations
+ Passed 1000 iterations
Running popCnt32#
- Passed 100 iterations
+ Passed 1000 iterations
Running popCnt64#
- Passed 100 iterations
+ Passed 1000 iterations
Running popCnt#
- Passed 100 iterations
+ Passed 1000 iterations
Running pdep8#
- Passed 100 iterations
+ Passed 1000 iterations
Running pdep16#
- Passed 100 iterations
+ Passed 1000 iterations
Running pdep32#
- Passed 100 iterations
+ Passed 1000 iterations
Running pdep64#
- Passed 100 iterations
+ Passed 1000 iterations
Running pdep#
- Passed 100 iterations
+ Passed 1000 iterations
Running pext8#
- Passed 100 iterations
+ Passed 1000 iterations
Running pext16#
- Passed 100 iterations
+ Passed 1000 iterations
Running pext32#
- Passed 100 iterations
+ Passed 1000 iterations
Running pext64#
- Passed 100 iterations
+ Passed 1000 iterations
Running pext#
- Passed 100 iterations
+ Passed 1000 iterations
Running clz8#
- Passed 100 iterations
+ Passed 1000 iterations
Running clz16#
- Passed 100 iterations
+ Passed 1000 iterations
Running clz32#
- Passed 100 iterations
+ Passed 1000 iterations
Running clz64#
- Passed 100 iterations
+ Passed 1000 iterations
Running clz#
- Passed 100 iterations
+ Passed 1000 iterations
Running ctz8#
- Passed 100 iterations
+ Passed 1000 iterations
Running ctz16#
- Passed 100 iterations
+ Passed 1000 iterations
Running ctz32#
- Passed 100 iterations
+ Passed 1000 iterations
Running ctz64#
- Passed 100 iterations
+ Passed 1000 iterations
Running ctz#
- Passed 100 iterations
+ Passed 1000 iterations
Running byteSwap16#
- Passed 100 iterations
+ Passed 1000 iterations
Running byteSwap32#
- Passed 100 iterations
+ Passed 1000 iterations
Running byteSwap64#
- Passed 100 iterations
+ Passed 1000 iterations
Running byteSwap#
- Passed 100 iterations
+ Passed 1000 iterations
Running bitReverse8#
- Passed 100 iterations
+ Passed 1000 iterations
Running bitReverse16#
- Passed 100 iterations
+ Passed 1000 iterations
Running bitReverse32#
- Passed 100 iterations
+ Passed 1000 iterations
Running bitReverse64#
- Passed 100 iterations
+ Passed 1000 iterations
Running bitReverse#
- Passed 100 iterations
+ Passed 1000 iterations
Running narrow8Int#
- Passed 100 iterations
+ Passed 1000 iterations
Running narrow16Int#
- Passed 100 iterations
+ Passed 1000 iterations
Running narrow32Int#
- Passed 100 iterations
+ Passed 1000 iterations
Running narrow8Word#
- Passed 100 iterations
+ Passed 1000 iterations
Running narrow16Word#
- Passed 100 iterations
+ Passed 1000 iterations
Running narrow32Word#
- Passed 100 iterations
+ Passed 1000 iterations
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/bd38b76cff47bcb27d737b15f8ad0972...
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/bd38b76cff47bcb27d737b15f8ad0972...
You're receiving this email because of your account on gitlab.haskell.org.