[LoopPredication] Account for critical edges when inserting assumes. PR26496
authorMax Kazantsev <mkazantsev@azul.com>
Mon, 27 Feb 2023 11:22:52 +0000 (18:22 +0700)
committerMax Kazantsev <mkazantsev@azul.com>
Mon, 27 Feb 2023 11:26:17 +0000 (18:26 +0700)
commita18ce47a3e0065d0a26b370a73440411b76d8493
tree4e04373a9fcc712c133d09b71ac785c28501b04c
parentee2f9d6dfb6f1360d2dc68d151c84e80252a40ec
[LoopPredication] Account for critical edges when inserting assumes. PR26496

Loop predication can insert assumes to preserve knowledge about some facts that
may otherwise be lost, because loop predication is a lossy transform. When a guard
is represented as branch by widenable condition, it should insert it in the guarded
block. However, if the guarded block has other predecessors than the guard block,
then the condition might not dominate it. Currently we generate invalid code here.

One possible fix here is to split critical edge and insert the assume there, but in
this case we should modify CFG, which Loop Predication is not currently doing, and we
want to keep it that way.

The fix is to handle this case by inserting a Phi which takes `Cond` as input from the
guard block and `true` from any other blocks. This is valid in terms of IR and does
not introduce any new knowledge if we came from another block.

Differential Revision: https://reviews.llvm.org/D144859
Reviewed By: nikic, skatkov
llvm/lib/Transforms/Scalar/LoopPredication.cpp
llvm/test/Transforms/LoopPredication/pr61022.ll