[GHC] #10980: Deriving Read instance from datatype with N fields leads to N^2 code size growth
GHC
ghc-devs at haskell.org
Fri Oct 16 22:18:00 UTC 2015
#10980: Deriving Read instance from datatype with N fields leads to N^2 code size
growth
-------------------------------------+-------------------------------------
Reporter: slyfox | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.10.2
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
The problem observed on GHC's code base when explored why exactly some
object files are so huge.
Let's look at the stats of text code section sizes on today's HEAD
(skipping GHCi libraries and stage1 binaries):
{{{
~/dev/git/ghc $ size `find -name *.o -type f | grep -v stage1 | grep -v
HS` | sort -k1 -n -r | head -n20
text data bss dec hex filename
1791068 145448 0 1936516 1d8c84 ./compiler/stage2/build/DynFlags.o
1558637 77464 0 1636101 18f705 ./compiler/stage2/build/PprC.o
1397966 23272 0 1421238 15afb6
./compiler/stage2/build/PlatformConstants.o
1332048 373344 0 1705392 1a05b0 ./libraries/Cabal/Cabal/dist-
boot/build/Distribution/PackageDescription.o
1331238 373352 0 1704590 1a028e
./bootstrapping/Distribution/PackageDescription.o
1271578 246240 0 1517818 1728fa ./libraries/template-haskell/dist-
boot/build/Language/Haskell/TH/Syntax.o
1229696 311616 0 1541312 1784c0 ./libraries/Cabal/Cabal/dist-
install/build/Distribution/PackageDescription.o
1215082 224288 0 1439370 15f68a ./libraries/template-haskell/dist-
install/build/Language/Haskell/TH/Syntax.o
1071746 242664 0 1314410 140e6a ./compiler/stage2/build/HsExpr.o
1015090 40904 0 1055994 101cfa
./compiler/stage2/build/Llvm/PpLlvm.o
970203 124944 0 1095147 10b5eb ./compiler/stage2/build/Parser.o
849693 79760 0 929453 e2ead ./compiler/stage2/build/HsDecls.o
833327 35440 0 868767 d419f
./compiler/stage2/build/X86/CodeGen.o
819959 127192 0 947151 e73cf ./libraries/Cabal/Cabal/dist-
boot/build/Distribution/Simple/Setup.o
819685 125120 0 944805 e6aa5
./bootstrapping/Distribution/Simple/Setup.o
816927 124520 0 941447 e5d87 ./libraries/Cabal/Cabal/dist-
install/build/Distribution/Simple/Setup.o
785398 41536 0 826934 c9e36 ./compiler/stage2/build/CoreLint.o
772550 42040 0 814590 c6dfe
./compiler/stage2/build/DriverPipeline.o
766461 36280 0 802741 c3fb5 ./compiler/stage2/build/HscMain.o
735605 23408 0 759013 b94e5 ./libraries/containers/dist-
install/build/Data/Sequence.o
}}}
'''PlatformConstants.o''' is a very clear example of this problem. Trimmed
down example of this file is:
{{{#!hs
module M (D) where
data D = D { a0
, a01 , a02 , a03 , a04 , a05 , a06 , a07 , a08 , a09 , a10
, a11 , a12 , a13 , a14 , a15 , a16 , a17 , a18 , a19 , a20
, a21 , a22 , a23 , a24 , a25 , a26 , a27 , a28 , a29 , a30
, a31 , a32 , a33 , a34 , a35 , a36 , a37 , a38 , a39 , a40
, a41 , a42 , a43 , a44 , a45 , a46 , a47 , a48 , a49 , a50
, a51 , a52 , a53 , a54 , a55 , a56 , a57 , a58 , a59 , a60
, a61 , a62 , a63 , a64 , a65 , a66 , a67 , a68 , a69 , a70
, a71 , a72 , a73 , a74 , a75 , a76 , a77 , a78 , a79 , a80
, a81 , a82 , a83 , a84 , a85 , a86 , a87 , a88 , a89 , a90
, a91 , a92 , a93 , a94 , a95 , a96 , a97 , a98 , a99
:: Int } deriving Read
}}}
Results in 800KB file:
{{{
$ ghc-stage2 -c -O1 -fforce-recomp M.hs -o M.o
$ size M.o
text data bss dec hex filename
847039 16080 0 863119 d2b8f M.o
}}}
The size growth is quadratic:
{{{
# fields code-size
1 6263
21 61767
41 173623
61 347503
81 583367
101 881231
121 1241087
141 1662959
161 2146815
181 2692679
201 3300543
221 3970407
241 4702263
261 5496135
281 6351991
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10980>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list