Skip to content
  • Arthur Eubanks's avatar
    [Inliner] Run always-inliner in inliner-wrapper · 0291e2c9
    Arthur Eubanks authored
    An alwaysinline function may not get inlined in inliner-wrapper due to
    the inlining order.
    
    Previously for the following, the inliner would first inline @a() into @b(),
    
    ```
    define void @a() {
    entry:
      call void @b()
      ret void
    }
    
    define void @b() alwaysinline {
    entry:
      br label %for.cond
    
    for.cond:
      call void @a()
      br label %for.cond
    }
    ```
    
    making @b() recursive and unable to be inlined into @a(), ending at
    
    ```
    define void @a() {
    entry:
      call void @b()
      ret void
    }
    
    define void @b() alwaysinline {
    entry:
      br label %for.cond
    
    for.cond:
      call void @b()
      br label %for.cond
    }
    ```
    
    Running always-inliner first makes sure that we respect alwaysinline in more cases.
    
    Fixes https://bugs.llvm.org/show_bug.cgi?id=46945.
    
    Reviewed By: davidxl, rnk
    
    Differential Revision: https://reviews.llvm.org/D86988
    0291e2c9
Loading