diff options
author | Sylvain Henry <sylvain@haskus.fr> | 2021-10-07 11:20:36 +0200 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2021-10-20 17:49:07 -0400 |
commit | 0b575899eca29a89ff18d84e0daa63ec35358976 (patch) | |
tree | d0021e9d17ed2493e356e92f43186ec7d53e1f77 | |
parent | 05b8a21884fb3b283acb7d148afc875a95f7752c (diff) | |
download | haskell-0b575899eca29a89ff18d84e0daa63ec35358976.tar.gz |
Bignum: constant folding for bigNatCompareWord# (#20361)
-rw-r--r-- | compiler/GHC/Builtin/Names.hs | 4 | ||||
-rw-r--r-- | compiler/GHC/Core/Opt/ConstantFold.hs | 5 | ||||
-rw-r--r-- | libraries/ghc-bignum/src/GHC/Num/BigNat.hs | 1 |
3 files changed, 8 insertions, 2 deletions
diff --git a/compiler/GHC/Builtin/Names.hs b/compiler/GHC/Builtin/Names.hs index 5f02b8e42b..d60c8820a1 100644 --- a/compiler/GHC/Builtin/Names.hs +++ b/compiler/GHC/Builtin/Names.hs @@ -1213,6 +1213,7 @@ integerFromNaturalName , bignatFromWordListName , bignatEqName , bignatCompareName + , bignatCompareWordName :: Name bnbVarQual, bnnVarQual, bniVarQual :: String -> Unique -> Name @@ -1224,6 +1225,7 @@ bniVarQual str key = varQual gHC_NUM_INTEGER (fsLit str) key bignatFromWordListName = bnbVarQual "bigNatFromWordList#" bignatFromWordListIdKey bignatEqName = bnbVarQual "bigNatEq#" bignatEqIdKey bignatCompareName = bnbVarQual "bigNatCompare" bignatCompareIdKey +bignatCompareWordName = bnbVarQual "bigNatCompareWord#" bignatCompareWordIdKey naturalToWordName = bnnVarQual "naturalToWord#" naturalToWordIdKey naturalPopCountName = bnnVarQual "naturalPopCount#" naturalPopCountIdKey @@ -2599,6 +2601,7 @@ integerFromNaturalIdKey , bignatFromWordListIdKey , bignatEqIdKey , bignatCompareIdKey + , bignatCompareWordIdKey :: Unique integerFromNaturalIdKey = mkPreludeMiscIdUnique 600 @@ -2674,6 +2677,7 @@ naturalSizeInBaseIdKey = mkPreludeMiscIdUnique 684 bignatFromWordListIdKey = mkPreludeMiscIdUnique 690 bignatEqIdKey = mkPreludeMiscIdUnique 691 bignatCompareIdKey = mkPreludeMiscIdUnique 692 +bignatCompareWordIdKey = mkPreludeMiscIdUnique 693 ------------------------------------------------------ diff --git a/compiler/GHC/Core/Opt/ConstantFold.hs b/compiler/GHC/Core/Opt/ConstantFold.hs index 26adc68efe..58887cf8e1 100644 --- a/compiler/GHC/Core/Opt/ConstantFold.hs +++ b/compiler/GHC/Core/Opt/ConstantFold.hs @@ -2064,8 +2064,9 @@ builtinBignumRules = , bignum_bin_pred "bigNatEq#" bignatEqName (==) -- comparisons (return an Ordering) - , bignum_compare "integerCompare" integerCompareName - , bignum_compare "bignatCompare" bignatCompareName + , bignum_compare "integerCompare" integerCompareName + , bignum_compare "bignatCompare" bignatCompareName + , bignum_compare "bignatCompareWord#" bignatCompareWordName -- binary operations , integer_binop "integerAdd" integerAddName (+) diff --git a/libraries/ghc-bignum/src/GHC/Num/BigNat.hs b/libraries/ghc-bignum/src/GHC/Num/BigNat.hs index b6afc533fb..fa8b84eccd 100644 --- a/libraries/ghc-bignum/src/GHC/Num/BigNat.hs +++ b/libraries/ghc-bignum/src/GHC/Num/BigNat.hs @@ -332,6 +332,7 @@ bigNatNe a b = isTrue# (bigNatNe# a b) -- | Compare a BigNat and a Word# bigNatCompareWord# :: BigNat# -> Word# -> Ordering +{-# NOINLINE bigNatCompareWord# #-} bigNatCompareWord# a b | bigNatIsZero a = cmpW# 0## b | isTrue# (wordArraySize# a ># 1#) = GT |