8266615: C2 incorrectly folds subtype checks involving an interface array

Reviewed-by: kvn, neliasso
This commit is contained in:
Tobias Hartmann 2021-05-18 12:21:24 +00:00
parent 894547d2c1
commit ce88b33488
2 changed files with 87 additions and 2 deletions

View file

@ -4058,16 +4058,22 @@ int Compile::static_subtype_check(ciKlass* superk, ciKlass* subk) {
}
ciType* superelem = superk;
if (superelem->is_array_klass())
ciType* subelem = subk;
if (superelem->is_array_klass()) {
superelem = superelem->as_array_klass()->base_element_type();
}
if (subelem->is_array_klass()) {
subelem = subelem->as_array_klass()->base_element_type();
}
if (!subk->is_interface()) { // cannot trust static interface types yet
if (subk->is_subtype_of(superk)) {
return SSC_always_true; // (1) false path dead; no dynamic test needed
}
if (!(superelem->is_klass() && superelem->as_klass()->is_interface()) &&
!(subelem->is_klass() && subelem->as_klass()->is_interface()) &&
!superk->is_subtype_of(subk)) {
return SSC_always_false;
return SSC_always_false; // (2) true path dead; no dynamic test needed
}
}