Annotation linting
authorPeter Wortmann <scpmw@leeds.ac.uk>
Mon, 13 Oct 2014 22:09:59 +0000 (00:09 +0200)
committerAustin Seipp <austin@well-typed.com>
Tue, 16 Dec 2014 21:02:06 +0000 (15:02 -0600)
commit07d604fa1dba7caa39cdc4bc3d90844c600adb70
tree8cabbd3dabc82cd091eae2c9db9c95b647e6fdd8
parent3b893f386b086a6cbac81d277a5aceaf1ee39e42
Annotation linting

This adds a way by which we can make sure that the Core passes treat
annotations right: We run them twice and compare the results.

The main problem here is that Core equivalence is awkward: We do not
want the comparison to care about the order of, say, top-level or
recursive bindings. This is important even if GHC generally generates
the bindings in the right order - after all, if something goes wrong
we don't want linting to dump out the whole program as the offense.

So instead we do some heuristic matching - first greedily match
everything that's easy, then match the rest by label order. This
should work as long as GHC generates the labels in roughly the same
order for both pass runs.  In practice it seems to work alright.

We also check that IdInfos match, as this might cause hard-to-spot
bugs down the line (I had at least one bug because unfolding guidance
didn't match!). We especially check unfoldings up until the point
where it might get us into an infinite loop.

(From Phabricator D169)
compiler/basicTypes/BasicTypes.hs
compiler/coreSyn/CoreLint.hs
compiler/coreSyn/CoreSyn.hs
compiler/coreSyn/CoreUtils.hs
compiler/main/DynFlags.hs
compiler/simplCore/SimplCore.hs