Skip to content
  1. May 25, 2004
  2. Apr 18, 2004
  3. Mar 17, 2004
    • Chris Lattner's avatar
      Fix bug in previous checkin · a3783a57
      Chris Lattner authored
      llvm-svn: 12458
      a3783a57
    • Chris Lattner's avatar
      Okay, so there is no reasonable way for tail duplication to update SSA form, · 95057f6a
      Chris Lattner authored
      as it is making effectively arbitrary modifications to the CFG and we don't
      have a domset/domfrontier implementations that can handle the dynamic updates.
      Instead of having a bunch of code that doesn't actually work in practice,
      just demote any potentially tricky values to the stack (causing the problem
      to go away entirely).  Later invocations of mem2reg will rebuild SSA for us.
      
      This fixes all of the major performance regressions with tail duplication
      from LLVM 1.1.  For example, this loop:
      
      ---
      int popcount(int x) {
        int result = 0;
        while (x != 0) {
          result = result + (x & 0x1);
          x = x >> 1;
        }
        return result;
      }
      ---
      Used to be compiled into:
      
      int %popcount(int %X) {
      entry:
      	br label %loopentry
      
      loopentry:		; preds = %entry, %no_exit
      	%x.0 = phi int [ %X, %entry ], [ %tmp.9, %no_exit ]		; <int> [#uses=3]
      	%result.1.0 = phi int [ 0, %entry ], [ %tmp.6, %no_exit ]		; <int> [#uses=2]
      	%tmp.1 = seteq int %x.0, 0		; <bool> [#uses=1]
      	br bool %tmp.1, label %loopexit, label %no_exit
      
      no_exit:		; preds = %loopentry
      	%tmp.4 = and int %x.0, 1		; <int> [#uses=1]
      	%tmp.6 = add int %tmp.4, %result.1.0		; <int> [#uses=1]
      	%tmp.9 = shr int %x.0, ubyte 1		; <int> [#uses=1]
      	br label %loopentry
      
      loopexit:		; preds = %loopentry
      	ret int %result.1.0
      }
      
      And is now compiled into:
      
      int %popcount(int %X) {
      entry:
              br label %no_exit
      
      no_exit:                ; preds = %entry, %no_exit
              %x.0.0 = phi int [ %X, %entry ], [ %tmp.9, %no_exit ]          ; <int> [#uses=2]
              %result.1.0.0 = phi int [ 0, %entry ], [ %tmp.6, %no_exit ]             ; <int> [#uses=1]
              %tmp.4 = and int %x.0.0, 1              ; <int> [#uses=1]
              %tmp.6 = add int %tmp.4, %result.1.0.0          ; <int> [#uses=2]
              %tmp.9 = shr int %x.0.0, ubyte 1                ; <int> [#uses=2]
              %tmp.1 = seteq int %tmp.9, 0            ; <bool> [#uses=1]
              br bool %tmp.1, label %loopexit, label %no_exit
      
      loopexit:               ; preds = %no_exit
              ret int %tmp.6
      }
      
      llvm-svn: 12457
      95057f6a
  4. Mar 16, 2004
  5. Mar 01, 2004
  6. Feb 29, 2004
  7. Feb 22, 2004
  8. Feb 01, 2004
  9. Jan 09, 2004
  10. Nov 11, 2003
  11. Oct 20, 2003
  12. Aug 31, 2003
  13. Aug 23, 2003
  14. Aug 02, 2003
  15. Jul 23, 2003
  16. Jun 24, 2003
  17. Jun 22, 2003
Loading