- Apr 23, 2008
-
-
Anton Korobeynikov authored
llvm-svn: 50173
-
Anton Korobeynikov authored
llvm-svn: 50169
-
Anton Korobeynikov authored
llvm-svn: 50168
-
Anton Korobeynikov authored
Be over-conservative: scan for all used virtual registers and calculate maximal stack alignment in assumption, that there will be spill of vector register. llvm-svn: 50167
-
Anton Korobeynikov authored
llvm-svn: 50166
-
Anton Korobeynikov authored
llvm-svn: 50165
-
Anton Korobeynikov authored
llvm-svn: 50164
-
Anton Korobeynikov authored
llvm-svn: 50163
-
Anton Korobeynikov authored
llvm-svn: 50162
-
Anton Korobeynikov authored
Eastimate required stack alignment early, so we can decide, whether we will need frame pointer or not llvm-svn: 50161
-
Anton Korobeynikov authored
llvm-svn: 50160
-
Anton Korobeynikov authored
llvm-svn: 50159
-
Anton Korobeynikov authored
llvm-svn: 50158
-
Anton Korobeynikov authored
llvm-svn: 50157
-
Anton Korobeynikov authored
llvm-svn: 50156
-
Anton Korobeynikov authored
llvm-svn: 50155
-
Anton Korobeynikov authored
llvm-svn: 50154
-
Anton Korobeynikov authored
llvm-svn: 50153
-
Anton Korobeynikov authored
llvm-svn: 50152
-
Chris Lattner authored
callees. llvm-svn: 50142
-
Chris Lattner authored
fix read after free bug (PR2238). llvm-svn: 50141
-
Chris Lattner authored
would turn every getresult instruction into undef. This helps with rdar://5778210 llvm-svn: 50140
-
Chris Lattner authored
llvm-svn: 50139
-
Chris Lattner authored
logic with vmcore. llvm-svn: 50138
-
Chris Lattner authored
llvm-svn: 50137
-
Chris Lattner authored
call/invoke or undef. llvm-svn: 50129
-
Dale Johannesen authored
type of a different size. llvm-svn: 50121
-
Evan Cheng authored
Don't do: "(X & 4) >> 1 == 2 --> (X & 4) == 4" if there are more than one uses of the shift result. llvm-svn: 50118
-
- Apr 22, 2008
-
-
Chris Lattner authored
where a comparison has a phi input and that phi is a constant. For example, stuff like: Threading edge through bool from 'bb2149' to 'bb2231' with cost: 1, across block: bb2237: ; preds = %bb2231, %bb2149 %tmp2328.rle = phi i32 [ %tmp2232, %bb2231 ], [ %tmp2232439, %bb2149 ] ; <i32> [#uses=2] %done.0 = phi i32 [ %done.2, %bb2231 ], [ 0, %bb2149 ] ; <i32> [#uses=1] %tmp2239 = icmp eq i32 %done.0, 0 ; <i1> [#uses=1] br i1 %tmp2239, label %bb2231, label %bb2327 or bb38.i298: ; preds = %bb33.i295, %bb1693 %tmp39.i296.rle = phi %struct.ibox* [ null, %bb1693 ], [ %tmp39.i296.rle1109, %bb33.i295 ] ; <%struct.ibox*> [#uses=2] %minspan.1.i291.reg2mem.1 = phi i32 [ 32000, %bb1693 ], [ %minspan.0.i288, %bb33.i295 ] ; <i32> [#uses=1] %tmp40.i297 = icmp eq %struct.ibox* %tmp39.i296.rle, null ; <i1> [#uses=1] br i1 %tmp40.i297, label %implfeeds.exit311, label %bb43.i301 This triggers thousands of times in spec. llvm-svn: 50110
-
Chris Lattner authored
llvm-svn: 50106
-
Chris Lattner authored
br (and X, phi(Y, Z, false)), label L1, label L2 This triggers once on 252.eon and 6 times on 176.gcc. Blocks in question often look like this: bb262: ; preds = %bb261, %bb248 %iftmp.251.0 = phi i1 [ true, %bb261 ], [ false, %bb248 ] ; <i1> [#uses=4] %tmp270 = icmp eq %struct.rtx_def* %tmp.0.i, null ; <i1> [#uses=1] %bothcond = or i1 %iftmp.251.0, %tmp270 ; <i1> [#uses=1] br i1 %bothcond, label %bb288, label %bb273 In this case, it is clear that it doesn't matter if tmp.0.i is null when coming from bb261. When coming from bb248, it is all that matters. Another random example: check_asm_operands.exit: ; preds = %check_asm_operands.exit.thr_comm, %bb30.i, %bb12.i, %bb6.i413 %tmp.0.i420 = phi i1 [ true, %bb6.i413 ], [ true, %bb12.i ], [ true, %bb30.i ], [ false, %check_asm_operands.exit.thr_comm ; <i1> [#uses=1] call void @llvm.stackrestore( i8* %savedstack ) nounwind %tmp4389 = icmp eq i32 %added_sets_1.0, 0 ; <i1> [#uses=1] %tmp4394 = icmp eq i32 %added_sets_2.0, 0 ; <i1> [#uses=1] %bothcond80 = and i1 %tmp4389, %tmp4394 ; <i1> [#uses=1] %bothcond81 = and i1 %bothcond80, %tmp.0.i420 ; <i1> [#uses=1] br i1 %bothcond81, label %bb4398, label %bb4397 Here is the case from 252.eon: bb290.i.i: ; preds = %bb23.i57.i.i, %bb8.i39.i.i, %bb100.i.i, %bb100.i.i, %bb85.i.i110 %myEOF.1.i.i = phi i1 [ true, %bb100.i.i ], [ true, %bb100.i.i ], [ true, %bb85.i.i110 ], [ true, %bb8.i39.i.i ], [ false, %bb23.i57.i.i ] ; <i1> [#uses=2] %i.4.i.i = phi i32 [ %i.1.i.i, %bb85.i.i110 ], [ %i.0.i.i, %bb100.i.i ], [ %i.0.i.i, %bb100.i.i ], [ %i.3.i.i, %bb8.i39.i.i ], [ %i.3.i.i, %bb23.i57.i.i ] ; <i32> [#uses=3] %tmp292.i.i = load i8* %tmp16.i.i100, align 1 ; <i8> [#uses=1] %tmp293.not.i.i = icmp ne i8 %tmp292.i.i, 0 ; <i1> [#uses=1] %bothcond.i.i = and i1 %tmp293.not.i.i, %myEOF.1.i.i ; <i1> [#uses=1] br i1 %bothcond.i.i, label %bb202.i.i, label %bb301.i.i Factoring out 3 common predecessors. On the path from any blocks other than bb23.i57.i.i, the load and compare are dead. llvm-svn: 50096
-
Chris Lattner authored
llvm-svn: 50094
-
Chris Lattner authored
llvm-svn: 50080
-
Chris Lattner authored
getelementptr-seteq.ll into: define i1 @test(i64 %X, %S* %P) { %C = icmp eq i64 %X, -1 ; <i1> [#uses=1] ret i1 %C } instead of: define i1 @test(i64 %X, %S* %P) { %A.idx.mask = and i64 %X, 4611686018427387903 ; <i64> [#uses=1] %C = icmp eq i64 %A.idx.mask, 4611686018427387903 ; <i1> [#uses=1] ret i1 %C } And fixes the second half of PR2235. This speeds up the insertion sort case by 45%, from 1.12s to 0.77s. In practice, this will significantly speed up for loops structured like: for (double *P = Base + N; P != Base; --P) ... Which happens frequently for C++ iterators. llvm-svn: 50079
-
Chris Lattner authored
llvm-svn: 50078
-
Dan Gohman authored
argument. The x86-64 ABI requires the incoming value of %rdi to be copied to %rax on exit from a function that is returning a large C struct. Also, add a README-X86-64 entry detailing the missed optimization opportunity and proposing an alternative approach. llvm-svn: 50075
-
- Apr 21, 2008
-
-
Dan Gohman authored
empty ScheduleDAG. llvm-svn: 50054
-
Dan Gohman authored
llvm-svn: 50053
-
Dan Gohman authored
llvm-svn: 50051
-
Chris Lattner authored
llvm-svn: 50047
-