summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Jakobi <simon.jakobi@gmail.com>2022-04-24 00:48:30 +0200
committerSylvain Henry <sylvain@haskus.fr>2022-11-02 16:34:08 +0000
commitcba25862cd73fb0512a22c5efee4089aa71ae889 (patch)
tree3547021be31076ecb973112f028811aa4a3c80b9
parentd6a8c222fb0d7b10d6359a2663179203cdff37cd (diff)
downloadhaskell-wip/sjakobi/21176-integer-bits.tar.gz
Mark clearBit for Integer and integerClearBit[#] as INLINEwip/sjakobi/21176-integer-bits
This fixes T8832 which previously wasn't able to constant-fold the expression clearBit (bit 0) 0
-rw-r--r--libraries/base/GHC/Bits.hs1
-rw-r--r--libraries/ghc-bignum/src/GHC/Num/Integer.hs2
2 files changed, 3 insertions, 0 deletions
diff --git a/libraries/base/GHC/Bits.hs b/libraries/base/GHC/Bits.hs
index 0ea238b7bd..f35a72dc25 100644
--- a/libraries/base/GHC/Bits.hs
+++ b/libraries/base/GHC/Bits.hs
@@ -555,6 +555,7 @@ instance Bits Integer where
zeroBits = integerZero
setBit x i = integerSetBit x (fromIntegral i)
clearBit x i = integerClearBit x (fromIntegral i)
+ {-# INLINE clearBit #-}
complementBit x i = integerComplementBit x (fromIntegral i)
bit (I# i) = integerBit# (int2Word# i)
diff --git a/libraries/ghc-bignum/src/GHC/Num/Integer.hs b/libraries/ghc-bignum/src/GHC/Num/Integer.hs
index 4d72c258c7..ed9b684d39 100644
--- a/libraries/ghc-bignum/src/GHC/Num/Integer.hs
+++ b/libraries/ghc-bignum/src/GHC/Num/Integer.hs
@@ -617,6 +617,7 @@ integerSetBit !i (W# n) = integerSetBit# i n
--
-- @since 1.3
integerClearBit# :: Integer -> Word# -> Integer
+{-# INLINE integerClearBit# #-}
integerClearBit# n@(IS x) i
| isTrue# (i `ltWord#` (WORD_SIZE_IN_BITS## `minusWord#` 1##))
= IS (x `andI#` notI# (uncheckedIShiftL# 1# (word2Int# i)))
@@ -644,6 +645,7 @@ integerClearBit# (IN x) i = IN (bigNatAddWord#
--
-- @since 1.3
integerClearBit :: Integer -> Word -> Integer
+{-# INLINE integerClearBit #-}
integerClearBit !i (W# n) = integerClearBit# i n
-- | Reverse the /n/-th bit.