--- a/hotspot/src/share/vm/opto/compile.cpp Fri May 02 19:00:04 2014 -0700
+++ b/hotspot/src/share/vm/opto/compile.cpp Fri May 02 19:10:24 2014 -0700
@@ -704,6 +704,7 @@
#endif
set_print_inlining(PrintInlining || method()->has_option("PrintInlining") NOT_PRODUCT( || PrintOptoInlining));
set_print_intrinsics(PrintIntrinsics || method()->has_option("PrintIntrinsics"));
+ set_has_irreducible_loop(true); // conservative until build_loop_tree() reset it
if (ProfileTraps RTM_OPT_ONLY( || UseRTMLocking )) {
// Make sure the method being compiled gets its own MDO,
@@ -988,6 +989,8 @@
set_print_assembly(PrintFrameConverterAssembly);
set_parsed_irreducible_loop(false);
#endif
+ set_has_irreducible_loop(false); // no loops
+
CompileWrapper cw(this);
Init(/*AliasLevel=*/ 0);
init_tf((*generator)());
@@ -1158,7 +1161,7 @@
if( start->is_Start() )
return start->as_Start();
}
- ShouldNotReachHere();
+ fatal("Did not find Start node!");
return NULL;
}
--- a/hotspot/src/share/vm/opto/compile.hpp Fri May 02 19:00:04 2014 -0700
+++ b/hotspot/src/share/vm/opto/compile.hpp Fri May 02 19:10:24 2014 -0700
@@ -319,6 +319,7 @@
bool _trace_opto_output;
bool _parsed_irreducible_loop; // True if ciTypeFlow detected irreducible loops during parsing
#endif
+ bool _has_irreducible_loop; // Found irreducible loops
// JSR 292
bool _has_method_handle_invokes; // True if this method has MethodHandle invokes.
RTMState _rtm_state; // State of Restricted Transactional Memory usage
@@ -604,6 +605,8 @@
void set_parsed_irreducible_loop(bool z) { _parsed_irreducible_loop = z; }
int _in_dump_cnt; // Required for dumping ir nodes.
#endif
+ bool has_irreducible_loop() const { return _has_irreducible_loop; }
+ void set_has_irreducible_loop(bool z) { _has_irreducible_loop = z; }
// JSR 292
bool has_method_handle_invokes() const { return _has_method_handle_invokes; }
--- a/hotspot/src/share/vm/opto/loopnode.cpp Fri May 02 19:00:04 2014 -0700
+++ b/hotspot/src/share/vm/opto/loopnode.cpp Fri May 02 19:10:24 2014 -0700
@@ -267,9 +267,9 @@
// Counted loop head must be a good RegionNode with only 3 not NULL
// control input edges: Self, Entry, LoopBack.
- if (x->in(LoopNode::Self) == NULL || x->req() != 3)
+ if (x->in(LoopNode::Self) == NULL || x->req() != 3 || loop->_irreducible) {
return false;
-
+ }
Node *init_control = x->in(LoopNode::EntryControl);
Node *back_control = x->in(LoopNode::LoopBackControl);
if (init_control == NULL || back_control == NULL) // Partially dead
@@ -1523,11 +1523,11 @@
// If I have one hot backedge, peel off myself loop.
// I better be the outermost loop.
- if( _head->req() > 3 ) {
+ if (_head->req() > 3 && !_irreducible) {
split_outer_loop( phase );
result = true;
- } else if( !_head->is_Loop() && !_irreducible ) {
+ } else if (!_head->is_Loop() && !_irreducible) {
// Make a new LoopNode to replace the old loop head
Node *l = new (phase->C) LoopNode( _head->in(1), _head->in(2) );
l = igvn.register_new_node_with_optimizer(l, _head);
@@ -2939,6 +2939,7 @@
return pre_order;
}
}
+ C->set_has_irreducible_loop(_has_irreducible_loops);
}
// This Node might be a decision point for loops. It is only if
--- a/hotspot/src/share/vm/opto/memnode.cpp Fri May 02 19:00:04 2014 -0700
+++ b/hotspot/src/share/vm/opto/memnode.cpp Fri May 02 19:10:24 2014 -0700
@@ -308,33 +308,16 @@
int alias_idx = phase->C->get_alias_index(t_adr->is_ptr());
}
-#ifdef ASSERT
Node* base = NULL;
- if (address->is_AddP())
+ if (address->is_AddP()) {
base = address->in(AddPNode::Base);
+ }
if (base != NULL && phase->type(base)->higher_equal(TypePtr::NULL_PTR) &&
!t_adr->isa_rawptr()) {
// Note: raw address has TOP base and top->higher_equal(TypePtr::NULL_PTR) is true.
- Compile* C = phase->C;
- tty->cr();
- tty->print_cr("===== NULL+offs not RAW address =====");
- if (C->is_dead_node(this->_idx)) tty->print_cr("'this' is dead");
- if ((ctl != NULL) && C->is_dead_node(ctl->_idx)) tty->print_cr("'ctl' is dead");
- if (C->is_dead_node(mem->_idx)) tty->print_cr("'mem' is dead");
- if (C->is_dead_node(address->_idx)) tty->print_cr("'address' is dead");
- if (C->is_dead_node(base->_idx)) tty->print_cr("'base' is dead");
- tty->cr();
- base->dump(1);
- tty->cr();
- this->dump(2);
- tty->print("this->adr_type(): "); adr_type()->dump(); tty->cr();
- tty->print("phase->type(address): "); t_adr->dump(); tty->cr();
- tty->print("phase->type(base): "); phase->type(address)->dump(); tty->cr();
- tty->cr();
+ // Skip this node optimization if its address has TOP base.
+ return NodeSentinel; // caller will return NULL
}
- assert(base == NULL || t_adr->isa_rawptr() ||
- !phase->type(base)->higher_equal(TypePtr::NULL_PTR), "NULL+offs not RAW address?");
-#endif
// Avoid independent memory operations
Node* old_mem = mem;
--- a/hotspot/src/share/vm/opto/node.cpp Fri May 02 19:00:04 2014 -0700
+++ b/hotspot/src/share/vm/opto/node.cpp Fri May 02 19:10:24 2014 -0700
@@ -27,6 +27,7 @@
#include "memory/allocation.inline.hpp"
#include "opto/cfgnode.hpp"
#include "opto/connode.hpp"
+#include "opto/loopnode.hpp"
#include "opto/machnode.hpp"
#include "opto/matcher.hpp"
#include "opto/node.hpp"
@@ -1263,6 +1264,7 @@
Node *top = igvn->C->top();
nstack.push(dead);
+ bool has_irreducible_loop = igvn->C->has_irreducible_loop();
while (nstack.size() > 0) {
dead = nstack.pop();
@@ -1277,13 +1279,31 @@
assert (!use->is_Con(), "Control for Con node should be Root node.");
use->set_req(0, top); // Cut dead edge to prevent processing
nstack.push(use); // the dead node again.
+ } else if (!has_irreducible_loop && // Backedge could be alive in irreducible loop
+ use->is_Loop() && !use->is_Root() && // Don't kill Root (RootNode extends LoopNode)
+ use->in(LoopNode::EntryControl) == dead) { // Dead loop if its entry is dead
+ use->set_req(LoopNode::EntryControl, top); // Cut dead edge to prevent processing
+ use->set_req(0, top); // Cut self edge
+ nstack.push(use);
} else { // Else found a not-dead user
+ // Dead if all inputs are top or null
+ bool dead_use = !use->is_Root(); // Keep empty graph alive
for (uint j = 1; j < use->req(); j++) {
- if (use->in(j) == dead) { // Turn all dead inputs into TOP
+ Node* in = use->in(j);
+ if (in == dead) { // Turn all dead inputs into TOP
use->set_req(j, top);
+ } else if (in != NULL && !in->is_top()) {
+ dead_use = false;
}
}
- igvn->_worklist.push(use);
+ if (dead_use) {
+ if (use->is_Region()) {
+ use->set_req(0, top); // Cut self edge
+ }
+ nstack.push(use);
+ } else {
+ igvn->_worklist.push(use);
+ }
}
// Refresh the iterator, since any number of kills might have happened.
k = dead->last_outs(kmin);
--- a/hotspot/src/share/vm/runtime/arguments.cpp Fri May 02 19:00:04 2014 -0700
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Fri May 02 19:10:24 2014 -0700
@@ -2399,7 +2399,7 @@
status &= verify_interval(CodeCacheSegmentSize, 1, 1024, "CodeCacheSegmentSize");
// TieredCompilation needs at least 2 compiler threads.
- const int num_min_compiler_threads = (TieredCompilation && (TieredStopAtLevel >= CompLevel_full_optimization)) ? 2 : 1;
+ const int num_min_compiler_threads = (TieredCompilation && (TieredStopAtLevel >= CompLevel_full_optimization)) ? 2 : CI_COMPILER_COUNT;
status &=verify_min_value(CICompilerCount, num_min_compiler_threads, "CICompilerCount");
if (!FLAG_IS_DEFAULT(CICompilerCount) && !FLAG_IS_DEFAULT(CICompilerCountPerCPU) && CICompilerCountPerCPU) {
--- a/hotspot/test/compiler/5091921/Test7005594.java Fri May 02 19:00:04 2014 -0700
+++ b/hotspot/test/compiler/5091921/Test7005594.java Fri May 02 19:10:24 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,7 @@
/**
* @test
* @bug 7005594
+ * @ignore 7117034
* @summary Array overflow not handled correctly with loop optimzations
*
* @run shell Test7005594.sh
--- a/hotspot/test/compiler/7052494/Test7052494.java Fri May 02 19:00:04 2014 -0700
+++ b/hotspot/test/compiler/7052494/Test7052494.java Fri May 02 19:10:24 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,7 @@
/**
* @test
* @bug 7052494
+ * @ignore 7154567
* @summary Eclipse test fails on JDK 7 b142
*
* @run main/othervm -Xbatch Test7052494
--- a/hotspot/test/compiler/ciReplay/TestVM.sh Fri May 02 19:00:04 2014 -0700
+++ b/hotspot/test/compiler/ciReplay/TestVM.sh Fri May 02 19:10:24 2014 -0700
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
##
## @test
## @bug 8011675
+## @ignore 8032498
## @summary testing of ciReplay with using generated by VM replay.txt
## @author igor.ignatyev@oracle.com
## @run shell TestVM.sh
--- a/hotspot/test/compiler/ciReplay/TestVM_no_comp_level.sh Fri May 02 19:00:04 2014 -0700
+++ b/hotspot/test/compiler/ciReplay/TestVM_no_comp_level.sh Fri May 02 19:10:24 2014 -0700
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
##
## @test
## @bug 8011675
+## @ignore 8032498
## @summary testing of ciReplay with using generated by VM replay.txt w/o comp_level
## @author igor.ignatyev@oracle.com
## @run shell TestVM_no_comp_level.sh
--- a/hotspot/test/compiler/startup/NumCompilerThreadsCheck.java Fri May 02 19:00:04 2014 -0700
+++ b/hotspot/test/compiler/startup/NumCompilerThreadsCheck.java Fri May 02 19:10:24 2014 -0700
@@ -30,11 +30,28 @@
import com.oracle.java.testlibrary.*;
public class NumCompilerThreadsCheck {
+
public static void main(String[] args) throws Exception {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:CICompilerCount=-1");
OutputAnalyzer out = new OutputAnalyzer(pb.start());
String expectedOutput = "CICompilerCount of -1 is invalid";
out.shouldContain(expectedOutput);
+
+ if (isZeroVm()) {
+ String expectedLowWaterMarkText = "must be at least 0";
+ out.shouldContain(expectedLowWaterMarkText);
+ }
+ }
+
+ private static boolean isZeroVm() {
+ String vmName = System.getProperty("java.vm.name");
+ if (vmName == null) {
+ throw new RuntimeException("No VM name");
+ }
+ if (vmName.toLowerCase().contains("zero")) {
+ return true;
+ }
+ return false;
}
}