RFR: 8263352: assert(use == polladr) failed: the use should be a safepoint polling
Roland Westrelin
roland at openjdk.java.net
Fri Mar 19 11:22:38 UTC 2021
On Thu, 18 Mar 2021 18:20:59 GMT, Vladimir Kozlov <kvn at openjdk.org> wrote:
> I have question for @rwestrel who did strip mining. Looking on nodes I see:
>
> ```
> 1247 CountedLoop === 1247 1246 794 [[ 1247 788 741 738 781 1242 ]] inner stride: 1 strip mined !orig=[1237],[731] !jvms: ComponentSampleModel::<init> @ bci:147 (line 162)
> 1242 CountedLoopEnd === 1247 1241 [[ 1243 794 ]] [lt] P=0.646827, C=6564.000000 !orig=[793] !jvms: ComponentSampleModel::<init> @ bci:144 (line 161)
> 1243 IfFalse === 1242 [[ 1248 ]] #0 !orig=795 !jvms: ComponentSampleModel::<init> @ bci:144 (line 161)
>
> 788 LoadP === 1247 659 787 [[ 1248 ]] @rawptr:BotPTR, idx=Raw; #rawptr:BotPTR (does not depend only on test) !jvms: ComponentSampleModel::<init> @ bci:158 (line 161)
> 1248 SafePoint === 1243 1 784 1 1 788 10 1 1 1 1 1 1 782 [[ 1244 ]] SafePoint !orig=783 !jvms: ComponentSampleModel::<init> @ bci:158 (line 161)
> ```
>
> So why Poll's LoadP node's control edge is not the same as SafePoint's control edge? Why it points to inner loop head?
> If we adjust LoadP's control edge to the same node as Safepoint (exit from inner loop), we would not need this special case in match_fill_loop().
That makes sense but needs to be done explicitly:
diff --git a/src/hotspot/share/opto/loopnode.cpp b/src/hotspot/share/opto/loopnode.cpp
index bf5a685960c..42e5b940dc5 100644
--- a/src/hotspot/share/opto/loopnode.cpp
+++ b/src/hotspot/share/opto/loopnode.cpp
@@ -1636,6 +1636,13 @@ bool PhaseIdealLoop::is_counted_loop(Node* x, IdealLoopTree*&loop, BasicType iv_
Node* sfpt = sfpt2->clone();
sfpt->set_req(0, iffalse);
outer_le->set_req(0, sfpt);
+ Node* polladdr = sfpt->in(TypeFunc::Parms)->clone();
+ assert(polladdr->is_Load(), "");
+ Node* new_polladdr = polladdr->clone();
+ new_polladdr->set_req(0, iffalse);
+ _igvn.register_new_node_with_optimizer(new_polladdr, polladdr);
+ set_ctrl(new_polladdr, iffalse);
+ sfpt->set_req(TypeFunc::Parms, new_polladdr);
// When this code runs, loop bodies have not yet been populated.
const bool body_populated = false;
register_control(sfpt, outer_ilt, iffalse, body_populated);
-------------
PR: https://git.openjdk.java.net/jdk/pull/3061
More information about the hotspot-compiler-dev
mailing list