[IfConversion] Keep the CFG updated incrementally in IfConvertTriangle
authorMikael Holmen <mikael.holmen@ericsson.com>
Fri, 12 May 2017 06:28:58 +0000 (06:28 +0000)
committerMikael Holmen <mikael.holmen@ericsson.com>
Fri, 12 May 2017 06:28:58 +0000 (06:28 +0000)
commitce3ec4519b602cf5a58a379b6a3b8471690403a5
tree59847387ad9c657357edc895f3551817278b8c31
parent2833321f09efd9387257d17a3ef5128841142e6f
[IfConversion] Keep the CFG updated incrementally in IfConvertTriangle

Summary:
Instead of using RemoveExtraEdges (which uses analyzeBranch, which cannot
always be trusted) at the end to fixup the CFG we keep the CFG updated as
we go along and remove or add branches and merge blocks.

This way we won't have any problems if the involved MBBs contain
unanalyzable instructions.

This fixes PR32721.

In that case we had a triangle

   EBB
   | \
   |  |
   | TBB
   |  /
   FBB

where FBB didn't have any successors at all since it ended with an
unconditional return. Then TBB and FBB were be merged into EBB, but EBB
would still keep its successors, and the use of analyzeBranch and
CorrectExtraCFGEdges wouldn't help to remove them since the return
instruction is not analyzable (at least not on ARM).

Reviewers: kparzysz, iteratee, MatzeB

Reviewed By: iteratee

Subscribers: aemerson, rengolin, javed.absar, llvm-commits

Differential Revision: https://reviews.llvm.org/D33037

llvm-svn: 302876
llvm/lib/CodeGen/IfConversion.cpp
llvm/test/CodeGen/MIR/ARM/PR32721_ifcvt_triangle_unanalyzable.mir [new file with mode: 0644]