Skip to content

Commit 6df2123

Browse files
committed
[GR-64670] Treat special register writes as memory kills
PullRequest: graal/20656
2 parents 4a50a6a + 43d84e1 commit 6df2123

File tree

2 files changed

+38
-12
lines changed

2 files changed

+38
-12
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/nodes/WriteCurrentVMThreadNode.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,27 @@
2424
*/
2525
package com.oracle.svm.core.graal.nodes;
2626

27+
import org.graalvm.nativeimage.IsolateThread;
28+
import org.graalvm.word.LocationIdentity;
29+
30+
import com.oracle.svm.core.FrameAccess;
31+
import com.oracle.svm.core.ReservedRegisters;
32+
2733
import jdk.graal.compiler.core.common.type.StampFactory;
2834
import jdk.graal.compiler.graph.NodeClass;
2935
import jdk.graal.compiler.lir.gen.LIRGeneratorTool;
36+
import jdk.graal.compiler.nodeinfo.InputType;
3037
import jdk.graal.compiler.nodeinfo.NodeCycles;
3138
import jdk.graal.compiler.nodeinfo.NodeInfo;
3239
import jdk.graal.compiler.nodeinfo.NodeSize;
3340
import jdk.graal.compiler.nodes.FixedWithNextNode;
3441
import jdk.graal.compiler.nodes.ValueNode;
42+
import jdk.graal.compiler.nodes.memory.SingleMemoryKill;
3543
import jdk.graal.compiler.nodes.spi.LIRLowerable;
3644
import jdk.graal.compiler.nodes.spi.NodeLIRBuilderTool;
37-
import org.graalvm.nativeimage.IsolateThread;
3845

39-
import com.oracle.svm.core.FrameAccess;
40-
import com.oracle.svm.core.ReservedRegisters;
41-
42-
@NodeInfo(cycles = NodeCycles.CYCLES_1, size = NodeSize.SIZE_1)
43-
public class WriteCurrentVMThreadNode extends FixedWithNextNode implements LIRLowerable {
46+
@NodeInfo(cycles = NodeCycles.CYCLES_1, size = NodeSize.SIZE_1, allowedUsageTypes = InputType.Memory)
47+
public class WriteCurrentVMThreadNode extends FixedWithNextNode implements LIRLowerable, SingleMemoryKill {
4448
public static final NodeClass<WriteCurrentVMThreadNode> TYPE = NodeClass.create(WriteCurrentVMThreadNode.class);
4549

4650
@Input protected ValueNode value;
@@ -58,4 +62,13 @@ public void generate(NodeLIRBuilderTool gen) {
5862

5963
@NodeIntrinsic
6064
public static native void writeCurrentVMThread(IsolateThread value);
65+
66+
/**
67+
* Kill memory to keep memory accesses that use this register as a base from floating across
68+
* changes of this register.
69+
*/
70+
@Override
71+
public LocationIdentity getKilledLocationIdentity() {
72+
return LocationIdentity.any();
73+
}
6174
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/nodes/WriteHeapBaseNode.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,27 @@
2424
*/
2525
package com.oracle.svm.core.graal.nodes;
2626

27+
import org.graalvm.word.LocationIdentity;
28+
import org.graalvm.word.PointerBase;
29+
30+
import com.oracle.svm.core.FrameAccess;
31+
import com.oracle.svm.core.ReservedRegisters;
32+
2733
import jdk.graal.compiler.core.common.type.StampFactory;
2834
import jdk.graal.compiler.graph.NodeClass;
2935
import jdk.graal.compiler.lir.gen.LIRGeneratorTool;
36+
import jdk.graal.compiler.nodeinfo.InputType;
3037
import jdk.graal.compiler.nodeinfo.NodeCycles;
3138
import jdk.graal.compiler.nodeinfo.NodeInfo;
3239
import jdk.graal.compiler.nodeinfo.NodeSize;
3340
import jdk.graal.compiler.nodes.FixedWithNextNode;
3441
import jdk.graal.compiler.nodes.ValueNode;
42+
import jdk.graal.compiler.nodes.memory.SingleMemoryKill;
3543
import jdk.graal.compiler.nodes.spi.LIRLowerable;
3644
import jdk.graal.compiler.nodes.spi.NodeLIRBuilderTool;
37-
import org.graalvm.word.PointerBase;
3845

39-
import com.oracle.svm.core.FrameAccess;
40-
import com.oracle.svm.core.ReservedRegisters;
41-
42-
@NodeInfo(cycles = NodeCycles.CYCLES_1, size = NodeSize.SIZE_1)
43-
public class WriteHeapBaseNode extends FixedWithNextNode implements LIRLowerable {
46+
@NodeInfo(cycles = NodeCycles.CYCLES_1, size = NodeSize.SIZE_1, allowedUsageTypes = InputType.Memory)
47+
public class WriteHeapBaseNode extends FixedWithNextNode implements LIRLowerable, SingleMemoryKill {
4448
public static final NodeClass<WriteHeapBaseNode> TYPE = NodeClass.create(WriteHeapBaseNode.class);
4549

4650
@Input protected ValueNode value;
@@ -58,4 +62,13 @@ public void generate(NodeLIRBuilderTool gen) {
5862

5963
@NodeIntrinsic
6064
public static native void writeCurrentVMHeapBase(PointerBase value);
65+
66+
/**
67+
* Kill memory to keep memory accesses that use this register as a base from floating across
68+
* changes of this register.
69+
*/
70+
@Override
71+
public LocationIdentity getKilledLocationIdentity() {
72+
return LocationIdentity.any();
73+
}
6174
}

0 commit comments

Comments
 (0)