Skip to content

Commit decfa9d

Browse files
committed
Merge branch 'master' into ag/GR-36219-fix-class-redefine-jck-test
2 parents 9061dd6 + b79445b commit decfa9d

File tree

268 files changed

+1017
-2321
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

268 files changed

+1017
-2321
lines changed

compiler/src/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/DeoptimizeDirectiveTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,19 @@
3232

3333
import org.graalvm.compiler.api.directives.GraalDirectives;
3434
import org.graalvm.compiler.core.test.GraalCompilerTest;
35+
import org.graalvm.compiler.phases.OptimisticOptimizations;
3536

3637
public class DeoptimizeDirectiveTest extends GraalCompilerTest {
3738

3839
public static boolean inCompiledCode() {
3940
return GraalDirectives.inCompiledCode();
4041
}
4142

43+
@Override
44+
protected OptimisticOptimizations getOptimisticOptimizations() {
45+
return OptimisticOptimizations.ALL;
46+
}
47+
4248
@Test
4349
public void testInCompiledCode() {
4450
ResolvedJavaMethod method = getResolvedJavaMethod("inCompiledCode");

compiler/src/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64ASIMDAssembler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2199,6 +2199,7 @@ public void mlsVVV(ASIMDSize size, ElementSize eSize, Register dst, Register src
21992199
* @param imm long value to move. If size is 128, then this value is copied twice
22002200
*/
22012201
public void moviVI(ASIMDSize size, Register dst, long imm) {
2202+
assert dst.getRegisterCategory().equals(SIMD);
22022203
modifiedImmEncoding(ImmediateOp.MOVI, size, dst, imm);
22032204
}
22042205

compiler/src/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64MacroAssembler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1573,8 +1573,8 @@ public void fmov(int size, Register dst, Register src) {
15731573
public void fmov(int size, Register dst, double imm) {
15741574
assert size == 32 || size == 64;
15751575
if (imm == 0.0) {
1576-
assert Double.doubleToRawLongBits(imm) == 0L : "-0.0 is no valid immediate.";
1577-
fmovCpu2Fpu(size, dst, zr);
1576+
assert Double.doubleToRawLongBits(imm) == 0L : "-0.0 is not a valid immediate.";
1577+
neon.moviVI(ASIMDSize.HalfReg, dst, 0);
15781578
} else {
15791579
super.fmov(size, dst, imm);
15801580
}

compiler/src/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraalCompilerTest.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
import org.graalvm.compiler.phases.OptimisticOptimizations;
111111
import org.graalvm.compiler.phases.Phase;
112112
import org.graalvm.compiler.phases.PhaseSuite;
113+
import org.graalvm.compiler.phases.OptimisticOptimizations.Optimization;
113114
import org.graalvm.compiler.phases.common.CanonicalizerPhase;
114115
import org.graalvm.compiler.phases.common.inlining.InliningPhase;
115116
import org.graalvm.compiler.phases.common.inlining.info.InlineInfo;
@@ -592,9 +593,14 @@ protected final Providers getProviders() {
592593
* all the paths where the value is set so it is the proper place for a test override. Setting
593594
* it in other places can result in inconsistent values being used in other parts of the
594595
* compiler.
596+
*
597+
* This method returns settings such that all optimizations except
598+
* {@link Optimization#RemoveNeverExecutedCode} are enabled. The latter is removed to reduce a
599+
* major source of indeterminism in tests caused by profiles. Most tests should ignore profiles
600+
* as they can differ wildly depending on the set of tests being run.
595601
*/
596602
protected OptimisticOptimizations getOptimisticOptimizations() {
597-
return OptimisticOptimizations.ALL;
603+
return OptimisticOptimizations.ALL.remove(Optimization.RemoveNeverExecutedCode);
598604
}
599605

600606
protected final HighTierContext getDefaultHighTierContext() {

compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/UnimplementedGraalIntrinsics.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,12 +169,14 @@ public UnimplementedGraalIntrinsics(GraalHotSpotVMConfig config, Architecture ar
169169
"java/lang/Long.numberOfTrailingZeros(J)I");
170170

171171
// Relevant for Java flight recorder
172-
add(toBeInvestigated,
172+
// [GR-10106] These JFR intrinsics are used for firing socket/file events via Java
173+
// instrumentation and are of low priority.
174+
add(ignore,
173175
"oracle/jrockit/jfr/Timing.counterTime()J",
174176
"oracle/jrockit/jfr/VMJFR.classID0(Ljava/lang/Class;)J",
175177
"oracle/jrockit/jfr/VMJFR.threadID()I");
176178

177-
add(toBeInvestigated,
179+
add(ignore,
178180
"jdk/jfr/internal/JVM.counterTime()J",
179181
"jdk/jfr/internal/JVM.getClassId(Ljava/lang/Class;)J",
180182
"jdk/jfr/internal/JVM.getEventWriter()Ljava/lang/Object;");

compiler/src/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/IfNode.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -958,6 +958,21 @@ private boolean removeOrMaterializeIf(SimplifierTool tool) {
958958
removeThroughFalseBranch(tool, merge);
959959
return true;
960960
}
961+
/*-
962+
* Remove this pattern:
963+
* if (a == null)
964+
* return null
965+
* else
966+
* return a
967+
*/
968+
if (condition instanceof IsNullNode && trueValue.isJavaConstant() && trueValue.asJavaConstant().isDefaultForKind() && merge instanceof MergeNode) {
969+
ValueNode value = ((IsNullNode) condition).getValue();
970+
if (falseValue == value && singlePhi.stamp(NodeView.DEFAULT).equals(value.stamp(NodeView.DEFAULT))) {
971+
singlePhi.setValueAt(trueEnd, falseValue);
972+
removeThroughFalseBranch(tool, merge);
973+
return true;
974+
}
975+
}
961976
}
962977
}
963978
}

compiler/src/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ConditionalNode.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@
3333
import org.graalvm.compiler.core.common.type.Stamp;
3434
import org.graalvm.compiler.core.common.type.StampFactory;
3535
import org.graalvm.compiler.graph.NodeClass;
36-
import org.graalvm.compiler.nodes.spi.Canonicalizable;
37-
import org.graalvm.compiler.nodes.spi.CanonicalizerTool;
3836
import org.graalvm.compiler.lir.gen.ArithmeticLIRGeneratorTool.RoundingMode;
3937
import org.graalvm.compiler.nodeinfo.InputType;
4038
import org.graalvm.compiler.nodeinfo.NodeInfo;
@@ -45,6 +43,8 @@
4543
import org.graalvm.compiler.nodes.NodeView;
4644
import org.graalvm.compiler.nodes.StructuredGraph;
4745
import org.graalvm.compiler.nodes.ValueNode;
46+
import org.graalvm.compiler.nodes.spi.Canonicalizable;
47+
import org.graalvm.compiler.nodes.spi.CanonicalizerTool;
4848
import org.graalvm.compiler.nodes.spi.LIRLowerable;
4949
import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
5050

@@ -277,6 +277,11 @@ public static ValueNode canonicalizeConditional(LogicNode condition, ValueNode t
277277
}
278278
// @formatter:on
279279

280+
if (condition instanceof IsNullNode && trueValue.isJavaConstant() && trueValue.asJavaConstant().isDefaultForKind() &&
281+
falseValue == ((IsNullNode) condition).getValue()) {
282+
return falseValue;
283+
}
284+
280285
return null;
281286
}
282287

compiler/src/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/DeoptimizeOnVolatileReadTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import org.graalvm.compiler.api.directives.GraalDirectives;
2828
import org.graalvm.compiler.core.test.GraalCompilerTest;
29+
import org.graalvm.compiler.phases.OptimisticOptimizations;
2930
import org.junit.Test;
3031

3132
import jdk.vm.ci.code.InstalledCode;
@@ -43,6 +44,11 @@ static class Dummy {
4344
volatile boolean f2 = false;
4445
}
4546

47+
@Override
48+
protected OptimisticOptimizations getOptimisticOptimizations() {
49+
return OptimisticOptimizations.ALL;
50+
}
51+
4652
public static int test1Snippet(Dummy dummy) {
4753
if (GraalDirectives.injectBranchProbability(0, GraalDirectives.inCompiledCode() & dummy.f1)) {
4854
return 1;

compiler/src/org.graalvm.compiler.serviceprovider/src/org/graalvm/compiler/serviceprovider/SpeculationReasonGroup.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,15 @@ public final class SpeculationReasonGroup {
4646
private static final AtomicInteger nextId = new AtomicInteger(1);
4747

4848
/**
49-
* Creates speculation group whose context will always match {@code signature}.
49+
* Creates a speculation group whose context will always match {@code signature}.
50+
*
51+
* This constructor is deleted in libgraal to ensure group ids are allocated during build time.
52+
* Without this invariant, it would possible for 2 different groups to have the same id if the
53+
* groups are allocated in different libgraal isolates (since static variables are
54+
* isolate-local).
5055
*/
5156
public SpeculationReasonGroup(String name, Class<?>... signature) {
52-
this.id = nextId.get();
57+
this.id = nextId.getAndIncrement();
5358
this.name = name;
5459
this.signature = signature;
5560
for (Class<?> c : signature) {

compiler/src/org.graalvm.jniutils/src/org/graalvm/jniutils/JNIExceptionWrapper.java

Lines changed: 27 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@
3232
import static org.graalvm.jniutils.JNIUtil.GetStaticMethodID;
3333
import static org.graalvm.jniutils.JNIUtil.IsSameObject;
3434
import static org.graalvm.jniutils.JNIUtil.NewGlobalRef;
35-
import static org.graalvm.jniutils.JNIUtil.NewObjectArray;
36-
import static org.graalvm.jniutils.JNIUtil.SetObjectArrayElement;
3735
import static org.graalvm.jniutils.JNIUtil.Throw;
3836
import static org.graalvm.jniutils.JNIUtil.createHSString;
3937
import static org.graalvm.jniutils.JNIUtil.createString;
@@ -48,17 +46,20 @@
4846
import org.graalvm.jniutils.JNI.JClass;
4947
import org.graalvm.jniutils.JNI.JNIEnv;
5048
import org.graalvm.jniutils.JNI.JObject;
51-
import org.graalvm.jniutils.JNI.JObjectArray;
5249
import org.graalvm.jniutils.JNI.JString;
5350
import org.graalvm.jniutils.JNI.JThrowable;
5451
import org.graalvm.nativeimage.StackValue;
5552
import org.graalvm.nativeimage.c.type.CTypeConversion;
5653
import org.graalvm.word.WordFactory;
5754

5855
import java.io.ByteArrayInputStream;
56+
import java.io.ByteArrayOutputStream;
5957
import java.io.DataInputStream;
58+
import java.io.DataOutputStream;
6059
import java.io.IOException;
6160
import java.util.Objects;
61+
import java.util.zip.GZIPInputStream;
62+
import java.util.zip.GZIPOutputStream;
6263

6364
/**
6465
* Wraps an exception thrown by a JNI call into HotSpot. If the exception propagates up to an native
@@ -73,7 +74,7 @@ public final class JNIExceptionWrapper extends RuntimeException {
7374
private static final JNIMethodResolver GetClassName = JNIMethodResolver.create("getClassName", String.class, Class.class);
7475
private static final JNIMethodResolver GetStackTrace = JNIMethodResolver.create("getStackTrace", byte[].class, Throwable.class);
7576
private static final JNIMethodResolver GetThrowableMessage = JNIMethodResolver.create("getThrowableMessage", String.class, Throwable.class);
76-
private static final JNIMethodResolver UpdateStackTrace = JNIMethodResolver.create("updateStackTrace", Throwable.class, Throwable.class, String[].class);
77+
private static final JNIMethodResolver UpdateStackTrace = JNIMethodResolver.create("updateStackTrace", Throwable.class, Throwable.class, byte[].class);
7778

7879
private static volatile JNI.JClass entryPointsClass;
7980

@@ -94,7 +95,7 @@ private JNIExceptionWrapper(JNIEnv env, JThrowable throwableHandle) {
9495
private void throwInHotSpot(JNIEnv env) {
9596
JThrowable toThrow;
9697
if (throwableRequiresStackTraceUpdate) {
97-
toThrow = updateStackTrace(env, throwableHandle, encode(getStackTrace()));
98+
toThrow = updateStackTrace(env, throwableHandle, getStackTrace());
9899
} else {
99100
toThrow = throwableHandle;
100101
}
@@ -201,7 +202,7 @@ public static JThrowable createHSException(JNIEnv env, Throwable original) {
201202
JNIExceptionWrapper jniExceptionWrapper = (JNIExceptionWrapper) original;
202203
hsThrowable = jniExceptionWrapper.throwableHandle;
203204
if (jniExceptionWrapper.throwableRequiresStackTraceUpdate) {
204-
hsThrowable = updateStackTrace(env, hsThrowable, encode(jniExceptionWrapper.getStackTrace()));
205+
hsThrowable = updateStackTrace(env, hsThrowable, jniExceptionWrapper.getStackTrace());
205206
}
206207
} else {
207208
hsThrowable = createExceptionOfSameType(env, original);
@@ -217,11 +218,11 @@ public static JThrowable createHSException(JNIEnv env, Throwable original) {
217218
// For exceptions which override fillInStackTrace merging stack traces only adds
218219
// useless JNI calls.
219220
StackTraceElement[] hsStack = getJNIExceptionStackTrace(env, hsThrowable);
220-
String[] merged = encode(mergeStackTraces(hsStack, nativeStack,
221+
StackTraceElement[] mergedStack = mergeStackTraces(hsStack, nativeStack,
221222
hasSameExceptionType ? 0 : 1, // exception with same exception
222223
// type has no factory method
223-
0, false));
224-
hsThrowable = updateStackTrace(env, hsThrowable, merged);
224+
0, false);
225+
hsThrowable = updateStackTrace(env, hsThrowable, mergedStack);
225226
}
226227
}
227228
return hsThrowable;
@@ -386,29 +387,6 @@ private static StackTraceElement[] mergeStackTraces(
386387
return merged;
387388
}
388389

389-
/**
390-
* Encodes {@code stackTrace} into a string representation. Each stack trace element has the
391-
* form {@code className|methodName|fileName|lineNumber}. A missing {@code fileName} is encoded
392-
* as an empty string. A {@code '|'} in {@code className}, {@code methodName} or
393-
* {@code fileName} is replaced with a {@code '!'}. Given how rare this is, a complicated
394-
* escaping mechanism is not warranted.
395-
*/
396-
private static String[] encode(StackTraceElement[] stackTrace) {
397-
String[] res = new String[stackTrace.length];
398-
for (int i = 0; i < stackTrace.length; i++) {
399-
String className = stackTrace[i].getClassName();
400-
String methodName = stackTrace[i].getMethodName();
401-
String fileName = stackTrace[i].getFileName();
402-
int lineNumber = stackTrace[i].getLineNumber();
403-
res[i] = String.format("%s|%s|%s|%d",
404-
className == null ? "" : className.replace('|', '!'),
405-
methodName == null ? "" : methodName.replace('|', '!'),
406-
fileName == null ? "" : fileName.replace('|', '!'),
407-
lineNumber);
408-
}
409-
return res;
410-
}
411-
412390
/**
413391
* Gets the stack trace from a JNI exception.
414392
*
@@ -418,7 +396,7 @@ private static String[] encode(StackTraceElement[] stackTrace) {
418396
*/
419397
private static StackTraceElement[] getJNIExceptionStackTrace(JNIEnv env, JObject throwableHandle) {
420398
byte[] serializedStackTrace = JNIUtil.createArray(env, (JByteArray) callGetStackTrace(env, throwableHandle));
421-
try (DataInputStream in = new DataInputStream(new ByteArrayInputStream(serializedStackTrace))) {
399+
try (DataInputStream in = new DataInputStream(new GZIPInputStream(new ByteArrayInputStream(serializedStackTrace)))) {
422400
int len = in.readInt();
423401
StackTraceElement[] res = new StackTraceElement[len];
424402
for (int i = 0; i < len; i++) {
@@ -447,14 +425,22 @@ private static boolean containsHotSpotCall(StackTraceElement[] stackTrace) {
447425
return false;
448426
}
449427

450-
private static JThrowable updateStackTrace(JNIEnv env, JThrowable throwableHandle, String[] encodedStackTrace) {
451-
JClass string = findClass(env, getBinaryName(String.class.getName()));
452-
JObjectArray stackTraceHandle = NewObjectArray(env, encodedStackTrace.length, string, WordFactory.nullPointer());
453-
for (int i = 0; i < encodedStackTrace.length; i++) {
454-
JString element = createHSString(env, encodedStackTrace[i]);
455-
SetObjectArrayElement(env, stackTraceHandle, i, element);
428+
private static JThrowable updateStackTrace(JNIEnv env, JThrowable throwableHandle, StackTraceElement[] mergedStackTrace) {
429+
ByteArrayOutputStream bout = new ByteArrayOutputStream();
430+
try (DataOutputStream out = new DataOutputStream(new GZIPOutputStream(bout))) {
431+
out.writeInt(mergedStackTrace.length);
432+
for (int i = 0; i < mergedStackTrace.length; i++) {
433+
StackTraceElement stackTraceElement = mergedStackTrace[i];
434+
out.writeUTF(stackTraceElement.getClassName());
435+
out.writeUTF(stackTraceElement.getMethodName());
436+
String fileName = stackTraceElement.getFileName();
437+
out.writeUTF(fileName == null ? "" : fileName);
438+
out.writeInt(stackTraceElement.getLineNumber());
439+
}
440+
} catch (IOException ioe) {
441+
throw new RuntimeException(ioe);
456442
}
457-
return callUpdateStackTrace(env, throwableHandle, stackTraceHandle);
443+
return callUpdateStackTrace(env, throwableHandle, JNIUtil.createHSArray(env, bout.toByteArray()));
458444
}
459445

460446
private static String getMessage(JNIEnv env, JThrowable throwableHandle) {
@@ -527,7 +513,7 @@ private static <T extends JObject> T callCreateException(JNIEnv env, JObject p0)
527513
return HotSpotCalls.getDefault().callStaticJObject(env, getHotSpotEntryPoints(env), CreateException.resolve(env), args);
528514
}
529515

530-
private static <T extends JObject> T callUpdateStackTrace(JNIEnv env, JObject p0, JObject p1) {
516+
private static <T extends JObject> T callUpdateStackTrace(JNIEnv env, JObject p0, JByteArray p1) {
531517
JNI.JValue args = StackValue.get(2, JNI.JValue.class);
532518
args.addressOf(0).setJObject(p0);
533519
args.addressOf(1).setJObject(p1);

0 commit comments

Comments
 (0)