Skip to content

Commit bf65d11

Browse files
committed
Compiler intrinsics for new Bytecode DSL APIs should be optional
1 parent 137fd0b commit bf65d11

File tree

2 files changed

+87
-66
lines changed

2 files changed

+87
-66
lines changed

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/substitutions/TruffleGraphBuilderPlugins.java

Lines changed: 76 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,7 @@ public static void registerFrameWithoutBoxingPlugins(InvocationPlugins plugins,
590590
registerFrameAccessors(r, types, JavaKind.Byte);
591591

592592
int accessTag = types.FrameSlotKind_javaKindToTagIndex.get(JavaKind.Object);
593-
registerGet(r, JavaKind.Object, accessTag, "unsafeUncheckedGet", JavaKind.Object.name());
593+
registerGet(r, JavaKind.Object, accessTag, "unsafeUncheckedGet" + JavaKind.Object.name(), true);
594594

595595
registerOSRFrameTransferMethods(r);
596596

@@ -621,11 +621,10 @@ private static void registerFrameAccessors(Registration r, KnownTruffleTypes typ
621621
int accessTag = types.FrameSlotKind_javaKindToTagIndex.get(accessKind);
622622
String nameSuffix = accessKind.name();
623623
boolean isPrimitiveAccess = accessKind.isPrimitive();
624-
String[] indexedGetPrefixes = new String[]{"get", "unsafeGet", "expect", "unsafeExpect"};
625-
for (String prefix : indexedGetPrefixes) {
626-
registerGet(r, accessKind, accessTag, prefix, nameSuffix);
624+
registerGet(r, accessKind, accessTag, "get" + nameSuffix, false);
625+
for (String prefix : new String[]{"unsafeGet", "expect", "unsafeExpect"}) {
626+
registerGet(r, accessKind, accessTag, prefix + nameSuffix, true);
627627
}
628-
629628
r.register(new RequiredInvocationPlugin("get" + nameSuffix + "Static", Receiver.class, int.class) {
630629
@Override
631630
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver frameNode, ValueNode frameSlotNode) {
@@ -639,20 +638,8 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec
639638
}
640639
});
641640

642-
String[] indexedSetPrefixes = new String[]{"set", "unsafeSet"};
643-
for (String prefix : indexedSetPrefixes) {
644-
r.register(new RequiredInvocationPlugin(prefix + nameSuffix, Receiver.class, int.class, getJavaClass(accessKind)) {
645-
@Override
646-
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver frameNode, ValueNode frameSlotNode, ValueNode value) {
647-
int frameSlotIndex = maybeGetConstantNumberedFrameSlotIndex(frameNode, frameSlotNode);
648-
if (frameSlotIndex >= 0) {
649-
b.add(new VirtualFrameSetNode(frameNode, frameSlotIndex, accessTag, value, VirtualFrameAccessType.Indexed, VirtualFrameAccessFlags.NON_STATIC_UPDATE));
650-
return true;
651-
}
652-
return false;
653-
}
654-
});
655-
}
641+
registerSet(r, accessKind, accessTag, "set" + nameSuffix, false);
642+
registerSet(r, accessKind, accessTag, "unsafeSet" + nameSuffix, true);
656643
r.register(new RequiredInvocationPlugin("set" + nameSuffix + "Static", Receiver.class, int.class, getJavaClass(accessKind)) {
657644
@Override
658645
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver frameNode, ValueNode frameSlotNode, ValueNode value) {
@@ -678,8 +665,8 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec
678665
});
679666
}
680667

681-
private static void registerGet(Registration r, JavaKind accessKind, int accessTag, String prefix, String nameSuffix) {
682-
r.register(new RequiredInvocationPlugin(prefix + nameSuffix, Receiver.class, int.class) {
668+
private static void registerGet(Registration r, JavaKind accessKind, int accessTag, String name, boolean optional) {
669+
r.register(new InvocationPlugin(name, Receiver.class, int.class) {
683670
@Override
684671
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver frameNode, ValueNode frameSlotNode) {
685672
int frameSlotIndex = maybeGetConstantNumberedFrameSlotIndex(frameNode, frameSlotNode);
@@ -689,6 +676,70 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec
689676
}
690677
return false;
691678
}
679+
680+
@Override
681+
public boolean isOptional() {
682+
return optional;
683+
}
684+
});
685+
}
686+
687+
private static void registerSet(Registration r, JavaKind accessKind, int accessTag, String name, boolean optional) {
688+
r.register(new InvocationPlugin(name, Receiver.class, int.class, getJavaClass(accessKind)) {
689+
@Override
690+
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver frameNode, ValueNode frameSlotNode, ValueNode value) {
691+
int frameSlotIndex = maybeGetConstantNumberedFrameSlotIndex(frameNode, frameSlotNode);
692+
if (frameSlotIndex >= 0) {
693+
b.add(new VirtualFrameSetNode(frameNode, frameSlotIndex, accessTag, value, VirtualFrameAccessType.Indexed, VirtualFrameAccessFlags.NON_STATIC_UPDATE));
694+
return true;
695+
}
696+
return false;
697+
}
698+
699+
@Override
700+
public boolean isOptional() {
701+
return optional;
702+
}
703+
});
704+
}
705+
706+
private static void registerCopy(Registration r, String name, boolean optional) {
707+
r.register(new InvocationPlugin(name, Receiver.class, int.class, int.class) {
708+
@Override
709+
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode frameSlot1, ValueNode frameSlot2) {
710+
int frameSlot1Index = maybeGetConstantNumberedFrameSlotIndex(receiver, frameSlot1);
711+
int frameSlot2Index = maybeGetConstantNumberedFrameSlotIndex(receiver, frameSlot2);
712+
if (frameSlot1Index >= 0 && frameSlot2Index >= 0) {
713+
b.add(new VirtualFrameCopyNode(receiver, frameSlot1Index, frameSlot2Index, VirtualFrameAccessType.Indexed, VirtualFrameAccessFlags.NON_STATIC_UPDATE));
714+
return true;
715+
}
716+
return false;
717+
}
718+
719+
@Override
720+
public boolean isOptional() {
721+
return optional;
722+
}
723+
});
724+
}
725+
726+
private static void registerClear(Registration r, String name, int illegalTag, boolean optional) {
727+
r.register(new InvocationPlugin(name, Receiver.class, int.class) {
728+
@Override
729+
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode frameSlot) {
730+
int frameSlotIndex = maybeGetConstantNumberedFrameSlotIndex(receiver, frameSlot);
731+
if (frameSlotIndex >= 0) {
732+
b.add(new VirtualFrameClearNode(receiver, frameSlotIndex, illegalTag, VirtualFrameAccessType.Indexed,
733+
VirtualFrameAccessFlags.NON_STATIC_UPDATE));
734+
return true;
735+
}
736+
return false;
737+
}
738+
739+
@Override
740+
public boolean isOptional() {
741+
return optional;
742+
}
692743
});
693744
}
694745

