[BreakCritEdges] Add option to opt-out of perserving loop-simplify.
authorFlorian Hahn <flo@fhahn.com>
Fri, 12 Jun 2020 10:15:26 +0000 (11:15 +0100)
committerFlorian Hahn <flo@fhahn.com>
Fri, 12 Jun 2020 10:47:13 +0000 (11:47 +0100)
commit4495a6b141ebf55bd1d7de48f3c0920c50cc9a77
tree6f5c40c21130719013e7c6da0e7d38173a1a701a
parentd61b1f8534c6ee0f9dad528cda641d1429920ed4
[BreakCritEdges] Add option to opt-out of perserving loop-simplify.

This patch adds a new option to CriticalEdgeSplittingOptions to control
whether loop-simplify form must be preserved. It is them used by GVN to
indicate that loop-simplify form does not have to be preserved.

This fixes a crash exposed by 189efe295b6e.

If the critical edge we are splitting goes from a block inside a loop to
a block outside the loop, splitting the edge will create a new exit
block. As a result, the new block will branch to the original exit
block, which will add a non-loop predecessor, breaking loop-simplify
form. To preserve loop-simplify form, the predecessor blocks of the
original exit are split, but that does not work for blocks with
indirectbr terminators. If preserving loop-simplify form is requested,
bail out , before making any changes.

Reviewers: reames, hfinkel, davide, efriedma

Reviewed By: efriedma

Differential Revision: https://reviews.llvm.org/D81582
llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h
llvm/lib/Transforms/Scalar/GVN.cpp
llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp
llvm/test/Transforms/GVN/critical-edge-split-indbr-pred-in-loop.ll [new file with mode: 0644]
llvm/test/Transforms/GVN/preserve-analysis.ll