Skip to content

Commit d006869

Browse files
committed
Add unit test
1 parent b51e7bc commit d006869

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/replacements/test/MethodHandleImplTest.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,20 @@
2727
import java.lang.invoke.MethodHandle;
2828
import java.lang.invoke.MethodHandles;
2929
import java.lang.invoke.MethodType;
30+
import java.lang.invoke.VarHandle;
3031

3132
import org.junit.Test;
3233

34+
import jdk.graal.compiler.nodes.DeoptimizeNode;
35+
import jdk.graal.compiler.nodes.ValueNode;
36+
import jdk.graal.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration;
37+
import jdk.graal.compiler.nodes.graphbuilderconf.GraphBuilderContext;
38+
import jdk.graal.compiler.nodes.graphbuilderconf.NodePlugin;
39+
import jdk.vm.ci.meta.DeoptimizationAction;
40+
import jdk.vm.ci.meta.DeoptimizationReason;
41+
import jdk.vm.ci.meta.ResolvedJavaField;
42+
import jdk.vm.ci.meta.ResolvedJavaMethod;
43+
3344
public class MethodHandleImplTest extends MethodSubstitutionTest {
3445

3546
static final MethodHandle squareHandle;
@@ -63,4 +74,48 @@ public void testIsCompileConstant() {
6374
testGraph("invokeSquare");
6475
}
6576

77+
@Override
78+
protected GraphBuilderConfiguration editGraphBuilderConfiguration(GraphBuilderConfiguration conf) {
79+
conf.getPlugins().prependNodePlugin(new NodePlugin() {
80+
@Override
81+
public boolean handleLoadField(GraphBuilderContext b, ValueNode object, ResolvedJavaField field) {
82+
if (field.getName().equals("fieldOffset") && b.getGraph().method().getName().equals("incrementThreadCount")) {
83+
// Force a deopt in the testFlock test case
84+
b.add(new DeoptimizeNode(DeoptimizationAction.InvalidateRecompile, DeoptimizationReason.Unresolved));
85+
return true;
86+
}
87+
return false;
88+
}
89+
});
90+
return super.editGraphBuilderConfiguration(conf);
91+
}
92+
93+
public static class ThreadFlock {
94+
private static final VarHandle THREAD_COUNT;
95+
96+
static {
97+
try {
98+
MethodHandles.Lookup l = MethodHandles.lookup();
99+
THREAD_COUNT = l.findVarHandle(ThreadFlock.class, "threadCount", int.class);
100+
} catch (Exception e) {
101+
throw new InternalError(e);
102+
}
103+
}
104+
105+
private volatile int threadCount;
106+
107+
public void incrementThreadCount() {
108+
THREAD_COUNT.getAndAdd(this, 1);
109+
}
110+
}
111+
112+
@Test
113+
public void testFlock() {
114+
ThreadFlock flock = new ThreadFlock();
115+
for (int i = 0; i < 10_000; i++) {
116+
flock.incrementThreadCount();
117+
}
118+
ResolvedJavaMethod method = getResolvedJavaMethod(ThreadFlock.class, "incrementThreadCount");
119+
getCode(method);
120+
}
66121
}

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/BytecodeParser.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1886,7 +1886,9 @@ protected Invokable appendInvoke(InvokeKind initialInvokeKind, ResolvedJavaMetho
18861886
if (!parsingIntrinsic() && DeoptALot.getValue(options)) {
18871887
append(new DeoptimizeNode(DeoptimizationAction.None, RuntimeConstraint));
18881888
JavaKind resultType = initialTargetMethod.getSignature().getReturnKind();
1889-
frameState.pushReturn(resultType, ConstantNode.defaultForKind(resultType, graph));
1889+
if (resultType != JavaKind.Void) {
1890+
frameState.pushReturn(resultType, ConstantNode.defaultForKind(resultType, graph));
1891+
}
18901892
return null;
18911893
}
18921894

0 commit comments

Comments
 (0)