diff --git a/src/mapleall/maple_me/src/cfg_opt.cpp b/src/mapleall/maple_me/src/cfg_opt.cpp index 3233d96ccff5b028da73634cc24628539ce161dd..d21d179ca3e0c37c44ec9267f46120e3a0e0cc1d 100644 --- a/src/mapleall/maple_me/src/cfg_opt.cpp +++ b/src/mapleall/maple_me/src/cfg_opt.cpp @@ -88,6 +88,7 @@ void CfgOpt::PropagateBB(BB &bb, BB *trueBranchBB, BB *falseBranchBB) { } break; } + case kBBGoto: case kBBFallthru: { if (!IsShortCircuitBB(predBB->GetBBLabel())) { continue; diff --git a/src/mapleall/maple_me/src/func_emit.cpp b/src/mapleall/maple_me/src/func_emit.cpp index aa92b3b82dd74c580ef2f770d4b2e358b5ef2663..eeba1414b9703ab0298c7cc77220ff11051da114 100644 --- a/src/mapleall/maple_me/src/func_emit.cpp +++ b/src/mapleall/maple_me/src/func_emit.cpp @@ -53,9 +53,6 @@ static BaseNode *ConvertSSANode(BaseNode *node) { if (node->IsSSANode()) { node = static_cast(node)->GetNoSSANode(); } - if (node->IsLeaf()) { - return node; - } for (uint32 opndId = 0; opndId < node->GetNumOpnds(); ++opndId) { node->SetOpnd(ConvertSSANode(node->Opnd(opndId)), opndId); } @@ -88,8 +85,9 @@ void FuncEmit::EmitBeforeHSSA(MIRFunction &func, const MapleVector &bbList) if (func.GetBody()->GetFirst() == nullptr) { func.GetBody()->SetFirst(bb->GetStmtNodes().begin().d()); } - if (lastStmt != nullptr) { - bb->GetStmtNodes().push_front(lastStmt); + if (lastStmt != nullptr) { // link basic blocks + bb->GetFirst().SetPrev(lastStmt); + lastStmt->SetNext(&bb->GetFirst()); } lastStmt = bb->GetStmtNodes().rbegin().base().d(); } diff --git a/src/mapleall/maple_me/src/lfo_iv_canon.cpp b/src/mapleall/maple_me/src/lfo_iv_canon.cpp index 8a76b352af05927478d4da33b9127dcf7bfb771b..2b2a66717f67ab9a3cabaa56db15cc1bf5071ac8 100644 --- a/src/mapleall/maple_me/src/lfo_iv_canon.cpp +++ b/src/mapleall/maple_me/src/lfo_iv_canon.cpp @@ -32,6 +32,9 @@ bool IVCanon::ResolveExprValue(MeExpr *x, ScalarMeExpr *phiLHS) { case kMeOpConst: return IsPrimitiveInteger(x->GetPrimType()); case kMeOpVar: case kMeOpReg:{ + if (x->IsVolatile()) { + return false; + } if (x == phiLHS) { return true; }