From d6138ef1ea13d07ae555542f8898b30d89e9ac9a Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Wed, 18 Feb 2015 14:48:53 +0000 Subject: 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 --- compiler/optimizing/graph_checker.cc | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) (limited to 'compiler/optimizing/graph_checker.cc') 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()))); + } } } -- cgit v1.2.3-59-g8ed1b