
It might be they are not required. In example like {-# OPTIONS_GHC -ddump-simpl -dsuppress-all #-} import System.Environment import Data.Word main :: IO () main = do [x',y'] <- getArgs let x, y :: Word x = read x' y = read y' print (not (x == y)) GHC is smart enough to just swap the branches, relevant optimized core looks like case x_a4Tc of { W# x2_a3Wb -> case x1_X4Ua of { W# y_a3Wf -> case eqWord# x2_a3Wb y_a3Wf of { __DEFAULT -> $fShowBool2; 1# -> $fShowBool4 } } }; where `$fShowBool*` are (probably, I haven't checked) printing True or False. I.e. expressions which are "case (not x) of True -> ..., False -> ..." optimize well, early enough. (IIRC that's the example used for case-of-case optimization). - Oleg On 20.10.2021 19.55, Sven Panne wrote:
Am Mi., 20. Okt. 2021 um 18:51 Uhr schrieb Oleg Grenrus
mailto:oleg.grenrus@iki.fi>: [...] Also, we coudl add builtin rewrite rules, rewriting not (eqInt8 x y) to neInt8 x y if some benchmarks show that it would be beneficial.
Hopefully such peephole optimizations are done much more generally further down the compilation pipeline, otherwise we will have more serious performance problems than the removal of (/=) from Eq. ;-)