[RS4GC] Fix hang on infinite loop
authorSerguei Katkov <serguei.katkov@azul.com>
Mon, 22 Mar 2021 03:30:41 +0000 (10:30 +0700)
committerSerguei Katkov <serguei.katkov@azul.com>
Tue, 23 Mar 2021 05:54:51 +0000 (12:54 +0700)
commit9fec382601dfd61e0eccf007a158314ae76b145c
treea26736dd4b2816d77ffbce9de519e8b06df26233
parentcf0f2884a1d966b271e10e9d548cee5279db89ee
[RS4GC] Fix hang on infinite loop

meetBDVState utility may sets the base pointer for the conflict state.
At this moment the base for conflict state does not have any meaning but
is used in comparison of BDV states. This comparison is used as an indicator
of progress done on iteration and RS4GC pass uses infinite loop to reach
fixed point.
As a result for added test on each iteration state for some phi nodes is updated
with other base value for conflict state and it indicates as a progress while
for conflict state there is no any progress more possible.
In reality the base value is transferred from one state to another and pass
detects the progress on these states.

The test is very fragile. The traversal order of states and operands of phi nodes
plays important role.

Reviewers: reames, dantrushin
Reviewed By: reames
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D99058
llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
llvm/test/Transforms/RewriteStatepointsForGC/meetBDVState-hangs.ll [new file with mode: 0644]