| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|
|
|
|
|
|
|
|
| |
simplification present in fully optimized code (I think instcombine fails to
transform some of these when "X-Y" has more than one use). Fires here and
there all over the test-suite, for example it eliminates 8 subtractions in
the final IR for 445.gobmk, 2 subs in 447.dealII, 2 in paq8p etc.
llvm-svn: 123442
|
|
|
|
|
|
|
|
|
|
|
| |
threading of shifts over selects and phis while there. This fires here and
there in the testsuite, to not much effect. For example when compiling spirit
it fires 5 times, during early-cse, resulting in 6 more cse simplifications,
and 3 more terminators being folded by jump threading, but the final bitcode
doesn't change in any interesting way: other optimizations would have caught
the opportunity anyway, only later.
llvm-svn: 123441
|
|
|
|
|
|
|
|
|
|
|
|
| |
While there, I noticed that the transform "undef >>a X -> undef" was wrong.
For example if X is 2 then the top two bits must be equal, so the result can
not be anything. I fixed this in the constant folder as well. Also, I made
the transform for "X << undef" stronger: it now folds to undef always, even
though X might be zero. This is in accordance with the LangRef, but I must
admit that it is fairly aggressive. Also, I added "i32 X << 32 -> undef"
following the LangRef and the constant folder, likewise fairly aggressive.
llvm-svn: 123417
|
|
|
|
|
|
| |
the comment I added): an extern weak global may have a null address.
llvm-svn: 123373
|
|
|
|
|
|
|
|
| |
is "X != 0 -> X" when X is a boolean. This occurs a lot because of the way
llvm-gcc converts gcc's conditional expressions. Add this, and a few other
similar transforms for completeness.
llvm-svn: 123372
|
|
|
|
|
|
| |
is the wrong hammer for this nail, and is probably right.
llvm-svn: 122661
|
|
|
|
|
|
|
|
|
|
|
| |
numbering, in which it considers (for example) "%a = add i32 %x, %y" and
"%b = add i32 %x, %y" to be equal because the operands are equal and the
result of the instructions only depends on the values of the operands.
This has almost no effect (it removes 4 instructions from gcc-as-one-file),
and perhaps slows down compilation: I measured a 0.4% slowdown on the large
gcc-as-one-file testcase, but it wasn't statistically significant.
llvm-svn: 122654
|
|
|
|
| |
llvm-svn: 122598
|
|
|
|
|
|
|
|
| |
the original instruction, half the cases were missed (making it not
wrong but suboptimal). Also correct a typo (A <-> B) in the second
chunk.
llvm-svn: 122414
|
|
|
|
|
|
| |
instcombine is compared to instsimplify.
llvm-svn: 122397
|
|
|
|
|
|
|
| |
not assume this (for example in case more transforms get added below
it). Suggested by Frits van Bommel.
llvm-svn: 122332
|
|
|
|
| |
llvm-svn: 122331
|
|
|
|
|
|
| |
plenty left though!), in particular for multiplication.
llvm-svn: 122330
|
|
|
|
|
|
|
| |
quite often, but don't make much difference in practice presumably because
instcombine also knows them and more.
llvm-svn: 122328
|
|
|
|
|
|
| |
No functionality change.
llvm-svn: 122327
|
|
|
|
|
|
|
|
|
|
|
|
| |
a couple of existing transforms. This fires surprisingly often, for
example when compiling gcc "(X+(-1))+1->X" fires quite a lot as well
as various "and" simplifications (usually with a phi node operand).
Most of the time this doesn't make a real difference since the same
thing would have been done elsewhere anyway, eg: by instcombine, but
there are a few places where this results in simplifications that we
were not doing before.
llvm-svn: 122326
|
|
|
|
|
|
|
| |
(they had just been forgotten before). Adding Xor causes "main" in the
existing testcase 2010-11-01-lshr-mask.ll to be hugely more simplified.
llvm-svn: 122245
|
|
|
|
|
|
| |
instcombine and into InstructionSimplify.
llvm-svn: 121861
|
|
|
|
|
|
|
| |
it to be replaced by undef rather than not replaced at all, the idea being that
this may reduce the amount of work done by whoever called InstructionSimplify.
llvm-svn: 121860
|
|
|
|
|
|
|
|
|
|
|
| |
uninitialized. The warning is terrible, has incorrect source locations, and has
a huge false positive rate such as *all* of these.
If anyone has a better solution, please let me know. Alternatively, I'll
happily add -Wno-uninitialized to the -Werror build mode. Maybe I can even do
it *only* when building with GCC instead of Clang.
llvm-svn: 120281
|
|
|
|
| |
llvm-svn: 120016
|
|
|
|
|
|
| |
then replace the index with zero.
llvm-svn: 119974
|
|
|
|
|
|
| |
InstructionSimplify.
llvm-svn: 119970
|
|
|
|
|
|
|
|
|
|
| |
constant
folding improvements: if P points to a type of size zero, turn "gep P, N" into "P".
More generally, if a gep index type has size zero, instcombine could replace the
index with zero, but that is not done here.
llvm-svn: 119942
|
|
|
|
|
|
| |
of why such threading is pointless.
llvm-svn: 119798
|
|
|
|
|
|
|
|
| |
instructions out of InstCombine and into InstructionSimplify. While
there, introduce an m_AllOnes pattern to simplify matching with integers
and vectors with all bits equal to one.
llvm-svn: 119536
|
|
|
|
|
|
|
|
| |
simplified to itself (this can only happen in unreachable blocks).
Change it to return null instead. Hopefully this will fix some
buildbot failures.
llvm-svn: 119490
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
class, uses DominatorTree which is an analysis. This change moves all of
the tricky hasConstantValue logic to SimplifyInstruction, and replaces it
with a very simple literal implementation. I already taught users of
hasConstantValue that need tricky stuff to use SimplifyInstruction instead.
I didn't update InlineFunction because the IR looks like it might be in a
funky state at the point it calls hasConstantValue, which makes calling
SimplifyInstruction dangerous since it can in theory do a lot of tricky
reasoning. This may be a pessimization, for example in the case where
all phi node operands are either undef or a fixed constant.
llvm-svn: 119459
|
|
|
|
|
|
|
|
|
|
|
| |
over a phi node by applying it to each operand may be wrong if the
operation and the phi node are mutually interdependent (the testcase
has a simple example of this). So only do this transform if it would
be correct to perform the operation in each predecessor of the block
containing the phi, i.e. if the other operands all dominate the phi.
This should fix the FFMPEG snow.c regression reported by İsmail Dönmez.
llvm-svn: 119347
|
|
|
|
|
|
| |
values that are equal to the phi itself.
llvm-svn: 119161
|
|
|
|
|
|
| |
it to get better phi node simplification.
llvm-svn: 119055
|
|
|
|
|
|
|
|
|
|
| |
offload the work to hasConstantValue rather than do something more
complicated (such handling mutually recursive phis) because (1) it is
not clear it is worth it; and (2) if it is worth it, maybe such logic
would be better placed in hasConstantValue. Adjust some GVN tests
which are now cleaned up much further (eg: all phi nodes are removed).
llvm-svn: 119043
|
|
|
|
| |
llvm-svn: 119038
|
|
|
|
|
|
| |
Probably it should just be 1, but compromise with 3.
llvm-svn: 118718
|
|
|
|
|
|
|
|
|
| |
nodes can be used in loops, this could result in infinite looping
if there is no recursion limit, so add such a limit. It is also
used for the SelectInst case because in theory there could be an
infinite loop there too if the basic block is unreachable.
llvm-svn: 118694
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The simplifications performed here never create new instructions, they
only return existing instructions (or a constant), and so are always a
win. In theory they should transform (for example)
%z = and i32 %x, %y
%s = select i1 %cond, i32 %y, i32 %z
%r = and i32 %x, %s
into
%r = and i32 %x, y
but in practice they get into a fight with instcombine, and lose.
Unfortunately instcombine does a poor job in this case. Nonetheless
I'm committing this transform to make it easier to discuss what to
do to make peace with instcombine.
llvm-svn: 118679
|
|
|
|
| |
llvm-svn: 118516
|
|
|
|
|
|
|
| |
of a select instruction, the same as already exists for integer
comparisons.
llvm-svn: 118379
|
|
|
|
|
|
|
|
| |
of a select instruction, see if doing the compare with the
true and false values of the select gives the same result.
If so, that can be used as the value of the comparison.
llvm-svn: 118378
|
|
|
|
|
|
|
|
|
| |
Instruction by itself. Now that CorrelatedValuePropagation is
more careful not to call SimplifyInstructionsInBlock() on an unreachable block, the issue has been fixed at a higher level. Add
a big warning to SimplifyInstructionsInBlock() to hopefully prevent this in the future.
llvm-svn: 114117
|
|
|
|
|
|
|
|
| |
simplification to try
to replace an instruction with itself. Add a predicate to the simplifier to prevent this case.
llvm-svn: 114097
|
|
|
|
|
|
| |
Reassociate does this but it doesn't catch all cases (e.g. if the operands are i1).
llvm-svn: 113651
|
|
|
|
|
|
|
|
|
|
| |
mutated by recursive simplification. This also enhances
ReplaceAndSimplifyAllUses to actually do a real RAUW
at the end of it, which updates any value handles
pointing to "From" to start pointing to "To". This
seems useful for debug info and random other VH users.
llvm-svn: 108415
|
|
|
|
| |
llvm-svn: 108407
|
|
|
|
| |
llvm-svn: 108401
|
|
|
|
|
|
| |
inst simplify. No functionality change.
llvm-svn: 101873
|
|
|
|
| |
llvm-svn: 97659
|
|
|
|
| |
llvm-svn: 96777
|
|
|
|
| |
llvm-svn: 90011
|
|
|
|
|
|
| |
SimplifyGEPInst method in InstructionSimplify.h. No functionality change.
llvm-svn: 89980
|