Opened 18 months ago

Last modified 18 months ago

#14923 new bug

Recompilation avoidance fails after a LANGUAGE change

Reported by: akio Owned by:
Priority: normal Milestone:
Component: Compiler Version: 8.4.1
Keywords: Cc:
Operating System: Linux Architecture: Unknown/Multiple
Type of failure: Compile-time performance bug Test Case:
Blocked By: Blocking:
Related Tickets: Differential Rev(s):
Wiki Page:

Description

It looks like the recompilation checker can be confused when a LANGUAGE pragma is added or removed.

The following shell script demonstrates the issue:

#!/bin/sh
cat >Foo.hs <<END
{-# LANGUAGE UndecidableInstances #-}
module Foo where
END
rm -f Foo.hi Foo.o

ghc -c Foo.hs; ghc --show-iface Foo.hi | grep flag

sed -i 's/^{-#/--&/' Foo.hs # comment out the pragma

ghc -c Foo.hs; ghc --show-iface Foo.hi | grep flag
ghc -c Foo.hs; ghc --show-iface Foo.hi | grep flag
ghc -c Foo.hs; ghc --show-iface Foo.hi | grep flag

I get this output:

% ./bug.sh
  flag hash: b1ada48735eec2ef16d5070887aa7f10
  flag hash: b1ada48735eec2ef16d5070887aa7f10
  flag hash: e7b294090e04f1a84f0bfc9b8cc49322
compilation IS NOT required
  flag hash: e7b294090e04f1a84f0bfc9b8cc49322

In the third invocation to GHC, I expect the recompilation checker to detect that compilation is not required, because nothing has changed since the second invocation. Also it seems suspicious that the flag hash changes beteen the second run and the third run.

Change History (1)

comment:1 Changed 18 months ago by bgamari

Hmm, very interesting. It looks to me like fingerprintDynFlags includes the language flags in its hash.

Note: See TracTickets for help on using tickets.