mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-17 17:44:40 +02:00
8266615: C2 incorrectly folds subtype checks involving an interface array
Reviewed-by: kvn, neliasso
This commit is contained in:
parent
894547d2c1
commit
ce88b33488
2 changed files with 87 additions and 2 deletions
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue