|
27 | 27 | import com.oracle.svm.core.ReservedRegisters; |
28 | 28 | import com.oracle.svm.core.graal.nodes.ReadReservedRegisterFixedNode; |
29 | 29 | import com.oracle.svm.core.graal.nodes.ReadReservedRegisterFloatingNode; |
30 | | -import com.oracle.svm.hosted.code.SubstrateCompilationDirectives; |
31 | 30 |
|
32 | 31 | import jdk.graal.compiler.nodes.StructuredGraph; |
33 | 32 | import jdk.graal.compiler.nodes.ValueNode; |
|
36 | 35 | public class ReadReservedRegister { |
37 | 36 |
|
38 | 37 | public static ValueNode createReadStackPointerNode(StructuredGraph graph) { |
39 | | - return createReadNode(graph, ReservedRegisters.singleton().getFrameRegister()); |
| 38 | + var rr = ReservedRegisters.singleton(); |
| 39 | + return createReadNode(rr.mustUseFixedRead(graph), rr.getFrameRegister()); |
40 | 40 | } |
41 | 41 |
|
42 | 42 | public static ValueNode createReadIsolateThreadNode(StructuredGraph graph) { |
43 | | - return createReadNode(graph, ReservedRegisters.singleton().getThreadRegister()); |
| 43 | + var rr = ReservedRegisters.singleton(); |
| 44 | + return createReadNode(rr.mustUseFixedRead(graph), rr.getThreadRegister()); |
44 | 45 | } |
45 | 46 |
|
46 | 47 | public static ValueNode createReadHeapBaseNode(StructuredGraph graph) { |
47 | | - return createReadNode(graph, ReservedRegisters.singleton().getHeapBaseRegister()); |
| 48 | + var rr = ReservedRegisters.singleton(); |
| 49 | + return createReadNode(rr.mustUseFixedRead(graph), rr.getHeapBaseRegister()); |
48 | 50 | } |
49 | 51 |
|
50 | 52 | public static ValueNode createReadCodeBaseNode(StructuredGraph graph) { |
51 | | - return createReadNode(graph, ReservedRegisters.singleton().getCodeBaseRegister()); |
| 53 | + var rr = ReservedRegisters.singleton(); |
| 54 | + return createReadNode(rr.mustUseFixedRead(graph), rr.getCodeBaseRegister()); |
52 | 55 | } |
53 | 56 |
|
54 | | - private static ValueNode createReadNode(StructuredGraph graph, Register register) { |
55 | | - /* |
56 | | - * A floating node to access the register is more efficient: it allows value numbering of |
57 | | - * multiple accesses, including floating nodes that use it as an input. But for |
58 | | - * deoptimization target methods, we must not do value numbering because there is no |
59 | | - * proxying at deoptimization entry points for this node, so the value is not restored |
60 | | - * during deoptimization. |
61 | | - */ |
62 | | - if (SubstrateCompilationDirectives.isDeoptTarget(graph.method())) { |
| 57 | + private static ValueNode createReadNode(boolean useFixedRead, Register register) { |
| 58 | + if (useFixedRead) { |
63 | 59 | return new ReadReservedRegisterFixedNode(register); |
64 | 60 | } else { |
65 | 61 | return new ReadReservedRegisterFloatingNode(register); |
|
0 commit comments