OSDN Git Service

Merging r340820:
authorHans Wennborg <hans@hanshq.net>
Thu, 30 Aug 2018 08:35:03 +0000 (08:35 +0000)
committerHans Wennborg <hans@hanshq.net>
Thu, 30 Aug 2018 08:35:03 +0000 (08:35 +0000)
commit4a194874cdcfe53be8ba4032e1d236d1a351810e
tree6772e14ce0f9d096acd39f4b0ec2426284146ccb
parent3d019e215d92181275e1f2a07cecaec07ae204ca
Merging r340820:
------------------------------------------------------------------------
r340820 | uabelho | 2018-08-28 14:40:11 +0200 (Tue, 28 Aug 2018) | 34 lines

[CloneFunction] Constant fold terminators before checking single predecessor

Summary:
This fixes PR31105.

There is code trying to delete dead code that does so by e.g. checking if
the single predecessor of a block is the block itself.

That check fails on a block like this
 bb:
   br i1 undef, label %bb, label %bb
since that has two (identical) predecessors.

However, after the check for dead blocks there is a call to
ConstantFoldTerminator on the basic block, and that call simplifies the
block to
 bb:
   br label %bb

Therefore we now do the call to ConstantFoldTerminator before the check if
the block is dead, so it can realize that it really is.

The original behavior lead to the block not being removed, but it was
simplified as above, and then we did a call to
    Dest->replaceAllUsesWith(&*I);
with old and new being equal, and an assertion triggered.

Reviewers: chandlerc, fhahn

Reviewed By: fhahn

Subscribers: eraman, llvm-commits

Differential Revision: https://reviews.llvm.org/D51280
------------------------------------------------------------------------

git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_70@341037 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/Utils/CloneFunction.cpp
test/Transforms/Inline/infinite-loop-two-predecessors.ll [new file with mode: 0644]