- Apr 15, 2004
-
-
Chris Lattner authored
Instead of producing code like this: Loop: X = phi 0, X2 ... X2 = X + 1 if (X != N-1) goto Loop We now generate code that looks like this: Loop: X = phi 0, X2 ... X2 = X + 1 if (X2 != N) goto Loop This has two big advantages: 1. The trip count of the loop is now explicit in the code, allowing the direct implementation of Loop::getTripCount() 2. This reduces register pressure in the loop, and allows X and X2 to be put into the same register. As a consequence of the second point, the code we generate for loops went from: .LBB2: # no_exit.1 ... mov %EDI, %ESI inc %EDI cmp %ESI, 2 mov %ESI, %EDI jne .LBB2 # PC rel: no_exit.1 To: .LBB2: # no_exit.1 ... inc %ESI cmp %ESI, 3 jne .LBB2 # PC rel: no_exit.1 ... which has two fewer moves, and uses one less register. llvm-svn: 12961
-
- Apr 14, 2004
-
-
Chris Lattner authored
llvm-svn: 12940
-
- Apr 13, 2004
-
-
Chris Lattner authored
test/Regression/Transforms/SCCP/calltest.ll llvm-svn: 12921
-
Chris Lattner authored
llvm-svn: 12917
-
Chris Lattner authored
LoopSimplify was not updating dominator frontiers correctly in some cases. llvm-svn: 12890
-
Chris Lattner authored
llvm-svn: 12888
-
Chris Lattner authored
This is fairly straight-forward, but was a real nightmare to get just perfect. aarg. :) llvm-svn: 12884
-
- Apr 12, 2004
-
-
Chris Lattner authored
llvm-svn: 12858
-
- Apr 11, 2004
-
-
Chris Lattner authored
llvm-svn: 12826
-
Chris Lattner authored
llvm-svn: 12824
-
Chris Lattner authored
llvm-svn: 12821
-
Chris Lattner authored
Canonicalize add of sign bit constant into a xor llvm-svn: 12819
-
- Apr 10, 2004
-
-
Chris Lattner authored
and a bit more powerful llvm-svn: 12817
-
Chris Lattner authored
llvm-svn: 12816
-
Chris Lattner authored
llvm-svn: 12814
-
Chris Lattner authored
llvm-svn: 12813
-
Chris Lattner authored
llvm-svn: 12811
-
Chris Lattner authored
llvm-svn: 12810
-
Chris Lattner authored
call and invoke instructions that are known to not write to memory. llvm-svn: 12807
-
Chris Lattner authored
This transforms code like this: %C = or %A, %B %D = select %cond, %C, %A into: %C = select %cond, %B, 0 %D = or %A, %C Since B is often a constant, the select can often be eliminated. In any case, this reduces the usage count of A, allowing subsequent optimizations to happen. This xform applies when the operator is any of: add, sub, mul, or, xor, and, shl, shr llvm-svn: 12800
-
- Apr 09, 2004
-
-
Chris Lattner authored
that have a constant operand. This implements add.ll:test19, shift.ll:test15*, and others that are not tested llvm-svn: 12794
-
Chris Lattner authored
llvm-svn: 12793
-
- Apr 08, 2004
-
-
Chris Lattner authored
llvm-svn: 12784
-
Chris Lattner authored
llvm-svn: 12769
-
- Apr 07, 2004
-
-
Chris Lattner authored
llvm-svn: 12762
-
- Apr 05, 2004
-
-
Chris Lattner authored
llvm-svn: 12659
-
Chris Lattner authored
llvm-svn: 12658
-
Chris Lattner authored
types and can have arbitrary 32- and 64-bit integer types indexing into sequential types. llvm-svn: 12653
-
- Apr 02, 2004
-
-
Chris Lattner authored
This also implements some new features for the indvars pass, including linear function test replacement, exit value substitution, and it works with a much more general class of induction variables and loops. llvm-svn: 12620
-
- Apr 01, 2004
-
-
Chris Lattner authored
llvm-svn: 12595
-
Chris Lattner authored
Testcase: LoopSimplify/2004-04-01-IncorrectDomUpdate.ll llvm-svn: 12592
-
Chris Lattner authored
llvm-svn: 12573
-
- Mar 30, 2004
-
-
Chris Lattner authored
llvm-svn: 12544
-
Chris Lattner authored
llvm-svn: 12540
-
- Mar 26, 2004
-
-
Chris Lattner authored
llvm-svn: 12520
-
- Mar 25, 2004
-
-
Chris Lattner authored
#1 is to unconditionally strip constantpointerrefs out of instruction operands where they are absolutely pointless and inhibit optimization. GRRR! #2 is to implement InstCombine/getelementptr_const.ll llvm-svn: 12519
-
- Mar 19, 2004
-
-
Chris Lattner authored
llvm-svn: 12507
-
- Mar 17, 2004
-
-
Chris Lattner authored
llvm-svn: 12464
-
Chris Lattner authored
llvm-svn: 12458
-
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
-