--- a/hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java Mon Dec 12 16:16:27 2016 +0300
+++ b/hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java Wed Mar 22 13:42:45 2017 -0700
@@ -22,13 +22,7 @@
*/
package org.graalvm.compiler.hotspot;
-import static org.graalvm.compiler.hotspot.stubs.StubUtil.newDescriptor;
-
import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
import org.graalvm.compiler.code.CompilationResult;
import org.graalvm.compiler.core.common.CompilationIdentifier;
import org.graalvm.compiler.core.common.cfg.AbstractBlockBase;
@@ -38,8 +32,6 @@
import org.graalvm.compiler.graph.Node.ConstantNodeParameter;
import org.graalvm.compiler.graph.Node.NodeIntrinsic;
import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
-import org.graalvm.compiler.hotspot.nodes.DeoptimizationFetchUnrollInfoCallNode;
-import org.graalvm.compiler.hotspot.nodes.UncommonTrapCallNode;
import org.graalvm.compiler.hotspot.nodes.VMErrorNode;
import org.graalvm.compiler.hotspot.nodes.aot.ResolveConstantStubCall;
import org.graalvm.compiler.hotspot.replacements.AESCryptSubstitutions;
@@ -48,7 +40,6 @@
import org.graalvm.compiler.hotspot.replacements.SHA2Substitutions;
import org.graalvm.compiler.hotspot.replacements.SHA5Substitutions;
import org.graalvm.compiler.hotspot.replacements.SHASubstitutions;
-import org.graalvm.compiler.hotspot.stubs.DeoptimizationStub;
import org.graalvm.compiler.hotspot.stubs.ExceptionHandlerStub;
import org.graalvm.compiler.hotspot.stubs.Stub;
import org.graalvm.compiler.hotspot.stubs.UnwindExceptionToCallerStub;
@@ -67,15 +58,19 @@
import org.graalvm.compiler.nodes.UnwindNode;
import org.graalvm.compiler.nodes.extended.ForeignCallNode;
import org.graalvm.compiler.options.Option;
+import org.graalvm.compiler.options.OptionKey;
import org.graalvm.compiler.options.OptionType;
-import org.graalvm.compiler.options.OptionValue;
+import org.graalvm.compiler.options.OptionValues;
import org.graalvm.compiler.phases.tiers.SuitesProvider;
import org.graalvm.compiler.word.Pointer;
import org.graalvm.compiler.word.Word;
+import org.graalvm.util.Equivalence;
+import org.graalvm.util.EconomicMap;
+import org.graalvm.util.EconomicSet;
+import org.graalvm.util.MapCursor;
import jdk.vm.ci.code.CompilationRequest;
import jdk.vm.ci.code.CompiledCode;
-import jdk.vm.ci.code.DebugInfo;
import jdk.vm.ci.code.Register;
import jdk.vm.ci.code.RegisterSaveLayout;
import jdk.vm.ci.code.StackSlot;
@@ -94,13 +89,11 @@
public static class Options {
// @formatter:off
- @Option(help = "Use Graal stubs instead of HotSpot stubs where possible")
- public static final OptionValue<Boolean> PreferGraalStubs = new OptionValue<>(false);
@Option(help = "Use Graal arithmetic stubs instead of HotSpot stubs where possible")
- public static final OptionValue<Boolean> GraalArithmeticStubs = new OptionValue<>(true);
+ public static final OptionKey<Boolean> GraalArithmeticStubs = new OptionKey<>(true);
@Option(help = "Enables instruction profiling on assembler level. Valid values are a comma separated list of supported instructions." +
" Compare with subclasses of Assembler.InstructionCounter.", type = OptionType.Debug)
- public static final OptionValue<String> ASMInstructionProfiling = new OptionValue<>(null);
+ public static final OptionKey<String> ASMInstructionProfiling = new OptionKey<>(null);
// @formatter:on
}
@@ -135,16 +128,6 @@
private final HotSpotGraalRuntimeProvider runtime;
/**
- * @see DeoptimizationFetchUnrollInfoCallNode
- */
- public static final ForeignCallDescriptor FETCH_UNROLL_INFO = new ForeignCallDescriptor("fetchUnrollInfo", Word.class, long.class, int.class);
-
- /**
- * @see DeoptimizationStub#unpackFrames(ForeignCallDescriptor, Word, int)
- */
- public static final ForeignCallDescriptor UNPACK_FRAMES = newDescriptor(DeoptimizationStub.class, "unpackFrames", int.class, Word.class, int.class);
-
- /**
* @see AESCryptSubstitutions#encryptBlockStub(ForeignCallDescriptor, Word, Word, Pointer)
*/
public static final ForeignCallDescriptor ENCRYPT_BLOCK = new ForeignCallDescriptor("encrypt_block", void.class, Word.class, Word.class, Pointer.class);
@@ -320,11 +303,6 @@
public static final ForeignCallDescriptor INVOCATION_EVENT = new ForeignCallDescriptor("invocation_event", void.class, MethodCountersPointer.class);
public static final ForeignCallDescriptor BACKEDGE_EVENT = new ForeignCallDescriptor("backedge_event", void.class, MethodCountersPointer.class, int.class, int.class);
- /**
- * @see UncommonTrapCallNode
- */
- public static final ForeignCallDescriptor UNCOMMON_TRAP = new ForeignCallDescriptor("uncommonTrap", Word.class, Word.class, int.class, int.class);
-
public HotSpotBackend(HotSpotGraalRuntimeProvider runtime, HotSpotProviders providers) {
super(providers);
this.runtime = runtime;
@@ -339,8 +317,9 @@
* runtime} object was initialized and this backend was registered with it.
*
* @param jvmciRuntime
+ * @param options
*/
- public void completeInitialization(HotSpotJVMCIRuntime jvmciRuntime) {
+ public void completeInitialization(HotSpotJVMCIRuntime jvmciRuntime, OptionValues options) {
}
/**
@@ -349,8 +328,8 @@
* @param lir the LIR to examine
* @return the registers that are defined by or used as temps for any instruction in {@code lir}
*/
- protected final Set<Register> gatherDestroyedCallerRegisters(LIR lir) {
- final Set<Register> destroyedRegisters = new HashSet<>();
+ protected final EconomicSet<Register> gatherDestroyedCallerRegisters(LIR lir) {
+ final EconomicSet<Register> destroyedRegisters = EconomicSet.create(Equivalence.IDENTITY);
ValueConsumer defConsumer = new ValueConsumer() {
@Override
@@ -382,7 +361,7 @@
* <p>
* Any entry in {@code calleeSaveInfo} that {@linkplain SaveRegistersOp#supportsRemove()
* supports} pruning will have {@code destroyedRegisters}
- * {@linkplain SaveRegistersOp#remove(Set) removed} as these registers are declared as
+ * {@linkplain SaveRegistersOp#remove(EconomicSet) removed} as these registers are declared as
* temporaries in the stub's {@linkplain ForeignCallLinkage linkage} (and thus will be saved by
* the stub's caller).
*
@@ -393,17 +372,17 @@
* @param frameMap used to {@linkplain FrameMap#offsetForStackSlot(StackSlot) convert} a virtual
* slot to a frame slot index
*/
- protected void updateStub(Stub stub, Set<Register> destroyedRegisters, Map<LIRFrameState, SaveRegistersOp> calleeSaveInfo, FrameMap frameMap) {
+ protected void updateStub(Stub stub, EconomicSet<Register> destroyedRegisters, EconomicMap<LIRFrameState, SaveRegistersOp> calleeSaveInfo, FrameMap frameMap) {
stub.initDestroyedCallerRegisters(destroyedRegisters);
- for (Map.Entry<LIRFrameState, SaveRegistersOp> e : calleeSaveInfo.entrySet()) {
- SaveRegistersOp save = e.getValue();
+ MapCursor<LIRFrameState, SaveRegistersOp> cursor = calleeSaveInfo.getEntries();
+ while (cursor.advance()) {
+ SaveRegistersOp save = cursor.getValue();
if (save.supportsRemove()) {
save.remove(destroyedRegisters);
}
- DebugInfo info = e.getKey() == null ? null : e.getKey().debugInfo();
- if (info != null) {
- info.setCalleeSaveInfo(save.getMap(frameMap));
+ if (cursor.getKey() != LIRFrameState.NO_STATE) {
+ cursor.getKey().debugInfo().setCalleeSaveInfo(save.getMap(frameMap));
}
}
}
@@ -419,7 +398,7 @@
}
protected void profileInstructions(LIR lir, CompilationResultBuilder crb) {
- if (HotSpotBackend.Options.ASMInstructionProfiling.getValue() != null) {
+ if (HotSpotBackend.Options.ASMInstructionProfiling.getValue(lir.getOptions()) != null) {
HotSpotInstructionProfiling.countInstructions(lir, crb.asm);
}
}