• Alex Biehl's avatar
    LLVM generate llvm.expect for conditional branches · 20fb781e
    Alex Biehl authored
    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
    20fb781e
CmmContFlowOpt.hs 15.6 KB