summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2020-05-05 11:57:26 -0400
committerMarge Bot <ben+marge-bot@smart-cactus.org>2020-05-15 10:42:46 -0400
commit568d7279a80cf945271f0659f11a94eea3f1433d (patch)
tree9e2c73c659012098755bbeaeeff0a9a6980a56e1
parent9bd20e83ff9b65bd5496fbb29d27072c9e4e84b9 (diff)
downloadhaskell-568d7279a80cf945271f0659f11a94eea3f1433d.tar.gz
GHC.Cmm.Opt: Handle MO_XX_Conv
This MachOp was introduced by 2c959a1894311e59cd2fd469c1967491c1e488f3 but a wildcard match in cmmMachOpFoldM hid the fact that it wasn't handled. Ideally we would eliminate the match but this appears to be a larger task. Fixes #18141.
-rw-r--r--compiler/GHC/Cmm/Opt.hs2
-rw-r--r--testsuite/tests/cmm/opt/T18141.hs17
-rw-r--r--testsuite/tests/cmm/opt/all.T1
3 files changed, 20 insertions, 0 deletions
diff --git a/compiler/GHC/Cmm/Opt.hs b/compiler/GHC/Cmm/Opt.hs
index 4ac24523c1..493122024c 100644
--- a/compiler/GHC/Cmm/Opt.hs
+++ b/compiler/GHC/Cmm/Opt.hs
@@ -69,6 +69,7 @@ cmmMachOpFoldM _ op [CmmLit (CmmInt x rep)]
MO_SF_Conv _from to -> CmmLit (CmmFloat (fromInteger x) to)
MO_SS_Conv from to -> CmmLit (CmmInt (narrowS from x) to)
MO_UU_Conv from to -> CmmLit (CmmInt (narrowU from x) to)
+ MO_XX_Conv from to -> CmmLit (CmmInt (narrowS from x) to)
_ -> panic $ "cmmMachOpFoldM: unknown unary op: " ++ show op
@@ -76,6 +77,7 @@ cmmMachOpFoldM _ op [CmmLit (CmmInt x rep)]
-- Eliminate conversion NOPs
cmmMachOpFoldM _ (MO_SS_Conv rep1 rep2) [x] | rep1 == rep2 = Just x
cmmMachOpFoldM _ (MO_UU_Conv rep1 rep2) [x] | rep1 == rep2 = Just x
+cmmMachOpFoldM _ (MO_XX_Conv rep1 rep2) [x] | rep1 == rep2 = Just x
-- Eliminate nested conversions where possible
cmmMachOpFoldM platform conv_outer [CmmMachOp conv_inner [x]]
diff --git a/testsuite/tests/cmm/opt/T18141.hs b/testsuite/tests/cmm/opt/T18141.hs
new file mode 100644
index 0000000000..9f2c2a79c7
--- /dev/null
+++ b/testsuite/tests/cmm/opt/T18141.hs
@@ -0,0 +1,17 @@
+{-# LANGUAGE MagicHash #-}
+
+module T18141 where
+
+import GHC.Exts
+
+divInt8# :: Int8# -> Int8# -> Int8#
+x# `divInt8#` y#
+ | isTrue# (x# `gtInt8#` zero#) && isTrue# (y# `ltInt8#` zero#) =
+ ((x# `subInt8#` one#) `quotInt8#` y#) `subInt8#` one#
+ | isTrue# (x# `ltInt8#` zero#) && isTrue# (y# `gtInt8#` zero#) =
+ ((x# `plusInt8#` one#) `quotInt8#` y#) `subInt8#` one#
+ | otherwise = x# `quotInt8#` y#
+ where
+ zero# = narrowInt8# 0#
+ one# = narrowInt8# 1#
+
diff --git a/testsuite/tests/cmm/opt/all.T b/testsuite/tests/cmm/opt/all.T
index 24572a219b..da7e95d5c4 100644
--- a/testsuite/tests/cmm/opt/all.T
+++ b/testsuite/tests/cmm/opt/all.T
@@ -1,3 +1,4 @@
# Verify that we optimize away conditional branches which always jump
# to the same target.
test('T15188', normal, makefile_test, [])
+test('T18141', normal, compile, [''])