1203 proj->in(0)->in(1) != NULL && 1204 proj->in(0)->in(1)->is_Bool() && 1205 proj->in(0)->in(1)->in(1) != NULL && 1206 proj->in(0)->in(1)->in(1)->Opcode() == Op_CmpP && 1207 proj->in(0)->in(1)->in(1)->in(2) != NULL && 1208 proj->in(0)->in(1)->in(1)->in(1) == other->in(MemNode::Address)->in(AddPNode::Address)->uncast() && 1209 igvn->type(proj->in(0)->in(1)->in(1)->in(2)) == TypePtr::NULL_PTR) { 1210 return true; 1211 } 1212 return false; 1213 } 1214 1215 // Returns true if this IfNode belongs to a flattened array check 1216 // and returns the corresponding array in the 'array' parameter. 1217 bool IfNode::is_flattened_array_check(PhaseTransform* phase, Node*& array) { 1218 Node* bol = in(1); 1219 if (!bol->is_Bool() || bol->as_Bool()->_test._test != BoolTest::ne) { 1220 return false; 1221 } 1222 Node* cmp = bol->in(1); 1223 if (cmp->Opcode() != Op_CmpI) { 1224 return false; 1225 } 1226 Node* cmp_in1 = cmp->in(1); 1227 Node* cmp_in2 = cmp->in(2); 1228 if ((unsigned int)cmp_in2->find_int_con(0) != Klass::_lh_array_tag_vt_value) { 1229 return false; 1230 } 1231 if (cmp_in1->Opcode() != Op_RShiftI) { 1232 return false; 1233 } 1234 Node* shift_in1 = cmp_in1->in(1); 1235 Node* shift_in2 = cmp_in1->in(2); 1236 if ((unsigned int)shift_in2->find_int_con(0) != Klass::_lh_array_tag_shift) { 1237 return false; 1238 } 1239 if (shift_in1->Opcode() != Op_LoadI) { 1240 return false; 1241 } 1242 intptr_t offset; 1243 Node* ptr = shift_in1->in(MemNode::Address); 1244 Node* addr = AddPNode::Ideal_base_and_offset(ptr, phase, offset); 1245 if (addr == NULL || offset != in_bytes(Klass::layout_helper_offset())) { 1246 return false; 1247 } 1248 if (!phase->type(addr)->isa_klassptr()) { 1249 return false; 1250 } 1251 Node* klass_load = ptr->as_AddP()->in(AddPNode::Base)->uncast(); 1252 if (klass_load->is_DecodeNKlass()) { 1253 klass_load = klass_load->in(1); 1254 } 1255 if (klass_load->is_Load()) { 1256 Node* address = klass_load->in(MemNode::Address); 1257 array = address->as_AddP()->in(AddPNode::Base); 1258 } 1259 return true; 1260 } 1261 1262 // Check that the If that is in between the 2 integer comparisons has 1263 // no side effect 1264 bool IfNode::is_side_effect_free_test(ProjNode* proj, PhaseIterGVN* igvn) { 1265 if (proj == NULL) { 1266 return false; 1267 } 1268 CallStaticJavaNode* unc = proj->is_uncommon_trap_if_pattern(Deoptimization::Reason_none); 1269 if (unc != NULL && proj->outcnt() <= 2) { 1270 if (proj->outcnt() == 1 || 1271 // Allow simple null check from LoadRange 1272 (is_cmp_with_loadrange(proj) && is_null_check(proj, igvn))) { 1273 CallStaticJavaNode* unc = proj->is_uncommon_trap_if_pattern(Deoptimization::Reason_none); 1274 CallStaticJavaNode* dom_unc = proj->in(0)->in(0)->as_Proj()->is_uncommon_trap_if_pattern(Deoptimization::Reason_none); | 1203 proj->in(0)->in(1) != NULL && 1204 proj->in(0)->in(1)->is_Bool() && 1205 proj->in(0)->in(1)->in(1) != NULL && 1206 proj->in(0)->in(1)->in(1)->Opcode() == Op_CmpP && 1207 proj->in(0)->in(1)->in(1)->in(2) != NULL && 1208 proj->in(0)->in(1)->in(1)->in(1) == other->in(MemNode::Address)->in(AddPNode::Address)->uncast() && 1209 igvn->type(proj->in(0)->in(1)->in(1)->in(2)) == TypePtr::NULL_PTR) { 1210 return true; 1211 } 1212 return false; 1213 } 1214 1215 // Returns true if this IfNode belongs to a flattened array check 1216 // and returns the corresponding array in the 'array' parameter. 1217 bool IfNode::is_flattened_array_check(PhaseTransform* phase, Node*& array) { 1218 Node* bol = in(1); 1219 if (!bol->is_Bool() || bol->as_Bool()->_test._test != BoolTest::ne) { 1220 return false; 1221 } 1222 Node* cmp = bol->in(1); 1223 if (cmp->Opcode() != Op_CmpI && cmp->Opcode() != Op_CmpL) { 1224 return false; 1225 } 1226 Node* cmp_in1 = cmp->in(1); 1227 Node* cmp_in2 = cmp->in(2); 1228 1229 if (cmp_in1->Opcode() != Op_GetFlattenedProperty) { 1230 return false; 1231 } 1232 1233 jlong in2 = -1; 1234 if (cmp->Opcode() == Op_CmpI) { 1235 in2 = cmp_in2->find_int_con(-1); 1236 } else { 1237 in2 = cmp_in2->find_long_con(-1); 1238 } 1239 1240 if (in2 != 0) { 1241 return false; 1242 } 1243 1244 Node* klass_load = cmp_in1->in(1); 1245 1246 if (klass_load->is_Load()) { 1247 Node* address = klass_load->in(MemNode::Address); 1248 array = address->as_AddP()->in(AddPNode::Base); 1249 } 1250 return true; 1251 } 1252 1253 // Check that the If that is in between the 2 integer comparisons has 1254 // no side effect 1255 bool IfNode::is_side_effect_free_test(ProjNode* proj, PhaseIterGVN* igvn) { 1256 if (proj == NULL) { 1257 return false; 1258 } 1259 CallStaticJavaNode* unc = proj->is_uncommon_trap_if_pattern(Deoptimization::Reason_none); 1260 if (unc != NULL && proj->outcnt() <= 2) { 1261 if (proj->outcnt() == 1 || 1262 // Allow simple null check from LoadRange 1263 (is_cmp_with_loadrange(proj) && is_null_check(proj, igvn))) { 1264 CallStaticJavaNode* unc = proj->is_uncommon_trap_if_pattern(Deoptimization::Reason_none); 1265 CallStaticJavaNode* dom_unc = proj->in(0)->in(0)->as_Proj()->is_uncommon_trap_if_pattern(Deoptimization::Reason_none); |