diff options
author | 2015-02-18 14:48:53 +0000 | |
---|---|---|
committer | 2015-02-19 14:01:18 +0000 | |
commit | d6138ef1ea13d07ae555542f8898b30d89e9ac9a (patch) | |
tree | a8ffd5fd966512fd280bc1b3214f4e57a9e1805f /compiler/optimizing/graph_checker.cc | |
parent | 92095533ac28879ddd8b44b559d700527ca12b8a (diff) |
Ensure the graph is correctly typed.
We used to be forgiving because of HIntConstant(0) also being
used for null. We now create a special HNullConstant for such uses.
Also, we need to run the dead phi elimination twice during ssa
building to ensure the correctness.
Change-Id: If479efa3680d3358800aebb1cca692fa2d94f6e5
Diffstat (limited to 'compiler/optimizing/graph_checker.cc')
-rw-r--r-- | compiler/optimizing/graph_checker.cc | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/compiler/optimizing/graph_checker.cc b/compiler/optimizing/graph_checker.cc index 4ebb1363cc..ef10428c0f 100644 --- a/compiler/optimizing/graph_checker.cc +++ b/compiler/optimizing/graph_checker.cc @@ -285,6 +285,19 @@ void SSAChecker::VisitInstruction(HInstruction* instruction) { } } +static Primitive::Type PrimitiveKind(Primitive::Type type) { + switch (type) { + case Primitive::kPrimBoolean: + case Primitive::kPrimByte: + case Primitive::kPrimShort: + case Primitive::kPrimChar: + case Primitive::kPrimInt: + return Primitive::kPrimInt; + default: + return type; + } +} + void SSAChecker::VisitPhi(HPhi* phi) { VisitInstruction(phi); @@ -321,18 +334,17 @@ void SSAChecker::VisitPhi(HPhi* phi) { } } } -} - -static Primitive::Type PrimitiveKind(Primitive::Type type) { - switch (type) { - case Primitive::kPrimBoolean: - case Primitive::kPrimByte: - case Primitive::kPrimShort: - case Primitive::kPrimChar: - case Primitive::kPrimInt: - return Primitive::kPrimInt; - default: - return type; + // Ensure that the inputs have the same primitive kind as the phi. + for (size_t i = 0, e = phi->InputCount(); i < e; ++i) { + HInstruction* input = phi->InputAt(i); + if (PrimitiveKind(input->GetType()) != PrimitiveKind(phi->GetType())) { + AddError(StringPrintf( + "Input %d at index %zu of phi %d from block %d does not have the " + "same type as the phi: %s versus %s", + input->GetId(), i, phi->GetId(), phi->GetBlock()->GetBlockId(), + Primitive::PrettyDescriptor(input->GetType()), + Primitive::PrettyDescriptor(phi->GetType()))); + } } } |