Commit Graph

1266 Commits

Author SHA1 Message Date
Sanjoy Das
1a6eaebd1c Revert "[SCEV] Add nuw/nsw to mul ops in StrengthenNoWrapFlags"
This reverts r334428.  It incorrectly marks some multiplications as nuw.  Tim
Shen is working on a proper fix.

Original commit message:

[SCEV] Add nuw/nsw to mul ops in StrengthenNoWrapFlags where safe.

Summary:
Previously we would add them for adds, but not multiplies.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@335016 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-19 04:09:44 +00:00
Justin Lebar
cfc2fa9b55 Revert "[SCEV] Use LLVM_MARK_AS_BITMASK_ENUM in SCEV." -- breaks MSVC builds.
This reverts D48237.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334878 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-16 00:14:10 +00:00
Justin Lebar
e743a53c30 Revert "[SCEV] Simplify some flags expressions." -- dependent revision breaks MSVC builds.
This reverts D48238.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334877 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-16 00:13:57 +00:00
Justin Lebar
dc96bffe35 [SCEV] Simplify some flags expressions.
Summary:
Sending for presubmit review out of an abundance of caution; it would be
bad to mess this up.

Reviewers: sanjoy

Subscribers: hiraditya, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334875 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-15 23:52:11 +00:00
Justin Lebar
5802a4a49f [SCEV] Use LLVM_MARK_AS_BITMASK_ENUM in SCEV.
Summary:
Obviates the need for mask/clear/setFlags helpers.

There are some expressions here which can be simplified, but to keep
this easy to review, I have not simplified them in this patch.

No functional change.

Reviewers: sanjoy

Subscribers: hiraditya, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334874 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-15 23:51:57 +00:00
Justin Lebar
ad5cfb94bc [SCEV] Fix a variable name, NFC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334738 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-14 17:14:01 +00:00
Justin Lebar
3edd5bf908 [SCEV] Simplify zext/trunc idiom that appears when handling bitmasks.
Summary:
Specifically, we transform

  zext(2^K * (trunc X to iN)) to iM ->
  2^K * (zext(trunc X to i{N-K}) to iM)<nuw>

This is helpful because pulling the 2^K out of the zext allows further
optimizations.

Reviewers: sanjoy

Subscribers: hiraditya, llvm-commits, timshen

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334737 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-14 17:13:48 +00:00
Justin Lebar
4090ce2a16 [SCEV] Simplify trunc-of-add/mul to add/mul-of-trunc under more circumstances.
Summary:
Previously we would do this simplification only if it did not introduce
any new truncs (excepting new truncs which replace other cast ops).

This change weakens this condition: If the number of truncs stays the
same, but we're able to transform trunc(X + Y) to X + trunc(Y), that's
still simpler, and it may open up additional transformations.

While we're here, also clean up some duplicated code.

Reviewers: sanjoy

Subscribers: hiraditya, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334736 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-14 17:13:35 +00:00
Justin Lebar
bcaa109652 [SCEV] Fix indentation and combine two if statements in getMulExpr, NFC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334735 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-14 17:13:22 +00:00
Justin Lebar
e2401ceceb [SCEV] Add transform zext((A * B * ...)<nuw>) --> (zext(A) * zext(B) * ...)<nuw>.
Reviewers: sanjoy

Subscribers: hiraditya, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334429 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-11 18:57:58 +00:00
Justin Lebar
109b3a6dbd [SCEV] Add nuw/nsw to mul ops in StrengthenNoWrapFlags where safe.
Summary:
Previously we would add them for adds, but not multiplies.

Reviewers: sanjoy

Subscribers: llvm-commits, hiraditya

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334428 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-11 18:57:42 +00:00
Justin Lebar
f17b95446c Fix indentation in ScalarEvolution.cpp.
Whitespace-only change.  (clang-formatted the whole block.)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334427 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-11 18:57:27 +00:00
Tim Shen
9299628cf4 [SCEV] Canonicalize "A /u C1 /u C2" to "A /u (C1*C2)".
Summary: FWIW InstCombine already folds this. Also avoid the case where C1*C2 overflows.

Reviewers: sunfish, sanjoy

