Skip to content

Commit 1e902bb

Browse files
committed
[GR-60866] Use plugin class name to filter fold plugin application
PullRequest: graal/19738
2 parents 69d89d2 + f35ce5a commit 1e902bb

File tree

11 files changed

+146
-190
lines changed

11 files changed

+146
-190
lines changed

compiler/src/jdk.graal.compiler.processor/src/jdk/graal/compiler/replacements/processor/GeneratedFoldPlugin.java

Lines changed: 56 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import static jdk.graal.compiler.replacements.processor.FoldHandler.INJECTED_PARAMETER_CLASS_NAME;
2929

3030
import java.io.PrintWriter;
31+
import java.io.StringWriter;
3132
import java.util.List;
3233
import java.util.Set;
3334
import java.util.TreeSet;
@@ -66,138 +67,55 @@ public void extraImports(AbstractProcessor processor, Set<String> imports) {
6667
imports.add("jdk.vm.ci.meta.JavaConstant");
6768
imports.add("jdk.vm.ci.meta.JavaKind");
6869
imports.add("jdk.graal.compiler.nodes.ConstantNode");
69-
imports.add("jdk.graal.compiler.core.common.type.Stamp");
7070
}
7171

7272
@Override
7373
protected void createExecute(AbstractProcessor processor, PrintWriter out, InjectedDependencies deps) {
74-
List<? extends VariableElement> params = intrinsicMethod.getParameters();
75-
7674
out.printf(" if (b.shouldDeferPlugin(this)) {\n");
7775
out.printf(" b.replacePlugin%s(this, targetMethod, args, %s.FUNCTION);\n", getReplacementFunctionSuffix(processor), getReplacementName());
7876
out.printf(" return true;\n");
7977
out.printf(" }\n");
8078

81-
int argCount = 0;
82-
Object receiver;
83-
if (intrinsicMethod.getModifiers().contains(Modifier.STATIC)) {
84-
receiver = intrinsicMethod.getEnclosingElement();
85-
} else {
86-
receiver = "arg0";
87-
TypeElement type = (TypeElement) intrinsicMethod.getEnclosingElement();
88-
constantArgument(processor, out, deps, argCount, type.asType(), argCount, false);
89-
argCount++;
90-
}
91-
92-
int firstArg = argCount;
93-
for (VariableElement param : params) {
94-
if (processor.getAnnotation(param, processor.getType(INJECTED_PARAMETER_CLASS_NAME)) == null) {
95-
constantArgument(processor, out, deps, argCount, param.asType(), argCount, false);
96-
} else {
79+
int argCount = intrinsicMethod.getModifiers().contains(Modifier.STATIC) ? 0 : 1;
80+
for (VariableElement param : intrinsicMethod.getParameters()) {
81+
if (processor.getAnnotation(param, processor.getType(INJECTED_PARAMETER_CLASS_NAME)) != null) {
9782
out.printf(" if (!checkInjectedArgument(b, args[%d], targetMethod)) {\n", argCount);
9883
out.printf(" return false;\n");
9984
out.printf(" }\n");
100-
out.printf(" %s arg%d = %s;\n", param.asType(), argCount, deps.use(processor, (DeclaredType) param.asType()));
10185
}
10286
argCount++;
10387
}
10488

105-
Set<String> suppressWarnings = new TreeSet<>();
106-
if (intrinsicMethod.getAnnotation(Deprecated.class) != null) {
107-
suppressWarnings.add("deprecation");
108-
}
109-
if (hasRawtypeWarning(intrinsicMethod.getReturnType())) {
110-
suppressWarnings.add("rawtypes");
111-
}
112-
for (VariableElement param : params) {
113-
if (hasUncheckedWarning(param.asType())) {
114-
suppressWarnings.add("unchecked");
115-
}
116-
}
117-
if (suppressWarnings.size() > 0) {
118-
out.printf(" @SuppressWarnings({");
119-
String sep = "";
120-
for (String suppressWarning : suppressWarnings) {
121-
out.printf("%s\"%s\"", sep, suppressWarning);
122-
sep = ", ";
123-
}
124-
out.printf("})\n");
125-
}
89+
// Exercise the emission (but swallow generated output) to populate the deps
90+
emitReplace(processor, new PrintWriter(new StringWriter()), deps);
12691

127-
out.printf(" %s result = %s.%s(", getErasedType(intrinsicMethod.getReturnType()), receiver, intrinsicMethod.getSimpleName());
128-
if (argCount > firstArg) {
129-
out.printf("arg%d", firstArg);
130-
for (int i = firstArg + 1; i < argCount; i++) {
131-
out.printf(", arg%d", i);
132-
}
92+
// Build the list of extra arguments to be passed
93+
StringBuilder extraArguments = new StringBuilder();
94+
for (InjectedDependencies.Dependency dep : deps) {
95+
extraArguments.append(", ").append(dep.getName(processor, intrinsicMethod));
13396
}
134-
out.printf(");\n");
135-
136-
TypeMirror returnType = intrinsicMethod.getReturnType();
137-
switch (returnType.getKind()) {
138-
case BOOLEAN:
139-
out.printf(" JavaConstant constant = JavaConstant.forInt(result ? 1 : 0);\n");
140-
break;
141-
case BYTE:
142-
case SHORT:
143-
case CHAR:
144-
case INT:
145-
out.printf(" JavaConstant constant = JavaConstant.forInt(result);\n");
146-
break;
147-
case LONG:
148-
out.printf(" JavaConstant constant = JavaConstant.forLong(result);\n");
149-
break;
150-
case FLOAT:
151-
out.printf(" JavaConstant constant = JavaConstant.forFloat(result);\n");
152-
break;
153-
case DOUBLE:
154-
out.printf(" JavaConstant constant = JavaConstant.forDouble(result);\n");
155-
break;
156-
case ARRAY:
157-
case TYPEVAR:
158-
case DECLARED:
159-
if (returnType.equals(processor.getType("java.lang.String"))) {
160-
out.printf(" JavaConstant constant = %s.forString(result);\n", deps.use(processor, WellKnownDependency.CONSTANT_REFLECTION));
161-
} else {
162-
out.printf(" JavaConstant constant = %s.forObject(result);\n", deps.use(processor, WellKnownDependency.SNIPPET_REFLECTION));
163-
}
164-
break;
165-
default:
166-
throw new IllegalArgumentException(returnType.toString());
167-
}
168-
169-
out.printf(" ConstantNode node = ConstantNode.forConstant(constant, %s, %s);\n", deps.use(processor, WellKnownDependency.META_ACCESS),
170-
deps.use(processor, WellKnownDependency.STRUCTURED_GRAPH));
171-
out.printf(" b.push(JavaKind.%s, node);\n", getReturnKind(intrinsicMethod));
172-
out.printf(" return true;\n");
97+
out.printf(" return doExecute(b, args%s);\n", extraArguments);
17398
}
17499

175-
@Override
176-
protected void createHelpers(AbstractProcessor processor, PrintWriter out, InjectedDependencies deps) {
177-
out.printf("\n");
178-
out.printf(" @Override\n");
179-
out.printf(" public boolean replace(GraphBuilderContext b, Replacements injection, Stamp stamp, NodeInputList<ValueNode> args) {\n");
180-
100+
private void emitReplace(AbstractProcessor processor, PrintWriter out, InjectedDependencies deps) {
181101
List<? extends VariableElement> params = intrinsicMethod.getParameters();
182-
183-
int argCount = 0;
102+
final int firstArg = intrinsicMethod.getModifiers().contains(Modifier.STATIC) ? 0 : 1;
184103
Object receiver;
185-
if (intrinsicMethod.getModifiers().contains(Modifier.STATIC)) {
104+
if (firstArg == 0) {
186105
receiver = intrinsicMethod.getEnclosingElement();
187106
} else {
188107
receiver = "arg0";
189108
TypeElement type = (TypeElement) intrinsicMethod.getEnclosingElement();
190-
constantArgument(processor, out, deps, argCount, type.asType(), argCount, true);
191-
argCount++;
109+
constantArgument(processor, out, deps, 0, type.asType(), 0, false);
192110
}
193111

194-
int firstArg = argCount;
112+
int argCount = firstArg;
195113
for (VariableElement param : params) {
196114
if (processor.getAnnotation(param, processor.getType(INJECTED_PARAMETER_CLASS_NAME)) == null) {
197-
constantArgument(processor, out, deps, argCount, param.asType(), argCount, true);
115+
constantArgument(processor, out, deps, argCount, param.asType(), argCount, false);
198116
} else {
199-
out.printf(" assert args.get(%d).isNullConstant() : \"Must be null constant \" + args.get(%d);\n", argCount, argCount);
200-
out.printf(" %s arg%d = %s;\n", param.asType(), argCount, deps.find(processor, (DeclaredType) param.asType()).getExpression(processor, intrinsicMethod));
117+
out.printf(" assert args[%d].isNullConstant() : \"Must be null constant \" + args[%d];\n", argCount, argCount);
118+
out.printf(" %s arg%d = %s;\n", param.asType(), argCount, deps.use(processor, (DeclaredType) param.asType()));
201119
}
202120
argCount++;
203121
}
@@ -270,6 +188,43 @@ protected void createHelpers(AbstractProcessor processor, PrintWriter out, Injec
270188
deps.use(processor, WellKnownDependency.STRUCTURED_GRAPH));
271189
out.printf(" b.push(JavaKind.%s, node);\n", getReturnKind(intrinsicMethod));
272190
out.printf(" return true;\n");
191+
}
192+
193+
@Override
194+
protected void createPrivateMembersAndConstructor(AbstractProcessor processor, PrintWriter out, InjectedDependencies deps, String constructorName) {
195+
// Add declarations for the extra arguments
196+
StringBuilder extraArguments = new StringBuilder();
197+
for (InjectedDependencies.Dependency dep : deps) {
198+
extraArguments.append(", ").append(dep.getType()).append(" ").append(dep.getName(processor, intrinsicMethod));
199+
}
200+
out.printf("\n");
201+
out.printf(" @SuppressWarnings(\"unused\")\n");
202+
out.printf(" static boolean doExecute(GraphBuilderContext b, ValueNode[] args%s) {\n", extraArguments);
203+
emitReplace(processor, out, deps);
204+
out.printf(" }\n");
205+
206+
// This must be done after the code emission above to ensure that deps includes all required
207+
// dependencies.
208+
super.createPrivateMembersAndConstructor(processor, out, deps, constructorName);
209+
}
210+
211+
@Override
212+
protected void createHelpers(AbstractProcessor processor, PrintWriter out, InjectedDependencies deps) {
213+
out.printf("\n");
214+
out.printf(" @Override\n");
215+
out.printf(" public boolean replace(GraphBuilderContext b, GeneratedPluginInjectionProvider injection, ValueNode[] args) {\n");
216+
217+
// Create local declarations for all the injected arguments
218+
for (InjectedDependencies.Dependency dep : deps) {
219+
out.printf(" %s %s = %s;\n", dep.getType(), dep.getName(processor, intrinsicMethod), dep.getExpression(processor, intrinsicMethod));
220+
}
221+
222+
// Build the list of extra arguments to be passed
223+
StringBuilder extraArguments = new StringBuilder();
224+
for (InjectedDependencies.Dependency dep : deps) {
225+
extraArguments.append(", ").append(dep.getName(processor, intrinsicMethod));
226+
}
227+
out.printf(" return %s.doExecute(b, args%s);\n", getPluginName(), extraArguments);
273228
out.printf(" }\n");
274229
}
275230
}

compiler/src/jdk.graal.compiler.processor/src/jdk/graal/compiler/replacements/processor/GeneratedNodeIntrinsicPlugin.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,6 @@ protected String pluginSuperclass() {
6262
@Override
6363
public void extraImports(AbstractProcessor processor, Set<String> imports) {
6464
imports.add("jdk.graal.compiler.nodes.graphbuilderconf.GraphBuilderContext");
65-
if (needsReplacement(processor)) {
66-
imports.add("jdk.graal.compiler.core.common.type.Stamp");
67-
}
6865
}
6966

7067
protected abstract List<? extends VariableElement> getParameters();
@@ -87,7 +84,7 @@ protected void createExecute(AbstractProcessor processor, PrintWriter out, Injec
8784

8885
for (int i = 0; i < signature.length; i++, idx++) {
8986
if (processor.getAnnotation(intrinsicMethod.getParameters().get(i), processor.getType(NodeIntrinsicHandler.CONSTANT_NODE_PARAMETER_CLASS_NAME)) != null) {
90-
String argName = constantArgument(processor, out, deps, idx, signature[i], i, false);
87+
String argName = constantArgument(processor, out, deps, idx, signature[i], i, true);
9188
verifyConstantArgument(out, argName, signature[i]);
9289
} else {
9390
if (signature[i].equals(processor.getType(NodeIntrinsicHandler.VALUE_NODE_CLASS_NAME))) {
@@ -199,7 +196,7 @@ protected void verifyConstantArgument(PrintWriter out, String argName, TypeMirro
199196
}
200197

201198
@Override
202-
protected void createOtherClasses(AbstractProcessor processor, PrintWriter out) {
199+
protected void createOtherClasses(AbstractProcessor processor, PrintWriter out, InjectedDependencies deps) {
203200
if (needsReplacement(processor)) {
204201
if (isWithExceptionReplacement(processor)) {
205202
/*
@@ -212,11 +209,10 @@ protected void createOtherClasses(AbstractProcessor processor, PrintWriter out)
212209
out.printf("@ExcludeFromJacocoGeneratedReport(\"deferred plugin support that is only called in libgraal\")\n");
213210
out.printf("final class %s implements PluginReplacementWithExceptionNode.ReplacementWithExceptionFunction {\n", name);
214211
out.printf(" static PluginReplacementWithExceptionNode.ReplacementWithExceptionFunction FUNCTION = new %s();\n", name);
215-
InjectedDependencies deps = new InjectedDependencies(false, intrinsicMethod);
216212
createHelpers(processor, out, deps);
217213
out.printf("}\n");
218214
} else {
219-
super.createOtherClasses(processor, out);
215+
super.createOtherClasses(processor, out, deps);
220216
}
221217
}
222218
}
@@ -241,13 +237,15 @@ protected boolean needsReplacement(AbstractProcessor processor) {
241237
}
242238

243239
@Override
244-
protected void createHelpers(AbstractProcessor processor, PrintWriter out, InjectedDependencies deps) {
240+
protected void createHelpers(AbstractProcessor processor, PrintWriter out, InjectedDependencies originalDeps) {
245241
if (!needsReplacement(processor)) {
246242
return;
247243
}
244+
// In this context all values must be retrieved from the injection argument
245+
InjectedDependencies deps = new InjectedDependencies(false, intrinsicMethod);
248246
out.printf("\n");
249247
out.printf(" @Override\n");
250-
out.printf(" public boolean replace(GraphBuilderContext b, Replacements injection, Stamp stamp, NodeInputList<ValueNode> args) {\n");
248+
out.printf(" public boolean replace(GraphBuilderContext b, GeneratedPluginInjectionProvider injection, ValueNode[] args) {\n");
251249

252250
List<? extends VariableElement> params = getParameters();
253251

@@ -263,12 +261,12 @@ protected void createHelpers(AbstractProcessor processor, PrintWriter out, Injec
263261

264262
for (int i = 0; i < signature.length; i++, idx++) {
265263
if (processor.getAnnotation(intrinsicMethod.getParameters().get(i), processor.getType(NodeIntrinsicHandler.CONSTANT_NODE_PARAMETER_CLASS_NAME)) != null) {
266-
constantArgument(processor, out, deps, idx, signature[i], i, true);
264+
constantArgument(processor, out, deps, idx, signature[i], i, false);
267265
} else {
268266
if (signature[i].equals(processor.getType(NodeIntrinsicHandler.VALUE_NODE_CLASS_NAME))) {
269-
out.printf(" ValueNode arg%d = args.get(%d);\n", idx, i);
267+
out.printf(" ValueNode arg%d = args[%d];\n", idx, i);
270268
} else {
271-
out.printf(" %s arg%d = (%s) args.get(%d);\n", signature[i], idx, signature[i], i);
269+
out.printf(" %s arg%d = (%s) args[%d];\n", signature[i], idx, signature[i], i);
272270
}
273271
}
274272
}

compiler/src/jdk.graal.compiler.processor/src/jdk/graal/compiler/replacements/processor/GeneratedPlugin.java

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,7 @@ public void setPluginName(String pluginName) {
6666
this.pluginName = pluginName;
6767
}
6868

69-
protected String pluginSuperclass() {
70-
return "GeneratedInvocationPlugin";
71-
}
69+
protected abstract String pluginSuperclass();
7270

7371
public void generate(AbstractProcessor processor, PrintWriter out) {
7472
out.printf("// class: %s\n", intrinsicMethod.getEnclosingElement());
@@ -84,28 +82,22 @@ public void generate(AbstractProcessor processor, PrintWriter out) {
8482
InjectedDependencies deps = new InjectedDependencies(true, intrinsicMethod);
8583
createExecute(processor, out, deps);
8684
out.printf(" }\n");
87-
out.printf(" @Override\n");
88-
out.printf(" public Class<? extends Annotation> getSource() {\n");
89-
out.printf(" return %s.class;\n", getAnnotationClass(processor).getQualifiedName().toString().replace('$', '.'));
90-
out.printf(" }\n");
9185

9286
createPrivateMembersAndConstructor(processor, out, deps, pluginName);
9387

9488
out.printf("}\n");
9589

96-
createOtherClasses(processor, out);
97-
90+
createOtherClasses(processor, out, deps);
9891
}
9992

100-
protected void createOtherClasses(AbstractProcessor processor, PrintWriter out) {
93+
protected void createOtherClasses(AbstractProcessor processor, PrintWriter out, InjectedDependencies deps) {
10194
String name = getReplacementName();
10295
out.printf("// class: %s\n", intrinsicMethod.getEnclosingElement());
10396
out.printf("// method: %s\n", intrinsicMethod);
10497
out.printf("// generated-by: %s\n", getClass().getName());
10598
out.printf("@ExcludeFromJacocoGeneratedReport(\"deferred plugin support that is only called in libgraal\")\n");
10699
out.printf("final class %s implements PluginReplacementNode.ReplacementFunction {\n", name);
107100
out.printf(" static PluginReplacementNode.ReplacementFunction FUNCTION = new %s();\n", name);
108-
InjectedDependencies deps = new InjectedDependencies(false, intrinsicMethod);
109101
createHelpers(processor, out, deps);
110102
out.printf("}\n");
111103
}
@@ -187,13 +179,12 @@ static boolean hasUncheckedWarning(TypeMirror type) {
187179
}
188180
}
189181

190-
protected void createPrivateMembersAndConstructor(AbstractProcessor processor, PrintWriter out, InjectedDependencies deps, String constructorName) {
182+
protected void createPrivateMembersAndConstructor(@SuppressWarnings("unused") AbstractProcessor processor, PrintWriter out, InjectedDependencies deps, String constructorName) {
191183
if (!deps.isEmpty()) {
192184
out.printf("\n");
193185
for (InjectedDependencies.Dependency dep : deps) {
194186
out.printf(" private final %s %s;\n", dep.getType(), dep.getName(processor, intrinsicMethod));
195187
}
196-
197188
needInjectionProvider = true;
198189
}
199190

@@ -258,13 +249,8 @@ protected String constantArgument(AbstractProcessor processor,
258249
int argIdx,
259250
TypeMirror type,
260251
int nodeIdx,
261-
boolean isReplacement) {
262-
Function<Integer, String> argFormatter;
263-
if (isReplacement) {
264-
argFormatter = (i) -> String.format("args.get(%d)", i);
265-
} else {
266-
argFormatter = (i) -> String.format("args[%d]", i);
267-
}
252+
boolean checkShouldDefer) {
253+
Function<Integer, String> argFormatter = (i) -> String.format("args[%d]", i);
268254
if (hasRawtypeWarning(type)) {
269255
out.printf(" @SuppressWarnings({\"rawtypes\"})\n");
270256
}
@@ -314,7 +300,7 @@ protected String constantArgument(AbstractProcessor processor,
314300
}
315301
}
316302
out.printf(" } else {\n");
317-
if (!isReplacement) {
303+
if (checkShouldDefer) {
318304
out.printf(" if (b.shouldDeferPlugin(this)) {\n");
319305
out.printf(" b.replacePlugin%s(this, targetMethod, args, %s.FUNCTION);\n", getReplacementFunctionSuffix(processor), getReplacementName());
320306
out.printf(" return true;\n");

0 commit comments

Comments
 (0)