Eventually I found that the issue was with C CodeGen in general, and had
nothing to do with ARM.
I've attached the patch there, but it may be only part of a bigger
The rough problem came from two things:
1) -(-128 :: Int8) => -128
You can't negate the smallest int in an integer space because of how
2s compliment works. There aren't enough bits to store +128.
2) We have a number of operations that transform:
| i < 0 = a + i => a - (negative i)
| i < 0 = a - i => a + (negative i)
And the assumption is that any integer can be negated, but that's not
true in exactly one case.
So, for example, it could turn
Which is not valid C.
That (but for Int32) was what I was seeing, and causing me trouble
building integer simple.
So, that was the bug I had encountered, and I don't know how the GHC
code works, I just trawled through until I found the line that was
causing me trouble, but I just figured I'd remind people that not every
integer can be negated, in case the same mistake is being done in other