Skip to content
  • Evan Cheng's avatar
    SimplifyCFG has stopped duplicating returns into predecessors to canonicalize IR · 824a7113
    Evan Cheng authored
    to have single return block (at least getting there) for optimizations. This
    is general goodness but it would prevent some tailcall optimizations.
    One specific case is code like this:
    int f1(void);
    int f2(void);
    int f3(void);
    int f4(void);
    int f5(void);
    int f6(void);
    int foo(int x) {
      switch(x) {
      case 1: return f1();
      case 2: return f2();
      case 3: return f3();
      case 4: return f4();
      case 5: return f5();
      case 6: return f6();
      }
    }
    
    =>
    LBB0_2:                                 ## %sw.bb
      callq   _f1
      popq    %rbp
      ret
    LBB0_3:                                 ## %sw.bb1
      callq   _f2
      popq    %rbp
      ret
    LBB0_4:                                 ## %sw.bb3
      callq   _f3
      popq    %rbp
      ret
    
    This patch teaches codegenprep to duplicate returns when the return value
    is a phi and where the phi operands are produced by tail calls followed by
    an unconditional branch:
    
    sw.bb7:                                           ; preds = %entry
      %call8 = tail call i32 @f5() nounwind
      br label %return
    sw.bb9:                                           ; preds = %entry
      %call10 = tail call i32 @f6() nounwind
      br label %return
    return:
      %retval.0 = phi i32 [ %call10, %sw.bb9 ], [ %call8, %sw.bb7 ], ... [ 0, %entry ]
      ret i32 %retval.0
    
    This allows codegen to generate better code like this:
    
    LBB0_2:                                 ## %sw.bb
            jmp     _f1                     ## TAILCALL
    LBB0_3:                                 ## %sw.bb1
            jmp     _f2                     ## TAILCALL
    LBB0_4:                                 ## %sw.bb3
            jmp     _f3                     ## TAILCALL
    
    rdar://9147433
    
    llvm-svn: 127953
    824a7113
Loading