Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
gluon-bot committed Oct 9, 2023
2 parents 78668d9 + e23b390 commit 76f24e3
Show file tree
Hide file tree
Showing 13 changed files with 115 additions and 175 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -742,38 +742,53 @@ public static ValueNode arrayLength(ValueNode value, FindLengthMode mode, Consta
return arrayLength(value, mode, constantReflection, null);
}

/**
* Filters out non-constant results when requested.
*/
private static ValueNode filterArrayLengthResult(ValueNode result, boolean allowOnlyConstantResult) {
return result == null || !allowOnlyConstantResult || result.isConstant() ? result : null;
}

private static ValueNode arrayLength(ValueNode value, FindLengthMode mode, ConstantReflectionProvider constantReflection, EconomicMap<ValueNode, ValueNode> visitedPhiInputs) {
Objects.requireNonNull(mode);

EconomicMap<ValueNode, ValueNode> visitedPhiInputMap = visitedPhiInputs;
ValueNode current = value;
StructuredGraph graph = value.graph();
boolean allowOnlyConstantResult = false;
do {
CompilationAlarm.checkProgress(graph);
/*
* PiArrayNode implements ArrayLengthProvider and ValueProxy. We want to treat it as an
* ArrayLengthProvider, therefore we check this case first.
*/
if (current instanceof ArrayLengthProvider) {
return ((ArrayLengthProvider) current).findLength(mode, constantReflection);
if (current instanceof ArrayLengthProvider provider) {
return filterArrayLengthResult(provider.findLength(mode, constantReflection), allowOnlyConstantResult);

} else if (current instanceof ValuePhiNode) {
} else if (current instanceof ValuePhiNode phi) {
if (visitedPhiInputMap == null) {
visitedPhiInputMap = EconomicMap.create();
}
return phiArrayLength((ValuePhiNode) current, mode, constantReflection, visitedPhiInputMap);
return filterArrayLengthResult(phiArrayLength(phi, mode, constantReflection, visitedPhiInputMap), allowOnlyConstantResult);

} else if (current instanceof ValueProxyNode) {
ValueProxyNode proxy = (ValueProxyNode) current;
} else if (current instanceof ValueProxyNode proxy) {
ValueNode length = arrayLength(proxy.getOriginalNode(), mode, constantReflection);
if (mode == ArrayLengthProvider.FindLengthMode.CANONICALIZE_READ && length != null && !length.isConstant()) {
length = new ValueProxyNode(length, proxy.proxyPoint());
}
return length;
return filterArrayLengthResult(length, allowOnlyConstantResult);

} else if (current instanceof ValueProxy) {
/* Written as a loop instead of a recursive call to reduce recursion depth. */
current = ((ValueProxy) current).getOriginalNode();
} else if (current instanceof LimitedValueProxy valueProxy) {
/*
* Note is it usually recommended to check for ValueProxy, not LimitedValueProxy.
* However, in this case we are intentionally unproxifying all LimitedValueProxies,
* as we want constant lengths to be found across DeoptProxyNodes. When the result
* is not a ValueProxy we limit the returned result to constant values.
*/
if (!(valueProxy instanceof ValueProxy)) {
allowOnlyConstantResult = true;
}
current = valueProxy.getOriginalNode();
} else {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -511,9 +511,22 @@ protected CallingSequence makeCallingSequence(MethodType type, FunctionDescripto
@Override
protected List<Adapter.Adaptation> generateAdaptations(NativeEntryPointInfo nep) {
var adaptations = super.generateAdaptations(nep);
/* Drop the rax parametersAssignment */
assert adaptations.get(adaptations.size() - 1) == null;
adaptations.set(adaptations.size() - 1, Adapter.drop());
var assignments = nep.parametersAssignment();

if (assignments.length > 0) {
final int last = assignments.length - 1;
if (assignments[last].equals(X86_64Architecture.Regs.rax)) {
/*
* This branch is only taken when the function is variadic, that is when rax is
* passed as an additional pseudo-parameter, where it will contain the number of
* XMM registers passed as arguments. However, we need to remove the rax
* assignment since rax will already be assigned separately in
* SubstrateAMD64RegisterConfig.getCallingConvention and later used in
* SubstrateAMD64NodeLIRBuilder.visitInvokeArguments.
*/
adaptations.set(last, Adapter.drop());
}
}
return adaptations;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,6 @@
import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.HINT;
import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG;

import com.oracle.svm.core.FrameAccess;
import org.graalvm.compiler.asm.amd64.AMD64Address;
import org.graalvm.compiler.asm.amd64.AMD64MacroAssembler;
import org.graalvm.compiler.lir.LIRInstructionClass;
import org.graalvm.compiler.lir.StandardOp;
Expand All @@ -40,7 +38,6 @@

import jdk.vm.ci.code.Register;
import jdk.vm.ci.meta.AllocatableValue;
import org.graalvm.nativeimage.Platform;

public final class AMD64LoadMethodPointerConstantOp extends AMD64LIRInstruction implements StandardOp.LoadConstantOp {
public static final LIRInstructionClass<AMD64LoadMethodPointerConstantOp> TYPE = LIRInstructionClass.create(AMD64LoadMethodPointerConstantOp.class);
Expand All @@ -56,13 +53,8 @@ public final class AMD64LoadMethodPointerConstantOp extends AMD64LIRInstruction
@Override
public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) {
Register resultReg = asRegister(result);
if (!Platform.includedIn(Platform.DARWIN_AMD64.class)) {
crb.recordInlineDataInCode(constant);
masm.movq(resultReg, 0L, true);
} else {
/* [GR-43389] ld64 bug does not allow direct8 relocations in .text on darwin */
masm.movq(resultReg, (AMD64Address) crb.recordDataReferenceInCode(constant, FrameAccess.wordSize()));
}
crb.recordInlineDataInCode(constant);
masm.leaq(resultReg, masm.getPlaceholder(masm.position()));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@

import java.nio.ByteBuffer;

import com.oracle.svm.core.meta.SubstrateMethodPointerConstant;
import org.graalvm.compiler.code.DataSection.Data;
import org.graalvm.compiler.code.DataSection.Patches;
import org.graalvm.compiler.core.common.type.CompressibleConstant;
Expand All @@ -51,11 +50,8 @@ public class SubstrateDataBuilder extends DataBuilder {
@Override
public Data createDataItem(Constant constant) {
int size;
if (constant instanceof SubstrateMethodPointerConstant methodPointerConstant) {
size = FrameAccess.wordSize();
return new ObjectData(size, size, methodPointerConstant);
} else if (constant instanceof VMConstant vmConstant) {
assert constant instanceof CompressibleConstant && constant instanceof TypedConstant : constant;
if (constant instanceof VMConstant vmConstant) {
assert constant instanceof JavaConstant && constant instanceof CompressibleConstant && constant instanceof TypedConstant : constant;
return new ObjectData(vmConstant);
} else if (JavaConstant.isNull(constant)) {
if (SubstrateObjectConstant.isCompressed((JavaConstant) constant)) {
Expand All @@ -64,8 +60,9 @@ public Data createDataItem(Constant constant) {
size = FrameAccess.uncompressedReferenceSize();
}
return createZeroData(size, size);
} else if (constant instanceof SerializableConstant serializableConstant) {
return createSerializableData(serializableConstant);
} else if (constant instanceof SerializableConstant) {
SerializableConstant s = (SerializableConstant) constant;
return createSerializableData(s);
} else {
throw new JVMCIError(String.valueOf(constant));
}
Expand All @@ -74,19 +71,15 @@ public Data createDataItem(Constant constant) {
public static class ObjectData extends Data {
private final VMConstant constant;

protected ObjectData(int alignment, int size, VMConstant constant) {
super(alignment, size);
this.constant = constant;
}

protected ObjectData(VMConstant constant) {
this(ConfigurationValues.getObjectLayout().getReferenceSize(), ConfigurationValues.getObjectLayout().getReferenceSize(), constant);
super(ConfigurationValues.getObjectLayout().getReferenceSize(), ConfigurationValues.getObjectLayout().getReferenceSize());
assert ((CompressibleConstant) constant).isCompressed() == ReferenceAccess.singleton()
.haveCompressedReferences() : "Constant object references in compiled code must be compressed (base-relative)";
this.constant = constant;
}

public VMConstant getConstant() {
return constant;
public JavaConstant getConstant() {
return (JavaConstant) constant;
}

@Override
Expand All @@ -99,7 +92,7 @@ public static void emit(ByteBuffer buffer, Patches patches, int size, VMConstant
if (size == Integer.BYTES) {
buffer.putInt(0);
} else if (size == Long.BYTES) {
buffer.putLong(0);
buffer.putLong(0L);
} else {
shouldNotReachHere("Unsupported object constant reference size: " + size);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,12 @@

import org.graalvm.compiler.api.replacements.Snippet;
import org.graalvm.compiler.api.replacements.Snippet.ConstantParameter;
import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
import org.graalvm.compiler.graph.Node;
import org.graalvm.compiler.nodes.FixedNode;
import org.graalvm.compiler.nodes.FixedWithNextNode;
import org.graalvm.compiler.nodes.Invoke;
import org.graalvm.compiler.nodes.InvokeNode;
import org.graalvm.compiler.nodes.InvokeWithExceptionNode;
import org.graalvm.compiler.nodes.ValueNode;
import org.graalvm.compiler.nodes.extended.ForeignCallNode;
import org.graalvm.compiler.nodes.extended.MembarNode;
import org.graalvm.compiler.nodes.spi.LoweringTool;
import org.graalvm.compiler.options.OptionValues;
Expand All @@ -50,7 +47,6 @@
import org.graalvm.compiler.replacements.Snippets;
import org.graalvm.nativeimage.Platforms;
import org.graalvm.nativeimage.c.struct.SizeOf;
import org.graalvm.nativeimage.c.type.CIntPointer;
import org.graalvm.nativeimage.impl.InternalPlatform;
import org.graalvm.word.LocationIdentity;

Expand All @@ -62,7 +58,6 @@
import com.oracle.svm.core.graal.nodes.VerificationMarkerNode;
import com.oracle.svm.core.graal.stackvalue.LoweredStackValueNode;
import com.oracle.svm.core.graal.stackvalue.StackValueNode.StackSlotIdentity;
import com.oracle.svm.core.nodes.CFunctionCaptureNode;
import com.oracle.svm.core.nodes.CFunctionEpilogueNode;
import com.oracle.svm.core.nodes.CFunctionPrologueDataNode;
import com.oracle.svm.core.nodes.CFunctionPrologueNode;
Expand Down Expand Up @@ -98,7 +93,6 @@
public final class CFunctionSnippets extends SubstrateTemplates implements Snippets {

private final SnippetInfo prologue;
private final SnippetInfo capture;
private final SnippetInfo epilogue;

/**
Expand All @@ -123,14 +117,6 @@ private static CPrologueData prologueSnippet(@ConstantParameter int newThreadSta
return CFunctionPrologueDataNode.cFunctionPrologueData(anchor, newThreadStatus);
}

@Node.NodeIntrinsic(value = ForeignCallNode.class)
public static native void callCaptureFunction(@Node.ConstantNodeParameter ForeignCallDescriptor descriptor, int states, CIntPointer captureBuffer);

@Snippet
private static void captureSnippet(@ConstantParameter ForeignCallDescriptor captureFunction, int statesToCapture, CIntPointer captureBuffer) {
callCaptureFunction(captureFunction, statesToCapture, captureBuffer);
}

@Snippet
private static void epilogueSnippet(@ConstantParameter int oldThreadStatus) {
if (SubstrateOptions.MultiThreaded.getValue()) {
Expand All @@ -157,11 +143,9 @@ private static void epilogueSnippet(@ConstantParameter int oldThreadStatus) {
super(options, providers);

this.prologue = snippet(providers, CFunctionSnippets.class, "prologueSnippet");
this.capture = snippet(providers, CFunctionSnippets.class, "captureSnippet");
this.epilogue = snippet(providers, CFunctionSnippets.class, "epilogueSnippet");

lowerings.put(CFunctionPrologueNode.class, new CFunctionPrologueLowering());
lowerings.put(CFunctionCaptureNode.class, new CFunctionCaptureLowering());
lowerings.put(CFunctionEpilogueNode.class, new CFunctionEpilogueLowering());
}

Expand Down Expand Up @@ -193,27 +177,6 @@ public void lower(CFunctionPrologueNode node, LoweringTool tool) {
}
}

class CFunctionCaptureLowering implements NodeLoweringProvider<CFunctionCaptureNode> {
@Override
public void lower(CFunctionCaptureNode node, LoweringTool tool) {
if (tool.getLoweringStage() != LoweringTool.StandardLoweringStage.LOW_TIER) {
return;
}

ValueNode statesToCapture = node.getStatesToCapture();
ForeignCallDescriptor captureFunction = node.getCaptureFunction();
ValueNode buffer = node.getCaptureBuffer();
Arguments args = new Arguments(capture, node.graph().getGuardsStage(), tool.getLoweringStage());
args.addConst("captureFunction", captureFunction);
args.add("statesToCapture", statesToCapture);
args.add("captureBuffer", buffer);

SnippetTemplate template = template(tool, node, args);
template.setMayRemoveLocation(true);
template.instantiate(tool.getMetaAccess(), node, SnippetTemplate.DEFAULT_REPLACER, args);
}
}

class CFunctionEpilogueLowering implements NodeLoweringProvider<CFunctionEpilogueNode> {
@Override
public void lower(CFunctionEpilogueNode node, LoweringTool tool) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,10 @@
import org.graalvm.compiler.nodeinfo.NodeInfo;
import org.graalvm.compiler.nodes.FixedWithNextNode;
import org.graalvm.compiler.nodes.ValueNode;
import org.graalvm.compiler.nodes.extended.ForeignCallNode;
import org.graalvm.compiler.nodes.memory.SingleMemoryKill;
import org.graalvm.compiler.nodes.spi.Lowerable;
import org.graalvm.compiler.nodes.spi.LoweringTool;
import org.graalvm.word.LocationIdentity;

/**
Expand Down Expand Up @@ -76,15 +78,13 @@ public LocationIdentity getKilledLocationIdentity() {
return LocationIdentity.any();
}

public ForeignCallDescriptor getCaptureFunction() {
return captureFunction;
}

public ValueNode getStatesToCapture() {
return statesToCapture;
}
@Override
public void lower(LoweringTool tool) {
if (tool.getLoweringStage() != LoweringTool.StandardLoweringStage.LOW_TIER) {
return;
}

public ValueNode getCaptureBuffer() {
return captureBuffer;
final ForeignCallNode call = graph().add(new ForeignCallNode(captureFunction, statesToCapture, captureBuffer));
graph().replaceFixedWithFixed(this, call);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ForkJoinPool;

import com.oracle.svm.core.graal.code.SubstrateDataBuilder;
import org.graalvm.collections.EconomicMap;
import org.graalvm.compiler.api.replacements.Fold;
import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
Expand Down Expand Up @@ -123,6 +122,7 @@
import com.oracle.svm.core.graal.phases.OptimizeExceptionPathsPhase;
import com.oracle.svm.core.heap.RestrictHeapAccess;
import com.oracle.svm.core.heap.RestrictHeapAccessCallees;
import com.oracle.svm.core.meta.MethodPointer;
import com.oracle.svm.core.meta.SubstrateMethodPointerConstant;
import com.oracle.svm.core.util.InterruptImageBuilding;
import com.oracle.svm.core.util.VMError;
Expand Down Expand Up @@ -151,7 +151,6 @@
import jdk.vm.ci.meta.MetaAccessProvider;
import jdk.vm.ci.meta.ResolvedJavaMethod;
import jdk.vm.ci.meta.VMConstant;
import org.graalvm.nativeimage.Platform;

public class CompileQueue {

Expand Down Expand Up @@ -1369,29 +1368,15 @@ protected void removeDeoptTargetOptimizations(LIRSuites lirSuites) {
DeoptimizationUtils.removeDeoptTargetOptimizations(lirSuites);
}

private void ensureCompiledForMethodPointerConstant(HostedMethod method, CompileReason reason, SubstrateMethodPointerConstant methodPointerConstant) {
HostedMethod referencedMethod = (HostedMethod) methodPointerConstant.pointer().getMethod();
ensureCompiled(referencedMethod, new MethodPointerConstantReason(method, referencedMethod, reason));
}

protected final void ensureCompiledForMethodPointerConstants(HostedMethod method, CompileReason reason, CompilationResult result) {
for (DataPatch dataPatch : result.getDataPatches()) {
Reference reference = dataPatch.reference;
if (reference instanceof ConstantReference constantReference) {
VMConstant vmConstant = constantReference.getConstant();
if (vmConstant instanceof SubstrateMethodPointerConstant methodPointerConstant) {
ensureCompiledForMethodPointerConstant(method, reason, methodPointerConstant);
}
}
}

for (DataSection.Data data : result.getDataSection()) {
if (data instanceof SubstrateDataBuilder.ObjectData objectData) {
VMConstant vmConstant = objectData.getConstant();
if (vmConstant instanceof SubstrateMethodPointerConstant methodPointerConstant) {
/* [GR-43389] Only reachable with ld64 workaround on */
VMError.guarantee(Platform.includedIn(Platform.DARWIN_AMD64.class));
ensureCompiledForMethodPointerConstant(method, reason, methodPointerConstant);
if (reference instanceof ConstantReference) {
VMConstant constant = ((ConstantReference) reference).getConstant();
if (constant instanceof SubstrateMethodPointerConstant) {
MethodPointer pointer = ((SubstrateMethodPointerConstant) constant).pointer();
HostedMethod referencedMethod = (HostedMethod) pointer.getMethod();
ensureCompiled(referencedMethod, new MethodPointerConstantReason(method, referencedMethod, reason));
}
}
}
Expand Down
Loading

0 comments on commit 76f24e3

Please sign in to comment.