Subscribers: hiraditya, bixia, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334425 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-11 18:44:58 +00:00
Krzysztof Parzyszek
4b6d3f98cd [SCEV] Look through zero-extends in howFarToZero
An expression like
  (zext i2 {(trunc i32 (1 + %B) to i2),+,1}<%while.body> to i32)
will become zero exactly when the nested value becomes zero in its type.
Strip injective operations from the input value in howFarToZero to make
the value simpler.

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334318 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-08 20:43:07 +00:00
Nicola Zaghen
0818e789cb Rename DEBUG macro to LLVM_DEBUG.
The DEBUG() macro is very generic so it might clash with other projects.
The renaming was done as follows:
- git grep -l 'DEBUG' | xargs sed -i 's/\bDEBUG\s\?(/LLVM_DEBUG(/g'
- git diff -U0 master | ../clang/tools/clang-format/clang-format-diff.py -i -p1 -style LLVM
- Manual change to APInt
- Manually chage DOCS as regex doesn't match it.

In the transition period the DEBUG() macro is still present and aliased
to the LLVM_DEBUG() one.

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



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@332240 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-14 12:53:11 +00:00
Serguei Katkov
6b81d89199 SCEV] Do not use induction in isKnownPredicate for simplification umax.
During simplification umax we trigger isKnownPredicate twice. As a first attempt it
tries the induction. To do that it tries to get post increment of SCEV.
Re-writing the SCEV may result in simplification of umax. If the SCEV contains a lot
of umax operations this recursion becomes very slow.

The added test demonstrates the slow behavior.

To resolve this we use only simple ways to check whether the predicate is known.

Reviewers: sanjoy, mkazantsev
Reviewed By: sanjoy
Subscribers: lebedev.ri, javed.absar, llvm-commits
Differential Revision: https://reviews.llvm.org/D46046



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@331949 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-10 01:40:43 +00:00
Max Kazantsev
cfd866304a Re-enable "[SCEV] Make computeExitLimit more simple and more powerful"
This patch was temporarily reverted because it has exposed bug 37229 on
PowerPC platform. The bug is unrelated to the patch and was just a general
bug in the optimization done for PowerPC platform only. The bug was fixed
by the patch rL331410.

This patch returns the disabled commit since the bug was fixed.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@331427 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-03 02:37:55 +00:00
Nico Weber
0f38c60baf IWYU for llvm-config.h in llvm, additions.
See r331124 for how I made a list of files missing the include.
I then ran this Python script:

    for f in open('filelist.txt'):
        f = f.strip()
        fl = open(f).readlines()

        found = False
        for i in xrange(len(fl)):
            p = '#include "llvm/'
            if not fl[i].startswith(p):
                continue
            if fl[i][len(p):] > 'Config':
                fl.insert(i, '#include "llvm/Config/llvm-config.h"\n')
                found = True
                break
        if not found:
            print 'not found', f
        else:
            open(f, 'w').write(''.join(fl))

and then looked through everything with `svn diff | diffstat -l | xargs -n 1000 gvim -p`
and tried to fix include ordering and whatnot.

No intended behavior change.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@331184 91177308-0d34-0410-b5e6-96231b3b80d8
2018-04-30 14:59:11 +00:00
Serguei Katkov
3f6034f46a [SCEV] Touch the unsused stats variables for product build.
This is a fix by elimination compiler warnings considered as errors.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@331103 91177308-0d34-0410-b5e6-96231b3b80d8
2018-04-28 06:41:35 +00:00
Serguei Katkov
c16075d9bd [SCEV] Reduce the number of invocation to non trivial getExact function
The invocation of getExact in ScalarEvolution::getBackedgeTakenInfo is used
only for getting statistic and for assert. 
Even if statistics is disabled, the code related to it will be eliminated
the invocation to getExact itself will not be eliminated
because it may have side-effects like creation of new SCEVs.

So do invocation only when we collect statistics or executes asserts.

