LLVM generate llvm.expect for conditional branches
This patch adds likeliness annotations to heap and and stack checks and modifies the llvm codegen to recognize those to help it generate better code. So with this patch ``` ... if ((Sp + 8) - 24 < SpLim) (likely: False) goto c23c; else goto c23d; ... ``` roughly generates: ``` %ln23k = icmp ult i64 %ln23j, %SpLim_Arg %ln23m = call ccc i1 (i1, i1) @llvm.expect.i1( i1 %ln23k, i1 0 ) br i1 %ln23m, label %c23c, label %c23d ``` Note the call to `llvm.expect` which denotes the expected result for the comparison. Test Plan: Look at assembler code with and without this patch. If the heap-checks moved out of the way we are happy. Reviewers: austin, simonmar, bgamari Reviewed By: bgamari Subscribers: michalt, thomie Differential Revision: https://phabricator.haskell.org/D2688 GHC Trac Issues: #8321
Showing
- compiler/cmm/CmmContFlowOpt.hs 10 additions, 5 deletionscompiler/cmm/CmmContFlowOpt.hs
- compiler/codeGen/StgCmmHeap.hs 4 additions, 3 deletionscompiler/codeGen/StgCmmHeap.hs
- compiler/codeGen/StgCmmMonad.hs 31 additions, 9 deletionscompiler/codeGen/StgCmmMonad.hs
- compiler/llvmGen/LlvmCodeGen/CodeGen.hs 28 additions, 7 deletionscompiler/llvmGen/LlvmCodeGen/CodeGen.hs
Loading
Please register or sign in to comment