summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSylvain Henry <sylvain@haskus.fr>2021-10-07 11:20:36 +0200
committerMarge Bot <ben+marge-bot@smart-cactus.org>2021-10-20 17:49:07 -0400
commit0b575899eca29a89ff18d84e0daa63ec35358976 (patch)
treed0021e9d17ed2493e356e92f43186ec7d53e1f77
parent05b8a21884fb3b283acb7d148afc875a95f7752c (diff)
downloadhaskell-0b575899eca29a89ff18d84e0daa63ec35358976.tar.gz
Bignum: constant folding for bigNatCompareWord# (#20361)
-rw-r--r--compiler/GHC/Builtin/Names.hs4
-rw-r--r--compiler/GHC/Core/Opt/ConstantFold.hs5
-rw-r--r--libraries/ghc-bignum/src/GHC/Num/BigNat.hs1
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