Reviewers: mkazantsev, sanjoy, javed.absar
Reviewed By: javed.absar
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D46178


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@331099 91177308-0d34-0410-b5e6-96231b3b80d8
2018-04-28 03:53:36 +00:00
Serguei Katkov
7ebdaa5e10 [SCEV] Add trivial case handling for umin utilities. NFC.
Reviewers: sanjoy, mkazantsev
Reviewed By: mkazantsev
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D46175


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@331022 91177308-0d34-0410-b5e6-96231b3b80d8
2018-04-27 08:02:50 +00:00
Serguei Katkov
fe97d18817 [SCEV] Introduce bulk umin creation utilities
Add new umin creation method which accepts a list of operands.

SCEV does not represents umin which is required in getExact, so
it transforms umin to umax with not. As a result the transformation of
tree of max to max with several operands does not work.
We just use the new introduced method for creation umin from several operands.

Reviewers: sanjoy, mkazantsev
Reviewed By: sanjoy
Subscribers: javed.absar, llvm-commits
Differential Revision: https://reviews.llvm.org/D46047


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@331015 91177308-0d34-0410-b5e6-96231b3b80d8
2018-04-27 03:56:53 +00:00
Max Kazantsev
fa6d83b0ef Revert "[SCEV] Make computeExitLimit more simple and more powerful"
This reverts commit 023c8be909.

This patch triggers miscompile of zlib on PowerPC platform. Most likely it is
caused by some pre-backend PPC-specific pass, but we don't clearly know the
reason yet. So we temporally revert this patch with intention to return it
once the problem is resolved. See bug 37229 for details.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@330893 91177308-0d34-0410-b5e6-96231b3b80d8
2018-04-26 02:07:40 +00:00
Max Kazantsev
d356fd6732 [LoopSimplify] Fix incorrect SCEV invalidation
In the function `simplifyOneLoop` we optimistically assume that changes in the
inner loop only affect this very loop and have no impact on its parents. In fact,
after rL329047 has been merged, we can now calculate exit counts for outer
loops which may depend on inner loops. Thus, we need to invalidate all parents
when we do something to a loop.

There is an evidence of incorrect behavior of `simplifyOneLoop`: when we insert
`SE->verify()` check in the end of this funciton, it fails on a bunch of existing
test, in particular:

    LLVM :: Transforms/LoopUnroll/peel-loop-not-forced.ll
    LLVM :: Transforms/LoopUnroll/peel-loop-pgo.ll
    LLVM :: Transforms/LoopUnroll/peel-loop.ll
    LLVM :: Transforms/LoopUnroll/peel-loop2.ll

Note that previously we have fixed issues of this variety, see rL328483.
This patch makes this function invalidate the outermost loop properly.

Differential Revision: https://reviews.llvm.org/D45937
Reviewed By: chandlerc


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@330576 91177308-0d34-0410-b5e6-96231b3b80d8
2018-04-23 10:32:37 +00:00
Max Kazantsev
ce9e75e4f2 [NFC] Loosen restriction on preheader to fix buildbot
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@329379 91177308-0d34-0410-b5e6-96231b3b80d8
2018-04-06 07:23:45 +00:00
Max Kazantsev
30f7325162 [SCEV] Prove implications for SCEVUnknown Phis
This patch teaches SCEV how to prove implications for SCEVUnknown nodes that are Phis.
If we need to prove `Pred` for `LHS, RHS`, and `LHS` is a Phi with possible incoming values
`L1, L2, ..., LN`, then if we prove `Pred` for `(L1, RHS), (L2, RHS), ..., (LN, RHS)` then we can also
prove it for `(LHS, RHS)`. If both `LHS` and `RHS` are Phis from the same block, it is sufficient
to prove the predicate for values that come from the same predecessor block.

The typical case that it handles is that we sometimes need to prove that `Phi(Len, Len - 1) >= 0`
given that `Len > 0`. The new logic was added to `isImpliedViaOperations` and only uses it and
non-recursive reasoning to prove the facts we need, so it should not hurt compile time a lot.

Differential Revision: https://reviews.llvm.org/D44001
Reviewed By: anna


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@329150 91177308-0d34-0410-b5e6-96231b3b80d8
2018-04-04 05:46:47 +00:00
Serguei Katkov
0bbc0393d8 [SCEV] Fix PR36974.
The patch changes the usage of dominate to properlyDominate
to satisfy the condition !(a < a) while using std::max.

