From e5523324d2c55e0091857e21bf5613b5f6b442a7 Mon Sep 17 00:00:00 2001
From: Sylvain Henry <sylvain@haskus.fr>
Date: Wed, 30 Sep 2020 19:26:02 +0200
Subject: [PATCH] Bignum: add integerNegate RULE

---
 libraries/ghc-bignum/src/GHC/Num/Integer.hs      |  3 +++
 testsuite/tests/lib/integer/all.T                |  1 +
 testsuite/tests/lib/integer/integerNegate.hs     |  8 ++++++++
 testsuite/tests/lib/integer/integerNegate.stderr | 10 ++++++++++
 4 files changed, 22 insertions(+)
 create mode 100644 testsuite/tests/lib/integer/integerNegate.hs
 create mode 100644 testsuite/tests/lib/integer/integerNegate.stderr

diff --git a/libraries/ghc-bignum/src/GHC/Num/Integer.hs b/libraries/ghc-bignum/src/GHC/Num/Integer.hs
index 43e4a18cdd8a..daa7ab8388dd 100644
--- a/libraries/ghc-bignum/src/GHC/Num/Integer.hs
+++ b/libraries/ghc-bignum/src/GHC/Num/Integer.hs
@@ -486,6 +486,9 @@ integerNegate (IP b)
   | isTrue# (bigNatEqWord# b ABS_INT_MINBOUND##) = IS INT_MINBOUND#
   | True                                         = IN b
 
+{-# RULES
+"integerNegate/integerNegate" forall x. integerNegate (integerNegate x) = x
+#-}
 
 -- | Compute absolute value of an 'Integer'
 integerAbs :: Integer -> Integer
diff --git a/testsuite/tests/lib/integer/all.T b/testsuite/tests/lib/integer/all.T
index 45270453a17c..0c997f7ebfb5 100644
--- a/testsuite/tests/lib/integer/all.T
+++ b/testsuite/tests/lib/integer/all.T
@@ -1,3 +1,4 @@
+test('integerNegate', normal, compile, ['-ddump-simpl -dno-typeable-binds -dsuppress-all -dsuppress-uniques'])
 test('integerBits', normal, compile_and_run, [''])
 test('integerConversions', normal, compile_and_run, [''])
 test('plusMinusInteger', [omit_ways(['ghci'])], compile_and_run, [''])
diff --git a/testsuite/tests/lib/integer/integerNegate.hs b/testsuite/tests/lib/integer/integerNegate.hs
new file mode 100644
index 000000000000..777c1b002a86
--- /dev/null
+++ b/testsuite/tests/lib/integer/integerNegate.hs
@@ -0,0 +1,8 @@
+{-# OPTIONS_GHC -O2 #-}
+
+module Test where
+
+import GHC.Num.Integer
+
+neg_neg :: Integer -> Integer
+neg_neg x = integerNegate (integerNegate x)
diff --git a/testsuite/tests/lib/integer/integerNegate.stderr b/testsuite/tests/lib/integer/integerNegate.stderr
new file mode 100644
index 000000000000..bebc75c44f1d
--- /dev/null
+++ b/testsuite/tests/lib/integer/integerNegate.stderr
@@ -0,0 +1,10 @@
+
+==================== Tidy Core ====================
+Result size of Tidy Core
+  = {terms: 3, types: 3, coercions: 0, joins: 0/0}
+
+-- RHS size: {terms: 2, types: 1, coercions: 0, joins: 0/0}
+neg_neg = \ x -> x
+
+
+
-- 
GitLab