[SimplifyCFG] Update FoldBranchToCommonDest to be poison-safe
authorJuneyoung Lee <aqjune@gmail.com>
Sun, 7 Mar 2021 16:23:04 +0000 (01:23 +0900)
committerJuneyoung Lee <aqjune@gmail.com>
Sun, 7 Mar 2021 16:38:03 +0000 (01:38 +0900)
commit99108c791de0285ee726a10e8274772b18cee73c
treee00ca97f01e76c2e3713f3593cd256145934b7d7
parent5bb38e84d3d0420e7159ffc34e3dd33ab5088b8e
[SimplifyCFG] Update FoldBranchToCommonDest to be poison-safe

This patch makes FoldBranchToCommonDest merge branch conditions into `select i1` rather than `and/or i1` when it is called by SimplifyCFG.
It is known that merging conditions into and/or is poison-unsafe, and this is towards making things *more* correct by removing possible miscompilations.
Currently, InstCombine simply consumes these selects into and/or of i1 (which is also unsafe), so the visible effect would be very small. The unsafe select -> and/or transformation will be removed in the future.
There has been efforts for updating optimizations to support the select form as well, and they are linked to D93065.

The safe transformation is fired when it is called by SimplifyCFG only. This is done by setting the new `PoisonSafe` argument as true.
Another place that calls FoldBranchToCommonDest is LoopSimplify. `PoisonSafe` flag is set to false in this case because enabling it has a nontrivial impact in performance because SCEV is more conservative with select form and InductiveRangeCheckElimination isn't aware of select form of and/or i1.

Reviewed By: nikic

Differential Revision: https://reviews.llvm.org/D95026
llvm/include/llvm/IR/IRBuilder.h
llvm/include/llvm/Transforms/Utils/Local.h
llvm/lib/Transforms/Utils/SimplifyCFG.cpp
llvm/test/Transforms/PGOProfile/chr.ll
llvm/test/Transforms/SimplifyCFG/ARM/branch-fold-threshold.ll
llvm/test/Transforms/SimplifyCFG/annotations.ll
llvm/test/Transforms/SimplifyCFG/common-dest-folding.ll
llvm/test/Transforms/SimplifyCFG/fold-branch-to-common-dest.ll
llvm/test/Transforms/SimplifyCFG/fold-debug-location.ll
llvm/test/Transforms/SimplifyCFG/preserve-branchweights.ll
llvm/test/Transforms/SimplifyCFG/switch_create-custom-dl.ll