276 @Test
277 public void testDeoptWithVirtualObjects() {
278 assertFalse(executedDeoptimizeDirective);
279 test("deoptWithVirtualObjectsSnippet");
280 assertTrue(executedDeoptimizeDirective);
281 }
282
283 @SafeVarargs
284 protected final void testPartialEscapeAnalysis(String snippet, double expectedProbability, int expectedCount, Class<? extends Node>... invalidNodeClasses) {
285 prepareGraph(snippet, false);
286 for (AbstractMergeNode merge : graph.getNodes(AbstractMergeNode.TYPE)) {
287 merge.setStateAfter(null);
288 }
289 new DeadCodeEliminationPhase().apply(graph);
290 new CanonicalizerPhase().apply(graph, context);
291 try {
292 Assert.assertTrue("partial escape analysis should have removed all NewInstanceNode allocations", graph.getNodes().filter(NewInstanceNode.class).isEmpty());
293 Assert.assertTrue("partial escape analysis should have removed all NewArrayNode allocations", graph.getNodes().filter(NewArrayNode.class).isEmpty());
294
295 ControlFlowGraph cfg = ControlFlowGraph.compute(graph, true, true, false, false);
296 double probabilitySum = 0;
297 int materializeCount = 0;
298 for (CommitAllocationNode materialize : graph.getNodes().filter(CommitAllocationNode.class)) {
299 probabilitySum += cfg.blockFor(materialize).probability() * materialize.getVirtualObjects().size();
300 materializeCount += materialize.getVirtualObjects().size();
301 }
302 Assert.assertEquals("unexpected number of MaterializeObjectNodes", expectedCount, materializeCount);
303 Assert.assertEquals("unexpected probability of MaterializeObjectNodes", expectedProbability, probabilitySum, 0.01);
304 for (Node node : graph.getNodes()) {
305 for (Class<? extends Node> clazz : invalidNodeClasses) {
306 Assert.assertFalse("instance of invalid class: " + clazz.getSimpleName(), clazz.isInstance(node) && node.usages().isNotEmpty());
307 }
308 }
309 } catch (AssertionError e) {
310 TypeSystemTest.outputGraph(graph, snippet + ": " + e.getMessage());
311 throw e;
312 }
313 }
314 }
|
276 @Test
277 public void testDeoptWithVirtualObjects() {
278 assertFalse(executedDeoptimizeDirective);
279 test("deoptWithVirtualObjectsSnippet");
280 assertTrue(executedDeoptimizeDirective);
281 }
282
283 @SafeVarargs
284 protected final void testPartialEscapeAnalysis(String snippet, double expectedProbability, int expectedCount, Class<? extends Node>... invalidNodeClasses) {
285 prepareGraph(snippet, false);
286 for (AbstractMergeNode merge : graph.getNodes(AbstractMergeNode.TYPE)) {
287 merge.setStateAfter(null);
288 }
289 new DeadCodeEliminationPhase().apply(graph);
290 new CanonicalizerPhase().apply(graph, context);
291 try {
292 Assert.assertTrue("partial escape analysis should have removed all NewInstanceNode allocations", graph.getNodes().filter(NewInstanceNode.class).isEmpty());
293 Assert.assertTrue("partial escape analysis should have removed all NewArrayNode allocations", graph.getNodes().filter(NewArrayNode.class).isEmpty());
294
295 ControlFlowGraph cfg = ControlFlowGraph.compute(graph, true, true, false, false);
296 double frequencySum = 0;
297 int materializeCount = 0;
298 for (CommitAllocationNode materialize : graph.getNodes().filter(CommitAllocationNode.class)) {
299 frequencySum += cfg.blockFor(materialize).getRelativeFrequency() * materialize.getVirtualObjects().size();
300 materializeCount += materialize.getVirtualObjects().size();
301 }
302 Assert.assertEquals("unexpected number of MaterializeObjectNodes", expectedCount, materializeCount);
303 Assert.assertEquals("unexpected frequency of MaterializeObjectNodes", expectedProbability, frequencySum, 0.01);
304 for (Node node : graph.getNodes()) {
305 for (Class<? extends Node> clazz : invalidNodeClasses) {
306 Assert.assertFalse("instance of invalid class: " + clazz.getSimpleName(), clazz.isInstance(node) && node.usages().isNotEmpty());
307 }
308 }
309 } catch (AssertionError e) {
310 TypeSystemTest.outputGraph(graph, snippet + ": " + e.getMessage());
311 throw e;
312 }
313 }
314 }
|