From 38a57e8bed401a08a60864b3a04a18591a270f5d Mon Sep 17 00:00:00 2001 From: Nils Eliasson Date: Mon, 24 Feb 2020 11:31:07 +0100 Subject: [PATCH] 8238723: yank_alloc_node must remove membar Reviewed-by: vlivanov, thartmann, roland --- src/hotspot/share/opto/macro.cpp | 53 +++++++++++-------- .../compiler/allocation/TestAllocation.java | 19 ++++++- 2 files changed, 48 insertions(+), 24 deletions(-) diff --git a/src/hotspot/share/opto/macro.cpp b/src/hotspot/share/opto/macro.cpp index 1cc31d2831a..6491f2839e9 100644 --- a/src/hotspot/share/opto/macro.cpp +++ b/src/hotspot/share/opto/macro.cpp @@ -1334,14 +1334,23 @@ void PhaseMacroExpand::expand_allocate_common( if (!allocation_has_use) { InitializeNode* init = alloc->initialization(); if (init != NULL) { - yank_initalize_node(init); - assert(init->outcnt() == 0, "all uses must be deleted"); - _igvn.remove_dead_node(init); + init->remove(&_igvn); } if (expand_fast_path && (initial_slow_test == NULL)) { // Remove allocation node and return. // Size is a non-negative constant -> no initial check needed -> directly to fast path. // Also, no usages -> empty fast path -> no fall out to slow path -> nothing left. +#ifndef PRODUCT + if (PrintEliminateAllocations) { + tty->print("NotUsed "); + Node* res = alloc->proj_out_or_null(TypeFunc::Parms); + if (res != NULL) { + res->dump(); + } else { + alloc->dump(); + } + } +#endif yank_alloc_node(alloc); return; } @@ -1579,6 +1588,16 @@ void PhaseMacroExpand::yank_alloc_node(AllocateNode* alloc) { Node* i_o = alloc->in(TypeFunc::I_O); extract_call_projections(alloc); + if (_resproj != NULL) { + for (DUIterator_Fast imax, i = _resproj->fast_outs(imax); i < imax; i++) { + Node* use = _resproj->fast_out(i); + use->isa_MemBar()->remove(&_igvn); + --imax; + --i; // back up iterator + } + assert(_resproj->outcnt() == 0, "all uses must be deleted"); + _igvn.remove_dead_node(_resproj); + } if (_fallthroughcatchproj != NULL) { migrate_outs(_fallthroughcatchproj, ctrl); _igvn.remove_dead_node(_fallthroughcatchproj); @@ -1608,6 +1627,14 @@ void PhaseMacroExpand::yank_alloc_node(AllocateNode* alloc) { _igvn.rehash_node_delayed(_ioproj_catchall); _ioproj_catchall->set_req(0, top()); } +#ifndef PRODUCT + if (PrintEliminateAllocations) { + if (alloc->is_AllocateArray()) {} + tty->print_cr("++++ Eliminated: %d AllocateArray", alloc->_idx); + } else { + tty->print_cr("++++ Eliminated: %d Allocate", alloc->_idx); + } +#endif _igvn.remove_dead_node(alloc); } @@ -1712,26 +1739,6 @@ void PhaseMacroExpand::expand_dtrace_alloc_probe(AllocateNode* alloc, Node* oop, } } -// Remove InitializeNode without use -void PhaseMacroExpand::yank_initalize_node(InitializeNode* initnode) { - assert(initnode->proj_out_or_null(TypeFunc::Parms) == NULL, "No uses allowed"); - - Node* ctrl_out = initnode->proj_out_or_null(TypeFunc::Control); - Node* mem_out = initnode->proj_out_or_null(TypeFunc::Memory); - - // Move all uses of each to - if (ctrl_out != NULL ) { - migrate_outs(ctrl_out, initnode->in(TypeFunc::Control)); - _igvn.remove_dead_node(ctrl_out); - } - - // Move all uses of each to - if (mem_out != NULL ) { - migrate_outs(mem_out, initnode->in(TypeFunc::Memory)); - _igvn.remove_dead_node(mem_out); - } -} - // Helper for PhaseMacroExpand::expand_allocate_common. // Initializes the newly-allocated storage. Node* diff --git a/test/hotspot/jtreg/compiler/allocation/TestAllocation.java b/test/hotspot/jtreg/compiler/allocation/TestAllocation.java index 6cfb55617ef..8fd13c5665a 100644 --- a/test/hotspot/jtreg/compiler/allocation/TestAllocation.java +++ b/test/hotspot/jtreg/compiler/allocation/TestAllocation.java @@ -25,7 +25,9 @@ * @test * @bug 8237581 * @summary Testing allocation expansion when there is no use of the allocation - * @run main/othervm -Xbatch -XX:CompileCommand=compileonly,compiler.allocation.TestAllocation:: + * @run main/othervm -Xbatch -XX:+PrintCompilation -XX:+PrintEliminateAllocations -XX:CompileCommand=compileonly,compiler.allocation.TestAllocation::test* + * compiler.allocation.TestAllocation + * @run main/othervm -Xbatch -XX:+PrintCompilation -XX:+PrintEliminateAllocations -XX:-DoEscapeAnalysis -XX:CompileCommand=compileonly,compiler.allocation.TestAllocation::test* * compiler.allocation.TestAllocation */ @@ -41,6 +43,12 @@ public int testUnknownPositiveArrayLength() { return w.i + w.ba.length; } + public int testStoreCapture() { + byte[] bs = new byte[1]; + bs[0] = 1; + return bs.length; + } + public int testUnknownNegativeArrayLength() { boolean success = false; try { @@ -61,6 +69,13 @@ public int testConstantPositiveArrayLength() { return w.i + w.ba.length; } + public int testConstantPositiveArrayLength2() { + Payload w = new Payload(173, 10); + w.i = 17; + w.ba = new byte[10]; + return w.i + w.ba.length; + } + public int testConstantNegativeArrayLength() { boolean success = false; try { @@ -91,7 +106,9 @@ public static void main(String[] strArr) { test.testUnknownPositiveArrayLength(); test.testUnknownNegativeArrayLength(); test.testConstantPositiveArrayLength(); + test.testConstantPositiveArrayLength2(); test.testConstantNegativeArrayLength(); + test.testStoreCapture(); } } }