[SimplifyCFG] Preserve knowledge about guarding condition by adding assume
authorMax Kazantsev <mkazantsev@azul.com>
Wed, 8 Sep 2021 06:17:23 +0000 (13:17 +0700)
committerMax Kazantsev <mkazantsev@azul.com>
Wed, 8 Sep 2021 07:05:17 +0000 (14:05 +0700)
commit29d054bf126870706f909a821895770bd9af42b3
tree15236fa80b74f72de1aba9a074786b0329479ac9
parentca867ef47b8aebc2d8167049544954e78eeeb9e8
[SimplifyCFG] Preserve knowledge about guarding condition by adding assume

This improvement adds "assume" after removal of branch basing on UB in successor block.

Consider the following example:

```
pred:
  x = ...
  cond = x > 10
  br cond, bb, other.succ

bb:
  phi [nullptr, pred], ... // other possible preds
  load(phi) // UB if we came from pred

other.succ:
  // here we know that x <= 10, but this knowledge is lost
  // after the branch is turned to unconditional unless we
  // preserve it with assume.
```

If we remove the branch basing on knowledge about UB in a successor block,
then the fact that x <= 10 is other.succ might be lost if this condition is
not inferrable from any dominating condition. To preserve this knowledge, we
can add assume intrinsic with (possibly inverted) branch condition.

Patch by Dmitry Bakunevich!

Differential Revision: https://reviews.llvm.org/D109054
Reviewed By: lebedev.ri
llvm/lib/Transforms/Utils/SimplifyCFG.cpp
llvm/test/Transforms/SimplifyCFG/tautological-conditional-branch.ll