From f15fe38756476bb83c3909bba319aa6e5a009848 Mon Sep 17 00:00:00 2001 From: binaryfz Date: Sat, 29 Aug 2020 09:39:08 +0800 Subject: [PATCH] [FE]enable type infer UT --- src/mplfe/common/include/feir_type_infer.h | 6 +- src/mplfe/common/include/feir_var.h | 2 +- .../common/include/feir_var_type_scatter.h | 4 + src/mplfe/common/src/feir_type.cpp | 2 +- src/mplfe/common/src/feir_type_infer.cpp | 11 +- src/mplfe/test/feir_stmt_loc_test.cpp | 2 - src/mplfe/test/feir_type_infer_test.cpp | 124 +++++++++--------- 7 files changed, 76 insertions(+), 75 deletions(-) diff --git a/src/mplfe/common/include/feir_type_infer.h b/src/mplfe/common/include/feir_type_infer.h index 6ed6b82c7a..a4f95b8b54 100644 --- a/src/mplfe/common/include/feir_type_infer.h +++ b/src/mplfe/common/include/feir_type_infer.h @@ -52,12 +52,12 @@ class FEIRTypeMergeHelper { class FEIRTypeInfer { public: - FEIRTypeInfer(MIRSrcLang argSrcLang, const std::map> &argMapDefUse); + FEIRTypeInfer(MIRSrcLang argSrcLang, const std::map> &argMapDefUse); ~FEIRTypeInfer() = default; void LoadTypeDefault(); void Reset(); UniqueFEIRType GetTypeForVarUse(const UniqueFEIRVar &varUse); - UniqueFEIRType GetTypeForVarDef(const UniqueFEIRVar &varDef); + UniqueFEIRType GetTypeForVarDef(UniqueFEIRVar &varDef); UniqueFEIRType GetTypeByTransForVarUse(const UniqueFEIRVar &varUse); void ProcessVarDef(UniqueFEIRVar &varDef); @@ -65,7 +65,7 @@ class FEIRTypeInfer { MIRSrcLang srcLang; UniqueFEIRType typeDefault; FEIRTypeMergeHelper mergeHelper; - const std::map> &mapDefUse; + const std::map> &mapDefUse; std::set visitVars; bool withCircle = false; bool first = false; diff --git a/src/mplfe/common/include/feir_var.h b/src/mplfe/common/include/feir_var.h index 050abc84a7..751166e569 100644 --- a/src/mplfe/common/include/feir_var.h +++ b/src/mplfe/common/include/feir_var.h @@ -36,7 +36,7 @@ class FEIRVarTrans { FEIRVarTrans(FEIRVarTransKind argKind, std::unique_ptr &argVar, uint8 dimDelta); ~FEIRVarTrans() = default; UniqueFEIRType GetType(const UniqueFEIRType &type, PrimType primType = PTY_ref, bool usePtr = true); - const std::unique_ptr &GetVar() const { + std::unique_ptr &GetVar() const { return var; } diff --git a/src/mplfe/common/include/feir_var_type_scatter.h b/src/mplfe/common/include/feir_var_type_scatter.h index a4ff0573a7..e8e02697b0 100644 --- a/src/mplfe/common/include/feir_var_type_scatter.h +++ b/src/mplfe/common/include/feir_var_type_scatter.h @@ -28,6 +28,10 @@ class FEIRVarTypeScatter : public FEIRVar { return scatterTypes; } + const UniqueFEIRVar &GetVar() const { + return var; + } + protected: std::string GetNameImpl(const MIRType &mirType) const override; std::string GetNameRawImpl() const override; diff --git a/src/mplfe/common/src/feir_type.cpp b/src/mplfe/common/src/feir_type.cpp index c4c3c6e1f4..98edb5b066 100644 --- a/src/mplfe/common/src/feir_type.cpp +++ b/src/mplfe/common/src/feir_type.cpp @@ -326,7 +326,7 @@ MIRType *FEIRTypeByName::GenerateMIRTypeImpl(bool usePtr, PrimType ptyPtr) const } bool FEIRTypeByName::IsEqualToImpl(const FEIRType &argType) const { - if (!FEIRTypeDefault::IsEqualTo(argType)) { + if (!FEIRTypeDefault::IsEqualToImpl(argType)) { return false; } const FEIRTypeByName &argTypeName = static_cast(argType); diff --git a/src/mplfe/common/src/feir_type_infer.cpp b/src/mplfe/common/src/feir_type_infer.cpp index 08ab91d64b..5aaf51f459 100644 --- a/src/mplfe/common/src/feir_type_infer.cpp +++ b/src/mplfe/common/src/feir_type_infer.cpp @@ -145,7 +145,7 @@ bool FEIRTypeMergeHelper::MergeType(UniqueFEIRType &typeDst, const UniqueFEIRTyp // ---------- FEIRTypeInfer ---------- FEIRTypeInfer::FEIRTypeInfer(MIRSrcLang argSrcLang, - const std::map> &argMapDefUse) + const std::map> &argMapDefUse) : srcLang(argSrcLang), mapDefUse(argMapDefUse) { LoadTypeDefault(); @@ -193,7 +193,7 @@ UniqueFEIRType FEIRTypeInfer::GetTypeForVarUse(const UniqueFEIRVar &varUse) { } } -UniqueFEIRType FEIRTypeInfer::GetTypeForVarDef(const UniqueFEIRVar &varDef) { +UniqueFEIRType FEIRTypeInfer::GetTypeForVarDef(UniqueFEIRVar &varDef) { CHECK_NULL_FATAL(varDef); if (varDef->GetType()->IsPreciseRefType()) { return varDef->GetType()->Clone(); @@ -254,8 +254,9 @@ void FEIRTypeInfer::ProcessVarDef(UniqueFEIRVar &varDef) { return; } if (useTypes.size() > 0) { - UniqueFEIRVar varNew = std::make_unique(UniqueFEIRVar(varDef->Clone())); - FEIRVarTypeScatter *ptrVarNew = static_cast(varNew.get()); + std::unique_ptr varNew = + std::make_unique(static_cast(varDef->Clone())); + FEIRVarTypeScatter *ptrVarNew = varNew.get(); varDef->SetType(varDef->GetType()->Clone()); for (const FEIRTypeKey &typeKey : useTypes) { ptrVarNew->AddScatterType(typeKey.GetType()); @@ -268,7 +269,7 @@ UniqueFEIRType FEIRTypeInfer::GetTypeByTransForVarUse(const UniqueFEIRVar &varUs CHECK_NULL_FATAL(varUse); FEIRVarTrans *ptrVarUseTrans = varUse->GetTrans().get(); CHECK_NULL_FATAL(ptrVarUseTrans); - const UniqueFEIRVar &varDef = ptrVarUseTrans->GetVar(); + UniqueFEIRVar &varDef = ptrVarUseTrans->GetVar(); CHECK_NULL_FATAL(varDef); UniqueFEIRType defType = GetTypeForVarDef(varDef); if (defType != nullptr) { diff --git a/src/mplfe/test/feir_stmt_loc_test.cpp b/src/mplfe/test/feir_stmt_loc_test.cpp index d9128c557d..8b9dd91acd 100644 --- a/src/mplfe/test/feir_stmt_loc_test.cpp +++ b/src/mplfe/test/feir_stmt_loc_test.cpp @@ -25,8 +25,6 @@ #include "feir_var_reg.h" #include "feir_var_name.h" #include "feir_test_base.h" -#define protected public -#define private public namespace maple { class FEIRStmtLOCTest : public FEIRTestBase { public: diff --git a/src/mplfe/test/feir_type_infer_test.cpp b/src/mplfe/test/feir_type_infer_test.cpp index dcd4c16613..c11566205f 100644 --- a/src/mplfe/test/feir_type_infer_test.cpp +++ b/src/mplfe/test/feir_type_infer_test.cpp @@ -23,6 +23,13 @@ #include "feir_builder.h" #include "feir_var_type_scatter.h" #include "feir_dfg.h" +#include "namemangler.h" + +#define protected public +#define private public +#include "fe_type_hierarchy.h" +#undef protected +#undef private namespace maple { class FEIRTypeHelperTest : public testing::Test, public RedirectBuffer { @@ -33,13 +40,16 @@ class FEIRTypeHelperTest : public testing::Test, public RedirectBuffer { class FEIRTypeInferTest : public testing::Test, public RedirectBuffer { public: - FEIRTypeInfer typeInfer; - FEIRTypeInferTest() - : typeInfer(kSrcLangJava) {} + FEIRTypeInferTest() {}; ~FEIRTypeInferTest() = default; }; TEST_F(FEIRTypeHelperTest, MergeType_Parent) { + GStrIdx type0StrIdx = + GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(namemangler::EncodeName("Ljava/lang/Integer;")); + GStrIdx type1StrIdx = + GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(namemangler::EncodeName("Ljava/lang/Number;")); + FETypeHierarchy::GetInstance().AddParentChildRelation(type1StrIdx, type0StrIdx); UniqueFEIRType type0 = FEIRTypeHelper::CreateTypeByJavaName("Ljava/lang/Integer;", false, false); UniqueFEIRType type1 = FEIRTypeHelper::CreateTypeByJavaName("Ljava/lang/Number;", false, false); UniqueFEIRType type2 = FEIRTypeHelper::CreateTypeByJavaName("Ljava/lang/String;", false, false); @@ -121,8 +131,6 @@ TEST_F(FEIRTypeHelperTest, MergeType_Child) { // var0 -> var1 // TEST_F(FEIRTypeInferTest, Test1) { - typeInfer.Reset(); - std::map> mapUseDef; std::map> mapDefUse; UniqueFEIRVar var0 = FEIRBuilder::CreateVarReg(0, PTY_ref, false); UniqueFEIRVar var1 = FEIRBuilder::CreateVarReg(0, PTY_ref, false); @@ -130,15 +138,15 @@ TEST_F(FEIRTypeInferTest, Test1) { UniqueFEIRType type1 = FEIRTypeHelper::CreateTypeByJavaName("Ljava/lang/Object;", false, true); var0->SetType(type0->Clone()); var1->SetType(type1->Clone()); - mapUseDef[&var1].insert(&var0); mapDefUse[&var0].insert(&var1); - typeInfer.SetMapUseDef(&mapUseDef); - typeInfer.SetMapDefUse(&mapDefUse); - EXPECT_EQ(typeInfer.GetTypeForVarUse(&var1)->IsEqualTo(type1), true); - typeInfer.ProcessVarDef(&var0); + + std::unique_ptr typeInfer = std::make_unique(kSrcLangJava, mapDefUse); + EXPECT_EQ(typeInfer->GetTypeForVarUse(var1)->IsEqualTo(type1), true); + EXPECT_EQ(typeInfer->GetTypeForVarDef(var0)->IsEqualTo(type0), true); + typeInfer->ProcessVarDef(var0); EXPECT_EQ(var0->GetKind(), FEIRVarKind::kFEIRVarTypeScatter); FEIRVarTypeScatter *ptrVar0 = static_cast(var0.get()); - EXPECT_EQ(ptrVar0->GetType()->IsEqualTo(type0), true); + EXPECT_EQ(ptrVar0->GetVar()->GetType()->IsEqualTo(type0), true); EXPECT_EQ(ptrVar0->GetScatterTypes().size(), 1); EXPECT_NE(ptrVar0->GetScatterTypes().find(FEIRTypeKey(type1)), ptrVar0->GetScatterTypes().end()); } @@ -155,8 +163,6 @@ TEST_F(FEIRTypeInferTest, Test1) { // var2 -> var3 // TEST_F(FEIRTypeInferTest, Test2) { - typeInfer.Reset(); - std::map> mapUseDef; std::map> mapDefUse; UniqueFEIRVar var0 = FEIRBuilder::CreateVarReg(0, PTY_ref, false); UniqueFEIRVar var1 = FEIRBuilder::CreateVarReg(0, PTY_ref, false); @@ -164,23 +170,21 @@ TEST_F(FEIRTypeInferTest, Test2) { UniqueFEIRVar var3 = FEIRBuilder::CreateVarReg(1, PTY_ref, false); UniqueFEIRType type0 = FEIRTypeHelper::CreateTypeByJavaName("Ljava/lang/String;", false, true); UniqueFEIRType type3 = FEIRTypeHelper::CreateTypeByJavaName("Ljava/lang/Object;", false, true); - UniqueFEIRVarTrans trans0 = std::make_unique(FEIRVarTransKind::kFEIRVarTransDirect, &var1); - UniqueFEIRVarTrans trans1 = std::make_unique(FEIRVarTransKind::kFEIRVarTransDirect, &var2); + UniqueFEIRVarTrans trans0 = std::make_unique(FEIRVarTransKind::kFEIRVarTransDirect, var1); + UniqueFEIRVarTrans trans1 = std::make_unique(FEIRVarTransKind::kFEIRVarTransDirect, var2); var1->SetTrans(std::move(trans1)); var2->SetTrans(std::move(trans0)); var0->SetType(type0->Clone()); var3->SetType(type3->Clone()); - mapUseDef[&var1].insert(&var0); - mapUseDef[&var3].insert(&var2); mapDefUse[&var0].insert(&var1); mapDefUse[&var2].insert(&var3); - typeInfer.SetMapUseDef(&mapUseDef); - typeInfer.SetMapDefUse(&mapDefUse); - EXPECT_EQ(typeInfer.GetTypeForVarUse(&var1)->IsEqualTo(type3), true); - typeInfer.Reset(); - EXPECT_EQ(typeInfer.GetTypeForVarUse(&var3)->IsEqualTo(type3), true); - typeInfer.ProcessVarDef(&var0); - typeInfer.ProcessVarDef(&var2); + std::unique_ptr typeInfer = std::make_unique(kSrcLangJava, mapDefUse); + EXPECT_EQ(typeInfer->GetTypeForVarUse(var1)->IsEqualTo(type3), true); + typeInfer->Reset(); + EXPECT_EQ(typeInfer->GetTypeForVarUse(var3)->IsEqualTo(type3), true); + + typeInfer->ProcessVarDef(var0); + typeInfer->ProcessVarDef(var2); EXPECT_EQ(var0->GetKind(), FEIRVarKind::kFEIRVarTypeScatter); EXPECT_EQ(var2->GetKind(), FEIRVarKind::kFEIRVarReg); } @@ -194,8 +198,6 @@ TEST_F(FEIRTypeInferTest, Test2) { // var3 -> var2 // var4 -> var2 TEST_F(FEIRTypeInferTest, Test3) { - typeInfer.Reset(); - std::map> mapUseDef; std::map> mapDefUse; UniqueFEIRVar var0 = FEIRBuilder::CreateVarReg(0, PTY_ref, false); UniqueFEIRVar var1 = FEIRBuilder::CreateVarReg(0, PTY_ref, false); @@ -204,30 +206,29 @@ TEST_F(FEIRTypeInferTest, Test3) { UniqueFEIRVar var4 = FEIRBuilder::CreateVarReg(1, PTY_ref, false); UniqueFEIRVar var5 = FEIRBuilder::CreateVarReg(0, PTY_ref, false); UniqueFEIRType type0 = FEIRTypeHelper::CreateTypeByJavaName("Ljava/lang/String;", false, true); - UniqueFEIRVarTrans trans1_2 = std::make_unique(FEIRVarTransKind::kFEIRVarTransDirect, &var1); - UniqueFEIRVarTrans trans2_1 = std::make_unique(FEIRVarTransKind::kFEIRVarTransDirect, &var2); - UniqueFEIRVarTrans trans4_5 = std::make_unique(FEIRVarTransKind::kFEIRVarTransDirect, &var4); - UniqueFEIRVarTrans trans5_4 = std::make_unique(FEIRVarTransKind::kFEIRVarTransDirect, &var5); - var1->SetTrans(std::move(trans2_1)); - var2->SetTrans(std::move(trans1_2)); - var4->SetTrans(std::move(trans5_4)); - var5->SetTrans(std::move(trans4_5)); + UniqueFEIRVarTrans transFrom1To2 = std::make_unique(FEIRVarTransKind::kFEIRVarTransDirect, var1); + UniqueFEIRVarTrans transFrom2To1 = std::make_unique(FEIRVarTransKind::kFEIRVarTransDirect, var2); + UniqueFEIRVarTrans transFrom4To5 = std::make_unique(FEIRVarTransKind::kFEIRVarTransDirect, var4); + UniqueFEIRVarTrans transFrom5To4 = std::make_unique(FEIRVarTransKind::kFEIRVarTransDirect, var5); + var1->SetTrans(std::move(transFrom2To1)); + var2->SetTrans(std::move(transFrom1To2)); + var4->SetTrans(std::move(transFrom5To4)); + var5->SetTrans(std::move(transFrom4To5)); var3->SetType(type0->Clone()); - mapUseDef[&var1].insert(&var0); - mapUseDef[&var1].insert(&var5); - mapUseDef[&var3].insert(&var2); - mapUseDef[&var4].insert(&var2); - FEIRDFG::CalculateDefUseByUseDef(mapDefUse, mapUseDef); - typeInfer.SetMapUseDef(&mapUseDef); - typeInfer.SetMapDefUse(&mapDefUse); - EXPECT_EQ(typeInfer.GetTypeForVarUse(&var1)->IsEqualTo(type0), true); - typeInfer.Reset(); - EXPECT_EQ(typeInfer.GetTypeForVarUse(&var3)->IsEqualTo(type0), true); - typeInfer.Reset(); - EXPECT_EQ(typeInfer.GetTypeForVarUse(&var4)->IsEqualTo(type0), true); - typeInfer.ProcessVarDef(&var0); - typeInfer.ProcessVarDef(&var2); - typeInfer.ProcessVarDef(&var5); + mapDefUse[&var0].insert(&var1); + mapDefUse[&var5].insert(&var1); + mapDefUse[&var2].insert(&var3); + mapDefUse[&var2].insert(&var4); + std::unique_ptr typeInfer = std::make_unique(kSrcLangJava, mapDefUse); + typeInfer->Reset(); + EXPECT_EQ(typeInfer->GetTypeForVarUse(var1)->IsEqualTo(type0), true); + typeInfer->Reset(); + EXPECT_EQ(typeInfer->GetTypeForVarUse(var3)->IsEqualTo(type0), true); + typeInfer->Reset(); + EXPECT_EQ(typeInfer->GetTypeForVarUse(var4)->IsEqualTo(type0), true); + typeInfer->ProcessVarDef(var0); + typeInfer->ProcessVarDef(var2); + typeInfer->ProcessVarDef(var5); EXPECT_EQ(var0->GetKind(), FEIRVarKind::kFEIRVarReg); EXPECT_EQ(var2->GetKind(), FEIRVarKind::kFEIRVarReg); EXPECT_EQ(var5->GetKind(), FEIRVarKind::kFEIRVarReg); @@ -245,8 +246,6 @@ TEST_F(FEIRTypeInferTest, Test3) { // var3 -> var2 // TEST_F(FEIRTypeInferTest, Test4) { - typeInfer.Reset(); - std::map> mapUseDef; std::map> mapDefUse; UniqueFEIRVar var0 = FEIRBuilder::CreateVarReg(0, PTY_ref, false); UniqueFEIRVar var1 = FEIRBuilder::CreateVarReg(0, PTY_ref, false); @@ -254,19 +253,18 @@ TEST_F(FEIRTypeInferTest, Test4) { UniqueFEIRVar var3 = FEIRBuilder::CreateVarReg(1, PTY_ref, false); UniqueFEIRType type0 = FEIRTypeHelper::CreateTypeByJavaName("Ljava/lang/Object;", false, true); UniqueFEIRType type1 = FEIRTypeHelper::CreateTypeByJavaName("[Ljava/lang/Object;", false, true); - UniqueFEIRVarTrans trans1_2 = std::make_unique(FEIRVarTransKind::kFEIRVarTransArrayDimDecr, &var1); - UniqueFEIRVarTrans trans2_1 = std::make_unique(FEIRVarTransKind::kFEIRVarTransArrayDimIncr, &var2); + UniqueFEIRVarTrans transFrom1To2 = std::make_unique(FEIRVarTransKind::kFEIRVarTransArrayDimDecr, var1); + UniqueFEIRVarTrans transFrom2To1 = std::make_unique(FEIRVarTransKind::kFEIRVarTransArrayDimIncr, var2); var3->SetType(type0->Clone()); - var1->SetTrans(std::move(trans2_1)); - var2->SetTrans(std::move(trans1_2)); - mapUseDef[&var1].insert(&var0); - mapUseDef[&var3].insert(&var2); - FEIRDFG::CalculateDefUseByUseDef(mapDefUse, mapUseDef); - typeInfer.SetMapUseDef(&mapUseDef); - typeInfer.SetMapDefUse(&mapDefUse); - EXPECT_EQ(typeInfer.GetTypeForVarUse(&var1)->IsEqualTo(type1), true); - typeInfer.ProcessVarDef(&var0); - typeInfer.ProcessVarDef(&var2); + var1->SetTrans(std::move(transFrom2To1)); + var2->SetTrans(std::move(transFrom1To2)); + mapDefUse[&var0].insert(&var1); + mapDefUse[&var2].insert(&var3); + std::unique_ptr typeInfer = std::make_unique(kSrcLangJava, mapDefUse); + typeInfer->Reset(); + EXPECT_EQ(typeInfer->GetTypeForVarUse(var1)->IsEqualTo(type1), true); + typeInfer->ProcessVarDef(var0); + typeInfer->ProcessVarDef(var2); EXPECT_EQ(var0->GetType()->IsEqualTo(type1), true); EXPECT_EQ(var2->GetType()->IsEqualTo(type0), true); } -- Gitee