Commit 568d7279 authored by Ben Gamari's avatar Ben Gamari 🐢 Committed by Marge Bot

GHC.Cmm.Opt: Handle MO_XX_Conv

This MachOp was introduced by 2c959a18
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.
parent 9bd20e83
Pipeline #19535 failed with stages
in 662 minutes and 53 seconds
......@@ -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]]
......
{-# 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#
# Verify that we optimize away conditional branches which always jump
# to the same target.
test('T15188', normal, makefile_test, [])
test('T18141', normal, compile, [''])
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment