22 */ |
22 */ |
23 |
23 |
24 |
24 |
25 package org.graalvm.compiler.core.aarch64; |
25 package org.graalvm.compiler.core.aarch64; |
26 |
26 |
|
27 import java.util.List; |
27 import java.util.ListIterator; |
28 import java.util.ListIterator; |
28 |
29 |
|
30 import org.graalvm.compiler.debug.GraalError; |
29 import org.graalvm.compiler.java.DefaultSuitesCreator; |
31 import org.graalvm.compiler.java.DefaultSuitesCreator; |
30 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins; |
32 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins; |
31 import org.graalvm.compiler.options.OptionValues; |
33 import org.graalvm.compiler.options.OptionValues; |
32 import org.graalvm.compiler.phases.BasePhase; |
34 import org.graalvm.compiler.phases.BasePhase; |
33 import org.graalvm.compiler.phases.Phase; |
35 import org.graalvm.compiler.phases.Phase; |
35 import org.graalvm.compiler.phases.tiers.CompilerConfiguration; |
37 import org.graalvm.compiler.phases.tiers.CompilerConfiguration; |
36 import org.graalvm.compiler.phases.tiers.LowTierContext; |
38 import org.graalvm.compiler.phases.tiers.LowTierContext; |
37 import org.graalvm.compiler.phases.tiers.Suites; |
39 import org.graalvm.compiler.phases.tiers.Suites; |
38 |
40 |
39 public class AArch64SuitesCreator extends DefaultSuitesCreator { |
41 public class AArch64SuitesCreator extends DefaultSuitesCreator { |
40 private final Class<? extends Phase> insertReadReplacementBefore; |
42 private final List<Class<? extends Phase>> insertReadReplacementBeforePositions; |
41 |
43 |
42 public AArch64SuitesCreator(CompilerConfiguration compilerConfiguration, Plugins plugins, Class<? extends Phase> insertReadReplacementBefore) { |
44 public AArch64SuitesCreator(CompilerConfiguration compilerConfiguration, Plugins plugins, List<Class<? extends Phase>> insertReadReplacementBeforePositions) { |
43 super(compilerConfiguration, plugins); |
45 super(compilerConfiguration, plugins); |
44 this.insertReadReplacementBefore = insertReadReplacementBefore; |
46 this.insertReadReplacementBeforePositions = insertReadReplacementBeforePositions; |
45 } |
47 } |
46 |
48 |
47 @Override |
49 @Override |
48 public Suites createSuites(OptionValues options) { |
50 public Suites createSuites(OptionValues options) { |
49 Suites suites = super.createSuites(options); |
51 Suites suites = super.createSuites(options); |
50 |
52 ListIterator<BasePhase<? super LowTierContext>> findPhase = null; |
51 ListIterator<BasePhase<? super LowTierContext>> findPhase = suites.getLowTier().findPhase(insertReadReplacementBefore); |
53 for (Class<? extends Phase> phase : insertReadReplacementBeforePositions) { |
52 // Put AArch64ReadReplacementPhase right before the SchedulePhase |
54 findPhase = suites.getLowTier().findPhase(phase); |
53 while (PhaseSuite.findNextPhase(findPhase, insertReadReplacementBefore)) { |
55 if (findPhase != null) { |
54 // Search for last occurrence of SchedulePhase |
56 // Put AArch64ReadReplacementPhase right before the requested phase |
|
57 while (PhaseSuite.findNextPhase(findPhase, phase)) { |
|
58 // Search for last occurrence of SchedulePhase |
|
59 } |
|
60 findPhase.previous(); |
|
61 break; |
|
62 } |
55 } |
63 } |
56 findPhase.previous(); |
64 if (findPhase != null) { |
57 findPhase.add(new AArch64ReadReplacementPhase()); |
65 findPhase.add(new AArch64ReadReplacementPhase()); |
|
66 } else { |
|
67 throw GraalError.shouldNotReachHere("Cannot find phase to insert AArch64ReadReplacementPhase"); |
|
68 } |
58 return suites; |
69 return suites; |
59 } |
70 } |
60 } |
71 } |