Files
llvm/test/Transforms/IndVarSimplify
Max Kazantsev f0dce6702c [IndVars] Fix usage of SCEVExpander to not mess with SCEVConstant. PR38674
This patch removes the function `expandSCEVIfNeeded` which behaves not as
it was intended. This function tries to make a lookup for exact existing expansion
and only goes to normal expansion via `expandCodeFor` if this lookup hasn't found
anything. As a result of this, if some instruction above the loop has a `SCEVConstant`
SCEV, this logic will return this instruction when asked for this `SCEVConstant` rather
than return a constant value. This is both non-profitable and in some cases leads to
breach of LCSSA form (as in PR38674).

Whether or not it is possible to break LCSSA with this algorithm and with some
non-constant SCEVs is still in question, this is still being investigated. I wasn't
able to construct such a test so far, so maybe this situation is impossible. If it is,
it will go as a separate fix.

Rather than do it, it is always correct to just invoke `expandCodeFor` unconditionally:
it behaves smarter about insertion points, and as side effect of this it will choose a
constant value for SCEVConstants. For other SCEVs it may end up finding a better insertion
point. So it should not be worse in any case.

NOTE: So far the only known case for which this transform may break LCSSA is mapping
of SCEVConstant to an instruction. However there is a suspicion that the entire algorithm
can compromise LCSSA form for other cases as well (yet not proved).

Differential Revision: https://reviews.llvm.org/D51286
Reviewed By: etherzhhb


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341345 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-04 05:01:35 +00:00
..
2016-08-03 20:53:23 +00:00
2016-08-03 20:53:23 +00:00
2016-08-03 20:53:23 +00:00
2015-08-06 20:43:41 +00:00
2015-11-05 23:45:38 +00:00
2016-01-17 18:12:52 +00:00
2018-06-13 02:25:32 +00:00
2016-01-19 20:53:51 +00:00
2016-08-03 20:53:23 +00:00