diff --git a/src/mapleall/maple_me/src/me_cfg.cpp b/src/mapleall/maple_me/src/me_cfg.cpp index 4b3547b7a7de2270005b14299cfccb6f4bcccd05..1b3252d9e9e0778081f79678597c4869ab28ab2c 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); } diff --git a/src/mapleall/maple_me/src/pme_mir_lower.cpp b/src/mapleall/maple_me/src/pme_mir_lower.cpp index 048ff7464adc984250344ae1ced00b04a7df7101..fdb427c437edac00a58ce717b1017bc4d883e334 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;