blob: bb4ef2b469766151151f6b8f28279f8f2522fd75 [file] [log] [blame]
/*
* Copyright (c) 2011, 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.
*/
/*
* @test
* @key stress
*
* @summary converted from VM Testbase vm/mlvm/meth/stress/compiler/deoptimize.
* VM Testbase keywords: [feature_mlvm, nonconcurrent, quarantine]
* VM Testbase comments: 8079642 8208255
* VM Testbase readme:
* DESCRIPTION
* The test creates and calls MH sequences (see vm/mlvm/mh/func/sequences test) causing compilation
* (by calling sequence 10000 times) and deoptimization (by using uncommon traps).
* See vm.mlvm.meth.stress.java.sequences.Test for details on MH sequences.
*
* @library /vmTestbase
* /test/lib
*
* @comment build test class and indify classes
* @build vm.mlvm.meth.stress.compiler.deoptimize.Test
* @run driver vm.mlvm.share.IndifiedClassesBuilder
*
* @requires vm.debug != true
*
* @run main/othervm/timeout=300
* -XX:ReservedCodeCacheSize=100m
* vm.mlvm.meth.stress.compiler.deoptimize.Test
* -threadsPerCpu 4
* -threadsExtra 2
*/
/*
* @test
* @key stress
*
* @library /vmTestbase
* /test/lib
*
* @comment build test class and indify classes
* @build vm.mlvm.meth.stress.compiler.deoptimize.Test
* @run driver vm.mlvm.share.IndifiedClassesBuilder
*
* @requires vm.debug == true
*
* @run main/othervm/timeout=300
* -XX:ReservedCodeCacheSize=100m
* vm.mlvm.meth.stress.compiler.deoptimize.Test
* -threadsPerCpu 2
* -threadsExtra 2
*/
package vm.mlvm.meth.stress.compiler.deoptimize;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import vm.mlvm.meth.share.Argument;
import vm.mlvm.meth.share.MHTransformationGen;
import vm.mlvm.meth.share.RandomArgumentsGen;
import vm.mlvm.share.Env;
import vm.mlvm.share.MlvmTest;
import vm.mlvm.share.MultiThreadedTest;
// TODO: check deopt using vm.mlvm.share.comp framework
public class Test extends MultiThreadedTest {
static class A {
Object m() {
return new Integer(0);
}
}
static class B extends A {
@Override
Object m() {
return new Integer(1);
}
}
static class TestData {
final A _a;
final int _expectedResult;
TestData(A a) {
_a = a;
_expectedResult = (Integer) a.m();
}
Object m() {
return _a.m();
}
}
volatile TestData _data = new TestData(new A());
volatile boolean _testDone = false;
final MethodHandle _mh;
final Argument[] _finalArgs;
public Test() throws Throwable {
_mh = MethodHandles.lookup().findVirtual(TestData.class, "m", MethodType.methodType(Object.class));
_finalArgs = RandomArgumentsGen.createRandomArgs(true, _mh.type());
}
@Override
protected void initializeTest() throws Throwable {
super.initializeTest();
if (calcThreadNum() < 2) {
throw new IllegalArgumentException("Number of threads should be 2 or more");
}
}
private void sleepAndDeoptimize() throws Throwable {
try {
Thread.sleep(3000);
// Force deoptimization in uncommon trap logic
Env.traceNormal("Deoptimizing");
_data = new TestData((A) Test.class.getClassLoader().loadClass(Test.class.getName() + "$B").newInstance());
Thread.sleep(3000);
} finally {
this._testDone = true;
}
}
@Override
protected boolean runThread(int threadNum) throws Throwable {
if ( threadNum == 0 ) {
sleepAndDeoptimize();
return true;
}
while ( ! Test.this._testDone) {
TestData dataSnapshot = _data;
Integer expectedResult = (Integer) dataSnapshot._a.m();
Argument retVal = new Argument(Object.class, expectedResult);
retVal.setPreserved(true);
MHTransformationGen.createAndCallSequence(retVal, dataSnapshot, _mh, _finalArgs, true);
}
return true;
}
public static void main(String[] args) { MlvmTest.launch(args); }
}