Fix `CanUseKnownBootImageVarHandle()`.
The first input to `HStaticFieldGet` in not necessarily an
`HLoadClass`. It can be also `HClinitCheck`.
(cherry picked from commit 1fbfa9b23cd1f0b4e00fd82ea999f9530f18b609)
Test: Rely on TreeHugger.
Bug: 191765508
Bug: 230729606
Merged-In: Ib05b0c8a74809698cb5084349959efac4e8f35a7
Change-Id: I4b0867befed15b82fed736cf07d8cb8d630b9cdd
diff --git a/compiler/optimizing/instruction_simplifier.cc b/compiler/optimizing/instruction_simplifier.cc
index 914e44a..4db258b 100644
--- a/compiler/optimizing/instruction_simplifier.cc
+++ b/compiler/optimizing/instruction_simplifier.cc
@@ -2940,7 +2940,7 @@
DCHECK(!declaring_class->IsInitialized());
return false;
}
- HLoadClass* load_class = var_handle_instruction->InputAt(0)->AsLoadClass();
+ HInstruction* load_class = var_handle_instruction->InputAt(0)->AsLoadClass();
if (kIsDebugBuild) {
bool is_in_boot_image = false;
if (Runtime::Current()->GetHeap()->ObjectIsInBootImageSpace(declaring_class)) {
@@ -2950,9 +2950,10 @@
const char* descriptor = declaring_class->GetDescriptor(&storage);
is_in_boot_image = compiler_options.IsImageClass(descriptor);
}
- CHECK_EQ(is_in_boot_image, load_class->IsInBootImage());
+ CHECK_EQ(is_in_boot_image,
+ load_class->IsLoadClass() && load_class->AsLoadClass()->IsInBootImage());
}
- if (!load_class->IsInBootImage()) {
+ if (!load_class->IsLoadClass() || !load_class->AsLoadClass()->IsInBootImage()) {
return false;
}