codeGen: inline allocation optimization for clone array primops
authorJohan Tibell <johan.tibell@gmail.com>
Thu, 13 Mar 2014 08:35:21 +0000 (09:35 +0100)
committerJohan Tibell <johan.tibell@gmail.com>
Sat, 22 Mar 2014 09:32:02 +0000 (10:32 +0100)
commit1eece45692fb5d1a5f4ec60c1537f8068237e9c1
treeb5d99d52c5a6ab762f9b92dfd0504105122ed62b
parent99ef27913dbe55fa57891bbf97d131e0933733e3
codeGen: inline allocation optimization for clone array primops

The inline allocation version is 69% faster than the out-of-line
version, when cloning an array of 16 unit elements on a 64-bit
machine.

Comparing the new and the old primop implementations isn't
straightforward. The old version had a missing heap check that I
discovered during the development of the new version. Comparing the
old and the new version would requiring fixing the old version, which
in turn means reimplementing the equivalent of MAYBE_CG in StgCmmPrim.

The inline allocation threshold is configurable via
-fmax-inline-alloc-size which gives the maximum array size, in bytes,
to allocate inline. The size does not include the closure header size.

Allowing the same primop to be either inline or out-of-line has some
implication for how we lay out heap checks. We always place a heap
check around out-of-line primops, as they may allocate outside of our
knowledge. However, for the inline primops we only allow allocation
via the standard means (i.e. virtHp). Since the clone primops might be
either inline or out-of-line the heap check layout code now consults
shouldInlinePrimOp to know whether a primop will be inlined.
14 files changed:
compiler/cmm/CLabel.hs
compiler/codeGen/StgCmmExpr.hs
compiler/codeGen/StgCmmPrim.hs
compiler/main/DynFlags.hs
compiler/prelude/primops.txt.pp
docs/users_guide/flags.xml
includes/Cmm.h
includes/stg/MiscClosures.h
rts/Linker.c
rts/PrimOps.cmm
testsuite/tests/codeGen/should_run/cgrun064.hs
testsuite/tests/codeGen/should_run/cgrun064.stdout
testsuite/tests/perf/should_run/InlineCloneArrayAlloc.hs [new file with mode: 0644]
testsuite/tests/perf/should_run/all.T