It is actually NFC due to set data structure is used to keep
the Loops and no two identical loops can be in collection.
So in reality there is no difference between usage of
dominate and properlyDominate in this particular case.
However it might be changed so it is better to fix it.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@329051 91177308-0d34-0410-b5e6-96231b3b80d8
2018-04-03 07:29:00 +00:00
Max Kazantsev
023c8be909 [SCEV] Make computeExitLimit more simple and more powerful
Current implementation of `computeExitLimit` has a big piece of code
the only purpose of which is to prove that after the execution of this
block the latch will be executed. What it currently checks is actually a
subset of situations where the exiting block dominates latch.

This patch replaces all these checks for simple particular cases with
domination check over loop's latch which is the only necessary condition
of taking the exiting block into consideration. This change allows to
calculate exact loop taken count for simple loops like

  for (int i = 0; i < 100; i++) {
    if (cond) {...} else {...}
    if (i > 50) break;
    . . .
  }

Differential Revision: https://reviews.llvm.org/D44677
Reviewed By: efriedma


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@329047 91177308-0d34-0410-b5e6-96231b3b80d8
2018-04-03 05:57:19 +00:00
Mandeep Singh Grang
ccca812fc3 [Analysis] Change std::sort to llvm::sort in response to r327219
Summary:
r327219 added wrappers to std::sort which randomly shuffle the container before sorting.
This will help in uncovering non-determinism caused due to undefined sorting
order of objects having the same key.

To make use of that infrastructure we need to invoke llvm::sort instead of std::sort.

Note: This patch is one of a series of patches to replace *all* std::sort to llvm::sort.
Refer D44363 for a list of all the required patches.

Reviewers: sanjoy, dexonsmith, hfinkel, RKSimon

Reviewed By: dexonsmith

Subscribers: david2050, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@328925 91177308-0d34-0410-b5e6-96231b3b80d8
2018-04-01 01:46:51 +00:00
Max Kazantsev
5c990415df [NFC] Fix meaningless assert in SCEV
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@328764 91177308-0d34-0410-b5e6-96231b3b80d8
2018-03-29 07:54:59 +00:00
Max Kazantsev
0048092b9c [NFC] Fix comments in getExact()
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@328612 91177308-0d34-0410-b5e6-96231b3b80d8
2018-03-27 08:13:55 +00:00
Max Kazantsev
8f8f2fa4dd [SCEV] Make exact taken count calculation more optimistic
Currently, `getExact` fails if it sees two exit counts in different blocks. There is
no solid reason to do so, given that we only calculate exact non-taken count
for exiting blocks that dominate latch. Using this fact, we can simply take min
out of all exits of all blocks to get the exact taken count.

This patch makes the calculation more optimistic with enforcing our assumption
with asserts. It allows us to calculate exact backedge taken count in trivial loops
like

  for (int i = 0; i < 100; i++) {
    if (i > 50) break;
    . . .
  }

Differential Revision: https://reviews.llvm.org/D44676
Reviewed By: fhahn


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@328611 91177308-0d34-0410-b5e6-96231b3b80d8
2018-03-27 07:30:38 +00:00
Max Kazantsev
10568deedd [SCEV] Add one more case in computeConstantDifference
This patch teaches `computeConstantDifference` handle calculation of constant
difference between `(X + C1)` and `(X + C2)` which is `(C2 - C1)`.

Differential Revision: https://reviews.llvm.org/D43759
Reviewed By: anna


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@328609 91177308-0d34-0410-b5e6-96231b3b80d8
2018-03-27 04:54:00 +00:00
Evgeny Stupachenko
ca64890b85 Revert r325687 (workaround for PR36032).
Summary:
Revert r325687 workaround for PR36032 since
 a fix was committed in r326154.

Reviewers: sbaranga

Differential Revision: http://reviews.llvm.org/D44768

From: Evgeny Stupachenko <evstupac@gmail.com>
                         <evgeny.v.stupachenko@intel.com>


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@328257 91177308-0d34-0410-b5e6-96231b3b80d8
2018-03-22 22:04:39 +00:00
Serguei Katkov
51dcaa3a7b [SCEV] Factor out isKnownViaInduction. NFC.
This just extracts the isKnownViaInduction from isKnownPredicate.

