3326 } 3327 3328 int opc = n->Opcode(); 3329 if (opc == Op_MulI) { 3330 if (n->in(1) == iv() && n->in(2)->is_Con()) { 3331 _scale = n->in(2)->get_int(); 3332 NOT_PRODUCT(_tracer.scaled_iv_4(n, _scale);) 3333 return true; 3334 } else if (n->in(2) == iv() && n->in(1)->is_Con()) { 3335 _scale = n->in(1)->get_int(); 3336 NOT_PRODUCT(_tracer.scaled_iv_5(n, _scale);) 3337 return true; 3338 } 3339 } else if (opc == Op_LShiftI) { 3340 if (n->in(1) == iv() && n->in(2)->is_Con()) { 3341 _scale = 1 << n->in(2)->get_int(); 3342 NOT_PRODUCT(_tracer.scaled_iv_6(n, _scale);) 3343 return true; 3344 } 3345 } else if (opc == Op_ConvI2L) { 3346 if (scaled_iv_plus_offset(n->in(1))) { 3347 NOT_PRODUCT(_tracer.scaled_iv_7(n);) 3348 return true; 3349 } 3350 } else if (opc == Op_LShiftL) { 3351 if (!has_iv() && _invar == NULL) { 3352 // Need to preserve the current _offset value, so 3353 // create a temporary object for this expression subtree. 3354 // Hacky, so should re-engineer the address pattern match. 3355 NOT_PRODUCT(Tracer::Depth dddd;) 3356 SWPointer tmp(this); 3357 NOT_PRODUCT(_tracer.scaled_iv_8(n, &tmp);) 3358 3359 if (tmp.scaled_iv_plus_offset(n->in(1))) { 3360 if (tmp._invar == NULL || _slp->do_vector_loop()) { 3361 int mult = 1 << n->in(2)->get_int(); 3362 _scale = tmp._scale * mult; 3363 _offset += tmp._offset * mult; 3364 NOT_PRODUCT(_tracer.scaled_iv_9(n, _scale, _offset, mult);) 3365 return true; 3420 } 3421 } 3422 if (opc == Op_SubI) { 3423 if (n->in(2)->is_Con() && invariant(n->in(1))) { 3424 _negate_invar = negate; 3425 _invar = n->in(1); 3426 _offset += !negate ? -(n->in(2)->get_int()) : n->in(2)->get_int(); 3427 NOT_PRODUCT(_tracer.offset_plus_k_8(n, _invar, _negate_invar, _offset);) 3428 return true; 3429 } else if (n->in(1)->is_Con() && invariant(n->in(2))) { 3430 _offset += negate ? -(n->in(1)->get_int()) : n->in(1)->get_int(); 3431 _negate_invar = !negate; 3432 _invar = n->in(2); 3433 NOT_PRODUCT(_tracer.offset_plus_k_9(n, _invar, _negate_invar, _offset);) 3434 return true; 3435 } 3436 } 3437 if (invariant(n)) { 3438 if (opc == Op_ConvI2L) { 3439 n = n->in(1); 3440 } 3441 if (n->bottom_type()->isa_int()) { 3442 _negate_invar = negate; 3443 _invar = n; 3444 NOT_PRODUCT(_tracer.offset_plus_k_10(n, _invar, _negate_invar, _offset);) 3445 return true; 3446 } 3447 } 3448 3449 NOT_PRODUCT(_tracer.offset_plus_k_11(n);) 3450 return false; 3451 } 3452 3453 //----------------------------print------------------------ 3454 void SWPointer::print() { 3455 #ifndef PRODUCT 3456 tty->print("base: %d adr: %d scale: %d offset: %d invar: %c%d\n", 3457 _base != NULL ? _base->_idx : 0, 3458 _adr != NULL ? _adr->_idx : 0, 3459 _scale, _offset, | 3326 } 3327 3328 int opc = n->Opcode(); 3329 if (opc == Op_MulI) { 3330 if (n->in(1) == iv() && n->in(2)->is_Con()) { 3331 _scale = n->in(2)->get_int(); 3332 NOT_PRODUCT(_tracer.scaled_iv_4(n, _scale);) 3333 return true; 3334 } else if (n->in(2) == iv() && n->in(1)->is_Con()) { 3335 _scale = n->in(1)->get_int(); 3336 NOT_PRODUCT(_tracer.scaled_iv_5(n, _scale);) 3337 return true; 3338 } 3339 } else if (opc == Op_LShiftI) { 3340 if (n->in(1) == iv() && n->in(2)->is_Con()) { 3341 _scale = 1 << n->in(2)->get_int(); 3342 NOT_PRODUCT(_tracer.scaled_iv_6(n, _scale);) 3343 return true; 3344 } 3345 } else if (opc == Op_ConvI2L) { 3346 if (n->in(1)->Opcode() == Op_CastII && 3347 n->in(1)->as_CastII()->has_range_check()) { 3348 // Skip range check dependent CastII nodes 3349 n = n->in(1); 3350 } 3351 if (scaled_iv_plus_offset(n->in(1))) { 3352 NOT_PRODUCT(_tracer.scaled_iv_7(n);) 3353 return true; 3354 } 3355 } else if (opc == Op_LShiftL) { 3356 if (!has_iv() && _invar == NULL) { 3357 // Need to preserve the current _offset value, so 3358 // create a temporary object for this expression subtree. 3359 // Hacky, so should re-engineer the address pattern match. 3360 NOT_PRODUCT(Tracer::Depth dddd;) 3361 SWPointer tmp(this); 3362 NOT_PRODUCT(_tracer.scaled_iv_8(n, &tmp);) 3363 3364 if (tmp.scaled_iv_plus_offset(n->in(1))) { 3365 if (tmp._invar == NULL || _slp->do_vector_loop()) { 3366 int mult = 1 << n->in(2)->get_int(); 3367 _scale = tmp._scale * mult; 3368 _offset += tmp._offset * mult; 3369 NOT_PRODUCT(_tracer.scaled_iv_9(n, _scale, _offset, mult);) 3370 return true; 3425 } 3426 } 3427 if (opc == Op_SubI) { 3428 if (n->in(2)->is_Con() && invariant(n->in(1))) { 3429 _negate_invar = negate; 3430 _invar = n->in(1); 3431 _offset += !negate ? -(n->in(2)->get_int()) : n->in(2)->get_int(); 3432 NOT_PRODUCT(_tracer.offset_plus_k_8(n, _invar, _negate_invar, _offset);) 3433 return true; 3434 } else if (n->in(1)->is_Con() && invariant(n->in(2))) { 3435 _offset += negate ? -(n->in(1)->get_int()) : n->in(1)->get_int(); 3436 _negate_invar = !negate; 3437 _invar = n->in(2); 3438 NOT_PRODUCT(_tracer.offset_plus_k_9(n, _invar, _negate_invar, _offset);) 3439 return true; 3440 } 3441 } 3442 if (invariant(n)) { 3443 if (opc == Op_ConvI2L) { 3444 n = n->in(1); 3445 if (n->Opcode() == Op_CastII && 3446 n->as_CastII()->has_range_check()) { 3447 // Skip range check dependent CastII nodes 3448 assert(invariant(n), "sanity"); 3449 n = n->in(1); 3450 } 3451 } 3452 if (n->bottom_type()->isa_int()) { 3453 _negate_invar = negate; 3454 _invar = n; 3455 NOT_PRODUCT(_tracer.offset_plus_k_10(n, _invar, _negate_invar, _offset);) 3456 return true; 3457 } 3458 } 3459 3460 NOT_PRODUCT(_tracer.offset_plus_k_11(n);) 3461 return false; 3462 } 3463 3464 //----------------------------print------------------------ 3465 void SWPointer::print() { 3466 #ifndef PRODUCT 3467 tty->print("base: %d adr: %d scale: %d offset: %d invar: %c%d\n", 3468 _base != NULL ? _base->_idx : 0, 3469 _adr != NULL ? _adr->_idx : 0, 3470 _scale, _offset, |