--- a/hotspot/src/share/vm/opto/divnode.cpp Fri Oct 28 19:33:22 2016 +0000
+++ b/hotspot/src/share/vm/opto/divnode.cpp Mon Oct 31 09:50:12 2016 +0100
@@ -474,16 +474,19 @@
const TypeInt *ti = t->isa_int();
if( !ti ) return NULL;
+
+ // Check for useless control input
+ // Check for excluding div-zero case
+ if (in(0) && (ti->_hi < 0 || ti->_lo > 0)) {
+ set_req(0, NULL); // Yank control input
+ return this;
+ }
+
if( !ti->is_con() ) return NULL;
jint i = ti->get_con(); // Get divisor
if (i == 0) return NULL; // Dividing by zero constant does not idealize
- if (in(0) != NULL) {
- phase->igvn_rehash_node_delayed(this);
- set_req(0, NULL); // Dividing by a not-zero constant; no faulting
- }
-
// Dividing by MININT does not optimize as a power-of-2 shift.
if( i == min_jint ) return NULL;
@@ -576,16 +579,19 @@
const TypeLong *tl = t->isa_long();
if( !tl ) return NULL;
+
+ // Check for useless control input
+ // Check for excluding div-zero case
+ if (in(0) && (tl->_hi < 0 || tl->_lo > 0)) {
+ set_req(0, NULL); // Yank control input
+ return this;
+ }
+
if( !tl->is_con() ) return NULL;
jlong l = tl->get_con(); // Get divisor
if (l == 0) return NULL; // Dividing by zero constant does not idealize
- if (in(0) != NULL) {
- phase->igvn_rehash_node_delayed(this);
- set_req(0, NULL); // Dividing by a not-zero constant; no faulting
- }
-
// Dividing by MINLONG does not optimize as a power-of-2 shift.
if( l == min_jlong ) return NULL;
@@ -853,6 +859,13 @@
if( t == Type::TOP ) return NULL;
const TypeInt *ti = t->is_int();
+ // Check for useless control input
+ // Check for excluding mod-zero case
+ if (in(0) && (ti->_hi < 0 || ti->_lo > 0)) {
+ set_req(0, NULL); // Yank control input
+ return this;
+ }
+
// See if we are MOD'ing by 2^k or 2^k-1.
if( !ti->is_con() ) return NULL;
jint con = ti->get_con();
@@ -1017,6 +1030,13 @@
if( t == Type::TOP ) return NULL;
const TypeLong *tl = t->is_long();
+ // Check for useless control input
+ // Check for excluding mod-zero case
+ if (in(0) && (tl->_hi < 0 || tl->_lo > 0)) {
+ set_req(0, NULL); // Yank control input
+ return this;
+ }
+
// See if we are MOD'ing by 2^k or 2^k-1.
if( !tl->is_con() ) return NULL;
jlong con = tl->get_con();