Matthijs Kooijman
98b5c16e3b
Add -unroll-allow-partial command line option that enabled the loop unroller to
...
partially unroll a loop when fully unrolling would not fit under the threshold.
Patch by Mikael Lepistö.
llvm-svn: 54160
2008-07-29 13:21:23 +00:00
Matthijs Kooijman
fd3070459b
Restructure ArgumentPromotion a bit. Instead of just having a single boolean
...
that says "unconditional loads from this argument are safe", we now keep track
of the safety per set of indices from which loads happen. This prevents
ArgPromotion from promoting loads that aren't really valid. As an added effect,
this will now disregard the the type of the indices passed to a GEP, so
"load GEP %A, i32 1" and "load GEP %A, i64 1" will result in a single argument,
not two.
This fixes PR2598, for which a testcase has been added as well.
llvm-svn: 54159
2008-07-29 10:00:13 +00:00
Owen Anderson
813bf7af7f
Don't remove volatile loads. Thanks to Duncan for noticing this one.
...
llvm-svn: 54144
2008-07-28 20:52:42 +00:00
Owen Anderson
3f3389745d
Add support for eliminating stores that store the same value that was just loaded.
...
This fixes PR2599.
llvm-svn: 54133
2008-07-28 16:14:26 +00:00
Dan Gohman
2ce6f2ad5e
Rename SDOperand to SDValue.
...
llvm-svn: 54128
2008-07-27 21:46:04 +00:00
Dan Gohman
5f36a32e7b
Put the LICM of constant GlobalVariables, introduced in r53945, under a
...
command-line option, and disable it by default. It introduced performance
regressions because CodeGen is currently not able to remat such loads.
llvm-svn: 53997
2008-07-24 23:57:25 +00:00
Chris Lattner
8a8fb908dc
"Allow LICM to sink or lift loads from constant memory. Also add a test
...
case for this.
This allows instructions like loads from global variables declared to
be constant to be moved out of loops."
Patch by Stefanus Du Toit!
llvm-svn: 53945
2008-07-23 05:06:28 +00:00
Dan Gohman
fa1211f69b
Enable first-class aggregates support.
...
Remove the GetResultInst instruction. It is still accepted in LLVM assembly
and bitcode, where it is now auto-upgraded to ExtractValueInst. Also, remove
support for return instructions with multiple values. These are auto-upgraded
to use InsertValueInst instructions.
The IRBuilder still accepts multiple-value returns, and auto-upgrades them
to InsertValueInst instructions.
llvm-svn: 53941
2008-07-23 00:34:11 +00:00
Dan Gohman
7ad3cd8c9d
Fix a bug in LSR's dead-PHI cleanup. If a PHI has a def-use chain that
...
leads into a cycle involving a different PHI, LSR got stuck running
around that cycle looking for the original PHI. To avoid this, keep
track of visited PHIs and stop searching if we see one more than once.
This fixes PR2570.
llvm-svn: 53879
2008-07-21 21:45:02 +00:00
Duncan Sands
2c741145a7
Supress a gcc-4.3 warning.
...
llvm-svn: 53771
2008-07-18 21:06:02 +00:00
Owen Anderson
04a6e0ba8c
Make PRE actually handle critical edges (by splitting them). Confirmed that bootstrap passes with this change.
...
llvm-svn: 53762
2008-07-18 18:03:38 +00:00
Owen Anderson
9858691f25
Reapply r53735. My last patch fixed the failures Dan observed.
...
llvm-svn: 53761
2008-07-18 17:49:43 +00:00
Owen Anderson
1468bec06e
Add some checks that got lost in the shuffle. This fixes 464.h264ref.
...
llvm-svn: 53760
2008-07-18 17:46:41 +00:00
Dan Gohman
29c3adaae0
Revert r53735. It broke SPEC 464.h264ref.
...
llvm-svn: 53757
2008-07-18 16:44:49 +00:00
Owen Anderson
fd7102037d
Use MergeBlockIntoPredecessor to simplify some code.
...
llvm-svn: 53735
2008-07-17 20:00:46 +00:00
Owen Anderson
27405efdc0
Make MergeBlockIntoPredecessor more aggressive when the same successor appears
...
more than once.
llvm-svn: 53731
2008-07-17 19:42:29 +00:00
Owen Anderson
addbe3eed1
Enable PRE. My last batch of changes fixed the miscompile.
...
llvm-svn: 53730
2008-07-17 19:41:00 +00:00
Matthijs Kooijman
8b69d77a7a
Make GlobalOpt preserve address spaces when scalar replacing aggregate globals.
...
llvm-svn: 53716
2008-07-17 11:59:53 +00:00
Chris Lattner
c600c53d1f
Fix PR2553
...
llvm-svn: 53715
2008-07-17 06:07:20 +00:00
Evan Cheng
97cd0298cc
Inliner tweak. Function calls should cost more than one instruction!
...
llvm-svn: 53712
2008-07-17 01:31:49 +00:00
Owen Anderson
c062381c7b
Factor MergeBlockIntoPredecessor out into BasicBlockUtils.
...
llvm-svn: 53705
2008-07-17 00:01:40 +00:00
Owen Anderson
ac31096311
There's no need to iterate block merging and PRE. In fact, iterating the latter
...
could cause problems for memdep when it breaks critical edges.
llvm-svn: 53691
2008-07-16 17:52:31 +00:00
Matthijs Kooijman
c1d7477ed2
Redo InstCombiner::visitExtractValueInst. Instead of using the (complicate)
...
FindInsertedValue, it now performs a number of simple transformations that
should result in the same effect when applied iteratively.
llvm-svn: 53673
2008-07-16 12:55:45 +00:00
Evan Cheng
c97094552c
Fix PR2296. Do not transform x86_sse2_storel_dq into a full-width store.
...
llvm-svn: 53666
2008-07-16 07:28:14 +00:00
Owen Anderson
24768e3dc4
Revert this, as it seems to still be broken.
...
llvm-svn: 53627
2008-07-15 17:59:02 +00:00
Owen Anderson
9d1f497a28
Enable local PRE by default.
...
llvm-svn: 53616
2008-07-15 16:28:23 +00:00
Owen Anderson
53d546e40b
Have GVN do a pre-pass over the CFG that folds away unconditional branches where possible. This allows local PRE to be more aggressive.
...
llvm-svn: 53615
2008-07-15 16:28:06 +00:00
Matthijs Kooijman
c893bf472d
Allow deadargelim to change return types even though now values were dead. This
...
again canonicalizes {i32} into i32 and {} into void.
llvm-svn: 53610
2008-07-15 14:42:31 +00:00
Matthijs Kooijman
5e8c022e21
Revert r53606. It turns out that explicitely tracking the liveness of the
...
return value as a whole in deadargelim is really not needed now that we simply
rebuild the old return value and actually prevents some canonicalization from
taking place.
This revert stops deadargelim from changing {i32} into i32 for now, but I'll
fix that next.
llvm-svn: 53609
2008-07-15 14:39:36 +00:00
Matthijs Kooijman
c1da874478
Make deadargelim a bit less smart, so it doesn't choke on nested structs as
...
return values that are still (partially) live. Instead of updating all uses of
a call instruction after removing some elements, it now just rebuilds the
original struct (With undef gaps where the unused values were) and leaves it to
instcombine to clean this up.
The added testcase still fails currently, but this is due to instcombine which
isn't good enough yet. I will fix that part next.
llvm-svn: 53608
2008-07-15 14:03:10 +00:00
Matthijs Kooijman
04d4c328ac
Don't use isa when we can reuse a previous dyn_cast.
...
llvm-svn: 53607
2008-07-15 13:39:08 +00:00
Matthijs Kooijman
84194b6768
Make DeadArgElim keep liveness of the return value as a whole in addition to
...
only the liveness of partial return values (for functions returning a struct).
This is more explicit to prevent unwanted changes in the return value.
In particular, deadargelim now canonicalizes a function returning {i32} to
returning i32 and {} to void, if the struct returned is not used in its
entirety, but only the single element is used.
llvm-svn: 53606
2008-07-15 13:36:06 +00:00
Matthijs Kooijman
79a8eb547c
Let DAE keep a list of live functions, instead of simply marking all arguments
...
and return values live for those functions. This doesn't change anything yet,
but prepares for the coming commits.
llvm-svn: 53601
2008-07-15 09:11:16 +00:00
Matthijs Kooijman
e9af814669
Split DAE::MarkLive into MarkLive and PropagateLiveness.
...
llvm-svn: 53600
2008-07-15 09:00:17 +00:00
Matthijs Kooijman
2ce5709e31
Pass around const RetOrArg references instead of copying values. Also, mark
...
RetOrArg::getDescription() as const.
llvm-svn: 53599
2008-07-15 08:56:49 +00:00
Matthijs Kooijman
f2860b9fb3
Simplify debug code by using RetOrArg::getDescription().
...
llvm-svn: 53598
2008-07-15 08:53:36 +00:00
Matthijs Kooijman
90d08addb0
Fix indentation (intentionally left out of the previous commit).
...
llvm-svn: 53592
2008-07-15 08:47:32 +00:00
Matthijs Kooijman
06642d3812
Move the deadargelim code for intrinsically alive functions into its own
...
method, to slightly simplify control flow.
llvm-svn: 53591
2008-07-15 08:45:12 +00:00
Dan Gohman
162668fa78
Fix uninitialized use of the Changed variable.
...
llvm-svn: 53564
2008-07-14 17:55:01 +00:00
Chris Lattner
8882b1c41c
Reapply r53540, now with the matching header!
...
llvm-svn: 53557
2008-07-14 17:32:59 +00:00
Duncan Sands
68b0383057
Revert r53540 - it does not compile.
...
llvm-svn: 53549
2008-07-14 07:59:28 +00:00
Chris Lattner
2831ad28be
If a function calls setjmp, never inline it into other functions. This is
...
a hack around the fact that we don't represent the CFG correctly for sj/lj.
It fixes PR2486.
llvm-svn: 53540
2008-07-14 00:46:56 +00:00
Chris Lattner
6f5ea6e49c
simplify some code, shuffle and insertelt always return a vector.
...
llvm-svn: 53538
2008-07-14 00:32:20 +00:00
Chris Lattner
16395e51f4
Fix PR2506 by being a bit more careful about reverse fact propagation when
...
disproving a condition. This actually compiles the existing testcase
(udiv_select_to_select_shift) to:
define i64 @test(i64 %X, i1 %Cond) {
entry:
%divisor1.t = lshr i64 %X, 3 ; <i64> [#uses=1]
%quotient2 = lshr i64 %X, 3 ; <i64> [#uses=1]
%sum = add i64 %divisor1.t, %quotient2 ; <i64> [#uses=1]
ret i64 %sum
}
instead of:
define i64 @test(i64 %X, i1 %Cond) {
entry:
%quotient1.v = select i1 %Cond, i64 3, i64 4 ; <i64> [#uses=1]
%quotient1 = lshr i64 %X, %quotient1.v ; <i64> [#uses=1]
%quotient2 = lshr i64 %X, 3 ; <i64> [#uses=1]
%sum = add i64 %quotient1, %quotient2 ; <i64> [#uses=1]
ret i64 %sum
}
llvm-svn: 53534
2008-07-14 00:15:52 +00:00
Chris Lattner
80b03a1b49
Fix mishandling of the infinite loop case when merging two blocks. This
...
fixes PR2540.
llvm-svn: 53533
2008-07-13 22:23:11 +00:00
Chris Lattner
834ab4ec1b
more refactoring. Use early exits instead of really complex logic.
...
No functionality change.
llvm-svn: 53532
2008-07-13 22:04:41 +00:00
Chris Lattner
5eed37224a
improve comments.
...
llvm-svn: 53531
2008-07-13 21:55:46 +00:00
Chris Lattner
9aada1d755
factor another large hunk of code out into its own function.
...
No functionality change.
llvm-svn: 53530
2008-07-13 21:53:26 +00:00
Chris Lattner
55eaae1e0c
Final bit of simplification for FoldBranchToCommonDest.
...
llvm-svn: 53528
2008-07-13 21:20:19 +00:00
Chris Lattner
1b317ea48a
simplify logic a bit
...
llvm-svn: 53527
2008-07-13 21:15:11 +00:00
Chris Lattner
2e25b8f444
Refactor some code out into its own helper function, getting rid of crazy multiline
...
conditionals and commenting the code better.
No functionality change.
llvm-svn: 53526
2008-07-13 21:12:01 +00:00
Nick Lewycky
f76aa23b54
Enhance analysis of srem.
...
Remove dead code analyzing urem. 'urem' of power-of-2 is canonicalized to an
'and' instruction.
llvm-svn: 53506
2008-07-12 05:04:38 +00:00
Dan Gohman
3707f1daba
Use find instead of lower_bound.
...
llvm-svn: 53474
2008-07-11 20:58:19 +00:00
Owen Anderson
8e462e9a82
Don't call lookupNumber more than we have to.
...
llvm-svn: 53470
2008-07-11 20:05:13 +00:00
Nick Lewycky
45e127ab20
Document 'mask' in this calculation.
...
llvm-svn: 53454
2008-07-11 08:16:26 +00:00
Nick Lewycky
da405e1155
Remove misleading constant from comment.
...
llvm-svn: 53452
2008-07-11 07:36:19 +00:00
Nick Lewycky
f95b64acaa
Add another optimization from PR2330. Also catch some missing cases that are
...
similar.
llvm-svn: 53451
2008-07-11 07:20:53 +00:00
Chris Lattner
3994bed1a9
a missed optimization that Eli spotted
...
llvm-svn: 53449
2008-07-11 06:40:29 +00:00
Chris Lattner
13a6911ea2
another bug in the same line.
...
llvm-svn: 53448
2008-07-11 06:38:16 +00:00
Chris Lattner
de89b507dd
fix a bug spotted by Eli's eagle eyes
...
llvm-svn: 53447
2008-07-11 06:36:01 +00:00
Chris Lattner
bd25b8507c
simplify and merge a bunch of code. Instead of comparing against
...
the min/max values for an integer type, compare against the min/max
values we can prove contain the input. This might be a tighter bound,
so this is general goodness.
llvm-svn: 53446
2008-07-11 05:40:05 +00:00
Chris Lattner
38a50c9528
fold away (x <= cst) earlier, allowing us to not have to
...
handle them in some code.
llvm-svn: 53445
2008-07-11 05:08:55 +00:00
Chris Lattner
6af608b8ce
Fix folding of icmp's of i1 where the comparison is signed. The code
...
was using the algorithm for folding unsigned comparisons which is
completely wrong. This has been broken since the signless types change.
llvm-svn: 53444
2008-07-11 04:20:58 +00:00
Chris Lattner
4fa8bb3430
Fix a bogus optimization: folding (slt (zext i1 A to i32), 1) -> (slt i1 A, true)
...
This cause a regression in InstCombine/JavaCompare, which was doing the right
thing on accident. To handle the missed case, generalize the comparisons based
on masked bits a little bit to handle comparisons against the max value. For
example, we can now xform (slt i32 (and X, 4), 4) -> (setne i32 (and X, 4), 4)
llvm-svn: 53443
2008-07-11 04:09:09 +00:00
Matthijs Kooijman
e0f3ab82c4
Restructure dead argument elimination, try #3 :-)
...
Rewrite the DeadArgumentElimination pass, to use a more explicit tracking of
dependencies between return values and/or arguments. Also make the handling of
arguments and return values the same.
The pass now looks properly inside returned structs, but only at the first
level (ie, not inside nested structs).
This version fixed a few more bugs and was cleaned up a bit. It now passes all
of LLVM's testing, and should still pass SPEC2006. There is still a minor bug
with regard to returning nested structs. Since there is currently nothing that
emits such IR, I will fix that in a seperate commit (partly because it requires
a non-trivial fix).
llvm-svn: 53400
2008-07-10 10:24:08 +00:00
Nick Lewycky
6193a564ab
Fix overzealous optimization. Thanks to Duncan Sands for pointing out my error!
...
llvm-svn: 53393
2008-07-10 05:51:40 +00:00
Nick Lewycky
bb89c2a3f6
Simplify, suggested by Chris Lattner.
...
llvm-svn: 53283
2008-07-09 07:35:26 +00:00
Nick Lewycky
f9c27c343a
Fold (a < 8) && (b < 8) into (a|b) < 8 for unsigned less or greater than.
...
llvm-svn: 53282
2008-07-09 07:29:11 +00:00
Nick Lewycky
364661c43e
Fold ((1 << a) & 1) to (a == 0).
...
llvm-svn: 53276
2008-07-09 05:20:13 +00:00
Nick Lewycky
0d3645e673
Reduce x - y to -y when we know the 'x' part will get masked off anyways.
...
llvm-svn: 53271
2008-07-09 04:32:37 +00:00
Devang Patel
51cbf928ab
If loop induction variable's start value is less then its exit value then do not split the loop.
...
llvm-svn: 53265
2008-07-09 00:12:01 +00:00
Chris Lattner
501d78fdc0
Fix PR2496, a really nasty bug which involved sinking volatile loads
...
into phis. This is actually the same bug as PR2262 /
2008-04-29-VolatileLoadDontMerge.ll, but I missed checking the first
predecessor for multiple successors. Testcase here:
InstCombine/2008-07-08-VolatileLoadMerge.ll
llvm-svn: 53240
2008-07-08 17:18:32 +00:00
Evan Cheng
03001cb820
Fix two serious LSR bugs.
...
1. LSR runOnLoop is always returning false regardless if any transformation is made.
2. AddUsersIfInteresting can create new instructions that are added to DeadInsts. But there is a later early exit which prevents them from being freed.
llvm-svn: 53193
2008-07-07 19:51:32 +00:00
Dan Gohman
38740a98b2
Make DenseMap's insert return a pair, to more closely resemble std::map.
...
llvm-svn: 53177
2008-07-07 17:46:23 +00:00
Nick Lewycky
9f1a4dc672
Fix missed optimization opportunity when analyzing cast of mul and select.
...
llvm-svn: 53151
2008-07-05 21:19:34 +00:00
Owen Anderson
3ea90a7d55
Use information already present in the ValueTable to fast-fail when we know there won't be a value number match. This speeds up GVN on a case where there are very few redundancies by ~25%.
...
llvm-svn: 53108
2008-07-03 17:44:33 +00:00
Devang Patel
eb611ddeb2
Do not try to update dominator info while manipulating CFG. This code does not handle all cases and keeps invalid dom info around some cases, which misleads other passes down stream.
...
Right now, dom info is recaluclated in the end if the loop is switched.
llvm-svn: 53106
2008-07-03 17:37:52 +00:00
Owen Anderson
d57cdc3c60
Remove the ability for ADCE to remove unreachable blocks in loop nests, because, as Eli pointed out, SimplifyCFG already does this.
...
llvm-svn: 53104
2008-07-03 17:21:41 +00:00
Bill Wendling
a96eabaab7
Remove unused function.
...
llvm-svn: 53090
2008-07-03 07:10:03 +00:00
Devang Patel
f94b9826b5
Preserve dom info.
...
llvm-svn: 53089
2008-07-03 07:04:22 +00:00
Devang Patel
226edd1826
Remove extra FIXME
...
llvm-svn: 53087
2008-07-03 06:50:04 +00:00
Devang Patel
c4dcf82a16
Reconstruct dom info, if loop is unswitched.
...
llvm-svn: 53086
2008-07-03 06:48:21 +00:00
Devang Patel
e491bb8845
LoopUnswitch does not preserve dominator info in all cases.
...
llvm-svn: 53085
2008-07-03 05:55:03 +00:00
Devang Patel
7dcfff392a
Undo previous patch. It is not that simple to fix dom info here.
...
llvm-svn: 53062
2008-07-03 00:08:13 +00:00
Devang Patel
5adfcb5783
Preserve dom info while simplifing loop after the unswitch.
...
llvm-svn: 53052
2008-07-02 22:58:54 +00:00
Owen Anderson
488b89f608
Use df_ext_iterator to capture the reachable set without allocating an extra set.
...
Also, move large sets and vectors out of instance variables and onto the stack,
and give them more reasonable sizes.
llvm-svn: 53044
2008-07-02 18:41:09 +00:00
Owen Anderson
6acc782dad
Avoid a redundant call.
...
llvm-svn: 53040
2008-07-02 18:15:31 +00:00
Owen Anderson
323b5755a6
Add support to ADCE for pruning unreachable blocks. This addresses the final
...
part of PR2509.
llvm-svn: 53038
2008-07-02 18:05:19 +00:00
Owen Anderson
9edcf24da9
Use DenseSet rather than SmallPtrSet for the alive set. Using SmallPtrSet
...
with a huge "size" parameter is actually quite inefficient.
llvm-svn: 53034
2008-07-02 17:32:04 +00:00
Owen Anderson
b22a640fe4
A better fix for PR2503 that doesn't pessimize GVN in the presence of unreachable blocks.
...
llvm-svn: 53032
2008-07-02 17:20:16 +00:00
Devang Patel
ed50fb5b61
reuse vectors.
...
llvm-svn: 53007
2008-07-02 01:44:29 +00:00
Devang Patel
57d94d6304
Fix comment.
...
llvm-svn: 53006
2008-07-02 01:31:19 +00:00
Devang Patel
e149d4ed4d
Preserve loop data so that it is not fetched everytime it is needed.
...
Keep track of currentLoop.
llvm-svn: 53005
2008-07-02 01:18:13 +00:00
Evan Cheng
da3db11db3
- Re-apply 52748 and friends with fix. GetConstantStringInfo() returns an empty string for ConstantAggregateZero case which surprises selectiondag.
...
- Correctly handle memcpy from constant string which is zero-initialized.
llvm-svn: 52891
2008-06-30 07:31:25 +00:00
Anton Korobeynikov
a7c583d584
Revert (52748 and friends):
...
Move GetConstantStringInfo to lib/Analysis. Remove
string output routine from Constant. Update all
callers. Change debug intrinsic api slightly to
accomodate move of routine, these now return values
instead of strings.
This unbreaks llvm-gcc bootstrap.
llvm-svn: 52884
2008-06-29 17:57:03 +00:00
Eric Christopher
3f1c75c4d8
Remove unused function.
...
llvm-svn: 52749
2008-06-26 01:19:35 +00:00
Eric Christopher
d0ab9c47e6
Move GetConstantStringInfo to lib/Analysis. Remove
...
string output routine from Constant. Update all
callers. Change debug intrinsic api slightly to
accomodate move of routine, these now return values
instead of strings.
llvm-svn: 52748
2008-06-26 00:31:12 +00:00
Evan Cheng
88ca48b09d
Restore DeadArgElim back to 52570. It's breaking 447.dealII.
...
llvm-svn: 52736
2008-06-25 18:10:09 +00:00
Duncan Sands
1b03c2ac98
Pacify gcc-4.3.
...
llvm-svn: 52723
2008-06-25 16:31:18 +00:00
Matthijs Kooijman
2e2001d8b9
Fix a (false) warning on darwin.
...
llvm-svn: 52705
2008-06-25 08:12:16 +00:00