diff options
author | klebinger.andreas@gmx.at <klebinger.andreas@gmx.at> | 2019-02-18 00:28:39 +0100 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2019-10-13 15:07:06 -0400 |
commit | 9a90f27f080123c636a3401b103ea68aa843e34d (patch) | |
tree | 581dabf4a1720457bce175902d8e9b5f6f1a0d93 /compiler/nativeGen/X86/CodeGen.hs | |
parent | d584e3f08cfee6e28b70bf53c573d86e44f326f8 (diff) | |
download | haskell-wip/gc/base.tar.gz |
Add loop level analysis to the NCG backend.wip/gc/base
For backends maintaining the CFG during codegen
we can now find loops and their nesting level.
This is based on the Cmm CFG and dominator analysis.
As a result we can estimate edge frequencies a lot better
for methods, resulting in far better code layout.
Speedup on nofib: ~1.5%
Increase in compile times: ~1.9%
To make this feasible this commit adds:
* Dominator analysis based on the Lengauer-Tarjan Algorithm.
* An algorithm estimating global edge frequences from branch
probabilities - In CFG.hs
A few static branch prediction heuristics:
* Expect to take the backedge in loops.
* Expect to take the branch NOT exiting a loop.
* Expect integer vs constant comparisons to be false.
We also treat heap/stack checks special for branch prediction
to avoid them being treated as loops.
(cherry picked from commit 056aa12d60f34ee90db2527586c82fc6f16eba39)
Diffstat (limited to 'compiler/nativeGen/X86/CodeGen.hs')
-rw-r--r-- | compiler/nativeGen/X86/CodeGen.hs | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/compiler/nativeGen/X86/CodeGen.hs b/compiler/nativeGen/X86/CodeGen.hs index 670950d754..672f6d3b62 100644 --- a/compiler/nativeGen/X86/CodeGen.hs +++ b/compiler/nativeGen/X86/CodeGen.hs @@ -3421,7 +3421,7 @@ invertCondBranches cfg keep bs = , Just edgeInfo2 <- getEdgeInfo lbl1 target2 cfg -- Both jumps come from the same cmm statement , transitionSource edgeInfo1 == transitionSource edgeInfo2 - , (CmmSource cmmCondBranch) <- transitionSource edgeInfo1 + , CmmSource {trans_cmmNode = cmmCondBranch} <- transitionSource edgeInfo1 --Int comparisons are invertable , CmmCondBranch (CmmMachOp op _args) _ _ _ <- cmmCondBranch |