Optimizer produces Core with an infinite <<loop>> v2
Summary
I am not quite sure what it is? Is it coincidence, my coding style or just luck. Two years later after I reported a bug #13429 (closed) about optimizer generating an infinite loop, I stumble upon exactly the same bug, while implementing the same algorithm (convolution), but in a completely different library and using a totally different approach. There are some similarities in types, but I can't draw a concrete comparison.
Unlike previous bug #13429 (closed), which was applicable to ghc-8.0 and was supposably fixed in ghc-8.2, this one is triggered in ghc-8.2 and up, but not for the prior version.
It is way too easy not not trigger the bug, in fact I initially noticed my tests failing for ghc-8.4.4 only, but once I reduced it to a smaller example, my tests started failing for ghc-8.6.5 as well as ghc-8.8.1
I apologize for the size of the uploaded module, but it took me a while to reduce it even to that level.
Steps to reproduce
Uploaded are the two files needed to reproduce the bug:
Those modules only depend on primitive
package, but this is only for convenience, since this bug could equally well be reproduced using either ForeignPtr
or by dropping down to ByteArray#
or MutableByteArray#
prims.
Compiling with optimizations is necessary to trigger the bug:
$ ghc Main.hs Array.hs -O1 -fforce-recomp && ./Main
[1 of 2] Compiling Array ( Array.hs, Array.o )
[2 of 2] Compiling Main ( Main.hs, Main.o )
Linking Main ...
Main: <<loop>>
When inspecting Core we can see where the loop occurs right away:
Rec {
-- RHS size: {terms: 1, types: 0, coercions: 0, joins: 0/0}
$s$fConstructPixe1 :: Index Int
$s$fConstructPixe1 = $s$fConstructPixe1
end Rec }
I found something peculiar, which could be useful for debugging this issue, is that the Construct
instance for P
representation is not used anywhere directly in the source code.
Expected behavior
No infinite loop in the produced binary.
Environment
- GHC version used: 8.2.2 - 8.8.1
Optional:
- Operating System: Ubuntu 18.04 LTS
- System Architecture: x86_64