diff src/share/vm/opto/parse2.cpp @ 23799:535618ab1c04

6675699: need comprehensive fix for unconstrained ConvI2L with narrowed type Summary: Emit CastII to make narrow ConvI2L dependent on the corresponding range check. Reviewed-by: kvn, roland
author thartmann
date Wed, 27 Jan 2016 09:02:51 +0100
parents eb8b5cc64669
children d109bda16490
line wrap: on
line diff
--- a/src/share/vm/opto/parse2.cpp	Mon Jan 25 08:46:19 2016 +0000
+++ b/src/share/vm/opto/parse2.cpp	Wed Jan 27 09:02:51 2016 +0100
@@ -154,7 +154,9 @@
   // Check for always knowing you are throwing a range-check exception
   if (stopped())  return top();
 
-  Node* ptr = array_element_address(ary, idx, type, sizetype);
+  // Make array address computation control dependent to prevent it
+  // from floating above the range check during loop optimizations.
+  Node* ptr = array_element_address(ary, idx, type, sizetype, control());
 
   if (result2 != NULL)  *result2 = elemtype;
 
@@ -457,9 +459,12 @@
 #ifdef _LP64
   // Clean the 32-bit int into a real 64-bit offset.
   // Otherwise, the jint value 0 might turn into an offset of 0x0800000000.
-  const TypeLong* lkeytype = TypeLong::make(CONST64(0), num_cases-1, Type::WidenMin);
-  key_val       = _gvn.transform( new (C) ConvI2LNode(key_val, lkeytype) );
+  const TypeInt* ikeytype = TypeInt::make(0, num_cases-1, Type::WidenMin);
+  // Make I2L conversion control dependent to prevent it from
+  // floating above the range check during loop optimizations.
+  key_val = C->constrained_convI2L(&_gvn, key_val, ikeytype, control());
 #endif
+
   // Shift the value by wordsize so we have an index into the table, rather
   // than a switch value
   Node *shiftWord = _gvn.MakeConX(wordSize);