94 import org.graalvm.compiler.nodes.StructuredGraph.Builder;
95 import org.graalvm.compiler.nodes.StructuredGraph.ScheduleResult;
96 import org.graalvm.compiler.nodes.ValueNode;
97 import org.graalvm.compiler.nodes.cfg.Block;
98 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration;
99 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins;
100 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
101 import org.graalvm.compiler.nodes.graphbuilderconf.InlineInvokePlugin;
102 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin;
103 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins;
104 import org.graalvm.compiler.nodes.java.AccessFieldNode;
105 import org.graalvm.compiler.nodes.spi.LoweringProvider;
106 import org.graalvm.compiler.nodes.spi.Replacements;
107 import org.graalvm.compiler.nodes.virtual.VirtualObjectNode;
108 import org.graalvm.compiler.options.OptionValues;
109 import org.graalvm.compiler.phases.BasePhase;
110 import org.graalvm.compiler.phases.OptimisticOptimizations;
111 import org.graalvm.compiler.phases.Phase;
112 import org.graalvm.compiler.phases.PhaseSuite;
113 import org.graalvm.compiler.phases.common.CanonicalizerPhase;
114 import org.graalvm.compiler.phases.common.ConvertDeoptimizeToGuardPhase;
115 import org.graalvm.compiler.phases.common.inlining.InliningPhase;
116 import org.graalvm.compiler.phases.common.inlining.info.InlineInfo;
117 import org.graalvm.compiler.phases.common.inlining.policy.GreedyInliningPolicy;
118 import org.graalvm.compiler.phases.schedule.SchedulePhase;
119 import org.graalvm.compiler.phases.schedule.SchedulePhase.SchedulingStrategy;
120 import org.graalvm.compiler.phases.tiers.HighTierContext;
121 import org.graalvm.compiler.phases.tiers.MidTierContext;
122 import org.graalvm.compiler.phases.tiers.Suites;
123 import org.graalvm.compiler.phases.tiers.TargetProvider;
124 import org.graalvm.compiler.phases.util.Providers;
125 import org.graalvm.compiler.printer.GraalDebugHandlersFactory;
126 import org.graalvm.compiler.runtime.RuntimeProvider;
127 import org.graalvm.compiler.test.AddExports;
128 import org.graalvm.compiler.test.GraalTest;
129 import org.graalvm.compiler.test.JLModule;
130 import org.junit.After;
131 import org.junit.Assert;
132 import org.junit.Test;
133 import org.junit.internal.AssumptionViolatedException;
134
882
883 protected void testAgainstExpected(OptionValues options, ResolvedJavaMethod method, Result expect, Set<DeoptimizationReason> shouldNotDeopt, Object receiver, Object... args) {
884 Result actual = executeActualCheckDeopt(options, method, shouldNotDeopt, receiver, args);
885 assertEquals(expect, actual);
886 }
887
888 protected Result executeActualCheckDeopt(OptionValues options, ResolvedJavaMethod method, Set<DeoptimizationReason> shouldNotDeopt, Object receiver, Object... args) {
889 Map<DeoptimizationReason, Integer> deoptCounts = new EnumMap<>(DeoptimizationReason.class);
890 ProfilingInfo profile = method.getProfilingInfo();
891 for (DeoptimizationReason reason : shouldNotDeopt) {
892 deoptCounts.put(reason, profile.getDeoptimizationCount(reason));
893 }
894 Result actual = executeActual(options, method, receiver, args);
895 profile = method.getProfilingInfo(); // profile can change after execution
896 for (DeoptimizationReason reason : shouldNotDeopt) {
897 Assert.assertEquals("wrong number of deopt counts for " + reason, (int) deoptCounts.get(reason), profile.getDeoptimizationCount(reason));
898 }
899 return actual;
900 }
901
902 protected void assertEquals(Result expect, Result actual) {
903 if (expect.exception != null) {
904 Assert.assertTrue("expected " + expect.exception, actual.exception != null);
905 Assert.assertEquals("Exception class", expect.exception.getClass(), actual.exception.getClass());
906 Assert.assertEquals("Exception message", expect.exception.getMessage(), actual.exception.getMessage());
907 } else {
908 if (actual.exception != null) {
909 throw new AssertionError("expected " + expect.returnValue + " but got an exception", actual.exception);
910 }
911 assertDeepEquals(expect.returnValue, actual.returnValue);
912 }
913 }
914
915 private Map<ResolvedJavaMethod, InstalledCode> cache = new ConcurrentHashMap<>();
916
917 /**
918 * Gets installed code for a given method, compiling it first if necessary. The graph is parsed
919 * {@link #parseEager eagerly}.
920 */
921 protected final InstalledCode getCode(ResolvedJavaMethod method) {
922 return getCode(method, null, false, false, getInitialOptions());
923 }
924
925 protected final InstalledCode getCode(ResolvedJavaMethod method, OptionValues options) {
926 return getCode(method, null, false, false, options);
|
94 import org.graalvm.compiler.nodes.StructuredGraph.Builder;
95 import org.graalvm.compiler.nodes.StructuredGraph.ScheduleResult;
96 import org.graalvm.compiler.nodes.ValueNode;
97 import org.graalvm.compiler.nodes.cfg.Block;
98 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration;
99 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins;
100 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
101 import org.graalvm.compiler.nodes.graphbuilderconf.InlineInvokePlugin;
102 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin;
103 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins;
104 import org.graalvm.compiler.nodes.java.AccessFieldNode;
105 import org.graalvm.compiler.nodes.spi.LoweringProvider;
106 import org.graalvm.compiler.nodes.spi.Replacements;
107 import org.graalvm.compiler.nodes.virtual.VirtualObjectNode;
108 import org.graalvm.compiler.options.OptionValues;
109 import org.graalvm.compiler.phases.BasePhase;
110 import org.graalvm.compiler.phases.OptimisticOptimizations;
111 import org.graalvm.compiler.phases.Phase;
112 import org.graalvm.compiler.phases.PhaseSuite;
113 import org.graalvm.compiler.phases.common.CanonicalizerPhase;
114 import org.graalvm.compiler.loop.phases.ConvertDeoptimizeToGuardPhase;
115 import org.graalvm.compiler.phases.common.inlining.InliningPhase;
116 import org.graalvm.compiler.phases.common.inlining.info.InlineInfo;
117 import org.graalvm.compiler.phases.common.inlining.policy.GreedyInliningPolicy;
118 import org.graalvm.compiler.phases.schedule.SchedulePhase;
119 import org.graalvm.compiler.phases.schedule.SchedulePhase.SchedulingStrategy;
120 import org.graalvm.compiler.phases.tiers.HighTierContext;
121 import org.graalvm.compiler.phases.tiers.MidTierContext;
122 import org.graalvm.compiler.phases.tiers.Suites;
123 import org.graalvm.compiler.phases.tiers.TargetProvider;
124 import org.graalvm.compiler.phases.util.Providers;
125 import org.graalvm.compiler.printer.GraalDebugHandlersFactory;
126 import org.graalvm.compiler.runtime.RuntimeProvider;
127 import org.graalvm.compiler.test.AddExports;
128 import org.graalvm.compiler.test.GraalTest;
129 import org.graalvm.compiler.test.JLModule;
130 import org.junit.After;
131 import org.junit.Assert;
132 import org.junit.Test;
133 import org.junit.internal.AssumptionViolatedException;
134
882
883 protected void testAgainstExpected(OptionValues options, ResolvedJavaMethod method, Result expect, Set<DeoptimizationReason> shouldNotDeopt, Object receiver, Object... args) {
884 Result actual = executeActualCheckDeopt(options, method, shouldNotDeopt, receiver, args);
885 assertEquals(expect, actual);
886 }
887
888 protected Result executeActualCheckDeopt(OptionValues options, ResolvedJavaMethod method, Set<DeoptimizationReason> shouldNotDeopt, Object receiver, Object... args) {
889 Map<DeoptimizationReason, Integer> deoptCounts = new EnumMap<>(DeoptimizationReason.class);
890 ProfilingInfo profile = method.getProfilingInfo();
891 for (DeoptimizationReason reason : shouldNotDeopt) {
892 deoptCounts.put(reason, profile.getDeoptimizationCount(reason));
893 }
894 Result actual = executeActual(options, method, receiver, args);
895 profile = method.getProfilingInfo(); // profile can change after execution
896 for (DeoptimizationReason reason : shouldNotDeopt) {
897 Assert.assertEquals("wrong number of deopt counts for " + reason, (int) deoptCounts.get(reason), profile.getDeoptimizationCount(reason));
898 }
899 return actual;
900 }
901
902 private static final List<Class<?>> C2_OMIT_STACK_TRACE_IN_FAST_THROW_EXCEPTIONS = Arrays.asList(
903 ArithmeticException.class,
904 ArrayIndexOutOfBoundsException.class,
905 ArrayStoreException.class,
906 ClassCastException.class,
907 NullPointerException.class);
908
909 protected void assertEquals(Result expect, Result actual) {
910 if (expect.exception != null) {
911 Assert.assertTrue("expected " + expect.exception, actual.exception != null);
912 Assert.assertEquals("Exception class", expect.exception.getClass(), actual.exception.getClass());
913 // C2 can optimize out the stack trace and message in some cases
914 if (expect.exception.getMessage() != null || !C2_OMIT_STACK_TRACE_IN_FAST_THROW_EXCEPTIONS.contains(expect.exception.getClass())) {
915 Assert.assertEquals("Exception message", expect.exception.getMessage(), actual.exception.getMessage());
916 }
917 } else {
918 if (actual.exception != null) {
919 throw new AssertionError("expected " + expect.returnValue + " but got an exception", actual.exception);
920 }
921 assertDeepEquals(expect.returnValue, actual.returnValue);
922 }
923 }
924
925 private Map<ResolvedJavaMethod, InstalledCode> cache = new ConcurrentHashMap<>();
926
927 /**
928 * Gets installed code for a given method, compiling it first if necessary. The graph is parsed
929 * {@link #parseEager eagerly}.
930 */
931 protected final InstalledCode getCode(ResolvedJavaMethod method) {
932 return getCode(method, null, false, false, getInitialOptions());
933 }
934
935 protected final InstalledCode getCode(ResolvedJavaMethod method, OptionValues options) {
936 return getCode(method, null, false, false, options);
|