Skip to content
  1. 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
    • Chris Lattner's avatar
      bb1a2cc7
  2. Mar 16, 2004
  3. Mar 15, 2004
  4. Mar 14, 2004
Loading