Skip to content
  1. Feb 23, 2005
  2. Feb 17, 2005
  3. Feb 14, 2005
  4. Feb 12, 2005
  5. Feb 01, 2005
  6. Jan 31, 2005
  7. Jan 29, 2005
  8. Jan 28, 2005
    • Chris Lattner's avatar
      * add some DEBUG statements · cd517ff0
      Chris Lattner authored
      * Properly compile this:
      
      struct a {};
      int test() {
        struct a b[2];
        if (&b[0] != &b[1])
          abort ();
        return 0;
      }
      
      to 'return 0', not abort().
      
      llvm-svn: 19875
      cd517ff0
  9. Jan 23, 2005
  10. Jan 22, 2005
  11. Jan 19, 2005
    • Chris Lattner's avatar
      Add two optimizations. The first folds (X+Y)-X -> Y · 411336fe
      Chris Lattner authored
      The second folds operations into selects, e.g. (select C, (X+Y), (Y+Z))
      -> (Y+(select C, X, Z)
      
      This occurs a few times across spec, e.g.
      
               select    add/sub
      mesa:    83        0
      povray:  5         2
      gcc      4         2
      parser   0         22
      perlbmk  13        30
      twolf    0         3
      
      llvm-svn: 19706
      411336fe
  12. Jan 17, 2005
  13. Jan 14, 2005
  14. Jan 13, 2005
    • Chris Lattner's avatar
      Turn select C, (X+Y), (X-Y) --> (X+(select C, Y, (-Y))). This occurs in · a04c904c
      Chris Lattner authored
      the 'sim' program and probably elsewhere.  In sim, it comes up for cases
      like this:
      
      #define round(x) ((x)>0.0 ? (x)+0.5 : (x)-0.5)
      double G;
      void T(double X) { G = round(X); }
      
      (it uses the round macro a lot).  This changes the LLVM code from:
      
              %tmp.1 = setgt double %X, 0.000000e+00          ; <bool> [#uses=1]
              %tmp.4 = add double %X, 5.000000e-01            ; <double> [#uses=1]
              %tmp.6 = sub double %X, 5.000000e-01            ; <double> [#uses=1]
              %mem_tmp.0 = select bool %tmp.1, double %tmp.4, double %tmp.6
              store double %mem_tmp.0, double* %G
      
      to:
      
              %tmp.1 = setgt double %X, 0.000000e+00          ; <bool> [#uses=1]
              %mem_tmp.0.p = select bool %tmp.1, double 5.000000e-01, double -5.000000e-01
              %mem_tmp.0 = add double %mem_tmp.0.p, %X
              store double %mem_tmp.0, double* %G
              ret void
      
      llvm-svn: 19537
      a04c904c
    • Chris Lattner's avatar
      Implement an optimization for == and != comparisons like this: · 81e84176
      Chris Lattner authored
      _Bool test2(int X, int Y) {
        return &arr[X][Y] == arr;
      }
      
      instead of generating this:
      
      bool %test2(int %X, int %Y) {
              %tmp.3.idx = mul int %X, 160            ; <int> [#uses=1]
              %tmp.3.idx1 = shl int %Y, ubyte 2               ; <int> [#uses=1]
              %tmp.3.offs2 = sub int 0, %tmp.3.idx            ; <int> [#uses=1]
              %tmp.7 = seteq int %tmp.3.idx1, %tmp.3.offs2            ; <bool> [#uses=1]
              ret bool %tmp.7
      }
      
      
      generate this:
      
      bool %test2(int %X, int %Y) {
              seteq int %X, 0         ; <bool>:0 [#uses=1]
              seteq int %Y, 0         ; <bool>:1 [#uses=1]
              %tmp.7 = and bool %0, %1                ; <bool> [#uses=1]
              ret bool %tmp.7
      }
      
      This idiom occurs in C++ programs when iterating from begin() to end(),
      in a vector or array.  For example, we now compile this:
      
      void test(int X, int Y) {
        for (int *i = arr; i != arr+100; ++i)
          foo(*i);
      }
      
      to this:
      
      no_exit:                ; preds = %entry, %no_exit
      	...
              %exitcond = seteq uint %indvar.next, 100                ; <bool> [#uses=1]
              br bool %exitcond, label %return, label %no_exit
      
      
      
      instead of this:
      
      no_exit:                ; preds = %entry, %no_exit
      	...
              %inc5 = getelementptr [100 x [40 x int]]* %arr, int 0, int 0, int %inc.rec              ; <int*> [#uses=1]
              %tmp.8 = seteq int* %inc5, getelementptr ([100 x [40 x int]]* %arr, int 0, int 100, int 0)              ; <bool> [#uses=1]
              %indvar.next = add uint %indvar, 1              ; <uint> [#uses=1]
              br bool %tmp.8, label %return, label %no_exit
      
      llvm-svn: 19536
      81e84176
    • Chris Lattner's avatar
      Fix some bugs in code I didn't mean to check in. · 4cb9fa37
      Chris Lattner authored
      llvm-svn: 19534
      4cb9fa37
    • Chris Lattner's avatar
      Fix a crash compiling 129.compress · 0798af33
      Chris Lattner authored
      llvm-svn: 19533
      0798af33
  15. Jan 08, 2005
  16. Jan 06, 2005
  17. Jan 01, 2005
    • Chris Lattner's avatar
      This is a bulk commit that implements the following primary improvements: · 86102b8a
      Chris Lattner authored
        * We can now fold cast instructions into select instructions that
          have at least one constant operand.
        * We now optimize expressions more aggressively based on bits that are
          known to be zero.  These optimizations occur a lot in code that uses
          bitfields even in simple ways.
        * We now turn more cast-cast sequences into AND instructions.  Before we
          would only do this if it if all types were unsigned.  Now only the
          middle type needs to be unsigned (guaranteeing a zero extend).
        * We transform sign extensions into zero extensions in several cases.
      
      This corresponds to these test/Regression/Transforms/InstCombine testcases:
        2004-11-22-Missed-and-fold.ll
        and.ll: test28-29
        cast.ll: test21-24
        and-or-and.ll
        cast-cast-to-and.ll
        zeroext-and-reduce.ll
      
      llvm-svn: 19220
      86102b8a
  18. Dec 29, 2004
  19. Dec 15, 2004
  20. Dec 14, 2004
  21. Dec 13, 2004
  22. Dec 12, 2004
Loading