OSDN Git Service

[LoopSimplify] Fix incorrect SCEV invalidation
authorMax Kazantsev <max.kazantsev@azul.com>
Mon, 23 Apr 2018 10:32:37 +0000 (10:32 +0000)
committerMax Kazantsev <max.kazantsev@azul.com>
Mon, 23 Apr 2018 10:32:37 +0000 (10:32 +0000)
commitd356fd67325cbe3d28cac674765574673a76970e
treebf86dcf0870ced409d4c2d05d2f5574d61e2d43d
parent0a556c8c152a380287e2fa5534ae7640debf091e
[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
include/llvm/Analysis/ScalarEvolution.h
lib/Analysis/ScalarEvolution.cpp
lib/Transforms/Utils/LoopSimplify.cpp
test/Transforms/LoopSimplify/preserve-scev.ll