diff --git a/testsuite/tests/lib/integer/Makefile b/testsuite/tests/lib/integer/Makefile
index 9101fbd40ada5d47b499a48e62cb4ccd7f67ef71..1e2aa6eb9b187e76f4e380f36cbb0124235ef677 100644
--- a/testsuite/tests/lib/integer/Makefile
+++ b/testsuite/tests/lib/integer/Makefile
@@ -1,3 +1,26 @@
 TOP=../../..
 include $(TOP)/mk/boilerplate.mk
 include $(TOP)/mk/test.mk
+
+CHECK = grep -q -- '$1' integerConstantFolding.simpl || \
+        echo "$2 didn't constant fold"
+
+.PHONY: integerConstantFolding
+integerConstantFolding:
+	'$(TEST_HC)' -Wall -v0 -O --make integerConstantFolding -fforce-recomp -ddump-simpl > integerConstantFolding.simpl
+# All the 100nnn values should be constant-folded away
+	! grep -q '\<100[0-9][0-9][0-9]\>' integerConstantFolding.simpl || { echo "Unfolded values found"; grep '\<100[0-9][0-9][0-9]\>' integerConstantFolding.simpl; }
+	$(call CHECK,\<200007\>,plusInteger)
+	$(call CHECK,\<10001100030\>,timesInteger)
+	$(call CHECK,-991\>,minusIntegerN)
+	$(call CHECK,\<989\>,minusIntegerP)
+	$(call CHECK,-200011\>,negateInteger)
+	$(call CHECK,\<200019\>,absInteger)
+	$(call CHECK,\<50024\>,gcdInteger)
+	$(call CHECK,\<1001100300\>,lcmInteger)
+	$(call CHECK,\<532\>,andInteger)
+	$(call CHECK,\<239575\>,orInteger)
+	$(call CHECK,\<239041\>,xorInteger)
+	$(call CHECK,-200059\>,complementInteger)
+	./integerConstantFolding
+
diff --git a/testsuite/tests/lib/integer/all.T b/testsuite/tests/lib/integer/all.T
index a3568e7606dcd90c6778599a86cbb81d74f4ab4e..ecff8fb6ce34aa7025d42eda55ec1f36c27876ac 100644
--- a/testsuite/tests/lib/integer/all.T
+++ b/testsuite/tests/lib/integer/all.T
@@ -1,3 +1,7 @@
 test('integerBits', normal, compile_and_run, [''])
 test('integerConversions', normal, compile_and_run, [''])
+test('integerConstantFolding',
+     extra_clean(['integerConstantFolding.simpl']),
+     run_command,
+     ['$MAKE -s --no-print-directory integerConstantFolding'])
 
