Commit Graph

190 Commits

Author SHA1 Message Date
Daniel Berlin
110f9f2e80 NewGVN: Fix PR 34430 - we need to look through predicateinfo copies to detect self-cycles of phi nodes. We also need to not ignore certain types of arguments when testing whether the phi has a backedge or was originally constant.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312510 91177308-0d34-0410-b5e6-96231b3b80d8
2017-09-05 02:17:43 +00:00
Daniel Berlin
660fd0b5be NewGVN: Fix PR 34452 by passing instruction all the way down when we do aggregate value simplification
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312509 91177308-0d34-0410-b5e6-96231b3b80d8
2017-09-05 02:17:42 +00:00
Daniel Berlin
d17cd5cd24 NewGVN: Detect copies through predicateinfo
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312508 91177308-0d34-0410-b5e6-96231b3b80d8
2017-09-05 02:17:41 +00:00
Daniel Berlin
190a294869 NewGVN: Change where check for original instruction in phi of ops leader finding is done. Where we had it before, we would stop looking when we hit the original instruction, but skip it. Now we skip it and keep looking.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312507 91177308-0d34-0410-b5e6-96231b3b80d8
2017-09-05 02:17:40 +00:00
Daniel Berlin
026a351310 Fix PR/33305. caused by trying to simplify expressions in phi of ops that should have no leaders.
Summary:
After a discussion with Rekka, i believe this (or a small variant)
should fix the remaining phi-of-ops problems.

Rekka's algorithm for completeness relies on looking up expressions
that should have no leader, and expecting it to fail (IE looking up
expressions that can't exist in a predecessor, and expecting it to
find nothing).

Unfortunately, sometimes these expressions can be simplified to
constants, but we need the lookup to fail anyway.  Additionally, our
simplifier outsmarts this by taking these "not quite right"
expressions, and simplifying them into other expressions or walking
through phis, etc.  In the past, we've sometimes been able to find
leaders for these expressions, incorrectly.

This change causes us to not to try to phi of ops such expressions.
We determine safety by seeing if they depend on a phi node in our
block.

This is not perfect, we can do a bit better, but this should be a
"correctness start" that we can then improve.  It also requires a
bunch of caching that i'll eventually like to eliminate.

The right solution, longer term, to the simplifier issues, is to make
the query interface for the instruction simplifier/constant folder
have the flags we need, so that we can keep most things going, but
turn off the possibly-invalid parts (threading through phis, etc).
This is an issue in another wrong code bug as well.

Reviewers: davide, mcrosier

Subscribers: sanjoy, llvm-commits

Differential Revision: https://reviews.llvm.org/D37175

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312401 91177308-0d34-0410-b5e6-96231b3b80d8
2017-09-02 02:18:44 +00:00
Daniel Berlin
29492fbac5 NewGVN: Make sure we don't incorrectly use PredicateInfo when doing PHI of ops
Summary: When we backtranslate expressions, we can't use the predicateinfo, since we are evaluating them in a different context.

Reviewers: davide, mcrosier

Subscribers: sanjoy, Prazek, llvm-commits

Differential Revision: https://reviews.llvm.org/D37174

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312352 91177308-0d34-0410-b5e6-96231b3b80d8
2017-09-01 19:20:18 +00:00
Daniel Berlin
36fa01b111 NewGVN: Make sure we add the correct user if we swapped the comparison operands
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312162 91177308-0d34-0410-b5e6-96231b3b80d8
2017-08-30 19:53:23 +00:00
Daniel Berlin
01a26ffc1a NewGVN: Allow simplification into variables
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312161 91177308-0d34-0410-b5e6-96231b3b80d8
2017-08-30 19:52:39 +00:00
Davide Italiano
ba48d7b486 [NewGVN] Use auto when the type is obvious NFCI.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311838 91177308-0d34-0410-b5e6-96231b3b80d8
2017-08-26 22:31:10 +00:00
Daniel Berlin
7824530ee0 NewGVN: Fix PR33204 - We need to add memory users when we bypass memorydefs for loads, not just when we do it for stores.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311829 91177308-0d34-0410-b5e6-96231b3b80d8
2017-08-26 07:37:11 +00:00
Daniel Berlin
9dc6eddb1d NewGVN: We weren't properly simplifying selects with equal arguments due to a thinko.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311626 91177308-0d34-0410-b5e6-96231b3b80d8
2017-08-24 02:43:17 +00:00
Benjamin Kramer
c773276189 Move helper classes into anonymous namespaces.
No functionality change intended.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311288 91177308-0d34-0410-b5e6-96231b3b80d8
2017-08-20 13:03:48 +00:00
Craig Topper
ebdb044915 [DebugCounter] Move the semicolon out of the DEBUG_COUNTER macro and require it to be placed at the end of each use.
This make it consistent with STATISTIC which it will often appears near.

