This repository has been archived by the owner on Sep 2, 2022. It is now read-only.
Permalink
Show file tree
Hide file tree
1 comment
on commit
sign in to comment.
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
8255763: C2: OSR miscompilation caused by invalid memory instruction …
…placement Disable GCM hoisting of memory-writing nodes for irreducible CFGs. This prevents GCM from wrongly "hoisting" stores into descendants of their original loop. Such an "inverted hoisting" can happen due to CFGLoop::compute_freq()'s inaccurate estimation of frequencies for irreducible CFGs. Extend CFG verification code by checking that memory-writing nodes are placed in either their original loop or an ancestor. Add tests for the reducible and irreducible cases. The former was already handled correctly before the change (the frequency estimation model prevents "inverted hoisting" for reducible CFGs), and is just added for coverage. This change addresses the specific miscompilation issue in a conservative way, for simplicity and safety. Future work includes investigating if only the illegal blocks can be discarded as candidates for GCM hoisting, and refining frequency estimation for irreducible CFGs. Reviewed-by: kvn, chagedorn
- Loading branch information
1 parent
2525f39
commit 4e8338eb13926775513c12492b8ccb8c9a84773e
Showing
4 changed files
with
161 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
/* | ||
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. | ||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | ||
* | ||
* This code is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 only, as | ||
* published by the Free Software Foundation. | ||
* | ||
* This code is distributed in the hope that it will be useful, but WITHOUT | ||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
* version 2 for more details (a copy is included in the LICENSE file that | ||
* accompanied this code). | ||
* | ||
* You should have received a copy of the GNU General Public License version | ||
* 2 along with this work; if not, write to the Free Software Foundation, | ||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | ||
* | ||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | ||
* or visit www.oracle.com if you need additional information or have any | ||
* questions. | ||
*/ | ||
|
||
package compiler.codegen; | ||
|
||
import jdk.test.lib.Asserts; | ||
|
||
/** | ||
* @test | ||
* @bug 8255763 | ||
* @summary Tests GCM's store placement for reducible and irreducible CFGs. | ||
* @library /test/lib / | ||
* @run main/othervm -Xbatch compiler.codegen.TestGCMStorePlacement reducible | ||
* @run main/othervm -Xbatch compiler.codegen.TestGCMStorePlacement irreducible | ||
*/ | ||
|
||
public class TestGCMStorePlacement { | ||
|
||
static int counter; | ||
|
||
// Reducible case: counter++ should not be placed into the loop. | ||
static void testReducible() { | ||
counter++; | ||
int acc = 0; | ||
for (int i = 0; i < 50; i++) { | ||
if (i % 2 == 0) { | ||
acc += 1; | ||
} | ||
} | ||
return; | ||
} | ||
|
||
// Irreducible case (due to OSR compilation): counter++ should not be placed | ||
// outside its switch case block. | ||
static void testIrreducible() { | ||
for (int i = 0; i < 30; i++) { | ||
switch (i % 3) { | ||
case 0: | ||
for (int j = 0; j < 50; j++) { | ||
// OSR enters here. | ||
for (int k = 0; k < 7000; k++) {} | ||
if (i % 2 == 0) { | ||
break; | ||
} | ||
} | ||
counter++; | ||
break; | ||
case 1: | ||
break; | ||
case 2: | ||
break; | ||
} | ||
} | ||
return; | ||
} | ||
|
||
public static void main(String[] args) { | ||
switch (args[0]) { | ||
case "reducible": | ||
// Cause a regular C2 compilation of testReducible. | ||
for (int i = 0; i < 100_000; i++) { | ||
counter = 0; | ||
testReducible(); | ||
Asserts.assertEQ(counter, 1); | ||
} | ||
break; | ||
case "irreducible": | ||
// Cause an OSR C2 compilation of testIrreducible. | ||
counter = 0; | ||
testIrreducible(); | ||
Asserts.assertEQ(counter, 10); | ||
break; | ||
default: | ||
System.out.println("invalid mode"); | ||
} | ||
} | ||
} |
4e8338e
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Review
Issues