@@ -814,34 +865,10 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec
814865
}
815866
});
816867

817-
for (String prefix : new String[]{"", "unsafe"}) {
818-
r.register(new RequiredInvocationPlugin(buildCamelCaseName(prefix, "copy"), Receiver.class, int.class, int.class) {
819-
@Override
820-
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode frameSlot1, ValueNode frameSlot2) {
821-
int frameSlot1Index = maybeGetConstantNumberedFrameSlotIndex(receiver, frameSlot1);
822-
int frameSlot2Index = maybeGetConstantNumberedFrameSlotIndex(receiver, frameSlot2);
823-
if (frameSlot1Index >= 0 && frameSlot2Index >= 0) {
824-
b.add(new VirtualFrameCopyNode(receiver, frameSlot1Index, frameSlot2Index, VirtualFrameAccessType.Indexed, VirtualFrameAccessFlags.NON_STATIC_UPDATE));
825-
return true;
826-
}
827-
return false;
828-
}
829-
});
830-
831-
r.register(new RequiredInvocationPlugin(buildCamelCaseName(prefix, "clear"), Receiver.class, int.class) {
832-
@Override
833-
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode frameSlot) {
834-
int frameSlotIndex = maybeGetConstantNumberedFrameSlotIndex(receiver, frameSlot);
835-
if (frameSlotIndex >= 0) {
836-
b.add(new VirtualFrameClearNode(receiver, frameSlotIndex, illegalTag, VirtualFrameAccessType.Indexed,
837-
VirtualFrameAccessFlags.NON_STATIC_UPDATE));
838-
return true;
839-
}
840-
return false;
841-
}
842-
});
843-
844-
}
868+
registerCopy(r, "copy", false);
869+
registerCopy(r, "unsafeCopy", true);
870+
registerClear(r, "clear", illegalTag, false);
871+
registerClear(r, "unsafeClear", illegalTag, true);
845872

846873
r.register(new RequiredInvocationPlugin("clearPrimitiveStatic", Receiver.class, int.class) {
847874
@Override
@@ -968,21 +995,6 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec
968995
});
969996
}
970997

971-
private static String buildCamelCaseName(String prefix, String name) {
972-
if (prefix.isEmpty()) {
973-
return name;
974-
} else {
975-
return prefix + firstLetterUpperCase(name);
976-
}
977-
}
978-
979-
private static String firstLetterUpperCase(String name) {
980-
if (name == null || name.isEmpty()) {
981-
return name;
982-
}
983-
return Character.toUpperCase(name.charAt(0)) + name.substring(1, name.length());
984-
}
985-
986998
public static void registerNodePlugins(InvocationPlugins plugins, KnownTruffleTypes types, MetaAccessProvider metaAccess, boolean canDelayIntrinsification,
987999
ConstantReflectionProvider constantReflection) {
9881000
Registration r = new Registration(plugins, new ResolvedJavaSymbol(types.Node));

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/substitutions/TruffleInvocationPlugins.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,7 @@ private static void registerBytecodePlugins(InvocationPlugins plugins, Replaceme
9090
plugins.registerIntrinsificationPredicate(t -> t.getName().equals("Lcom/oracle/truffle/api/bytecode/BytecodeDSLUncheckedAccess;"));
9191
InvocationPlugins.Registration r = new InvocationPlugins.Registration(plugins, "com.oracle.truffle.api.bytecode.BytecodeDSLUncheckedAccess", replacements);
9292

93-
r.register(new InlineOnlyInvocationPlugin("uncheckedCast", Receiver.class, Object.class,
94-
Class.class) {
93+
r.register(new InvocationPlugin("uncheckedCast", Receiver.class, Object.class, Class.class) {
9594
@Override
9695
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver,
9796
ValueNode object, ValueNode clazz) {
@@ -111,6 +110,16 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec
111110
return true;
112111
}
113112
}
113+
114+
@Override
115+
public boolean inlineOnly() {
116+
return true;
117+
}
118+
119+
@Override
120+
public boolean isOptional() {
121+
return true;
122+
}
114123
});
115124
}
116125

0 commit comments

Comments
 (0)