Skip to content
  1. May 23, 2004
  2. May 13, 2004
    • Chris Lattner's avatar
      This was not meant to be committed · 0026512b
      Chris Lattner authored
      llvm-svn: 13565
      0026512b
    • Chris Lattner's avatar
      Fix a nasty bug that caused us to unroll EXTREMELY large loops due to overflow · c12c945c
      Chris Lattner authored
      in the size calculation.
      
      This is not something you want to see:
      Loop Unroll: F[main] Loop %no_exit Loop Size = 2 Trip Count = 2147483648 - UNROLLING!
      
      The problem was that 2*2147483648 == 0.
      
      Now we get:
      Loop Unroll: F[main] Loop %no_exit Loop Size = 2 Trip Count = 2147483648 - TOO LARGE: 4294967296>100
      
      Thanks to some anonymous person playing with the demo page that repeatedly
      caused zion to go into swapping land.  That's one way to ensure you'll get
      a quick bugfix.  :)
      
      Testcase here: Transforms/LoopUnroll/2004-05-13-DontUnrollTooMuch.ll
      
      llvm-svn: 13564
      c12c945c
  3. May 09, 2004
  4. May 08, 2004
    • Chris Lattner's avatar
      Implement folding of GEP's like: · 5f667a6f
      Chris Lattner authored
              %tmp.0 = getelementptr [50 x sbyte]* %ar, uint 0, int 5         ; <sbyte*> [#uses=2]
              %tmp.7 = getelementptr sbyte* %tmp.0, int 8             ; <sbyte*> [#uses=1]
      
      together.  This patch actually allows us to simplify and generalize the code.
      
      llvm-svn: 13415
      5f667a6f
  5. May 07, 2004
  6. May 04, 2004
  7. May 02, 2004
  8. Apr 30, 2004
    • Chris Lattner's avatar
      Fix a major pessimization in the instcombiner. If an allocation instruction · 652064e3
      Chris Lattner authored
      is only used by a cast, and the casted type is the same size as the original
      allocation, it would eliminate the cast by folding it into the allocation.
      
      Unfortunately, it was placing the new allocation instruction right before
      the cast, which could pull (for example) alloca instructions into the body
      of a function.  This turns statically allocatable allocas into expensive
      dynamically allocated allocas, which is bad bad bad.
      
      This fixes the problem by placing the new allocation instruction at the same
      place the old one was, duh. :)
      
      llvm-svn: 13289
      652064e3
  9. Apr 27, 2004
  10. Apr 26, 2004
  11. Apr 23, 2004
  12. Apr 22, 2004
    • Chris Lattner's avatar
      c27302c7
    • Chris Lattner's avatar
      c1a682dd
    • Chris Lattner's avatar
      Implement a todo, rewriting all possible scev expressions inside of the · af532f27
      Chris Lattner authored
      loop.  This eliminates the extra add from the previous case, but it's
      not clear that this will be a performance win overall.  Tommorows test
      results will tell. :)
      
      llvm-svn: 13103
      af532f27
    • Chris Lattner's avatar
      This code really wants to iterate over the OPERANDS of an instruction, not · fb9a299f
      Chris Lattner authored
      over its USES.  If it's dead it doesn't have any uses!  :)
      
      Thanks to the fabulous and mysterious Bill Wendling for pointing this out.  :)
      
      llvm-svn: 13102
      fb9a299f
    • Chris Lattner's avatar
      Implement a fixme. The helps loops that have induction variables of different · dc7cc350
      Chris Lattner authored
      types in them.  Instead of creating an induction variable for all types, it
      creates a single induction variable and casts to the other sizes.  This generates
      this code:
      
      no_exit:                ; preds = %entry, %no_exit
              %indvar = phi uint [ %indvar.next, %no_exit ], [ 0, %entry ]            ; <uint> [#uses=4]
      ***     %j.0.0 = cast uint %indvar to short             ; <short> [#uses=1]
              %indvar = cast uint %indvar to int              ; <int> [#uses=1]
              %tmp.7 = getelementptr short* %P, uint %indvar          ; <short*> [#uses=1]
              store short %j.0.0, short* %tmp.7
              %inc.0 = add int %indvar, 1             ; <int> [#uses=2]
              %tmp.2 = setlt int %inc.0, %N           ; <bool> [#uses=1]
              %indvar.next = add uint %indvar, 1              ; <uint> [#uses=1]
              br bool %tmp.2, label %no_exit, label %loopexit
      
      instead of:
      
      no_exit:                ; preds = %entry, %no_exit
              %indvar = phi ushort [ %indvar.next, %no_exit ], [ 0, %entry ]          ; <ushort> [#uses=2]
      ***     %indvar = phi uint [ %indvar.next, %no_exit ], [ 0, %entry ]            ; <uint> [#uses=3]
              %indvar = cast uint %indvar to int              ; <int> [#uses=1]
              %indvar = cast ushort %indvar to short          ; <short> [#uses=1]
              %tmp.7 = getelementptr short* %P, uint %indvar          ; <short*> [#uses=1]
              store short %indvar, short* %tmp.7
              %inc.0 = add int %indvar, 1             ; <int> [#uses=2]
              %tmp.2 = setlt int %inc.0, %N           ; <bool> [#uses=1]
              %indvar.next = add uint %indvar, 1
      ***     %indvar.next = add ushort %indvar, 1
              br bool %tmp.2, label %no_exit, label %loopexit
      
      This is an improvement in register pressure, but probably doesn't happen that
      often.
      
      The more important fix will be to get rid of the redundant add.
      
      llvm-svn: 13101
      dc7cc350
  13. Apr 20, 2004
  14. Apr 19, 2004
  15. Apr 18, 2004
  16. Apr 17, 2004
    • Chris Lattner's avatar
      If the loop executes a constant number of times, try a bit harder to replace · a8140800
      Chris Lattner authored
      exit values.
      
      llvm-svn: 13018
      a8140800
    • Chris Lattner's avatar
      Fix a HUGE pessimization on X86. The indvars pass was taking this · 1e9ac1a4
      Chris Lattner authored
      (familiar) function:
      
      int _strlen(const char *str) {
          int len = 0;
          while (*str++) len++;
          return len;
      }
      
      And transforming it to use a ulong induction variable, because the type of
      the pointer index was left as a constant long.  This is obviously very bad.
      
      The fix is to shrink long constants in getelementptr instructions to intptr_t,
      making the indvars pass insert a uint induction variable, which is much more
      efficient.
      
      Here's the before code for this function:
      
      int %_strlen(sbyte* %str) {
      entry:
              %tmp.13 = load sbyte* %str              ; <sbyte> [#uses=1]
              %tmp.24 = seteq sbyte %tmp.13, 0                ; <bool> [#uses=1]
              br bool %tmp.24, label %loopexit, label %no_exit
      
      no_exit:                ; preds = %entry, %no_exit
      ***     %indvar = phi uint [ %indvar.next, %no_exit ], [ 0, %entry ]            ; <uint> [#uses=2]
      ***     %indvar = phi ulong [ %indvar.next, %no_exit ], [ 0, %entry ]           ; <ulong> [#uses=2]
              %indvar1 = cast ulong %indvar to uint           ; <uint> [#uses=1]
              %inc.02.sum = add uint %indvar1, 1              ; <uint> [#uses=1]
              %inc.0.0 = getelementptr sbyte* %str, uint %inc.02.sum          ; <sbyte*> [#uses=1]
              %tmp.1 = load sbyte* %inc.0.0           ; <sbyte> [#uses=1]
              %tmp.2 = seteq sbyte %tmp.1, 0          ; <bool> [#uses=1]
              %indvar.next = add ulong %indvar, 1             ; <ulong> [#uses=1]
              %indvar.next = add uint %indvar, 1              ; <uint> [#uses=1]
              br bool %tmp.2, label %loopexit.loopexit, label %no_exit
      
      loopexit.loopexit:              ; preds = %no_exit
              %indvar = cast uint %indvar to int              ; <int> [#uses=1]
              %inc.1 = add int %indvar, 1             ; <int> [#uses=1]
              ret int %inc.1
      
      loopexit:               ; preds = %entry
              ret int 0
      }
      
      
      Here's the after code:
      
      int %_strlen(sbyte* %str) {
      entry:
              %inc.02 = getelementptr sbyte* %str, uint 1             ; <sbyte*> [#uses=1]
              %tmp.13 = load sbyte* %str              ; <sbyte> [#uses=1]
              %tmp.24 = seteq sbyte %tmp.13, 0                ; <bool> [#uses=1]
              br bool %tmp.24, label %loopexit, label %no_exit
      
      no_exit:                ; preds = %entry, %no_exit
      ***     %indvar = phi uint [ %indvar.next, %no_exit ], [ 0, %entry ]            ; <uint> [#uses=3]
              %indvar = cast uint %indvar to int              ; <int> [#uses=1]
              %inc.0.0 = getelementptr sbyte* %inc.02, uint %indvar           ; <sbyte*> [#uses=1]
              %inc.1 = add int %indvar, 1             ; <int> [#uses=1]
              %tmp.1 = load sbyte* %inc.0.0           ; <sbyte> [#uses=1]
              %tmp.2 = seteq sbyte %tmp.1, 0          ; <bool> [#uses=1]
              %indvar.next = add uint %indvar, 1              ; <uint> [#uses=1]
              br bool %tmp.2, label %loopexit, label %no_exit
      
      loopexit:               ; preds = %entry, %no_exit
              %len.0.1 = phi int [ 0, %entry ], [ %inc.1, %no_exit ]          ; <int> [#uses=1]
              ret int %len.0.1
      }
      
      llvm-svn: 13016
      1e9ac1a4
    • Chris Lattner's avatar
      Even if there are not any induction variables in the loop, if we can compute · 885a6eb7
      Chris Lattner authored
      the trip count for the loop, insert one so that we can canonicalize the exit
      condition.
      
      llvm-svn: 13015
      885a6eb7
  17. Apr 16, 2004
Loading