< prev index next >

src/share/vm/opto/parse2.cpp

Print this page

        

*** 164,174 **** } } // Check for always knowing you are throwing a range-check exception if (stopped()) return top(); ! Node* ptr = array_element_address(ary, idx, type, sizetype); if (result2 != NULL) *result2 = elemtype; assert(ptr != top(), "top should go hand-in-hand with stopped"); --- 164,176 ---- } } // Check for always knowing you are throwing a range-check exception if (stopped()) return top(); ! // 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; assert(ptr != top(), "top should go hand-in-hand with stopped");
*** 464,479 **** // Create an ideal node JumpTable that has projections // of all possible ranges for a switch statement // The key_val input must be converted to a pointer offset and scaled. // Compare Parse::array_addressing above. ! #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 ConvI2LNode(key_val, lkeytype) ); ! #endif // Shift the value by wordsize so we have an index into the table, rather // than a switch value Node *shiftWord = _gvn.MakeConX(wordSize); key_val = _gvn.transform( new MulXNode( key_val, shiftWord)); --- 466,483 ---- // Create an ideal node JumpTable that has projections // of all possible ranges for a switch statement // The key_val input must be converted to a pointer offset and scaled. // Compare Parse::array_addressing above. ! // Clean the 32-bit int into a real 64-bit offset. // Otherwise, the jint value 0 might turn into an offset of 0x0800000000. ! const TypeInt* ikeytype = TypeInt::make(0, num_cases, Type::WidenMin); ! // Make I2L conversion control dependent to prevent it from ! // floating above the range check during loop optimizations. ! key_val = C->conv_I2X_index(&_gvn, key_val, ikeytype, control()); ! // Shift the value by wordsize so we have an index into the table, rather // than a switch value Node *shiftWord = _gvn.MakeConX(wordSize); key_val = _gvn.transform( new MulXNode( key_val, shiftWord));
< prev index next >