While there move one DEBUG_COUNTER instance out of an anonymous namespace. It's already declaring a static variable so the namespace is unnecessary.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@310637 91177308-0d34-0410-b5e6-96231b3b80d8
2017-08-10 17:48:11 +00:00
Chad Rosier
0db3a4f041 [NewGVN] Add CL option to control the generation of phi-of-ops (disable by default).
Differential Revision: https://reviews.llvm.org/D36478539

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@310594 91177308-0d34-0410-b5e6-96231b3b80d8
2017-08-10 14:12:57 +00:00
Chad Rosier
02ffffd209 [NewGVN] Use a cast instead of a dyn_cast.
Differential Revision: https://reviews.llvm.org/D36478

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@310397 91177308-0d34-0410-b5e6-96231b3b80d8
2017-08-08 18:41:49 +00:00
Davide Italiano
0d362a25a4 [NewGVN] Fix the case where we have a phi-of-ops which goes away.
Patch by Daniel Berlin, fixes PR33196 (and probably something else).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309988 91177308-0d34-0410-b5e6-96231b3b80d8
2017-08-03 21:17:49 +00:00
Sanjay Patel
9360b2e1ac [NewGVN] fix typos; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309946 91177308-0d34-0410-b5e6-96231b3b80d8
2017-08-03 15:18:27 +00:00
Davide Italiano
4b606092e9 [NewGVN] Fold single-use variables. NFCI.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309790 91177308-0d34-0410-b5e6-96231b3b80d8
2017-08-02 04:05:49 +00:00
Davide Italiano
0c5b2b5297 [NewGVN] Remove a (now stale) comment. NFCI.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309789 91177308-0d34-0410-b5e6-96231b3b80d8
2017-08-02 03:51:40 +00:00
Davide Italiano
17015f9a54 [NewGVN] Check for congruency of memory accesses.
This is fine as nothing in the code relies on leader and memory
leader being the same for a given congruency class. Ack'ed by
Dan.

Fixes PR33720.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307699 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-11 19:49:12 +00:00
Davide Italiano
4efbfe0504 [NewGVN] Fix an innocent typo I found while debugging PR33720.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307694 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-11 19:19:45 +00:00
Davide Italiano
e57a909956 [NewGVN] Clarify the function invariants formatting them properly.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307692 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-11 19:15:36 +00:00
Davide Italiano
063d8f6b0f [NewGVN] Simplify a lambda a little bit. NFCI.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307586 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-10 20:45:00 +00:00
Daniel Berlin
7a954fc3ee NewGVN: Remove useless test in addPhiOfOps.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306702 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-29 17:01:10 +00:00
Davide Italiano
84fac2c58c [NewGVN] Fix a bug that made the store verifier less effective.
We weren't actually checking for duplicated stores, as the condition
was always actually false. This was found by Coverity, and I have
no clue how to trigger this in real-world code (although I
 tried for a bit).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305867 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-20 22:57:40 +00:00
Davide Italiano
04b8896eca [NewGVN] Simplify findConditionEquivalence(). NFCI.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305707 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-19 16:46:15 +00:00
Daniel Berlin
47c282c3df NewGVN: Fix PR 33461, caused by slightly overzealous verification.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305657 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-19 00:24:00 +00:00
Daniel Berlin
e6644ec06a NewGVN: This is wrong by inspection, it will not cause an issue currently due to other limitations, i believe. This also means i can't make a test for it.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305415 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-14 21:19:28 +00:00
George Burgess IV
cff96a9836 Fix signed/unsigned comparison warning; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305262 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-13 01:28:49 +00:00
Daniel Berlin
2d73c379ee NewGVN: Fix PR/33187. This is a bug caused by two things:
1. When there is no perfect iteration order, we can't let phi nodes
put themselves in terms of things that come later in the iteration
order, or we will endlessly cycle (the normal RPO algorithm clears the
hashtable to avoid this issue).
2. We are sometimes erasing the wrong expression (causing pessimism)
because our equality says loads and stores are the same.
We introduce an exact equality function and use it when erasing to
make sure we erase only identical expressions, not equivalent ones.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304807 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-06 17:15:28 +00:00
Daniel Berlin
a76241a0a5 NewGVN: Fix PR 33185 by checking whether we need to recursively
generate a phi of ops, which we don't currently support.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304272 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-31 01:47:32 +00:00
Daniel Berlin
0ef24304b8 NewGVN: Compute hash value of expression on demand and use it in inequality testing.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304195 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-30 06:58:18 +00:00
Daniel Berlin
328a635eb4 NewGVN: Fix PR33194, memory corruption by putting temporary instructions in tables sometimes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304194 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-30 06:42:29 +00:00
Benjamin Kramer
a0f27f968e Make helper functions static. NFC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304029 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-26 20:09:00 +00:00
Daniel Berlin
4133415c70 NewGVN: Fix PR 33119, PR 33129, due to regressed undef handling
Fix PR33120 and others by eliminating self-cycles a different way.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303875 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-25 15:44:20 +00:00
Davide Italiano
6ff9a78ce5 [NewGVN] Update additionalUsers when we simplify to a value.
Otherwise we don't revisit an instruction that could be simplified,
and when we verify, we discover there's something that changed, i.e.
what we had wasn't a maximal fixpoint.

