RFR: 8291466: C2: assert(false) failed: infinite loop in PhaseIterGVN::transform_old with -XX:+StressIGVN [v3]

Christian Hagedorn chagedorn at openjdk.org
Mon Aug 29 08:42:19 UTC 2022


On Mon, 29 Aug 2022 08:09:14 GMT, Pengfei Li <pli at openjdk.org> wrote:

>> Recently, an igvn infinite loop issue was reported. Git bisection shows
>> it appears after our JDK-8289996 patch. But after that patch is backed
>> out, we find similar test still fails. We have attached a jtreg case to
>> reproduce this issue.
>> 
>> The ideal graph of the problematic method has a `MulINode` multiplying a
>> `PhiNode` by a `ConINode`. For better optimizations, `MulINode::Ideal()`
>> moves the constant input to the right hand side. And `Ideal()` function
>> in its parent class `MulNode` has the similar logic. In some code paths,
>> `MulINode::Ideal()` calls `MulNode::Ideal()`. The problem here is that,
>> `MulINode` and `MulNode` use different ways to check constant. One calls
>> `type->singleton()` and the other calls `node->find_int_con(val)` which
>> accepts constant in `PhiNode`. So in some corner cases where a `PhiNode`
>> can be evaluated to a constant, the two inputs of the `MulNode` will be
>> swapped back and forth in `Ideal()` calls. It eventually causes the igvn
>> infinite loop issue.
>> 
>> This patch removes the `swap_edges()` logic in `MulINode` and `MulLNode`
>> because it's enough to do this by calling `MulNode::Ideal()`. We also do
>> some code cleanup in this patch as we have done in JDK-8289996.
>> 
>> Tested hotspot::hotspot_all_no_apps, jdk::tier1~3 and langtools::tier1.
>
> Pengfei Li has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Make the code more readable

Thanks for doing the updates! Apart from some other minor things, it looks good to me!

src/hotspot/share/opto/mulnode.cpp line 337:

> 335: // Check for power-of-2 multiply, then try the regular MulNode::Ideal
> 336: Node *MulLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
> 337:   // Swap constant to right

This comment can now also be removed as already done in `MulINode::Ideal()`.

src/hotspot/share/opto/mulnode.cpp line 338:

> 336: Node *MulLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
> 337:   // Swap constant to right
> 338:   jlong con = in(2)->find_long_con(0);

Can also be a `const` as done in `MulINode::Ideal()`.

src/hotspot/share/opto/mulnode.cpp line 346:

> 344: 
> 345:   // Now we have a constant Node on the right and the constant in con.
> 346:   if (con == CONST64(1)) {

I guess you can also remove `CONST64` here and directly write `con == 1` (as you've already done for `con == 0`).

-------------

Marked as reviewed by chagedorn (Reviewer).

PR: https://git.openjdk.org/jdk/pull/9820


More information about the hotspot-dev mailing list