Reviewers: sanjoy, mkazantsev, reames
Reviewed By: mkazantsev
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D44554


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@327824 91177308-0d34-0410-b5e6-96231b3b80d8
2018-03-19 08:32:09 +00:00
Serguei Katkov
4cf108a0bb [SCEV] Re-land: Fix isKnownPredicate
This is re-land of https://reviews.llvm.org/rL327362 with a fix
and regression test.

The crash was due to it is possible that for found MDL loop,
LHS or RHS may contain an invariant unknown SCEV which
does not dominate the MDL. Please see regression
test for an example.

Reviewers: sanjoy, mkazantsev, reames
Reviewed By: mkazantsev
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D44553


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@327822 91177308-0d34-0410-b5e6-96231b3b80d8
2018-03-19 06:35:30 +00:00
Max Kazantsev
2a1dc77e0b [NFC] Void variables used for asserts only
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@327693 91177308-0d34-0410-b5e6-96231b3b80d8
2018-03-16 05:02:24 +00:00
Max Kazantsev
cfb3cd346a [SCEV][NFC] Remove TBB, FBB parameters from exit limit computations
Methods `computeExitLimitFromCondCached` and `computeExitLimitFromCondImpl` take
true and false branches as parameters and only use them for asserts and for identifying
whether true/false branch belongs to the loop (which can be done once earlier). This fact
complicates generalization of exit limit computation logic on guards because the guards
don't have blocks to which they go in case of failure explicitly.

The motivation of this patch is that currently this part of SCEV knows nothing about guards
and only works with explicit branches. As result, it fails to prove that a loop

  for (i = 0; i < 100; i++)
    guard(i < 10);

exits after 10th iteration, while in the equivalent example

  for (i = 0; i < 100; i++)
    if (i >= 10) break;

SCEV easily proves this fact. We are going to change it in near future, and this is why
we need to make these methods operate on more abstract level.

This patch refactors this code to get rid of these parameters as meaningless and prepare
ground for teaching these methods to work with guards as well as they work with explicit
branching instructions.

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@327615 91177308-0d34-0410-b5e6-96231b3b80d8
2018-03-15 09:38:00 +00:00
Max Kazantsev
4f23838f56 [SCEV][NFC] Smarter implementation of isAvailableAtLoopEntry
isAvailableAtLoopEntry duplicates logic of `properlyDominates` after checking invariance.
This patch replaces this logic with invocation of this method which is more profitable
because it supports caching.

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@327373 91177308-0d34-0410-b5e6-96231b3b80d8
2018-03-13 07:46:06 +00:00
Serguei Katkov
8f8572aba3 Revert [SCEV] Fix isKnownPredicate
It is a revert of rL327362 which causes build bot failures with assert like