Fixes PR32836.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303715 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-24 02:30:24 +00:00
Daniel Berlin
cc24c88dcf NewGVN: Fix PR 33116, the memoryphi version of bug 32838.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303521 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-21 23:41:58 +00:00
Daniel Berlin
06366afa19 NewGVN: Cleanup some repeated code using some templated helpers
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303520 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-21 23:41:56 +00:00
Daniel Berlin
efa684722e NewGVN: Fix printing of simplified expression
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303519 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-21 23:41:53 +00:00
Davide Italiano
204f8c0a24 [NewGVN] Create a StoreExpression instead of a VariableExpression.
In the case where we have an operand defined by a lod of the
same memory location. Historically this was a VariableExpression
because we wanted to make sure they ended up in the same class,
but if we create the right expression, they end up in the same
class anyway.

Fixes PR32897. Thanks to Dan for the detailed discussion and the
fix suggestion.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303475 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-20 00:46:54 +00:00
Davide Italiano
2d9c8197c8 [NewGVN] Get rid of an assertion.
This was here because we don't want to switch leaders too much,
in order to avoid fixpoint(ing) issue, but it's not sure if it
matters in practice.

A first step towards fixing PR32897.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303473 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-20 00:24:04 +00:00
Daniel Berlin
55d8857f8f NewGVN: Fix PR32838.
This is a complicated bug involving two issues:
1. What do we do with phi nodes when we prove all arguments are not
live?
2. When is it safe to use value leaders to determine if we can ignore
an argumnet?

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303453 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-19 20:22:20 +00:00
Daniel Berlin
c81a193613 Last of the major pieces to NewGVN - yay!
Summary:
NewGVN: Handle equivalence between phi of ops and op of phis.

This makes our GVN mostly-complete. It would be complete, modulo some
deliberate choices we make.  This means it detects roughly all herband
equivalences in polynomial time, including cases notoriously hard for
other GVN's to detect.  It also detects a very large swath of the
cases we currently rely on instcombine to detect that involve folding
upwards through phis.

Fixes PR 31125, 31463, PR 31868

Reviewers: davide

Subscribers: Prazek, llvm-commits

Differential Revision: https://reviews.llvm.org/D32151

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303444 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-19 19:01:27 +00:00
Daniel Berlin
f3e0e87774 NewGVN: Get rid of most dominating leader check
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303443 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-19 19:01:24 +00:00
Davide Italiano
bd8c7210cd [NewGVN] Delete the old store when we find congruent to a load.
(or non-store, more in general). Fixes PR33086. Caught by the
store verifier.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303406 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-19 04:06:10 +00:00
Davide Italiano
ed2b8bd9f4 [NewGVN] Break infinite recursion in singleReachablePHIPath().
We can have cycles between PHIs and this causes singleReachablePhi()
to call itself indefintely (until we run out of stack). The proper
solution would be that of computing SCCs, but it's not worth for
now, so just keep a visited set and give up when we find a cycle.
Thanks to Dan for the discussion/help with this.

Fixes PR33014.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303393 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-18 23:22:44 +00:00
Davide Italiano
32baeeab7f [NewGVN] Replace predicate info leftovers.
This time with an additional fix, i.e. we remove the dead
@llvm.ssa.copy instruction.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303385 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-18 21:43:23 +00:00
Francis Visoiu Mistrih
1179b5ee40 BitVector: add iterators for set bits
Differential revision: https://reviews.llvm.org/D32060

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303227 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-17 01:07:53 +00:00
Daniel Berlin
d0402428ae NewGVN: Only do something in verifyStoreExpressions if assertions are enabled, to avoid unused code warnings.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303201 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-16 20:02:45 +00:00
Daniel Berlin
39f419be0f NewGVN: Fix PR 33051 by making sure we remove old store expressions
from the ExpressionToClass mapping.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303200 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-16 19:58:47 +00:00