summaryrefslogtreecommitdiff
path: root/compiler/optimizing
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/optimizing')
-rw-r--r--compiler/optimizing/graph_visualizer.cc19
-rw-r--r--compiler/optimizing/instruction_simplifier.cc4
2 files changed, 22 insertions, 1 deletions
diff --git a/compiler/optimizing/graph_visualizer.cc b/compiler/optimizing/graph_visualizer.cc
index fd2e4e81df..b64791788d 100644
--- a/compiler/optimizing/graph_visualizer.cc
+++ b/compiler/optimizing/graph_visualizer.cc
@@ -21,6 +21,7 @@
#include "licm.h"
#include "nodes.h"
#include "optimization.h"
+#include "reference_type_propagation.h"
#include "register_allocator.h"
#include "ssa_liveness_analysis.h"
@@ -354,6 +355,24 @@ class HGraphVisualizerPrinter : public HGraphVisitor {
} else {
StartAttributeStream("loop") << "B" << info->GetHeader()->GetBlockId();
}
+ } else if (IsPass(ReferenceTypePropagation::kReferenceTypePropagationPassName)
+ && is_after_pass_) {
+ if (instruction->GetType() == Primitive::kPrimNot) {
+ if (instruction->IsLoadClass()) {
+ ScopedObjectAccess soa(Thread::Current());
+ StartAttributeStream("klass")
+ << PrettyClass(instruction->AsLoadClass()->GetLoadedClassRTI().GetTypeHandle().Get());
+ } else {
+ ReferenceTypeInfo info = instruction->GetReferenceTypeInfo();
+ if (info.IsTop()) {
+ StartAttributeStream("klass") << "java.lang.Object";
+ } else {
+ ScopedObjectAccess soa(Thread::Current());
+ StartAttributeStream("klass") << PrettyClass(info.GetTypeHandle().Get());
+ }
+ StartAttributeStream("exact") << std::boolalpha << info.IsExact() << std::noboolalpha;
+ }
+ }
}
}
diff --git a/compiler/optimizing/instruction_simplifier.cc b/compiler/optimizing/instruction_simplifier.cc
index 98a5841f80..2daeeb3c0c 100644
--- a/compiler/optimizing/instruction_simplifier.cc
+++ b/compiler/optimizing/instruction_simplifier.cc
@@ -206,7 +206,9 @@ static bool TypeCheckHasKnownOutcome(HLoadClass* klass, HInstruction* object, bo
// The test failed at compile time so will also fail at runtime.
*outcome = false;
return true;
- } else if (!class_rti.IsInterface() && !obj_rti.IsSupertypeOf(class_rti)) {
+ } else if (!class_rti.IsInterface()
+ && !obj_rti.IsInterface()
+ && !obj_rti.IsSupertypeOf(class_rti)) {
// Different type hierarchy. The test will fail.
*outcome = false;
return true;