From 9c264137c3e6af5a480b3e53f0a5ea029525831f Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Thu, 20 Oct 2022 13:27:44 -0700 Subject: [PATCH 1/3] Put back code to delete identity assignments in CreateBasicBlocks() --- src/mapleall/maple_me/src/me_cfg.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/mapleall/maple_me/src/me_cfg.cpp b/src/mapleall/maple_me/src/me_cfg.cpp index 4b3547b7a7..1b3252d9e9 100644 --- a/src/mapleall/maple_me/src/me_cfg.cpp +++ b/src/mapleall/maple_me/src/me_cfg.cpp @@ -1309,6 +1309,14 @@ void MeCFG::CreateBasicBlocks() { } case OP_dassign: { DassignNode *dass = static_cast(stmt); + // delete identity assignments inserted by LFO + if (dass->GetRHS()->GetOpCode() == OP_dread) { + DreadNode *dread = static_cast(dass->GetRHS()); + if (dass->GetStIdx() == dread->GetStIdx() && dass->GetFieldID() == dread->GetFieldID()) { + func.CurFunction()->GetBody()->RemoveStmt(stmt); + break; + } + } if (curBB->IsEmpty()) { curBB->SetFirst(stmt); } -- Gitee From 24d0504bf60985e4546934c2913f69bb6942be4b Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Thu, 20 Oct 2022 13:27:44 -0700 Subject: [PATCH 2/3] Put back code to delete identity assignments in CreateBasicBlocks() --- src/mapleall/maple_me/src/me_cfg.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/mapleall/maple_me/src/me_cfg.cpp b/src/mapleall/maple_me/src/me_cfg.cpp index 4b3547b7a7..1b3252d9e9 100644 --- a/src/mapleall/maple_me/src/me_cfg.cpp +++ b/src/mapleall/maple_me/src/me_cfg.cpp @@ -1309,6 +1309,14 @@ void MeCFG::CreateBasicBlocks() { } case OP_dassign: { DassignNode *dass = static_cast(stmt); + // delete identity assignments inserted by LFO + if (dass->GetRHS()->GetOpCode() == OP_dread) { + DreadNode *dread = static_cast(dass->GetRHS()); + if (dass->GetStIdx() == dread->GetStIdx() && dass->GetFieldID() == dread->GetFieldID()) { + func.CurFunction()->GetBody()->RemoveStmt(stmt); + break; + } + } if (curBB->IsEmpty()) { curBB->SetFirst(stmt); } -- Gitee From 9308b6e3781c37f111f52f5f485864066161592c Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Tue, 25 Oct 2022 00:44:02 -0700 Subject: [PATCH 3/3] Made avoiding critical edges in the lowering of if-then-else conditioned on having profile data --- src/mapleall/maple_me/src/pme_mir_lower.cpp | 86 +++++++++++++++++++-- 1 file changed, 80 insertions(+), 6 deletions(-) diff --git a/src/mapleall/maple_me/src/pme_mir_lower.cpp b/src/mapleall/maple_me/src/pme_mir_lower.cpp index 048ff7464a..fdb427c437 100644 --- a/src/mapleall/maple_me/src/pme_mir_lower.cpp +++ b/src/mapleall/maple_me/src/pme_mir_lower.cpp @@ -121,6 +121,80 @@ BlockNode *PreMeMIRLower::LowerIfStmt(IfStmtNode &ifstmt, bool recursive) { if (GetFuncProfData()) { GetFuncProfData()->CopyStmtFreq(evalstmt->GetStmtID(), ifstmt.GetStmtID()); } + } else if (elseempty && !GetFuncProfData()) { + // brfalse + // + // label + CondGotoNode *brfalsestmt = mirModule.CurFuncCodeMemPool()->New(OP_brfalse); + brfalsestmt->SetOpnd(ifstmt.Opnd(), 0); + brfalsestmt->SetSrcPos(ifstmt.GetSrcPos()); + LabelIdx endlabelidx = mirFunc->GetLabelTab()->CreateLabelWithPrefix('e'); + mirFunc->GetLabelTab()->AddToStringLabelMap(endlabelidx); + if (canRaiseBack) { + preMeFunc->SetIfLabelCreatedByPreMe(endlabelidx); + } + PreMeIfInfo *ifInfo = preMeFunc->pmemp->New(); + brfalsestmt->SetOffset(endlabelidx); + blk->AddStatement(brfalsestmt); + // set stmtfreqs + if (GetFuncProfData()) { + GetFuncProfData()->CopyStmtFreq(brfalsestmt->GetStmtID(), ifstmt.GetStmtID()); + } + blk->AppendStatementsFromBlock(*ifstmt.GetThenPart()); + + LabelNode *labstmt = mirModule.CurFuncCodeMemPool()->New(); + labstmt->SetLabelIdx(endlabelidx); + ifInfo->endLabel = endlabelidx; + if (canRaiseBack) { + preMeFunc->label2IfInfo.insert(std::make_pair(endlabelidx, ifInfo)); + } + SrcPosition pos = func->GetMirFunc()->GetScope()->GetScopeEndPos(ifstmt.GetThenPart()->GetSrcPos()); + labstmt->SetSrcPos(pos); + blk->AddStatement(labstmt); + // set stmtfreqs + if (GetFuncProfData()) { + ASSERT(GetFuncProfData()->GetStmtFreq(ifstmt.GetThenPart()->GetStmtID()) >= 0, "sanity check"); + int64_t freq = GetFuncProfData()->GetStmtFreq(ifstmt.GetStmtID()) - + GetFuncProfData()->GetStmtFreq(ifstmt.GetThenPart()->GetStmtID()); + GetFuncProfData()->SetStmtFreq(labstmt->GetStmtID(), freq); + } + } else if (thenempty && !GetFuncProfData()) { + // brtrue + // + // label + CondGotoNode *brtruestmt = mirModule.CurFuncCodeMemPool()->New(OP_brtrue); + brtruestmt->SetOpnd(ifstmt.Opnd(), 0); + brtruestmt->SetSrcPos(ifstmt.GetSrcPos()); + LabelIdx endlabelidx = mirFunc->GetLabelTab()->CreateLabelWithPrefix('e'); + if (canRaiseBack) { + preMeFunc->SetIfLabelCreatedByPreMe(endlabelidx); + } + PreMeIfInfo *ifInfo = preMeFunc->pmemp->New(); + mirFunc->GetLabelTab()->AddToStringLabelMap(endlabelidx); + brtruestmt->SetOffset(endlabelidx); + blk->AddStatement(brtruestmt); + + // set stmtfreqs + if (GetFuncProfData()) { + GetFuncProfData()->CopyStmtFreq(brtruestmt->GetStmtID(), ifstmt.GetStmtID()); + } + blk->AppendStatementsFromBlock(*ifstmt.GetElsePart()); + LabelNode *labstmt = mirModule.CurFuncCodeMemPool()->New(); + labstmt->SetLabelIdx(endlabelidx); + ifInfo->endLabel = endlabelidx; + if (canRaiseBack) { + preMeFunc->label2IfInfo.insert(std::make_pair(endlabelidx, ifInfo)); + } + SrcPosition pos = func->GetMirFunc()->GetScope()->GetScopeEndPos(ifstmt.GetElsePart()->GetSrcPos()); + labstmt->SetSrcPos(pos); + blk->AddStatement(labstmt); + // set stmtfreqs + if (GetFuncProfData()) { + ASSERT(GetFuncProfData()->GetStmtFreq(ifstmt.GetElsePart()->GetStmtID()) > 0, "sanity check"); + int64_t freq = GetFuncProfData()->GetStmtFreq(ifstmt.GetStmtID()) - + GetFuncProfData()->GetStmtFreq(ifstmt.GetElsePart()->GetStmtID()); + GetFuncProfData()->SetStmtFreq(labstmt->GetStmtID(), freq); + } } else { // brfalse // @@ -213,13 +287,13 @@ BlockNode *PreMeMIRLower::LowerIfStmt(IfStmtNode &ifstmt, bool recursive) { } ifInfo->endLabel = endlabelidx; } - // generate extra label to avoid critical edge - LabelIdx extraLabelIdx = mirFunc->GetLabelTab()->CreateLabelWithPrefix('x'); - preMeFunc->SetIfLabelCreatedByPreMe(extraLabelIdx); - LabelNode *extraLabelNode = mirbuilder->CreateStmtLabel(extraLabelIdx); - blk->AddStatement(extraLabelNode); - // set stmtfreqs if (GetFuncProfData()) { + // generate extra label to avoid critical edge + LabelIdx extraLabelIdx = mirFunc->GetLabelTab()->CreateLabelWithPrefix('x'); + preMeFunc->SetIfLabelCreatedByPreMe(extraLabelIdx); + LabelNode *extraLabelNode = mirbuilder->CreateStmtLabel(extraLabelIdx); + blk->AddStatement(extraLabelNode); + // set stmtfreqs GetFuncProfData()->CopyStmtFreq(extraLabelNode->GetStmtID(), ifstmt.GetStmtID()); } return blk; -- Gitee