I think that what happens is that this function: a `quot` b | b == 0 = divZeroError | a == minBound && b == (-1) = overflowError | otherwise = a `quotInt` b
is expanded to: a `quot` b = if b == 0 then divZeroError else if a == minBound then if b == (-1) then overflowError else a `quotInt` b else a `quotInt` b Then the compiler sees that b is a constant and computes that b == 0 is False and b == (-1) is also False so it could eliminate two If statements. The result is: a `quot` b = if a == minBound then a `quotInt` b else a `quotInt` b and this is exactly what we get. I bet that if the original function was: a `quot` b | b == 0 = divZeroError | b == (-1) && a == minBound = overflowError -- Note the changed order here | otherwise = a `quotInt` b then we would get what we want. I think that it is much more often to have division where the divisor is known so we will get the best code in this case. Regards, Krasimir On Fri, Feb 20, 2009 at 4:00 AM, Tyson Whitehead <twhiteh...@gmail.com> wrote: > On February 19, 2009 18:20:33 Krasimir Angelov wrote: >> Oh. I looked at the primops.txt.pp for something suspicious but I >> didn't checked the actual implementation of quot. I thought that quot >> calls quotInt# directly. When I use quotInt in the code I can get the >> real idiv assembly instruction. Still the code generated by GHC is >> strange it doesn't throw any exception actually. It just evaluates the >> same expression but with the constant maxBound. >> >> On Thu, Feb 19, 2009 at 11:19 PM, Max Bolingbroke >> > a `quot` b >> > >> > | b == 0 = divZeroError >> > | a == minBound && b == (-1) = overflowError >> > | otherwise = a `quotInt` b > > I checked the quot one like you said. Kind of strange all right. > > It looks like it is performing the a == minBound check (where a = maxBound-x) > despite the b == (-1) check (where b = 10) being optimized away. > > Cheers! -Tyson > _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users