diff --git a/testsuite/tests/lib/integer/integerConstantFolding.hs b/testsuite/tests/lib/integer/integerConstantFolding.hs
new file mode 100644
index 0000000000000000000000000000000000000000..49fd1832bdc6cb993d703b888d7088f525361d82
--- /dev/null
+++ b/testsuite/tests/lib/integer/integerConstantFolding.hs
@@ -0,0 +1,137 @@
+
+module Main (main) where
+
+import Data.Bits
+
+main :: IO ()
+main = do p "plusInteger"        plusInteger
+          p "timesInteger"       timesInteger
+          p "minusIntegerN"      minusIntegerN
+          p "minusIntegerP"      minusIntegerP
+          p "negateInteger"      negateInteger
+          p "eqIntegerE"         eqIntegerE
+          p "eqIntegerN"         eqIntegerN
+          p "neqIntegerE"        neqIntegerE
+          p "neqIntegerN"        neqIntegerN
+          p "absIntegerP"        absIntegerP
+          p "absIntegerZ"        absIntegerZ
+          p "absIntegerN"        absIntegerN
+          p "signumIntegerP"    signumIntegerP
+          p "signumIntegerZ"    signumIntegerZ
+          p "signumIntegerN"    signumIntegerN
+          p "leIntegerL"        leIntegerL
+          p "leIntegerE"        leIntegerE
+          p "leIntegerG"        leIntegerG
+          p "gtIntegerL"        gtIntegerL
+          p "gtIntegerE"        gtIntegerE
+          p "gtIntegerG"        gtIntegerG
+          p "ltIntegerL"        ltIntegerL
+          p "ltIntegerE"        ltIntegerE
+          p "ltIntegerG"        ltIntegerG
+          p "geIntegerL"        geIntegerL
+          p "geIntegerE"        geIntegerE
+          p "geIntegerG"        geIntegerG
+          p "compareIntegerL"   compareIntegerL
+          p "compareIntegerE"   compareIntegerE
+          p "compareIntegerG"   compareIntegerG
+          p "gcdInteger"        gcdInteger
+          p "lcmInteger"        lcmInteger
+          p "andInteger"        andInteger
+          p "orInteger"         orInteger
+          p "xorInteger"        xorInteger
+          p "complementInteger" complementInteger
+
+    where p :: Show a => String -> a -> IO ()
+          p str x = putStrLn (str ++ ": " ++ show x)
+
+plusInteger :: Integer
+plusInteger = 100003 + 100004
+
+timesInteger :: Integer
+timesInteger = 100005 * 100006
+
+minusIntegerN :: Integer
+minusIntegerN = 100007 - 100998
+minusIntegerP :: Integer
+minusIntegerP = 100999 - 100010
+
+negateInteger :: Integer
+negateInteger = negate 200011
+
+eqIntegerE :: Bool
+eqIntegerE = (100012 :: Integer) == 100012
+eqIntegerN :: Bool
+eqIntegerN = (100013 :: Integer) == 100014
+
+neqIntegerE :: Bool
+neqIntegerE = (100015 :: Integer) /= 100015
+neqIntegerN :: Bool
+neqIntegerN = (100016 :: Integer) /= 100017
+
+absIntegerP :: Integer
+absIntegerP = abs 200018
+absIntegerZ :: Integer
+absIntegerZ = abs 0
+absIntegerN :: Integer
+absIntegerN = abs (-200019)
+
+signumIntegerP :: Integer
+signumIntegerP = signum 100020
+signumIntegerZ :: Integer
+signumIntegerZ = signum 0
+signumIntegerN :: Integer
+signumIntegerN = signum (-100021)
+
+leIntegerL :: Bool
+leIntegerL = (100022 :: Integer) <= 100023
+leIntegerE :: Bool
+leIntegerE = (100024 :: Integer) <= 100024
+leIntegerG :: Bool
+leIntegerG = (100026 :: Integer) <= 100025
+
+gtIntegerL :: Bool
+gtIntegerL = (100026 :: Integer) > 100027
+gtIntegerE :: Bool
+gtIntegerE = (100028 :: Integer) > 100028
+gtIntegerG :: Bool
+gtIntegerG = (100030 :: Integer) > 100031
+
+ltIntegerL :: Bool
+ltIntegerL = (100032 :: Integer) < 100033
+ltIntegerE :: Bool
+ltIntegerE = (100034 :: Integer) < 100034
+ltIntegerG :: Bool
+ltIntegerG = (100036 :: Integer) < 100035
+
+geIntegerL :: Bool
+geIntegerL = (100037 :: Integer) >= 100038
+geIntegerE :: Bool
+geIntegerE = (100039 :: Integer) >= 100039
+geIntegerG :: Bool
+geIntegerG = (100041 :: Integer) >= 100040
+
+compareIntegerL :: Ordering
+compareIntegerL = (100042 :: Integer) `compare` 100043
+compareIntegerE :: Ordering
+compareIntegerE = (100044 :: Integer) `compare` 100044
+compareIntegerG :: Ordering
+compareIntegerG = (100046 :: Integer) `compare` 100045
+
+gcdInteger :: Integer
+gcdInteger = 100048 `gcd` 150072
+
+lcmInteger :: Integer
+lcmInteger = 100050 `lcm` 100060
+
+andInteger :: Integer
+andInteger = 100052 .&. 140053
+
+orInteger :: Integer
+orInteger = 100054 .|. 140055
+
+xorInteger :: Integer
+xorInteger = 100056 `xor` 140057
+
+complementInteger :: Integer
+complementInteger = complement 200058
+
diff --git a/testsuite/tests/lib/integer/integerConstantFolding.stdout b/testsuite/tests/lib/integer/integerConstantFolding.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..a392ba18bcc0d1d6ce3740f13b25bec52cd92c34
--- /dev/null
+++ b/testsuite/tests/lib/integer/integerConstantFolding.stdout
@@ -0,0 +1,36 @@
+plusInteger: 200007
+timesInteger: 10001100030
+minusIntegerN: -991
+minusIntegerP: 989
+negateInteger: -200011
+eqIntegerE: True
+eqIntegerN: False
+neqIntegerE: False
+neqIntegerN: True
+absIntegerP: 200018
+absIntegerZ: 0
+absIntegerN: 200019
+signumIntegerP: 1
+signumIntegerZ: 0
+signumIntegerN: -1
+leIntegerL: True
+leIntegerE: True
+leIntegerG: False
+gtIntegerL: False
+gtIntegerE: False
+gtIntegerG: False
+ltIntegerL: True
+ltIntegerE: False
+ltIntegerG: False
+geIntegerL: False
+geIntegerE: True
+geIntegerG: True
+compareIntegerL: LT
+compareIntegerE: EQ
+compareIntegerG: GT
+gcdInteger: 50024
+lcmInteger: 1001100300
+andInteger: 532
+orInteger: 239575
+xorInteger: 239041
+complementInteger: -200059