diff --git a/src/mapleall/maple_me/include/ssa_mir_nodes.h b/src/mapleall/maple_me/include/ssa_mir_nodes.h index a8a42987420a3aaa2fa842d31c5cf79374f770c0..6bb9fc9eab4d09c1231cd1c5eef4c3b58ff97c39 100644 --- a/src/mapleall/maple_me/include/ssa_mir_nodes.h +++ b/src/mapleall/maple_me/include/ssa_mir_nodes.h @@ -488,6 +488,8 @@ class SSANode : public BaseNode { return *(GetSSAVar()->GetOst()->GetMIRSymbol()); } + virtual BaseNode *GetNoSSANode() = 0; + protected: VersionSt *ssaVar = nullptr; }; @@ -514,6 +516,11 @@ class AddrofSSANode : public SSANode { FieldID GetFieldID() const { return addrofNode->GetFieldID(); } + + BaseNode *GetNoSSANode() override { + return addrofNode; + } + private: AddrofNode *addrofNode; }; @@ -547,6 +554,11 @@ class IreadSSANode : public SSANode { void SetOpnd(BaseNode *node, size_t i = 0) override { ireadNode->SetOpnd(node, i); } + + BaseNode *GetNoSSANode() override { + return ireadNode; + } + private: IreadNode *ireadNode; }; @@ -568,6 +580,11 @@ class RegreadSSANode : public SSANode { PregIdx GetRegIdx() const { return regreadNode->GetRegIdx(); } + + BaseNode *GetNoSSANode() override { + return regreadNode; + } + private: RegreadNode *regreadNode; }; diff --git a/src/mapleall/maple_me/src/func_emit.cpp b/src/mapleall/maple_me/src/func_emit.cpp index 6404100a72cd492767bf2602b4ee46f79ca43f05..72ee655528ee077b5aa6d660b71862c741e126d4 100644 --- a/src/mapleall/maple_me/src/func_emit.cpp +++ b/src/mapleall/maple_me/src/func_emit.cpp @@ -14,6 +14,7 @@ */ #include "func_emit.h" #include "mir_function.h" +#include "ssa_mir_nodes.h" namespace maple { void FuncEmit::EmitLabelForBB(MIRFunction &func, BB &bb) const { @@ -48,8 +49,23 @@ void FuncEmit::EmitLabelForBB(MIRFunction &func, BB &bb) const { } } -static void ConvertMaydassign(BB &bb) { +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) { + auto *retOpnd = ConvertSSANode(node->Opnd(opndId)); + node->SetOpnd(retOpnd, opndId); + } + return node; +} + +static void ConvertStmt(BB &bb) { for (auto &stmt : bb.GetStmtNodes()) { + ConvertSSANode(&stmt); if (stmt.GetOpCode() == OP_maydassign) { stmt.SetOpCode(OP_dassign); } @@ -65,7 +81,7 @@ void FuncEmit::EmitBeforeHSSA(MIRFunction &func, const MapleVector &bbList) if (bb == nullptr) { continue; } - ConvertMaydassign(*bb); + ConvertStmt(*bb); if (bb->GetBBLabel() != 0) { EmitLabelForBB(func, *bb); }