Assertion `isAvailableAtLoopEntry(RHS, L) && "RHS is not available at Loop Entry"' failed.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@327363 91177308-0d34-0410-b5e6-96231b3b80d8
2018-03-13 06:36:00 +00:00
Serguei Katkov
579aaf149e [SCEV] Fix isKnownPredicate
IsKnownPredicate is updated to implement the following algorithm
proposed by @sanjoy and @mkazantsev :
isKnownPredicate(Pred, LHS, RHS) {
  Collect set S all loops on which either LHS or RHS depend.
  If S is non-empty
    a. Let PD be the element of S which is dominated by all other elements of S
    b. Let E(LHS) be value of LHS on entry of PD.
       To get E(LHS), we should just take LHS and replace all AddRecs that
       are attached to PD on with their entry values.
       Define E(RHS) in the same way.
    c. Let B(LHS) be value of L on backedge of PD.
       To get B(LHS), we should just take LHS and replace all AddRecs that
       are attached to PD on with their backedge values.
       Define B(RHS) in the same way.
    d. Note that E(LHS) and E(RHS) are automatically available on entry of PD,
       so we can assert on that.
    e. Return true if isLoopEntryGuardedByCond(Pred, E(LHS), E(RHS)) &&
                      isLoopBackedgeGuardedByCond(Pred, B(LHS), B(RHS))
Return true if Pred, L, R is known from ranges, splitting etc.
}
This is follow-up for https://reviews.llvm.org/D42417.

Reviewers: sanjoy, mkazantsev, reames
Reviewed By: sanjoy, mkazantsev
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D43507


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@327362 91177308-0d34-0410-b5e6-96231b3b80d8
2018-03-13 06:10:27 +00:00
Max Kazantsev
1eba8752d7 [SCEV] Smart range calculation for SCEVUnknown Phis
The range of SCEVUnknown Phi which merges values `X1, X2, ..., XN`
can be evaluated as `U(Range(X1), Range(X2), ..., Range(XN))`.

Reviewed By: sanjoy
Differential Revision: https://reviews.llvm.org/D43810


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@326418 91177308-0d34-0410-b5e6-96231b3b80d8
2018-03-01 06:56:48 +00:00
Serguei Katkov
8734c750f5 [SCEV] Cleanup SCEVInitRewriter. NFC.
Set default value for IgnoreOtherLoops of SCEVInitRewriter::rewrite to true
to be consistent with SCEVPostIncRewriter which does not have this parameter
but behaves as it would be true.

This is follow up for rL326067.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@326174 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-27 06:39:31 +00:00
Evgeny Stupachenko
e47bd78db1 Fix PR36032, PR35432
Summary:

The change fix an assert fail at ScalarEvolutionExpander.cpp:
  assert(ExitCount != SE.getCouldNotCompute() && "Invalid loop count");

Reviewers: sbaranga

Differential Revision: http://reviews.llvm.org/D42604

From: Evgeny Stupachenko <evstupac@gmail.com>
                         <evgeny.v.stupachenko@intel.com>


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@326154 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-27 00:17:31 +00:00
Serguei Katkov
ac0361ce6b [SCEV] Factor out getUsedLoops
The patch introduces the new function in ScalarEvolution to get
all loops used in specified SCEV.

This is a preparation for re-writing isKnownPredicate utility as
described in https://reviews.llvm.org/D42417.

Reviewers: sanjoy, mkazantsev, reames
Reviewed By: sanjoy
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D43504


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@326072 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-26 09:26:41 +00:00
Serguei Katkov
edde6812b4 [SCEV] Introduce SCEVPostIncRewriter
The patch introduces the SCEVPostIncRewriter rewriter which
is similar to SCEVInitRewriter but rewrites AddRec with post increment
value of this AddRec.

This is a preparation for re-writing isKnownPredicate utility as
described in https://reviews.llvm.org/D42417.

Reviewers: sanjoy, mkazantsev, reames
Reviewed By: sanjoy
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D43499


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@326071 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-26 08:40:18 +00:00
Serguei Katkov
f7e09e372b [SCEV] Extends the SCEVInitRewriter
The patch introduces an additional parameter IgnoreOtherLoops to SCEVInitRewriter.
if it is equal to true then rewriter will not invalidate result in case
SCEV depends on other loops then specified during creation.

The patch does not change the default behavior.
This is a preparation for re-writing isKnownPredicate utility as
described in https://reviews.llvm.org/D42417.

Reviewers: sanjoy, mkazantsev, reames
Reviewed By: sanjoy
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D43498


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@326067 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-26 07:08:56 +00:00
Max Kazantsev
3f84050216 [SCEV][NFC] Factor out common logic into a separate method
SCEV has multiple occurences of code when we need to prove some predicate on
every iteration of a loop and do it with invocations of couple `isLoopEntryGuardedByCond`,
`isLoopBackedgeGuardedByCond`. This patch factors out these two calls into a separate
method. It is a preparation step to extend this logic: it is not the only way how we can prove
such conditions.

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325745 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-22 06:27:32 +00:00
Silviu Baranga
1f383654e0 [SCEV] Temporarily disable loop versioning for the purpose
of turning SCEVUnknowns of PHIs into AddRecExprs.

This feature is now hidden behind the -scev-version-unknown flag.

Fixes PR36032 and PR35432.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325687 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-21 15:20:32 +00:00
Max Kazantsev
724361f776 [NFC] Rename isKnownViaSimpleReasoning to isKnownViaNonRecursiveReasoning
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325216 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-15 07:47:17 +00:00