diff --git a/build/core/maple_test.mk b/build/core/maple_test.mk index 9a0602b436ca45b0985ebe21265ae9667341247b..a1f421df8c07d3e7b3ab8d7102292f07f48ca228 100644 --- a/build/core/maple_test.mk +++ b/build/core/maple_test.mk @@ -15,3 +15,4 @@ clean: @rm -f *.groots.txt @rm -f *.primordials.txt @rm -rf comb.log + @rm -rf *.muid diff --git a/doc/Programming_Specifications.md b/doc/Programming_Specifications.md index dc13e022b137ba1fd1c32fbd0d27395c0fa4f852..826f0d99464e8a6f6e07e80e93ab1720a692d320 100644 --- a/doc/Programming_Specifications.md +++ b/doc/Programming_Specifications.md @@ -557,7 +557,7 @@ default: // Bad: default 未缩进 // 假设下面第一行已经不满足行宽要求 ```cpp if (currentValue > threshold && - someConditionsion) { + someConditionsion) { DoSomething(); ... } @@ -612,10 +612,14 @@ const int rank[] = { ``` ## 指针与引用 -### 建议3.12.1 指针类型"`*`"跟随变量名,并与类型之间有一个空格 - +### 建议3.12.1 指针类型"`*`"跟随变量名或者类型,不要两边都留有或者都没有空格 +指针命名: `*`靠左靠右都可以,但是不要两边都有或者都没有空格。 ```cpp +int* p = nullptr; // Good int *p = nullptr; // Good + +int*p = nullptr; // Bad +int * p = nullptr; // Bad ``` 例外:当变量被 const 修饰时,"`*`" 无法跟随变量,此时也不要跟随类型。 @@ -623,12 +627,16 @@ int *p = nullptr; // Good char * const VERSION = "V100"; ``` -### 建议3.12.2 引用类型"`&`"跟随变量名,并与类型之间有一个空格 - +### 建议3.12.2 引用类型"`&`"跟随变量名或者类型,不要两边都留有或者都没有空格 +引用命名:`&`靠左靠右都可以,但是不要两边都有或者都没有空格。 ```cpp int i = 8; +int& p = i; // Good int &p = i; // Good + +int & p = i; // Bad +int&p = i; // Bad ``` ## 编译预处理 diff --git a/src/bin/jbc2mpl b/src/bin/jbc2mpl index 51eaf158335be60db30f8dc54f1d816e7073d01a..285173f5496087782ae9ddb3513f39639124660b 100755 Binary files a/src/bin/jbc2mpl and b/src/bin/jbc2mpl differ diff --git a/src/bin/maple b/src/bin/maple index 3c894dc2065639965f7246dbd6880f6dba0d8731..cb9e09590c4f92b75665d57efb2a934e236a38cc 100755 Binary files a/src/bin/maple and b/src/bin/maple differ diff --git a/src/bin/mplcg b/src/bin/mplcg index 152930e4d0a333c61f7b0185f16d2f5ae9a5058b..f29743b12145e1e23d3b50349488fd7d81c67cfb 100755 Binary files a/src/bin/mplcg and b/src/bin/mplcg differ diff --git a/src/maple_driver/include/compiler.h b/src/maple_driver/include/compiler.h index db1b6af82f0dc7c58a561b6dc8857be3e6a2e33f..ec60988123110edaa148e3fe8e6a74d8513bc651 100644 --- a/src/maple_driver/include/compiler.h +++ b/src/maple_driver/include/compiler.h @@ -129,7 +129,7 @@ class MapleCombCompiler : public Compiler { const std::unordered_set GetFinalOutputs(const MplOptions &mplOptions) const; private: - MeOptions *MakeMeOptions(const MplOptions &options, MemPool *optmp); + MeOption *MakeMeOptions(const MplOptions &options, MemPool *optmp); Options *MakeMpl2MplOptions(const MplOptions &options, MemPool *optmp); std::string realRunningExe; }; diff --git a/src/maple_driver/include/driver_runner.h b/src/maple_driver/include/driver_runner.h index ccc9a9b9a92b13c434854eeac05dae79b731acc0..267bdd9ea31a0df67bd8af2eeef9055ad984beea 100644 --- a/src/maple_driver/include/driver_runner.h +++ b/src/maple_driver/include/driver_runner.h @@ -31,7 +31,7 @@ namespace maple { class DriverRunner final { public: DriverRunner(MIRModule *theModule, const std::vector &exeNames, Options *mpl2mplOptions, - std::string mpl2mplInput, MeOptions *meOptions, std::string meInput, std::string actualInput, + std::string mpl2mplInput, MeOption *meOptions, std::string meInput, std::string actualInput, MemPool *optMp, bool timePhases = false, bool genMemPl = false) : theModule(theModule), @@ -63,7 +63,7 @@ class DriverRunner final { this->mpl2mplInput = mpl2mplInput; } - void SetMeInfo(MeOptions *meOptions, const std::string &meInput) { + void SetMeInfo(MeOption *meOptions, const std::string &meInput) { this->meOptions = meOptions; this->meInput = meInput; } @@ -74,7 +74,7 @@ class DriverRunner final { std::vector exeNames; Options *mpl2mplOptions = nullptr; std::string mpl2mplInput; - MeOptions *meOptions = nullptr; + MeOption *meOptions = nullptr; std::string meInput; std::string actualInput; MemPool *optMp; diff --git a/src/maple_driver/src/maple_comb_compiler.cpp b/src/maple_driver/src/maple_comb_compiler.cpp index 8578aa3340038e6c83f04e1040a86fd1abe286fa..27cb49ba530dedae08bff49b482585b90deb787f 100644 --- a/src/maple_driver/src/maple_comb_compiler.cpp +++ b/src/maple_driver/src/maple_comb_compiler.cpp @@ -70,8 +70,8 @@ void MapleCombCompiler::PrintCommand(const MplOptions &options) const { << GetInputFileName(options) << options.printCommandStr << std::endl; } -MeOptions *MapleCombCompiler::MakeMeOptions(const MplOptions &options, maple::MemPool *optMp) { - MeOptions *meOption = new MeOptions(optMp); +MeOption *MapleCombCompiler::MakeMeOptions(const MplOptions &options, maple::MemPool *optMp) { + MeOption *meOption = new MeOption(*optMp); auto inputMeOptions = options.exeOptions.find(kBinNameMe); if (inputMeOptions == options.exeOptions.end()) { LogInfo::MapleLogger() << "no me input options" << std::endl; @@ -84,11 +84,11 @@ MeOptions *MapleCombCompiler::MakeMeOptions(const MplOptions &options, maple::Me } switch (opt.Index()) { case kMeSkipPhases: - meOption->SplitPhases(opt.Args().c_str(), meOption->GetSkipPhases()); + meOption->SplitPhases(opt.Args(), meOption->GetSkipPhases()); break; case kMeRange: meOption->useRange = true; - meOption->GetRange(opt.Args().c_str()); + meOption->GetRange(opt.Args()); break; case kMeDumpAfter: meOption->dumpAfter = true; @@ -97,7 +97,7 @@ MeOptions *MapleCombCompiler::MakeMeOptions(const MplOptions &options, maple::Me meOption->dumpFunc = opt.Args(); break; case kMeDumpPhases: - meOption->SplitPhases(opt.Args().c_str(), meOption->dumpPhases); + meOption->SplitPhases(opt.Args(), meOption->dumpPhases); break; case kMeQuiet: meOption->quiet = true; @@ -165,7 +165,7 @@ MeOptions *MapleCombCompiler::MakeMeOptions(const MplOptions &options, maple::Me } Options *MapleCombCompiler::MakeMpl2MplOptions(const MplOptions &options, maple::MemPool *optMp) { - Options *mpl2mplOption = new Options(optMp); + Options *mpl2mplOption = new Options(*optMp); auto inputOptions = options.exeOptions.find(kBinNameMpl2mpl); if (inputOptions == options.exeOptions.end()) { LogInfo::MapleLogger() << "no mpl2mpl input options" << std::endl; @@ -241,7 +241,7 @@ ErrorCode MapleCombCompiler::Compile(const MplOptions &options, MIRModulePtr &th std::string fileName = GetInputFileName(options); theModule = new MIRModule(fileName.c_str()); int nErr = 0; - MeOptions *meOptions = nullptr; + MeOption *meOptions = nullptr; Options *mpl2mplOptions = nullptr; auto iterMe = std::find(options.runningExes.begin(), options.runningExes.end(), kBinNameMe); if (iterMe != options.runningExes.end()) { diff --git a/src/maple_ipa/src/interleaved_manager.cpp b/src/maple_ipa/src/interleaved_manager.cpp index 414da76ea7221eec8339ed91c6e9d2fd49fde806..5b6a6f33866dc09c63743d2d96dfe289fcc1910b 100644 --- a/src/maple_ipa/src/interleaved_manager.cpp +++ b/src/maple_ipa/src/interleaved_manager.cpp @@ -82,7 +82,7 @@ void InterleavedManager::Run() { compList = &mirModule.GetFunctionList(); } for (MIRFunction *func : *compList) { - if (MeOptions::useRange && (rangeNum < MeOptions::range[0] || rangeNum > MeOptions::range[1])) { + if (MeOption::useRange && (rangeNum < MeOption::range[0] || rangeNum > MeOption::range[1])) { rangeNum++; continue; } diff --git a/src/maple_ir/include/metadata_layout.h b/src/maple_ir/include/metadata_layout.h index b8bf81641fc0be35d717e8d58eed99a5a2f39ac7..aa96da30d7ec986752f027fe926882f163fc7dd3 100644 --- a/src/maple_ir/include/metadata_layout.h +++ b/src/maple_ir/include/metadata_layout.h @@ -88,31 +88,8 @@ inline void *MRTGetAddressFromMetaRefOffset(MetaRefOffset *pOffset) { return reinterpret_cast(reinterpret_cast(pOffset) + (*pOffset)); } -struct FieldInfo { - AddrOffset offset; - uint32_t mod; - uint16_t flag; - uint16_t index; - AddrOffset typeName; - int32_t fieldName; - int32_t annotation; - int64_t declaringClass; -}; - -struct MethodInfo { - AddrOffset methodInVtabIndex; - AddrOffset addr; - AddrOffset declaringClass; - uint32_t mod; - int32_t methodName; - int32_t signatureName; - int32_t annotationValue; - uint16_t flag; - uint16_t argSize; -#ifndef USE_32BIT_REF - uint32_t paddind; -#endif -}; +// MethodMeta defined in MethodMeta.h +// FieldMeta defined in FieldMeta.h // MethodDesc contains MethodMetadata and stack map struct MethodDesc { diff --git a/src/maple_ir/include/mir_builder.h b/src/maple_ir/include/mir_builder.h index 001da552876368554420bd650bb26bc0aac0e03e..69d12e4d0fe8b3218d55a4cbc00ad9c1dfefaedd 100644 --- a/src/maple_ir/include/mir_builder.h +++ b/src/maple_ir/include/mir_builder.h @@ -107,10 +107,10 @@ class MIRBuilder { MIRFunction *GetFunctionFromStidx(StIdx stIdx); MIRFunction *GetFunctionFromName(const std::string&); // For compiler-generated metadata struct - void AddIntFieldConst(const MIRStructType *sType, MIRAggConst *newConst, uint32 fieldID, int64 constValue); - void AddAddrofFieldConst(const MIRStructType *sType, MIRAggConst *newConst, uint32 fieldID, const MIRSymbol *fieldSt); - void AddAddroffuncFieldConst(const MIRStructType *sType, MIRAggConst *newConst, uint32 fieldID, - const MIRSymbol *funcSt); + void AddIntFieldConst(const MIRStructType &sType, MIRAggConst &newConst, uint32 fieldID, int64 constValue); + void AddAddrofFieldConst(const MIRStructType &sType, MIRAggConst &newConst, uint32 fieldID, const MIRSymbol &fieldSt); + void AddAddroffuncFieldConst(const MIRStructType &sType, MIRAggConst &newConst, uint32 fieldID, + const MIRSymbol &funcSt); bool TraverseToNamedField(MIRStructType *structType, GStrIdx nameIdx, uint32 &fieldID); bool IsOfSameType(MIRType *type1, MIRType *type2); bool TraverseToNamedFieldWithTypeAndMatchStyle(MIRStructType *structType, GStrIdx nameIdx, TyIdx typeIdx, diff --git a/src/maple_ir/include/mir_function.h b/src/maple_ir/include/mir_function.h index 4168b4fca9817c841414bbb09244d01c145d2647..fdc261ddae8c27f149bbdee2b26dbdac088e7ccf 100644 --- a/src/maple_ir/include/mir_function.h +++ b/src/maple_ir/include/mir_function.h @@ -945,7 +945,6 @@ class MIRFunction { MapleVector infoIsString; // tells if an entry has string value MapleMap aliasVarMap; // source code alias variables for debuginfo bool withLocInfo; - enum { kEasumInvalid = -1, kEasumNosum = 0 }; uint8_t layoutType; uint16 frameSize; diff --git a/src/maple_ir/include/mir_module.h b/src/maple_ir/include/mir_module.h index 4940b3cdb3cd0b38c3c03ee09b87d090551db1a5..7707a3e925f1778f6d3f53132bb7437ccb9d745c 100644 --- a/src/maple_ir/include/mir_module.h +++ b/src/maple_ir/include/mir_module.h @@ -198,6 +198,7 @@ class MIRModule { MIRFunction *CurFunction(void) const; MemPool *CurFuncCodeMemPool(void) const; MapleAllocator *CurFuncCodeMemPoolAllocator(void) const; + MapleAllocator &GetCurFuncCodeMPAllocator(void) const; void AddExternStructType(TyIdx tyIdx); void AddExternStructType(const MIRType *t); void AddSymbol(StIdx stIdx); @@ -275,10 +276,6 @@ class MIRModule { return optimizedFuncs.push_back(func); } - MapleSet &GetRcNoNeedingLock() { - return rcNotNeedingLock; - } - MapleMap*> &GetPuIdxFieldInitializedMap() { return puIdxFieldInitializedMap; } @@ -507,7 +504,6 @@ class MIRModule { MapleVector optimizedFuncs; // Add the field for decouple optimization std::unordered_set superCallSet; - MapleSet rcNotNeedingLock; // set of stmtID's which does incref/decref to an object not escaping // record all the fields that are initialized in the constructor. module scope, // if puIdx doesn't appear in this map, it writes to all field id // if puIdx appears in the map, but it's corresponding MapleSet is nullptr, it writes nothing fieldID diff --git a/src/maple_ir/include/mir_nodes.h b/src/maple_ir/include/mir_nodes.h index 370391ef25623818419f95c37c40b8c62236c35e..aad5a7b032b1474e231331bfc33968a893e702ed 100644 --- a/src/maple_ir/include/mir_nodes.h +++ b/src/maple_ir/include/mir_nodes.h @@ -88,8 +88,8 @@ class BaseNode { virtual ~BaseNode() = default; - virtual BaseNode *CloneTree(MapleAllocator *allocator) const { - return allocator->GetMemPool()->New(*this); + virtual BaseNode *CloneTree(MapleAllocator &allocator) const { + return allocator.GetMemPool()->New(*this); } virtual void DumpBase(const MIRModule *mod, int32 indent) const; @@ -103,10 +103,6 @@ class BaseNode { LogInfo::MapleLogger() << std::endl; } - virtual bool HasSymbol(MIRModule *mod, MIRSymbol *st) { - return false; - } - virtual uint8 SizeOfInstr() { return kOpcodeInfo.GetTableItemAt(GetOpCode()).instrucSize; } @@ -200,8 +196,8 @@ class UnaryNode : public BaseNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - UnaryNode *CloneTree(MapleAllocator *allocator) const { - UnaryNode *nd = allocator->GetMemPool()->New(*this); + UnaryNode *CloneTree(MapleAllocator &allocator) const { + UnaryNode *nd = allocator.GetMemPool()->New(*this); nd->SetOpnd(uOpnd->CloneTree(allocator), 0); return nd; } @@ -211,10 +207,6 @@ class UnaryNode : public BaseNode { return uOpnd; } - bool HasSymbol(MIRModule *mod, MIRSymbol *st) { - return uOpnd->HasSymbol(mod, st); - } - uint8 NumOpnds(void) const { return 1; } @@ -249,8 +241,8 @@ class TypeCvtNode : public UnaryNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - TypeCvtNode *CloneTree(MapleAllocator *allocator) const { - TypeCvtNode *nd = allocator->GetMemPool()->New(*this); + TypeCvtNode *CloneTree(MapleAllocator &allocator) const { + TypeCvtNode *nd = allocator.GetMemPool()->New(*this); nd->SetOpnd(Opnd(0)->CloneTree(allocator), 0); return nd; } @@ -280,8 +272,8 @@ class RetypeNode : public TypeCvtNode { ~RetypeNode() = default; void Dump(const MIRModule *mod, int32 indent) const; - RetypeNode *CloneTree(MapleAllocator *allocator) const { - RetypeNode *nd = allocator->GetMemPool()->New(*this); + RetypeNode *CloneTree(MapleAllocator &allocator) const { + RetypeNode *nd = allocator.GetMemPool()->New(*this); nd->SetOpnd(Opnd()->CloneTree(allocator)); return nd; } @@ -316,8 +308,8 @@ class ExtractbitsNode : public UnaryNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - ExtractbitsNode *CloneTree(MapleAllocator *allocator) const { - ExtractbitsNode *nd = allocator->GetMemPool()->New(*this); + ExtractbitsNode *CloneTree(MapleAllocator &allocator) const { + ExtractbitsNode *nd = allocator.GetMemPool()->New(*this); nd->SetOpnd(Opnd()->CloneTree(allocator)); return nd; } @@ -353,8 +345,8 @@ class GCMallocNode : public BaseNode { void Dump(const MIRModule *mod, int32 indent) const; - GCMallocNode *CloneTree(MapleAllocator *allocator) const { - GCMallocNode *nd = allocator->GetMemPool()->New(*this); + GCMallocNode *CloneTree(MapleAllocator &allocator) const { + GCMallocNode *nd = allocator.GetMemPool()->New(*this); return nd; } @@ -389,8 +381,8 @@ class JarrayMallocNode : public UnaryNode { void Dump(const MIRModule *mod, int32 indent) const; - JarrayMallocNode *CloneTree(MapleAllocator *allocator) const { - JarrayMallocNode *nd = allocator->GetMemPool()->New(*this); + JarrayMallocNode *CloneTree(MapleAllocator &allocator) const { + JarrayMallocNode *nd = allocator.GetMemPool()->New(*this); nd->SetOpnd(Opnd()->CloneTree(allocator)); return nd; } @@ -423,8 +415,8 @@ class IreadNode : public UnaryNode { virtual void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - IreadNode *CloneTree(MapleAllocator *allocator) const { - IreadNode *nd = allocator->GetMemPool()->New(*this); + IreadNode *CloneTree(MapleAllocator &allocator) const { + IreadNode *nd = allocator.GetMemPool()->New(*this); nd->SetOpnd(Opnd()->CloneTree(allocator)); return nd; } @@ -446,12 +438,12 @@ class IreadNode : public UnaryNode { } // the base of an address expr is either a leaf or an iread - BaseNode *GetAddrExprBase() const { + BaseNode &GetAddrExprBase() const { BaseNode *base = Opnd(); while (base->NumOpnds() != 0 && base->GetOpCode() != OP_iread) { base = base->Opnd(0); } - return base; + return *base; } protected: @@ -475,8 +467,8 @@ class IreadoffNode : public UnaryNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - IreadoffNode *CloneTree(MapleAllocator *allocator) const { - IreadoffNode *nd = allocator->GetMemPool()->New(*this); + IreadoffNode *CloneTree(MapleAllocator &allocator) const { + IreadoffNode *nd = allocator.GetMemPool()->New(*this); nd->SetOpnd(Opnd()->CloneTree(allocator)); return nd; } @@ -504,8 +496,8 @@ class IreadFPoffNode : public BaseNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - IreadFPoffNode *CloneTree(MapleAllocator *allocator) const { - IreadFPoffNode *nd = allocator->GetMemPool()->New(*this); + IreadFPoffNode *CloneTree(MapleAllocator &allocator) const { + IreadFPoffNode *nd = allocator.GetMemPool()->New(*this); return nd; } @@ -558,8 +550,8 @@ class BinaryNode : public BaseNode, public BinaryOpnds { void Dump(const MIRModule *mod) const; bool Verify() const; - BinaryNode *CloneTree(MapleAllocator *allocator) const { - BinaryNode *nd = allocator->GetMemPool()->New(*this); + BinaryNode *CloneTree(MapleAllocator &allocator) const { + BinaryNode *nd = allocator.GetMemPool()->New(*this); nd->SetBOpnd(GetBOpnd(0)->CloneTree(allocator), 0); nd->SetBOpnd(GetBOpnd(1)->CloneTree(allocator), 1); return nd; @@ -580,10 +572,6 @@ class BinaryNode : public BaseNode, public BinaryOpnds { } } - bool HasSymbol(MIRModule *mod, MIRSymbol *st) { - return GetBOpnd(0)->HasSymbol(mod, st) || GetBOpnd(1)->HasSymbol(mod, st); - } - BaseNode *Opnd(size_t i) const { ASSERT(i < 2, "invalid operand idx in BinaryNode"); ASSERT(i >= 0, "invalid operand idx in BinaryNode"); @@ -622,8 +610,8 @@ class CompareNode : public BinaryNode { void Dump(const MIRModule *mod) const; bool Verify() const; - CompareNode *CloneTree(MapleAllocator *allocator) const { - CompareNode *nd = allocator->GetMemPool()->New(*this); + CompareNode *CloneTree(MapleAllocator &allocator) const { + CompareNode *nd = allocator.GetMemPool()->New(*this); nd->SetBOpnd(GetBOpnd(0)->CloneTree(allocator), 0); nd->SetBOpnd(GetBOpnd(1)->CloneTree(allocator), 1); return nd; @@ -655,8 +643,8 @@ class DepositbitsNode : public BinaryNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - DepositbitsNode *CloneTree(MapleAllocator *allocator) const { - DepositbitsNode *nd = allocator->GetMemPool()->New(*this); + DepositbitsNode *CloneTree(MapleAllocator &allocator) const { + DepositbitsNode *nd = allocator.GetMemPool()->New(*this); nd->SetBOpnd(GetBOpnd(0)->CloneTree(allocator), 0); nd->SetBOpnd(GetBOpnd(1)->CloneTree(allocator), 1); return nd; @@ -701,8 +689,8 @@ class ResolveFuncNode : public BinaryNode { void Dump(const MIRModule *mod, int32 indent) const; - ResolveFuncNode *CloneTree(MapleAllocator *allocator) const { - ResolveFuncNode *nd = allocator->GetMemPool()->New(*this); + ResolveFuncNode *CloneTree(MapleAllocator &allocator) const { + ResolveFuncNode *nd = allocator.GetMemPool()->New(*this); nd->SetBOpnd(GetBOpnd(0)->CloneTree(allocator), 0); nd->SetBOpnd(GetBOpnd(1)->CloneTree(allocator), 1); return nd; @@ -753,8 +741,8 @@ class TernaryNode : public BaseNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - TernaryNode *CloneTree(MapleAllocator *allocator) const { - TernaryNode *nd = allocator->GetMemPool()->New(*this); + TernaryNode *CloneTree(MapleAllocator &allocator) const { + TernaryNode *nd = allocator.GetMemPool()->New(*this); nd->topnd[0] = topnd[0]->CloneTree(allocator); nd->topnd[1] = topnd[1]->CloneTree(allocator); nd->topnd[2] = topnd[2]->CloneTree(allocator); @@ -779,10 +767,6 @@ class TernaryNode : public BaseNode { return false; } - bool HasSymbol(MIRModule *mod, MIRSymbol *st) { - return topnd[0]->HasSymbol(mod, st) || topnd[1]->HasSymbol(mod, st) || topnd[2]->HasSymbol(mod, st); - } - private: BaseNode *topnd[3]; }; @@ -847,8 +831,8 @@ class NaryNode : public BaseNode, public NaryOpnds { virtual void Dump(const MIRModule *mod, int32 indent) const; - NaryNode *CloneTree(MapleAllocator *allocator) const { - NaryNode *nd = allocator->GetMemPool()->New(allocator, this); + NaryNode *CloneTree(MapleAllocator &allocator) const { + NaryNode *nd = allocator.GetMemPool()->New(&allocator, this); for (size_t i = 0; i < GetNopndSize(); i++) { nd->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); } @@ -876,14 +860,6 @@ class NaryNode : public BaseNode, public NaryOpnds { bool Verify() const { return true; } - - bool HasSymbol(MIRModule *mod, MIRSymbol *st) { - for (size_t i = 0; i < GetNopndSize(); i++) - if (GetNopndAt(i)->HasSymbol(mod, st)) { - return true; - } - return false; - } }; class IntrinsicopNode : public NaryNode { @@ -913,8 +889,8 @@ class IntrinsicopNode : public NaryNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - IntrinsicopNode *CloneTree(MapleAllocator *allocator) const { - IntrinsicopNode *nd = allocator->GetMemPool()->New(allocator, this); + IntrinsicopNode *CloneTree(MapleAllocator &allocator) const { + IntrinsicopNode *nd = allocator.GetMemPool()->New(&allocator, this); for (size_t i = 0; i < GetNopndSize(); i++) { nd->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); } @@ -956,8 +932,8 @@ class ConstvalNode : public BaseNode { ~ConstvalNode() = default; void Dump(const MIRModule *mod, int32 indent) const; - ConstvalNode *CloneTree(MapleAllocator *allocator) const { - return allocator->GetMemPool()->New(*this); + ConstvalNode *CloneTree(MapleAllocator &allocator) const { + return allocator.GetMemPool()->New(*this); } const MIRConst *GetConstVal() const { @@ -988,8 +964,8 @@ class ConststrNode : public BaseNode { void Dump(const MIRModule *mod, int32 indent) const; - ConststrNode *CloneTree(MapleAllocator *allocator) const { - return allocator->GetMemPool()->New(*this); + ConststrNode *CloneTree(MapleAllocator &allocator) const { + return allocator.GetMemPool()->New(*this); } UStrIdx GetStrIdx() const { @@ -1016,8 +992,8 @@ class Conststr16Node : public BaseNode { void Dump(const MIRModule *mod, int32 indent) const; - Conststr16Node *CloneTree(MapleAllocator *allocator) const { - return allocator->GetMemPool()->New(*this); + Conststr16Node *CloneTree(MapleAllocator &allocator) const { + return allocator.GetMemPool()->New(*this); } U16StrIdx GetStrIdx() const { @@ -1045,8 +1021,8 @@ class SizeoftypeNode : public BaseNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - SizeoftypeNode *CloneTree(MapleAllocator *allocator) const { - return allocator->GetMemPool()->New(*this); + SizeoftypeNode *CloneTree(MapleAllocator &allocator) const { + return allocator.GetMemPool()->New(*this); } TyIdx GetTyIdx() const { @@ -1074,8 +1050,8 @@ class FieldsDistNode : public BaseNode { void Dump(const MIRModule *mod, int32 indent) const; - FieldsDistNode *CloneTree(MapleAllocator *allocator) const { - return allocator->GetMemPool()->New(*this); + FieldsDistNode *CloneTree(MapleAllocator &allocator) const { + return allocator.GetMemPool()->New(*this); } TyIdx GetTyIdx() const { @@ -1146,8 +1122,8 @@ class ArrayNode : public NaryNode { return GetNopndSize(); } - ArrayNode *CloneTree(MapleAllocator *allocator) const { - ArrayNode *nd = allocator->GetMemPool()->New(allocator, this); + ArrayNode *CloneTree(MapleAllocator &allocator) const { + ArrayNode *nd = allocator.GetMemPool()->New(&allocator, this); for (size_t i = 0; i < GetNopndSize(); i++) { nd->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); } @@ -1201,10 +1177,9 @@ class AddrofNode : public BaseNode { virtual void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; bool CheckNode(const MIRModule *mod) const; - bool HasSymbol(MIRModule *mod, MIRSymbol *st); - AddrofNode *CloneTree(MapleAllocator *allocator) const { - return allocator->GetMemPool()->New(*this); + AddrofNode *CloneTree(MapleAllocator &allocator) const { + return allocator.GetMemPool()->New(*this); } const StIdx &GetStIdx() const { @@ -1250,8 +1225,8 @@ class RegreadNode : public BaseNode { virtual void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - RegreadNode *CloneTree(MapleAllocator *allocator) const { - return allocator->GetMemPool()->New(*this); + RegreadNode *CloneTree(MapleAllocator &allocator) const { + return allocator.GetMemPool()->New(*this); } const PregIdx &GetRegIdx() const { @@ -1281,8 +1256,8 @@ class AddroffuncNode : public BaseNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - AddroffuncNode *CloneTree(MapleAllocator *allocator) const { - return allocator->GetMemPool()->New(*this); + AddroffuncNode *CloneTree(MapleAllocator &allocator) const { + return allocator.GetMemPool()->New(*this); } PUIdx GetPUIdx() const { @@ -1308,8 +1283,8 @@ class AddroflabelNode : public BaseNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - AddroflabelNode *CloneTree(MapleAllocator *allocator) const { - return allocator->GetMemPool()->New(*this); + AddroflabelNode *CloneTree(MapleAllocator &allocator) const { + return allocator.GetMemPool()->New(*this); } uint32 GetOffset() const { @@ -1426,8 +1401,8 @@ class StmtNode : public BaseNode, public PtrListNodeBase { void InsertAfterThis(StmtNode *pos); void InsertBeforeThis(StmtNode *pos); - virtual StmtNode *CloneTree(MapleAllocator *allocator) const { - StmtNode *s = allocator->GetMemPool()->New(*this); + virtual StmtNode *CloneTree(MapleAllocator &allocator) const { + StmtNode *s = allocator.GetMemPool()->New(*this); s->SetStmtID(stmtIDNext++); return s; } @@ -1514,8 +1489,8 @@ class IassignNode : public StmtNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - IassignNode *CloneTree(MapleAllocator *allocator) const { - IassignNode *bn = allocator->GetMemPool()->New(*this); + IassignNode *CloneTree(MapleAllocator &allocator) const { + IassignNode *bn = allocator.GetMemPool()->New(*this); bn->SetStmtID(stmtIDNext++); bn->SetOpnd(addrExpr->CloneTree(allocator), 0); bn->SetRHS(rhs->CloneTree(allocator)); @@ -1523,12 +1498,12 @@ class IassignNode : public StmtNode { } // the base of an address expr is either a leaf or an iread - BaseNode *GetAddrExprBase() const { + BaseNode &GetAddrExprBase() const { BaseNode *base = addrExpr; while (base->NumOpnds() != 0 && base->GetOpCode() != OP_iread) { base = base->Opnd(0); } - return base; + return *base; } void SetAddrExpr(BaseNode *exp) { @@ -1561,8 +1536,8 @@ class GotoNode : public StmtNode { void Dump(const MIRModule *mod, int32 indent) const; - GotoNode *CloneTree(MapleAllocator *allocator) const { - GotoNode *g = allocator->GetMemPool()->New(*this); + GotoNode *CloneTree(MapleAllocator &allocator) const { + GotoNode *g = allocator.GetMemPool()->New(*this); g->SetStmtID(stmtIDNext++); return g; } @@ -1591,8 +1566,8 @@ class JsTryNode : public StmtNode { void Dump(const MIRModule *mod, int32 indent) const; - JsTryNode *CloneTree(MapleAllocator *allocator) const { - JsTryNode *t = allocator->GetMemPool()->New(*this); + JsTryNode *CloneTree(MapleAllocator &allocator) const { + JsTryNode *t = allocator.GetMemPool()->New(*this); t->SetStmtID(stmtIDNext++); return t; } @@ -1673,8 +1648,8 @@ class TryNode : public StmtNode { offsets.insert(a, b, c); } - TryNode *CloneTree(MapleAllocator *allocator) const { - TryNode *nd = allocator->GetMemPool()->New(allocator); + TryNode *CloneTree(MapleAllocator &allocator) const { + TryNode *nd = allocator.GetMemPool()->New(&allocator); nd->SetStmtID(stmtIDNext++); for (size_t i = 0; i < offsets.size(); i++) { nd->AddOffset(offsets[i]); @@ -1729,8 +1704,8 @@ class CatchNode : public StmtNode { exceptionTyIdxVec.push_back(idx); } - CatchNode *CloneTree(MapleAllocator *allocator) const { - CatchNode *j = allocator->GetMemPool()->New(allocator); + CatchNode *CloneTree(MapleAllocator &allocator) const { + CatchNode *j = allocator.GetMemPool()->New(&allocator); j->SetStmtID(stmtIDNext++); for (uint32 i = 0; i < Size(); i++) { j->PushBack(GetExceptionTyIdxVecElement(i)); @@ -1774,8 +1749,8 @@ class SwitchNode : public StmtNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - SwitchNode *CloneTree(MapleAllocator *allocator) const { - SwitchNode *nd = allocator->GetMemPool()->New(allocator, this); + SwitchNode *CloneTree(MapleAllocator &allocator) const { + SwitchNode *nd = allocator.GetMemPool()->New(&allocator, this); nd->SetSwitchOpnd(switchOpnd->CloneTree(allocator)); for (size_t i = 0; i < switchTable.size(); i++) { nd->GetSwitchTable().push_back(switchTable[i]); @@ -1860,8 +1835,8 @@ class MultiwayNode : public StmtNode { void Dump(const MIRModule *mod, int32 indent) const; - MultiwayNode *CloneTree(MapleAllocator *allocator) const { - MultiwayNode *nd = allocator->GetMemPool()->New(allocator, this); + MultiwayNode *CloneTree(MapleAllocator &allocator) const { + MultiwayNode *nd = allocator.GetMemPool()->New(&allocator, this); nd->multiWayOpnd = static_cast(multiWayOpnd->CloneTree(allocator)); for (size_t i = 0; i < multiWayTable.size(); i++) { BaseNode *node = multiWayTable[i].first->CloneTree(allocator); @@ -1920,8 +1895,8 @@ class UnaryStmtNode : public StmtNode { return uopnd->Verify(); } - UnaryStmtNode *CloneTree(MapleAllocator *allocator) const { - UnaryStmtNode *nd = allocator->GetMemPool()->New(*this); + UnaryStmtNode *CloneTree(MapleAllocator &allocator) const { + UnaryStmtNode *nd = allocator.GetMemPool()->New(*this); nd->SetStmtID(stmtIDNext++); nd->SetOpnd(uopnd->CloneTree(allocator)); return nd; @@ -1972,8 +1947,8 @@ class DassignNode : public UnaryStmtNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - DassignNode *CloneTree(MapleAllocator *allocator) const { - DassignNode *nd = allocator->GetMemPool()->New(*this); + DassignNode *CloneTree(MapleAllocator &allocator) const { + DassignNode *nd = allocator.GetMemPool()->New(*this); nd->SetStmtID(stmtIDNext++); nd->SetOpnd(Opnd()->CloneTree(allocator)); return nd; @@ -2036,8 +2011,8 @@ class RegassignNode : public UnaryStmtNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - RegassignNode *CloneTree(MapleAllocator *allocator) const { - RegassignNode *nd = allocator->GetMemPool()->New(*this); + RegassignNode *CloneTree(MapleAllocator &allocator) const { + RegassignNode *nd = allocator.GetMemPool()->New(*this); nd->SetStmtID(stmtIDNext++); nd->SetOpnd(Opnd()->CloneTree(allocator)); return nd; @@ -2089,8 +2064,8 @@ class CondGotoNode : public UnaryStmtNode { offset = offsetValue; } - CondGotoNode *CloneTree(MapleAllocator *allocator) const { - CondGotoNode *nd = allocator->GetMemPool()->New(*this); + CondGotoNode *CloneTree(MapleAllocator &allocator) const { + CondGotoNode *nd = allocator.GetMemPool()->New(*this); nd->SetStmtID(stmtIDNext++); nd->SetOpnd(Opnd()->CloneTree(allocator)); return nd; @@ -2123,8 +2098,8 @@ class RangegotoNode : public UnaryStmtNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - RangegotoNode *CloneTree(MapleAllocator *allocator) const { - RangegotoNode *nd = allocator->GetMemPool()->New(allocator, this); + RangegotoNode *CloneTree(MapleAllocator &allocator) const { + RangegotoNode *nd = allocator.GetMemPool()->New(&allocator, this); nd->SetOpnd(Opnd()->CloneTree(allocator)); for (size_t i = 0; i < rangegotoTable.size(); i++) { nd->rangegotoTable.push_back(rangegotoTable[i]); @@ -2187,8 +2162,8 @@ class BlockNode : public StmtNode { Dump(mod, indent, nullptr, nullptr, false, false); } - BlockNode *CloneTree(MapleAllocator *allocator) const { - BlockNode *blk = allocator->GetMemPool()->New(); + BlockNode *CloneTree(MapleAllocator &allocator) const { + BlockNode *blk = allocator.GetMemPool()->New(); blk->SetStmtID(stmtIDNext++); for (auto &stmt : stmtNodeList) { StmtNode *newStmt = static_cast(stmt.CloneTree(allocator)); @@ -2201,8 +2176,8 @@ class BlockNode : public StmtNode { } BlockNode *CloneTreeWithSrcPosition(const MIRModule *mod) { - MapleAllocator *allocator = mod->CurFuncCodeMemPoolAllocator(); - BlockNode *blk = allocator->GetMemPool()->New(); + MapleAllocator &allocator = mod->GetCurFuncCodeMPAllocator(); + BlockNode *blk = allocator.GetMemPool()->New(); blk->SetStmtID(stmtIDNext++); for (auto &stmt : stmtNodeList) { StmtNode *newStmt = static_cast(stmt.CloneTree(allocator)); @@ -2270,8 +2245,8 @@ class IfStmtNode : public UnaryStmtNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - IfStmtNode *CloneTree(MapleAllocator *allocator) const { - IfStmtNode *nd = allocator->GetMemPool()->New(*this); + IfStmtNode *CloneTree(MapleAllocator &allocator) const { + IfStmtNode *nd = allocator.GetMemPool()->New(*this); nd->SetStmtID(stmtIDNext++); nd->SetOpnd(Opnd()->CloneTree(allocator)); nd->thenPart = thenPart->CloneTree(allocator); @@ -2332,8 +2307,8 @@ class WhileStmtNode : public UnaryStmtNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - WhileStmtNode *CloneTree(MapleAllocator *allocator) const { - WhileStmtNode *nd = allocator->GetMemPool()->New(*this); + WhileStmtNode *CloneTree(MapleAllocator &allocator) const { + WhileStmtNode *nd = allocator.GetMemPool()->New(*this); nd->SetStmtID(stmtIDNext++); nd->SetOpnd(Opnd()->CloneTree(allocator)); nd->body = body->CloneTree(allocator); @@ -2371,8 +2346,8 @@ class DoloopNode : public StmtNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - DoloopNode *CloneTree(MapleAllocator *allocator) const { - DoloopNode *nd = allocator->GetMemPool()->New(*this); + DoloopNode *CloneTree(MapleAllocator &allocator) const { + DoloopNode *nd = allocator.GetMemPool()->New(*this); nd->SetStmtID(stmtIDNext++); nd->SetStartExpr(startExpr->CloneTree(allocator)); nd->SetContExpr(GetCondExpr()->CloneTree(allocator)); @@ -2515,8 +2490,8 @@ class ForeachelemNode : public StmtNode { void Dump(const MIRModule *mod, int32 indent) const; - ForeachelemNode *CloneTree(MapleAllocator *allocator) const { - ForeachelemNode *nd = allocator->GetMemPool()->New(*this); + ForeachelemNode *CloneTree(MapleAllocator &allocator) const { + ForeachelemNode *nd = allocator.GetMemPool()->New(*this); nd->SetStmtID(stmtIDNext++); nd->SetLoopBody(loopBody->CloneTree(allocator)); return nd; @@ -2537,8 +2512,8 @@ class BinaryStmtNode : public StmtNode, public BinaryOpnds { void Dump(const MIRModule *mod, int32 indent) const; virtual bool Verify() const; - BinaryStmtNode *CloneTree(MapleAllocator *allocator) const { - BinaryStmtNode *nd = allocator->GetMemPool()->New(*this); + BinaryStmtNode *CloneTree(MapleAllocator &allocator) const { + BinaryStmtNode *nd = allocator.GetMemPool()->New(*this); nd->SetStmtID(stmtIDNext++); nd->SetBOpnd(GetBOpnd(0)->CloneTree(allocator), 0); nd->SetBOpnd(GetBOpnd(1)->CloneTree(allocator), 1); @@ -2583,8 +2558,8 @@ class IassignoffNode : public BinaryStmtNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - IassignoffNode *CloneTree(MapleAllocator *allocator) const { - IassignoffNode *nd = allocator->GetMemPool()->New(*this); + IassignoffNode *CloneTree(MapleAllocator &allocator) const { + IassignoffNode *nd = allocator.GetMemPool()->New(*this); nd->SetStmtID(stmtIDNext++); nd->SetBOpnd(GetBOpnd(0)->CloneTree(allocator), 0); nd->SetBOpnd(GetBOpnd(1)->CloneTree(allocator), 1); @@ -2608,8 +2583,8 @@ class IassignFPoffNode : public UnaryStmtNode { void Dump(const MIRModule *mod, int32 indent) const; bool Verify() const; - IassignFPoffNode *CloneTree(MapleAllocator *allocator) const { - IassignFPoffNode *nd = allocator->GetMemPool()->New(*this); + IassignFPoffNode *CloneTree(MapleAllocator &allocator) const { + IassignFPoffNode *nd = allocator.GetMemPool()->New(*this); nd->SetStmtID(stmtIDNext++); nd->SetOpnd(Opnd()->CloneTree(allocator)); return nd; @@ -2647,8 +2622,8 @@ class NaryStmtNode : public StmtNode, public NaryOpnds { void Dump(const MIRModule *mod, int32 indent) const; virtual bool Verify() const; - NaryStmtNode *CloneTree(MapleAllocator *allocator) const { - NaryStmtNode *nd = allocator->GetMemPool()->New(allocator, this); + NaryStmtNode *CloneTree(MapleAllocator &allocator) const { + NaryStmtNode *nd = allocator.GetMemPool()->New(&allocator, this); for (size_t i = 0; i < GetNopndSize(); i++) { nd->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); } @@ -2728,8 +2703,8 @@ class CallNode : public NaryStmtNode { bool Verify() const; MIRType *GetCallReturnType(); - CallNode *CloneTree(MapleAllocator *allocator) const { - CallNode *nd = allocator->GetMemPool()->New(allocator, this); + CallNode *CloneTree(MapleAllocator &allocator) const { + CallNode *nd = allocator.GetMemPool()->New(&allocator, this); for (size_t i = 0; i < GetNopndSize(); i++) { nd->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); } @@ -2830,8 +2805,8 @@ class IcallNode : public NaryStmtNode { virtual void Dump(const MIRModule *mod, int32 indent, bool newline) const; bool Verify() const; MIRType *GetCallReturnType(); - IcallNode *CloneTree(MapleAllocator *allocator) const { - IcallNode *nd = allocator->GetMemPool()->New(allocator, this); + IcallNode *CloneTree(MapleAllocator &allocator) const { + IcallNode *nd = allocator.GetMemPool()->New(&allocator, this); for (size_t i = 0; i < GetNopndSize(); i++) { nd->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); } @@ -2912,8 +2887,8 @@ class IntrinsiccallNode : public NaryStmtNode { bool Verify() const; MIRType *GetCallReturnType(); - IntrinsiccallNode *CloneTree(MapleAllocator *allocator) const { - IntrinsiccallNode *nd = allocator->GetMemPool()->New(allocator, this); + IntrinsiccallNode *CloneTree(MapleAllocator &allocator) const { + IntrinsiccallNode *nd = allocator.GetMemPool()->New(&allocator, this); for (size_t i = 0; i < GetNopndSize(); i++) { nd->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); } @@ -3002,8 +2977,8 @@ class CallinstantNode : public CallNode { Dump(mod, indent, true); } - CallinstantNode *CloneTree(MapleAllocator *allocator) const { - CallinstantNode *nd = allocator->GetMemPool()->New(allocator, this); + CallinstantNode *CloneTree(MapleAllocator &allocator) const { + CallinstantNode *nd = allocator.GetMemPool()->New(&allocator, this); for (size_t i = 0; i < GetNopndSize(); i++) { nd->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); } @@ -3047,8 +3022,8 @@ class LabelNode : public StmtNode { void Dump(const MIRModule *mod, int32 indent) const; - LabelNode *CloneTree(MapleAllocator *allocator) const { - LabelNode *l = allocator->GetMemPool()->New(*this); + LabelNode *CloneTree(MapleAllocator &allocator) const { + LabelNode *l = allocator.GetMemPool()->New(*this); l->SetStmtID(stmtIDNext++); return l; } @@ -3088,8 +3063,8 @@ class CommentNode : public StmtNode { void Dump(const MIRModule *mod, int32 indent) const; - CommentNode *CloneTree(MapleAllocator *allocator) const { - CommentNode *c = allocator->GetMemPool()->New(allocator, this); + CommentNode *CloneTree(MapleAllocator &allocator) const { + CommentNode *c = allocator.GetMemPool()->New(&allocator, this); return c; } diff --git a/src/maple_ir/include/mir_preg.h b/src/maple_ir/include/mir_preg.h old mode 100644 new mode 100755 index 65b7728c3cf1ceb53224f8f1efa24be9155d0e58..023db68511e48af6dc416271c74cd17a9d956192 --- a/src/maple_ir/include/mir_preg.h +++ b/src/maple_ir/include/mir_preg.h @@ -125,7 +125,7 @@ class MIRPregTable { } PregIdx CreateRefPreg(MIRType *mirType) { - ASSERT(mirType->GetPrimType() == PTY_ref || mirType->GetPrimType() == PTY_ptr, "ref or ptr type"); + ASSERT(mirType->GetPrimType() == PTY_ref, "only ref type needed"); PregIdx idx = CreatePreg(mirType->GetPrimType()); pregTable[idx]->SetMIRType(mirType); return idx; diff --git a/src/maple_ir/include/option.h b/src/maple_ir/include/option.h index 5ac115f5858b37f95f15356809a271c1974a7faf..55b7ce80318246481022b64ac96f6be91bfa0955 100644 --- a/src/maple_ir/include/option.h +++ b/src/maple_ir/include/option.h @@ -25,7 +25,7 @@ namespace maple { class Options { public: - explicit Options(maple::MemPool *memPool) : optionAlloc(memPool) {} + explicit Options(maple::MemPool &memPool) : optionAlloc(&memPool) {} bool ParseOptions(int argc, char **argv, std::string &fileName); ~Options() {} diff --git a/src/maple_ir/src/mir_builder.cpp b/src/maple_ir/src/mir_builder.cpp index f73b0360cf8202e4626c7280845788e097372ce5..12c371d60bb8b089903994aa4055ee06e8625702 100644 --- a/src/maple_ir/src/mir_builder.cpp +++ b/src/maple_ir/src/mir_builder.cpp @@ -18,42 +18,35 @@ namespace maple { // This is for compiler-generated metadata 1-level struct -void MIRBuilder::AddIntFieldConst(const MIRStructType *sType, MIRAggConst *newConst, uint32 fieldID, int64 constValue) { - if (sType != nullptr && newConst != nullptr) { - MIRConst *fieldConst = mirModule->GetMemPool()->New(constValue, - sType->GetElemType(fieldID - 1), fieldID); - newConst->GetConstVec().push_back(fieldConst); - } +void MIRBuilder::AddIntFieldConst(const MIRStructType &sType, MIRAggConst &newConst, uint32 fieldID, int64 constValue) { + MIRConst *fieldConst = mirModule->GetMemPool()->New(constValue, sType.GetElemType(fieldID - 1), fieldID); + newConst.GetConstVec().push_back(fieldConst); } // This is for compiler-generated metadata 1-level struct -void MIRBuilder::AddAddrofFieldConst(const MIRStructType *structType, MIRAggConst *newConst, uint32 fieldID, - const MIRSymbol *fieldSymbol) { - if (structType != nullptr && newConst != nullptr && fieldSymbol != nullptr) { - AddrofNode *fieldExpr = CreateExprAddrof(0, fieldSymbol, mirModule->GetMemPool()); - MIRConst *fieldConst = mirModule->GetMemPool()->New(fieldExpr->GetStIdx(), fieldExpr->GetFieldID(), - structType->GetElemType(fieldID - 1)); - fieldConst->SetFieldID(fieldID); - newConst->GetConstVec().push_back(fieldConst); - } +void MIRBuilder::AddAddrofFieldConst(const MIRStructType &structType, MIRAggConst &newConst, uint32 fieldID, + const MIRSymbol &fieldSymbol) { + AddrofNode *fieldExpr = CreateExprAddrof(0, &fieldSymbol, mirModule->GetMemPool()); + MIRConst *fieldConst = mirModule->GetMemPool()->New(fieldExpr->GetStIdx(), fieldExpr->GetFieldID(), + structType.GetElemType(fieldID - 1)); + fieldConst->SetFieldID(fieldID); + newConst.GetConstVec().push_back(fieldConst); } // This is for compiler-generated metadata 1-level struct -void MIRBuilder::AddAddroffuncFieldConst(const MIRStructType *structType, MIRAggConst *newConst, uint32 fieldID, - const MIRSymbol *funcSymbol) { - if (structType != nullptr && newConst != nullptr && funcSymbol != nullptr) { - MIRConst *fieldConst = nullptr; - MIRFunction *vMethod = funcSymbol->GetFunction(); - if (vMethod->IsAbstract()) { - fieldConst = mirModule->GetMemPool()->New(0, structType->GetElemType(fieldID - 1), fieldID); - } else { - AddroffuncNode *addrofFuncExpr = - CreateExprAddroffunc(funcSymbol->GetFunction()->GetPuidx(), mirModule->GetMemPool()); - fieldConst = mirModule->GetMemPool()->New(addrofFuncExpr->GetPUIdx(), - structType->GetElemType(fieldID - 1), fieldID); - } - newConst->GetConstVec().push_back(fieldConst); +void MIRBuilder::AddAddroffuncFieldConst(const MIRStructType &structType, MIRAggConst &newConst, uint32 fieldID, + const MIRSymbol &funcSymbol) { + MIRConst *fieldConst = nullptr; + MIRFunction *vMethod = funcSymbol.GetFunction(); + if (vMethod->IsAbstract()) { + fieldConst = mirModule->GetMemPool()->New(0, structType.GetElemType(fieldID - 1), fieldID); + } else { + AddroffuncNode *addrofFuncExpr = + CreateExprAddroffunc(funcSymbol.GetFunction()->GetPuidx(), mirModule->GetMemPool()); + fieldConst = mirModule->GetMemPool()->New(addrofFuncExpr->GetPUIdx(), + structType.GetElemType(fieldID - 1), fieldID); } + newConst.GetConstVec().push_back(fieldConst); } // fieldID is continuously being updated during traversal; diff --git a/src/maple_ir/src/mir_lower.cpp b/src/maple_ir/src/mir_lower.cpp index e4f925ee340560c04820a88b26e162272c4afb07..a61c4f14a751c321f7b4fe4f0c0ab5e9f47d758a 100644 --- a/src/maple_ir/src/mir_lower.cpp +++ b/src/maple_ir/src/mir_lower.cpp @@ -133,7 +133,7 @@ BlockNode *MIRLower::LowerWhileStmt(WhileStmtNode *whileStmt) { ASSERT(whileStmt->GetBody(), "null ptr check"); blk->AppendStatementsFromBlock(whileStmt->GetBody()); CondGotoNode *brTrueStmt = mirModule.CurFuncCodeMemPool()->New(OP_brtrue); - brTrueStmt->SetOpnd(whileStmt->Opnd()->CloneTree(mirModule.CurFuncCodeMemPoolAllocator())); + brTrueStmt->SetOpnd(whileStmt->Opnd()->CloneTree(mirModule.GetCurFuncCodeMPAllocator())); brTrueStmt->SetOffset(bodyLableIdx); blk->AddStatement(brTrueStmt); lableStmt = mirModule.CurFuncCodeMemPool()->New(); @@ -214,7 +214,7 @@ BlockNode *MIRLower::LowerDoloopStmt(DoloopNode *doloop) { blk->AddStatement(endDassign); } CondGotoNode *brTrueStmt = mirModule.CurFuncCodeMemPool()->New(OP_brtrue); - brTrueStmt->SetOpnd(doloop->GetCondExpr()->CloneTree(mirModule.CurFuncCodeMemPoolAllocator())); + brTrueStmt->SetOpnd(doloop->GetCondExpr()->CloneTree(mirModule.GetCurFuncCodeMPAllocator())); brTrueStmt->SetOffset(bodyLabelIdx); blk->AddStatement(brTrueStmt); labelStmt = mirModule.CurFuncCodeMemPool()->New(); diff --git a/src/maple_ir/src/mir_module.cpp b/src/maple_ir/src/mir_module.cpp index 0a41d25ea6cde725b42e8d92ec0f1f627f0e5820..b8bc8a1e66aad8b5606eea176aaee1bebb60a7a9 100644 --- a/src/maple_ir/src/mir_module.cpp +++ b/src/maple_ir/src/mir_module.cpp @@ -53,7 +53,6 @@ MIRModule::MIRModule(const char *fn) entryFunc(nullptr), floatNum(0), optimizedFuncs(memPoolAllocator.Adapter()), - rcNotNeedingLock(memPoolAllocator.Adapter()), puIdxFieldInitializedMap(std::less(), memPoolAllocator.Adapter()) { flavor = kFlavorUnknown; srcLang = kSrcLangUnknown; @@ -91,6 +90,10 @@ MapleAllocator *MIRModule::CurFuncCodeMemPoolAllocator(void) const { return curFunction->GetCodeMempoolAllocator(); } +MapleAllocator &MIRModule::GetCurFuncCodeMPAllocator(void) const { + return curFunction->GetCodeMPAllocator(); +} + void MIRModule::AddExternStructType(TyIdx tyIdx) { externStructTypeSet.insert(tyIdx); } diff --git a/src/maple_ir/src/mir_nodes.cpp b/src/maple_ir/src/mir_nodes.cpp index c7cc985cfbfd229d49ddd7d2fc4c1fdce84a7a2d..ee9d3999e5f55db8818b88dc03710818e3d5f63a 100644 --- a/src/maple_ir/src/mir_nodes.cpp +++ b/src/maple_ir/src/mir_nodes.cpp @@ -136,11 +136,6 @@ bool AddrofNode::CheckNode(const MIRModule *mod) const { } } -bool AddrofNode::HasSymbol(MIRModule *mod, MIRSymbol *st) { - ASSERT(mod != nullptr, "mod is null"); - return st == mod->CurFunction()->GetLocalOrGlobalSymbol(GetStIdx()); -} - void BlockNode::AddStatement(StmtNode *stmt) { ASSERT(stmt != nullptr, "null ptr check"); stmtNodeList.push_back(stmt); diff --git a/src/maple_me/include/alias_analysis_table.h b/src/maple_me/include/alias_analysis_table.h index 839193628f4c1f1ca3579f5eb526b2d7f08543fe..9c0df567d6c4d5092fe2f2e6d4cfe1bf271a7f28 100644 --- a/src/maple_me/include/alias_analysis_table.h +++ b/src/maple_me/include/alias_analysis_table.h @@ -16,36 +16,38 @@ #define MAPLE_ME_INCLUDE_ALIAS_ANALYSIS_TABLE_H #include "orig_symbol.h" #include "ssa_tab.h" +#include "class_hierarchy.h" namespace maple { class AliasAnalysisTable { public: - AliasAnalysisTable(SSATab *ssaTable, MapleAllocator allocator, MIRModule *module) + AliasAnalysisTable(SSATab &ssaTable, MapleAllocator allocator, MIRModule &module, KlassHierarchy &kh) : ssaTab(ssaTable), alloc(allocator), mirModule(module), prevLevelNode(alloc.Adapter()), nextLevelNodes(alloc.Adapter()), - memPool(ssaTab->GetMempool()) {} + memPool(ssaTab.GetMempool()), + klassHierarchy(kh) {} - OriginalSt *GetPrevLevelNode(const OriginalSt *ost); - MapleVector *GetNextLevelNodes(const OriginalSt *ost); - OriginalSt *FindOrCreateAddrofSymbolOriginalSt(const OriginalSt *ost); - OriginalSt *FindOrCreateExtraLevSymOrRegOriginalSt(OriginalSt *ost, TyIdx ptyidx, FieldID fld); - OriginalSt *FindOrCreateExtraLevOriginalSt(OriginalSt *ost, TyIdx ptyidx, FieldID fld); + OriginalSt *GetPrevLevelNode(const OriginalSt &ost); + MapleVector *GetNextLevelNodes(const OriginalSt &ost); + OriginalSt *FindOrCreateAddrofSymbolOriginalSt(const OriginalSt &ost); + OriginalSt *FindOrCreateExtraLevSymOrRegOriginalSt(OriginalSt &ost, TyIdx ptyidx, FieldID fld); + OriginalSt *FindOrCreateExtraLevOriginalSt(OriginalSt &ost, TyIdx ptyidx, FieldID fld); OriginalSt *FindExtraLevOriginalSt(const MapleVector &nextLevelOsts, FieldID fld); - OriginalSt *FindOrCreateDiffFieldOriginalSt(const OriginalSt *ost, FieldID fld); - OriginalSt *FindDiffFieldOriginalSt(const OriginalSt *ost, FieldID fld); + OriginalSt *FindOrCreateDiffFieldOriginalSt(const OriginalSt &ost, FieldID fld); + OriginalSt *FindDiffFieldOriginalSt(const OriginalSt &ost, FieldID fld); ~AliasAnalysisTable() = default; private: - SSATab *ssaTab; + SSATab &ssaTab; MapleAllocator alloc; - MIRModule *mirModule; + MIRModule &mirModule; MapleMap prevLevelNode; // index is the OStIdx MapleMap*> nextLevelNodes; // index is the OStIdx MemPool *memPool; + KlassHierarchy &klassHierarchy; }; - } // namespace maple #endif // MAPLE_ME_INCLUDE_ALIAS_ANALYSIS_TABLE_H diff --git a/src/maple_me/include/alias_class.h b/src/maple_me/include/alias_class.h index 5291513affe74eda63fafae6848bf28bd93e089f..3903745f7a5d625a8dfac549359aba28cc4d2908 100644 --- a/src/maple_me/include/alias_class.h +++ b/src/maple_me/include/alias_class.h @@ -24,8 +24,9 @@ namespace maple { class AliasElem { + friend class AliasClass; public: - AliasElem(uint32 i, OriginalSt *origst) + AliasElem(uint32 i, OriginalSt &origst) : id(i), ost(origst), notAllDefsSeen(false), @@ -35,13 +36,13 @@ class AliasElem { ~AliasElem() {} - void Dump(MIRModule *mod) const; + void Dump(MIRModule &mod) const; uint32 GetClassID() const { return id; } - OriginalSt *GetOriginalSt() const { + OriginalSt &GetOriginalSt() const { return ost; } @@ -61,25 +62,23 @@ class AliasElem { nextLevNotAllDefsSeen = allDefsSeen; } - MapleSet *GetClassSet() const { + const MapleSet *GetClassSet() const { return classSet; } - - void SetClassSet(MapleSet *set) { - classSet = set; + void AddClassToSet(uint id) { + classSet->emplace(id); } - MapleSet *GetAssignSet() const { + const MapleSet *GetAssignSet() const { return assignSet; } - - void SetAssignSet(MapleSet *set) { - assignSet = set; + void AddAssignToSet(uint id) { + assignSet->emplace(id); } private: uint32 id; // the original alias class id, before any union; start from 0 - OriginalSt *ost; + OriginalSt &ost; bool notAllDefsSeen; // applied to current level; unused for lev -1 bool nextLevNotAllDefsSeen; // remember that next level's elements need to be made notAllDefsSeen MapleSet *classSet; // points to the set of members of its class; nullptr for single-member classes @@ -88,15 +87,15 @@ class AliasElem { class AliasClass : public AnalysisResult { public: - AliasClass(MemPool *memPool, MIRModule *mod, SSATab *ssatb, bool lessThrowAliasParam, bool finalFieldHasAlias, + AliasClass(MemPool &memPool, MIRModule &mod, SSATab &ssatb, bool lessThrowAliasParam, bool finalFieldHasAlias, bool ignoreIpa, bool setCalleeHasSideEffect = false, KlassHierarchy *kh = nullptr) - : AnalysisResult(memPool), + : AnalysisResult(&memPool), mirModule(mod), acMemPool(memPool), - acAlloc(memPool), + acAlloc(&memPool), ssaTab(ssatb), unionFind(memPool), - osym2Elem(ssatb->GetOriginalStTableSize(), nullptr, acAlloc.Adapter()), + osym2Elem(ssatb.GetOriginalStTableSize(), nullptr, acAlloc.Adapter()), id2Elem(acAlloc.Adapter()), notAllDefsSeenClassSetRoots(acAlloc.Adapter()), globalsAffectedByCalls(std::less(), acAlloc.Adapter()), @@ -112,13 +111,13 @@ class AliasClass : public AnalysisResult { AliasAnalysisTable *GetAliasAnalysisTable() { if (aliasAnalysisTable == nullptr) { - aliasAnalysisTable = acMemPool->New(ssaTab, acAlloc, mirModule); + aliasAnalysisTable = acMemPool.New(ssaTab, acAlloc, mirModule, *klassHierarchy); } return aliasAnalysisTable; } - AliasElem *FindAliasElem(const OriginalSt *ost) const { - return osym2Elem.at(ost->GetIndex().idx); + AliasElem *FindAliasElem(const OriginalSt &ost) const { + return osym2Elem.at(ost.GetIndex().idx); } size_t GetAliasElemCount() const { @@ -129,41 +128,41 @@ class AliasClass : public AnalysisResult { return id2Elem.at(id); } - bool IsCreatedByElimRC(const OriginalSt *ost) const { - return ost->GetIndex().idx >= osym2Elem.size(); + bool IsCreatedByElimRC(const OriginalSt &ost) const { + return ost.GetIndex().idx >= osym2Elem.size(); } void ReinitUnionFind() { unionFind.Reinit(); } - void ApplyUnionForCopies(StmtNode *stmt); + void ApplyUnionForCopies(StmtNode &stmt); void CreateAssignSets(); void DumpAssignSets(); void UnionAllPointedTos(); void ApplyUnionForPointedTos(); - void CollectRootIDOfNextLevelNodes(const OriginalSt *ost, std::set &rootIDOfNADSs); + void CollectRootIDOfNextLevelNodes(const OriginalSt &ost, std::set &rootIDOfNADSs); void UnionForNotAllDefsSeen(); void CollectAliasGroups(std::map> &aliasGroups); bool AliasAccordingToType(TyIdx tyidxA, TyIdx tyidxB); - bool AliasAccordingToFieldID(const OriginalSt *ostA, const OriginalSt *ostB); + bool AliasAccordingToFieldID(const OriginalSt &ostA, const OriginalSt &ostB); void ReconstructAliasGroups(); void CollectNotAllDefsSeenAes(); void CreateClassSets(); void DumpClassSets(); - void InsertMayDefUseCall(StmtNode *stmt, BBId bbid, bool hasSideEffect, bool hasNoPrivateDefEffect); - void GenericInsertMayDefUse(StmtNode *stmt, BBId bbid); + void InsertMayDefUseCall(StmtNode &stmt, BBId bbid, bool hasSideEffect, bool hasNoPrivateDefEffect); + void GenericInsertMayDefUse(StmtNode &stmt, BBId bbid); protected: - MIRModule *mirModule; + MIRModule &mirModule; virtual bool InConstructorLikeFunc() const { return true; } private: - MemPool *acMemPool; + MemPool &acMemPool; MapleAllocator acAlloc; - SSATab *ssaTab; + SSATab &ssaTab; UnionFind unionFind; MapleVector osym2Elem; // index is OStIdx MapleVector id2Elem; // index is the id @@ -177,47 +176,48 @@ class AliasClass : public AnalysisResult { bool calleeHasSideEffect; KlassHierarchy *klassHierarchy; AliasAnalysisTable *aliasAnalysisTable; - bool CallHasNoSideEffectOrPrivateDefEffect(StmtNode *stmt, FuncAttrKind attrKind); - bool CallHasSideEffect(StmtNode *stmt); - bool CallHasNoPrivateDefEffect(StmtNode *stmt); - AliasElem *FindOrCreateAliasElem(OriginalSt *ost); - AliasElem *FindOrCreateExtraLevAliasElem(BaseNode *expr, TyIdx tyIdx, FieldID fieldId); - AliasElem *CreateAliasElemsExpr(BaseNode *expr); - void SetNotAllDefsSeenForMustDefs(const StmtNode *callas); - void SetPtrOpndNextLevNADS(const BaseNode *opnd, AliasElem *ae, bool hasNoPrivateDefEffect); + bool CallHasNoSideEffectOrPrivateDefEffect(StmtNode &stmt, FuncAttrKind attrKind); + bool CallHasSideEffect(StmtNode &stmt); + bool CallHasNoPrivateDefEffect(StmtNode &stmt); + AliasElem *FindOrCreateAliasElem(OriginalSt &ost); + AliasElem *FindOrCreateExtraLevAliasElem(BaseNode &expr, TyIdx tyIdx, FieldID fieldId); + AliasElem *CreateAliasElemsExpr(BaseNode &expr); + void SetNotAllDefsSeenForMustDefs(const StmtNode &callas); + void SetPtrOpndNextLevNADS(const BaseNode &opnd, AliasElem *ae, bool hasNoPrivateDefEffect); void SetPtrOpndsNextLevNADS(uint start, uint end, MapleVector &opnds, bool hasNoPrivateDefEffect); - void ApplyUnionForDassignCopy(const AliasElem *lhsAe, const AliasElem *rhsAe, const BaseNode *rhs); + void ApplyUnionForDassignCopy(const AliasElem &lhsAe, const AliasElem *rhsAe, const BaseNode *rhs); AliasElem *FindOrCreateDummyNADSAe(); - void CollectMayDefForMustDefs(const StmtNode *stmt, std::set &mayDefOsts); - void CollectMayUseForCallOpnd(const StmtNode *stmt, std::set &mayUseOsts); - void InsertMayDefNodeForCall(std::set &mayDefOsts, MapleMap *mayDefNodes, - StmtNode *stmt, BBId bbid, bool hasNoPrivateDefEffect); - void InsertMayUseExpr(BaseNode *expr); + void CollectMayDefForMustDefs(const StmtNode &stmt, std::set &mayDefOsts); + void CollectMayUseForCallOpnd(const StmtNode &stmt, std::set &mayUseOsts); + void InsertMayDefNodeForCall(std::set &mayDefOsts, MapleMap &mayDefNodes, + StmtNode &stmt, BBId bbid, bool hasNoPrivateDefEffect); + void InsertMayUseExpr(BaseNode &expr); void CollectMayUseFromGlobalsAffectedByCalls(std::set &mayUseOsts); void CollectMayUseFromNADS(std::set &mayUseOsts); - void InsertMayUseNode(std::set &mayUseOsts, MapleMap *mayUseNodes); - void InsertMayUseReturn(const StmtNode *stmt); - void CollectPtsToOfReturnOpnd(const OriginalSt *ost, std::set &mayUseOsts); - void InsertReturnOpndMayUse(const StmtNode *stmt); - void InsertMayUseAll(const StmtNode *stmt); - void CollectMayDefForDassign(const StmtNode *stmt, std::set &mayDefOsts); - void InsertMayDefNode(std::set &mayDefOsts, MapleMap *mayDefNodes, StmtNode *stmt, + void InsertMayUseNode(std::set &mayUseOsts, MapleMap &mayUseNodes); + void InsertMayUseReturn(const StmtNode &stmt); + void CollectPtsToOfReturnOpnd(const OriginalSt &ost, std::set &mayUseOsts); + void InsertReturnOpndMayUse(const StmtNode &stmt); + void InsertMayUseAll(const StmtNode &stmt); + void CollectMayDefForDassign(const StmtNode &stmt, std::set &mayDefOsts); + void InsertMayDefNode(std::set &mayDefOsts, MapleMap &mayDefNodes, StmtNode &stmt, BBId bbid); - void InsertMayDefDassign(StmtNode *stmt, BBId bbid); - void CollectMayDefForIassign(StmtNode *stmt, std::set &mayDefOsts); - void InsertMayDefNodeExcludeFinalOst(std::set &mayDefOsts, MapleMap *mayDefNodes, - StmtNode *stmt, BBId bbid); - void InsertMayDefIassign(StmtNode *stmt, BBId bbid); - void InsertMayDefUseSyncOps(StmtNode *stmt, BBId bbid); - void InsertMayUseNodeExcludeFinalOst(const std::set &mayUseOsts, MapleMap *mayUseNodes); - void InsertMayDefUseIntrncall(StmtNode *stmt, BBId bbid); - void InsertMayDefUseClinitCheck(IntrinsiccallNode *stmt, BBId bbid); + void InsertMayDefDassign(StmtNode &stmt, BBId bbid); + bool IsEquivalentField(TyIdx tyIdxA, FieldID fldA, TyIdx tyIdxB, FieldID fldB); + void CollectMayDefForIassign(StmtNode &stmt, std::set &mayDefOsts); + void InsertMayDefNodeExcludeFinalOst(std::set &mayDefOsts, MapleMap &mayDefNodes, + StmtNode &stmt, BBId bbid); + void InsertMayDefIassign(StmtNode &stmt, BBId bbid); + void InsertMayDefUseSyncOps(StmtNode &stmt, BBId bbid); + void InsertMayUseNodeExcludeFinalOst(const std::set &mayUseOsts, + MapleMap &mayUseNodes); + void InsertMayDefUseIntrncall(StmtNode &stmt, BBId bbid); + void InsertMayDefUseClinitCheck(IntrinsiccallNode &stmt, BBId bbid); virtual BB *GetBB(BBId id) = 0; void ProcessIdsAliasWithRoot(const std::set &idsAliasWithRoot, std::vector &newGroups); void UpdateNextLevelNodes(std::vector &nextLevelOsts, const AliasElem &aliasElem); void UnionNodes(std::vector &nextLevelOsts); int GetOffset(const Klass &super, Klass &base) const; }; - } // namespace maple #endif // MAPLE_ME_INCLUDE_ALIAS_CLASS_H diff --git a/src/maple_me/include/bb.h b/src/maple_me/include/bb.h index cadf730d4fe77f07d96332467ef822e743094320..1cf4f1e61072e131b345b6e9927421b900ba0f0f 100644 --- a/src/maple_me/include/bb.h +++ b/src/maple_me/include/bb.h @@ -261,7 +261,7 @@ class BB { void FindReachableBBs(std::vector &); void FindWillExitBBs(std::vector &); - PhiNode *PhiofVerStInserted(VersionSt *vsym); + const PhiNode *PhiofVerStInserted(VersionSt *vsym); void InsertPhi(MapleAllocator *alloc, VersionSt *vsym); void DumpPhi(const MIRModule*); bool IsMeStmtEmpty() const { @@ -393,11 +393,9 @@ class BB { StmtNodes stmtNodeList; MeStmts meStmtList; }; - } // namespace maple namespace std { - template <> struct hash { size_t operator()(const maple::BBId &x) const { @@ -411,7 +409,6 @@ struct hash { return x.idx; } }; - } // namespace std -#endif // MAPLE_ME_INCLUDE_BB_H +#endif // MAPLE_ME_INCLUDE_BB_H \ No newline at end of file diff --git a/src/maple_me/include/dominance.h b/src/maple_me/include/dominance.h index f5b03cb501d779c5a6a0c80122c7af0f09d7ed99..2ff5425f8e9a306f799274950a6d921c222dab00 100644 --- a/src/maple_me/include/dominance.h +++ b/src/maple_me/include/dominance.h @@ -20,27 +20,27 @@ namespace maple { class Dominance : public AnalysisResult { public: - Dominance(MemPool *memPool, MemPool *tmpPool, MapleVector *bbVec, BB *commonEntryBB, BB *commonExitBB) - : AnalysisResult(memPool), - domAllocator(memPool), - tmpAllocator(tmpPool), - bbVec(*bbVec), + Dominance(MemPool &memPool, MemPool &tmpPool, MapleVector &bbVec, BB &commonEntryBB, BB &commonExitBB) + : AnalysisResult(&memPool), + domAllocator(&memPool), + tmpAllocator(&tmpPool), + bbVec(bbVec), commonEntryBB(commonEntryBB), commonExitBB(commonExitBB), - postOrderIDVec(bbVec->size(), -1, tmpAllocator.Adapter()), + postOrderIDVec(bbVec.size(), -1, tmpAllocator.Adapter()), reversePostOrder(tmpAllocator.Adapter()), - doms(bbVec->size(), nullptr, domAllocator.Adapter()), - pdomPostOrderIDVec(bbVec->size(), -1, tmpAllocator.Adapter()), + doms(bbVec.size(), nullptr, domAllocator.Adapter()), + pdomPostOrderIDVec(bbVec.size(), -1, tmpAllocator.Adapter()), pdomReversePostOrder(tmpAllocator.Adapter()), - pdoms(bbVec->size(), nullptr, domAllocator.Adapter()), - domFrontier(bbVec->size(), MapleSet(std::less(), domAllocator.Adapter()), domAllocator.Adapter()), - domChildren(bbVec->size(), MapleSet(std::less(), domAllocator.Adapter()), domAllocator.Adapter()), - dtPreOrder(bbVec->size(), BBId(0), domAllocator.Adapter()), - dtDfn(bbVec->size(), -1, domAllocator.Adapter()), - pdomFrontier(bbVec->size(), MapleSet(std::less(), domAllocator.Adapter()), domAllocator.Adapter()), - pdomChildren(bbVec->size(), MapleSet(std::less(), domAllocator.Adapter()), domAllocator.Adapter()), - pdtPreOrder(bbVec->size(), BBId(0), domAllocator.Adapter()), - pdtDfn(bbVec->size(), -1, domAllocator.Adapter()) {} + pdoms(bbVec.size(), nullptr, domAllocator.Adapter()), + domFrontier(bbVec.size(), MapleSet(std::less(), domAllocator.Adapter()), domAllocator.Adapter()), + domChildren(bbVec.size(), MapleSet(std::less(), domAllocator.Adapter()), domAllocator.Adapter()), + dtPreOrder(bbVec.size(), BBId(0), domAllocator.Adapter()), + dtDfn(bbVec.size(), -1, domAllocator.Adapter()), + pdomFrontier(bbVec.size(), MapleSet(std::less(), domAllocator.Adapter()), domAllocator.Adapter()), + pdomChildren(bbVec.size(), MapleSet(std::less(), domAllocator.Adapter()), domAllocator.Adapter()), + pdtPreOrder(bbVec.size(), BBId(0), domAllocator.Adapter()), + pdtDfn(bbVec.size(), -1, domAllocator.Adapter()) {} ~Dominance() = default; @@ -48,23 +48,22 @@ class Dominance : public AnalysisResult { void ComputeDominance(); void ComputeDomFrontiers(); void ComputeDomChildren(); - void ComputeDtPreorder(const BB *bb, size_t &num); + void ComputeDtPreorder(const BB &bb, size_t &num); void ComputeDtDfn(); - bool Dominate(const BB *b1, BB *b2); // true if b1 dominates b2 + bool Dominate(const BB &b1, BB &b2); // true if b1 dominates b2 void DumpDoms(); void PdomGenPostOrderID(); void ComputePostDominance(); void ComputePdomFrontiers(); void ComputePdomChildren(); - void ComputePdtPreorder(const BB *bb, size_t &num); + void ComputePdtPreorder(const BB &bb, size_t &num); void ComputePdtDfn(); - bool PostDominate(const BB *b1, BB *b2); // true if b1 postdominates b2 + bool PostDominate(const BB &b1, BB &b2); // true if b1 postdominates b2 void DumpPdoms(); MapleVector &GetBBVec() { return bbVec; } - const MapleVector &GetBBVec() const { return bbVec; } @@ -81,22 +80,14 @@ class Dominance : public AnalysisResult { return bbVec[i]; } - BB *GetCommonEntryBB() { + BB &GetCommonEntryBB() { return commonEntryBB; } - void SetCommonEntryBB(BB *bb) { - commonEntryBB = bb; - } - - BB *GetCommonExitBB() { + BB &GetCommonExitBB() { return commonExitBB; } - void SetCommonExitBB(BB *exitBB) { - commonExitBB = exitBB; - } - MapleVector &GetPostOrderIDVec() { return postOrderIDVec; } @@ -206,8 +197,8 @@ class Dominance : public AnalysisResult { private: MapleAllocator tmpAllocator; // can be freed after dominator computation MapleVector &bbVec; - BB *commonEntryBB; - BB *commonExitBB; + BB &commonEntryBB; + BB &commonExitBB; MapleVector postOrderIDVec; // index is bb id MapleVector reversePostOrder; // an ordering of the BB in reverse postorder MapleVector doms; // index is bb id; immediate dominator for each BB @@ -225,12 +216,11 @@ class Dominance : public AnalysisResult { MapleVector pdtDfn; // gives position of each BB in pdt_preorder protected: - void PostOrderWalk(BB *bb, int32 &pid, std::vector &visitedMap); - BB *Intersect(BB *bb1, const BB *bb2); - bool CommonEntryBBIsPred(const BB *bb); - void PdomPostOrderWalk(BB *bb, int32 &pid, std::vector &visitedMap); - BB *PdomIntersect(BB *bb1, const BB *bb2); + void PostOrderWalk(BB &bb, int32 &pid, std::vector &visitedMap); + BB *Intersect(BB &bb1, const BB &bb2); + bool CommonEntryBBIsPred(const BB &bb); + void PdomPostOrderWalk(BB &bb, int32 &pid, std::vector &visitedMap); + BB *PdomIntersect(BB &bb1, const BB &bb2); }; - } // namespace maple #endif // MAPLE_ME_INCLUDE_DOMINANCE_H diff --git a/src/maple_me/include/func_emit.h b/src/maple_me/include/func_emit.h index 0d28328ff93f550eb06180d70c40d59148b0bcc7..a3e7a29ae4131c819935441fc2f3f99cdf146558 100644 --- a/src/maple_me/include/func_emit.h +++ b/src/maple_me/include/func_emit.h @@ -20,12 +20,11 @@ namespace maple { class FuncEmit { public: - void EmitBeforeHSSA(MIRFunction *func, const MapleVector &bbList); + void EmitBeforeHSSA(MIRFunction &func, const MapleVector &bbList); virtual ~FuncEmit() = default; private: - void EmitLabelForBB(MIRFunction *func, BB *bb); + void EmitLabelForBB(MIRFunction &func, BB &bb); }; - } // namespace maple -#endif // MAPLE_ME_INCLUDE_FUNC_EMIT_H +#endif // MAPLE_ME_INCLUDE_FUNC_EMIT_H \ No newline at end of file diff --git a/src/maple_me/include/irmap.h b/src/maple_me/include/irmap.h index fae859984cddcc40da3c4da76e80907e430c9051..9a8320063fe28f41e41e7275c8529aea273b688d 100644 --- a/src/maple_me/include/irmap.h +++ b/src/maple_me/include/irmap.h @@ -23,19 +23,17 @@ namespace maple { class IRMap : public AnalysisResult { public: - IRMap(SSATab *ssatab, Dominance *dom, MemPool *memPool, MemPool *tmpMemPool, uint32 hashTableSize) - : AnalysisResult(memPool), + IRMap(SSATab &ssatab, Dominance &dom, MemPool &memPool, MemPool &tmpMemPool, uint32 hashTableSize) + : AnalysisResult(&memPool), ssaTab(ssatab), - mirModule(&ssatab->mirModule), + mirModule(ssatab.GetModule()), dom(dom), - irMapAlloc(memPool), - tempAlloc(tmpMemPool), - exprID(0), + irMapAlloc(&memPool), + tempAlloc(&tmpMemPool), mapHashLength(hashTableSize), hashTable(mapHashLength, nullptr, irMapAlloc.Adapter()), - verst2MeExprTable(ssaTab->GetVersionStTableSize(), nullptr, irMapAlloc.Adapter()), + verst2MeExprTable(ssaTab.GetVersionStTableSize(), nullptr, irMapAlloc.Adapter()), regMeExprTable(irMapAlloc.Adapter()), - needAnotherPass(false), curBB(nullptr) {} virtual ~IRMap() {} @@ -43,38 +41,38 @@ class IRMap : public AnalysisResult { virtual BB *GetBB(BBId id) = 0; virtual BB *GetBBForLabIdx(LabelIdx lidx, PUIdx pidx = 0) = 0; Dominance *GetDominance() { - return dom; - } - - MeExpr *HashMeExpr(MeExpr *meExpr); - void PutToBucket(uint32, MeExpr*); - void BuildBB(BB *bb, std::vector &bbIRMapProcessed); - void BuildAssertMeStmt(NaryMeExpr*); - MeStmt *BuildMeStmtWithNoSSAPart(StmtNode *stmt); - MeStmt *BuildMeStmt(StmtNode*); - MeExpr *BuildExpr(BaseNode*); - MeExpr *BuildLHSVar(const VersionSt *verSt, DassignMeStmt *defMeStmt, DassignNode *dassign); - MeExpr *BuildLHSReg(const VersionSt *verSt, RegassignMeStmt *defMeStmt, const RegassignNode *regassign); - IvarMeExpr *BuildLHSIvar(MeExpr *baseAddr, IassignMeStmt *iassignMeStmt, FieldID fieldID); - IvarMeExpr *BuildLHSIvarFromIassMeStmt(IassignMeStmt *iassignMeStmt); - RegMeExpr *CreateRefRegMeExpr(MIRSymbol*); - RegMeExpr *CreateRegRefMeExpr(MeExpr*); - RegMeExpr *CreateRegRefMeExpr(MIRType*); - VarMeExpr *CreateVarMeExprVersion(const VarMeExpr*); - MeExpr *CreateAddrofMeExpr(MeExpr*); + return &dom; + } + + MeExpr *HashMeExpr(MeExpr &meExpr); + void PutToBucket(uint32, MeExpr&); + void BuildBB(BB &bb, std::vector &bbIRMapProcessed); + void BuildAssertMeStmt(NaryMeExpr&); + MeStmt *BuildMeStmtWithNoSSAPart(StmtNode &stmt); + MeStmt *BuildMeStmt(StmtNode&); + MeExpr *BuildExpr(BaseNode&); + MeExpr *BuildLHSVar(const VersionSt &verSt, DassignMeStmt &defMeStmt, DassignNode &dassign); + MeExpr *BuildLHSReg(const VersionSt &verSt, RegassignMeStmt &defMeStmt, const RegassignNode ®assign); + IvarMeExpr *BuildLHSIvar(MeExpr &baseAddr, IassignMeStmt &iassignMeStmt, FieldID fieldID); + IvarMeExpr *BuildLHSIvarFromIassMeStmt(IassignMeStmt &iassignMeStmt); + RegMeExpr *CreateRefRegMeExpr(MIRSymbol&); + RegMeExpr *CreateRegRefMeExpr(MeExpr&); + RegMeExpr *CreateRegRefMeExpr(MIRType&); + VarMeExpr *CreateVarMeExprVersion(const VarMeExpr&); + MeExpr *CreateAddrofMeExpr(MeExpr&); RegMeExpr *CreateRegMeExpr(PrimType); - RegMeExpr *CreateRegMeExprVersion(const OriginalSt*); - RegMeExpr *CreateRegMeExprVersion(const RegMeExpr*); - MeExpr *ReplaceMeExprExpr(MeExpr*, MeExpr*, MeExpr*); - bool ReplaceMeExprStmtOpnd(uint32, MeStmt*, MeExpr*, MeExpr*); - bool ReplaceMeExprStmt(MeStmt*, MeExpr*, MeExpr*); + RegMeExpr *CreateRegMeExprVersion(const OriginalSt&); + RegMeExpr *CreateRegMeExprVersion(const RegMeExpr&); + MeExpr *ReplaceMeExprExpr(MeExpr&, MeExpr&, MeExpr&); + bool ReplaceMeExprStmtOpnd(uint32, MeStmt&, MeExpr&, MeExpr&); + bool ReplaceMeExprStmt(MeStmt&, MeExpr&, MeExpr&); MeExpr *GetMeExprByVerID(uint32 verid) { return verst2MeExprTable[verid]; } - VarMeExpr *GetOrCreateVarFromVerSt(const VersionSt *verSt); - VarMeExpr *GetOrCreateZeroVersionVarMeExpr(OriginalSt *oSt); - RegMeExpr *GetOrCreateRegFromVerSt(const VersionSt *verSt); + VarMeExpr *GetOrCreateVarFromVerSt(const VersionSt &verSt); + VarMeExpr *GetOrCreateZeroVersionVarMeExpr(const OriginalSt &oSt); + RegMeExpr *GetOrCreateRegFromVerSt(const VersionSt &verSt); MeExpr *GetMeExpr(size_t index) { ASSERT(index < verst2MeExprTable.size(), "index out of range"); MeExpr *meExpr = verst2MeExprTable.at(index); @@ -86,36 +84,36 @@ class IRMap : public AnalysisResult { VarMeExpr *CreateNewGlobalTmp(GStrIdx strIdx, PrimType ptyp); VarMeExpr *CreateNewLocalRefVarTmp(GStrIdx strIdx, TyIdx tIdx); - DassignMeStmt *CreateDassignMeStmt(MeExpr*, MeExpr*, BB*); - RegassignMeStmt *CreateRegassignMeStmt(MeExpr*, MeExpr*, BB*); - void InsertMeStmtBefore(BB*, MeStmt*, MeStmt*); - void BuildChiList(MeStmt*, MapleMap &, MapleMap &); - void BuildMustDefList(MeStmt *meStmt, MapleVector &, MapleVector &); + DassignMeStmt *CreateDassignMeStmt(MeExpr&, MeExpr&, BB&); + RegassignMeStmt *CreateRegassignMeStmt(MeExpr&, MeExpr&, BB&); + void InsertMeStmtBefore(BB&, MeStmt&, MeStmt&); + void BuildChiList(MeStmt&, MapleMap &, MapleMap &); + void BuildMustDefList(MeStmt &meStmt, MapleVector &, MapleVector &); void BuildMuList(MapleMap &, MapleMap &); - void BuildPhiMeNode(BB*); + void BuildPhiMeNode(BB&); VersionSt *GetVerSt(size_t veridx) const { - return ssaTab->GetVerSt(veridx); + return ssaTab.GetVerSt(veridx); } - MeRegPhiNode *CreateMeRegPhi(RegMeExpr*); - MeVarPhiNode *CreateMeVarPhi(VarMeExpr*); + MeRegPhiNode *CreateMeRegPhi(RegMeExpr&); + MeVarPhiNode *CreateMeVarPhi(VarMeExpr&); bool Verify(); // iterate hash table and check with meexpr_table - BB *GetFalseBrBB(CondGotoMeStmt*); + BB *GetFalseBrBB(CondGotoMeStmt&); std::string PhaseName() const { return "irmap"; } virtual void Dump() = 0; - virtual void SetCurFunction(BB *bb) {} + virtual void SetCurFunction(BB &bb) {} MeExpr *CreateIntConstMeExpr(int64, PrimType); - MeExpr *CreateConstMeExpr(PrimType, MIRConst*); - MeExpr *CreateMeExprBinary(Opcode, PrimType, MeExpr*, MeExpr*); - MeExpr *CreateMeExprSelect(PrimType, MeExpr*, MeExpr*, MeExpr*); - MeExpr *CreateMeExprCompare(Opcode, PrimType, PrimType, MeExpr*, MeExpr*); - MeExpr *CreateMeExprIntrinsiciop1(MIRIntrinsicID, PrimType, MeExpr*); - MeExpr *CreateMeExprTypeCvt(PrimType, PrimType, MeExpr*); - MeExpr *CreateAddrofMeExprFromNewSymbol(MIRSymbol*, PUIdx); + MeExpr *CreateConstMeExpr(PrimType, MIRConst&); + MeExpr *CreateMeExprBinary(Opcode, PrimType, MeExpr&, MeExpr&); + MeExpr *CreateMeExprSelect(PrimType, MeExpr&, MeExpr&, MeExpr&); + MeExpr *CreateMeExprCompare(Opcode, PrimType, PrimType, MeExpr&, MeExpr&); + MeExpr *CreateMeExprIntrinsiciop1(MIRIntrinsicID, PrimType, MeExpr&); + MeExpr *CreateMeExprTypeCvt(PrimType, PrimType, MeExpr&); + MeExpr *CreateAddrofMeExprFromNewSymbol(MIRSymbol&, PUIdx); IntrinsiccallMeStmt *CreateIntrinsicCallMeStmt(MIRIntrinsicID idx, std::vector &opnds, TyIdx tyidx = TyIdx()); IntrinsiccallMeStmt *CreateIntrinsicCallAssignedMeStmt(MIRIntrinsicID idx, std::vector &opnds, MeExpr *ret, @@ -131,11 +129,11 @@ class IRMap : public AnalysisResult { } SSATab *GetSSATab() const { - return ssaTab; + return &ssaTab; } MIRModule *GetMIRModule() const { - return mirModule; + return &mirModule; } const MapleAllocator &GetIRMapAlloc() const { @@ -199,20 +197,19 @@ class IRMap : public AnalysisResult { } private: - SSATab *ssaTab; - MIRModule *mirModule; - Dominance *dom; + SSATab &ssaTab; + MIRModule &mirModule; + Dominance &dom; MapleAllocator irMapAlloc; MapleAllocator tempAlloc; - int32 exprID; // for allocating exprid_ in MeExpr + int32 exprID = 0; // for allocating exprid_ in MeExpr uint32 mapHashLength; // size of hashTable MapleVector hashTable; // the value number hash table MapleVector verst2MeExprTable; // map versionst to MeExpr. MapleVector regMeExprTable; // record all the regmeexpr created by ssapre - bool needAnotherPass; // set to true if CFG has changed + bool needAnotherPass = false; // set to true if CFG has changed bool dumpStmtNum = false; BB *curBB; // current maple_me::BB being visited }; - } // namespace maple #endif // MAPLE_ME_INCLUDE_IRMAP_H diff --git a/src/maple_me/include/me_alias_class.h b/src/maple_me/include/me_alias_class.h index dc2268a8876869b26d0085dd8e08e2f821cb1ac7..9effc14348eea9428eeee827169cb952fcbc1a26 100644 --- a/src/maple_me/include/me_alias_class.h +++ b/src/maple_me/include/me_alias_class.h @@ -21,7 +21,7 @@ namespace maple { class MeAliasClass : public AliasClass { public: - MeAliasClass(MemPool *memPool, MIRModule *mod, SSATab *ssaTab, MeFunction *func, bool lessAliasAtThrow, + MeAliasClass(MemPool &memPool, MIRModule &mod, SSATab &ssaTab, MeFunction &func, bool lessAliasAtThrow, bool finalFieldHasAlias, bool ignoreIPA, bool debug, bool setCalleeHasSideEffect, KlassHierarchy *kh) : AliasClass(memPool, mod, ssaTab, lessAliasAtThrow, finalFieldHasAlias, ignoreIPA, setCalleeHasSideEffect, kh), func(func) {} @@ -29,16 +29,16 @@ class MeAliasClass : public AliasClass { virtual ~MeAliasClass() = default; private: - MeFunction *func; - BB *GetBB(BBId id) { - if (func->GetAllBBs().size() < id.idx) { + MeFunction &func; + BB *GetBB(BBId id) override { + if (func.GetAllBBs().size() < id.idx) { return nullptr; } - return func->GetBBFromID(id); + return func.GetBBFromID(id); } - bool InConstructorLikeFunc() const { - return func->GetMirFunc()->IsConstructor() || HasWriteToStaticFinal(); + bool InConstructorLikeFunc() const override { + return func.GetMirFunc()->IsConstructor() || HasWriteToStaticFinal(); } bool HasWriteToStaticFinal() const; @@ -54,6 +54,5 @@ class MeDoAliasClass : public MeFuncPhase { return "aliasclass"; } }; - } // namespace maple #endif // MAPLE_ME_INCLUDE_ME_ALIAS_CLASS_H diff --git a/src/maple_me/include/me_bb_layout.h b/src/maple_me/include/me_bb_layout.h index faeee76c3d9ee15b82af04c3ce99242cf159f7e7..8a0d0c9fc985587cf305c71ffe19749726d00321 100644 --- a/src/maple_me/include/me_bb_layout.h +++ b/src/maple_me/include/me_bb_layout.h @@ -20,34 +20,34 @@ namespace maple { class BBLayout : public AnalysisResult { private: - MeFunction *func; + MeFunction &func; MapleAllocator layoutAlloc; MapleVector layoutBBs; // gives the determined layout order - BBId curBBId; // to index into func->bb_vec_ to return the next BB + BBId curBBId; // to index into func.bb_vec_ to return the next BB bool bbCreated; // new create bb will change mefunction::bb_vec_ and // related analysis result MapleVector laidOut; // indexed by bbid to tell if has been laid out bool tryOutstanding; // true if a try laid out but not its endtry public: - BBLayout(MemPool *memPool, MeFunction *f) - : AnalysisResult(memPool), + BBLayout(MemPool &memPool, MeFunction &f) + : AnalysisResult(&memPool), func(f), - layoutAlloc(memPool), + layoutAlloc(&memPool), layoutBBs(layoutAlloc.Adapter()), curBBId(0), bbCreated(false), - laidOut(func->GetAllBBs().size(), false, layoutAlloc.Adapter()), + laidOut(func.GetAllBBs().size(), false, layoutAlloc.Adapter()), tryOutstanding(false) { - laidOut[func->GetCommonEntryBB()->GetBBId().idx] = true; - laidOut[func->GetCommonExitBB()->GetBBId().idx] = true; + laidOut[func.GetCommonEntryBB()->GetBBId().idx] = true; + laidOut[func.GetCommonExitBB()->GetBBId().idx] = true; } virtual ~BBLayout() = default; BB *NextBB() { // return the next BB following strictly program input order curBBId.idx++; - while (curBBId.idx < func->GetAllBBs().size()) { - BB *nextBB = func->GetBBFromID(curBBId); + while (curBBId.idx < func.GetAllBBs().size()) { + BB *nextBB = func.GetBBFromID(curBBId); if (nextBB != nullptr && !laidOut[nextBB->GetBBId().idx]) { return nextBB; } @@ -56,16 +56,16 @@ class BBLayout : public AnalysisResult { return nullptr; } - void OptimizeBranchTarget(BB *bb); - bool BBEmptyAndFallthru(const BB *bb); - bool BBContainsOnlyGoto(BB *bb); - bool BBContainsOnlyCondGoto(BB *bb); - bool HasSameBranchCond(BB *bb1, BB *bb2); - bool BBCanBeMoved(BB *fromBB, const BB *toAfterBB); - void AddBB(BB *bb); - BB *GetFallThruBBSkippingEmpty(BB *bb); - void ResolveUnconditionalFallThru(BB *bb, BB *nextBB); - void ChangeToFallthruFromGoto(BB *bb); + void OptimizeBranchTarget(BB &bb); + bool BBEmptyAndFallthru(const BB &bb); + bool BBContainsOnlyGoto(BB &bb); + bool BBContainsOnlyCondGoto(BB &bb); + bool HasSameBranchCond(BB &bb1, BB &bb2); + bool BBCanBeMoved(BB &fromBB, const BB &toAfterBB); + void AddBB(BB &bb); + BB *GetFallThruBBSkippingEmpty(BB &bb); + void ResolveUnconditionalFallThru(BB &bb, BB &nextBB); + void ChangeToFallthruFromGoto(BB &bb); const MapleVector &GetBBs() const { return layoutBBs; } @@ -109,6 +109,5 @@ class MeDoBBLayout : public MeFuncPhase { return "bblayout"; } }; - } // namespace maple #endif // MAPLE_ME_INCLUDE_ME_BB_LAYOUT_H diff --git a/src/maple_me/include/me_cfg.h b/src/maple_me/include/me_cfg.h index 5109baad142afa30e48d8fde41f0bb491669c8de..cc82bafad81ed854354d5ebf8f92bd1dbaa7ce09 100644 --- a/src/maple_me/include/me_cfg.h +++ b/src/maple_me/include/me_cfg.h @@ -18,29 +18,29 @@ #include "me_phase.h" namespace maple { -class MirCFG { +class MeCFG { public: - explicit MirCFG(MeFunction *f) : func(f), hasDoWhile(false) {} + MeCFG(MeFunction &f) : func(f) {} - ~MirCFG() {} + ~MeCFG() {} void BuildMirCFG(); void FixMirCFG(); - void ConvertPhis2IdentityAssigns(BB *meBB); + void ConvertPhis2IdentityAssigns(BB &meBB); void UnreachCodeAnalysis(bool updatePhi = false); void WontExitAnalysis(); void Verify(); void VerifyLabels(); void Dump(); - void DumpToFile(const char *prefix, bool dumpInStrs = false); + void DumpToFile(const std::string &prefix, bool dumpInStrs = false); void AddAuxilaryBB(); - bool FindExprUse(BaseNode *expr, StIdx stIdx); - bool FindUse(StmtNode *stmt, StIdx stid); - bool FindDef(StmtNode *stmt, StIdx stid); - bool HasNoOccBetween(StmtNode *from, StmtNode *to, StIdx stIdx); + bool FindExprUse(BaseNode &expr, StIdx stIdx); + bool FindUse(StmtNode &stmt, StIdx stid); + bool FindDef(StmtNode &stmt, StIdx stid); + bool HasNoOccBetween(StmtNode &from, StmtNode &to, StIdx stIdx); - MeFunction *GetFunc() { + MeFunction &GetFunc() { return func; } @@ -53,9 +53,8 @@ class MirCFG { } private: - MeFunction *func; - bool hasDoWhile; + MeFunction &func; + bool hasDoWhile = false; }; - } // namespace maple #endif // MAPLE_ME_INCLUDE_ME_CFG_H diff --git a/src/maple_me/include/me_dominance.h b/src/maple_me/include/me_dominance.h index 2469bd19c4214975952782ce524602aa21f4cbc4..2b4f29d973e7cad6d757754a658aa302c0cd5f80 100644 --- a/src/maple_me/include/me_dominance.h +++ b/src/maple_me/include/me_dominance.h @@ -29,6 +29,5 @@ class MeDoDominance : public MeFuncPhase { return "dominance"; } }; - } // namespace maple -#endif // MAPLE_ME_INCLUDE_ME_DOMINANCE_H +#endif // MAPLE_ME_INCLUDE_ME_DOMINANCE_H \ No newline at end of file diff --git a/src/maple_me/include/me_emit.h b/src/maple_me/include/me_emit.h index f6a9c03fa1be69e9446cf04bc209a7356e1349dd..d7ff6c7034cf2e128d81e9f2ed42a8c061e9dee8 100644 --- a/src/maple_me/include/me_emit.h +++ b/src/maple_me/include/me_emit.h @@ -18,18 +18,16 @@ #include "me_phase.h" /* emit ir to specified file */ - namespace maple { -class MeDoEmission : public MeFuncPhase { +class MeDoEmit : public MeFuncPhase { public: - explicit MeDoEmission(MePhaseID id) : MeFuncPhase(id) {} + explicit MeDoEmit(MePhaseID id) : MeFuncPhase(id) {} - virtual ~MeDoEmission() = default; + virtual ~MeDoEmit() = default; AnalysisResult *Run(MeFunction *func, MeFuncResultMgr *m, ModuleResultMgr *mrm) override; std::string PhaseName() const override { return "emit"; } }; - } // namespace maple #endif // MAPLE_ME_INCLUDE_ME_EMIT_H diff --git a/src/maple_me/include/me_function.h b/src/maple_me/include/me_function.h index 6237137f7710f3067775a893a68e0afb697c0bcd..45b0d7e08cd91256ca95760d687f13af49ea1d7e 100644 --- a/src/maple_me/include/me_function.h +++ b/src/maple_me/include/me_function.h @@ -28,7 +28,7 @@ #include "me_ssa.h" namespace maple { -class MirCFG; +class MeCFG; class MeIRMap; #if DEBUG extern MIRModule *g_mirmodule; @@ -398,11 +398,11 @@ class MeFunction : public FuncEmit { return endTryBB2TryBB[endTry]; } - MirCFG *GetTheCfg() { + MeCFG *GetTheCfg() { return theCFG; } - void SetTheCfg(MirCFG *currTheCfg) { + void SetTheCfg(MeCFG *currTheCfg) { theCFG = currTheCfg; } @@ -455,7 +455,7 @@ class MeFunction : public FuncEmit { /* mempool */ MapleUnorderedMap labelBBIdMap; BBPtrHolder bbVec; - MirCFG *theCFG; + MeCFG *theCFG; SSATab *meSSATab; MeIRMap *irmap; MapleUnorderedMap bbTryNodeMap; // maps isTry bb to its try stmt @@ -467,6 +467,5 @@ class MeFunction : public FuncEmit { bool hasEH; /* current has try statement */ bool secondPass; // second pass for the same function }; - } // namespace maple #endif // MAPLE_ME_INCLUDE_ME_FUNCTION_H diff --git a/src/maple_me/include/me_ir.h b/src/maple_me/include/me_ir.h index d253296a04f5b0cca6c43e73be5346a93c00989f..71fa684bf2d6d9237ece074a6c5faaeb39d6d82f 100644 --- a/src/maple_me/include/me_ir.h +++ b/src/maple_me/include/me_ir.h @@ -117,11 +117,11 @@ class MeExpr { return false; } - virtual bool IsUseSameSymbol(MeExpr *expr) const { - return expr && (exprID == expr->exprID); + virtual bool IsUseSameSymbol(const MeExpr &expr) const { + return exprID == expr.exprID; } - virtual BaseNode *EmitExpr(SSATab*) = 0; + virtual BaseNode &EmitExpr(SSATab &) = 0; bool IsLeaf() const { return numOpnds == 0; } @@ -130,19 +130,19 @@ class MeExpr { return op == OP_gcmalloc || op == OP_gcmallocjarray || op == OP_gcpermalloc || op == OP_gcpermallocjarray; } - virtual bool IsVolatile(SSATab*) { + virtual bool IsVolatile(SSATab &) { return false; } - bool IsTheSameWorkcand(MeExpr*) const; - virtual void SetDefByStmt(MeStmt*) {} + bool IsTheSameWorkcand(const MeExpr &) const; + virtual void SetDefByStmt(MeStmt &) {} virtual MeExpr *GetOpnd(size_t i) const { return nullptr; } void UpdateDepth(); // update the depth, suppose all sub nodes have already depth done. - MeExpr *GetAddrExprBase(); // get the base of the address expression + MeExpr &GetAddrExprBase(); // get the base of the address expression MeExpr *FindSymAppearance(OStIdx oidx); // find the appearance of the symbol // in the expression; nullptr otherwise bool SymAppears(OStIdx oidx); // check if symbol appears in the expression @@ -151,7 +151,7 @@ class MeExpr { return !kOpcodeInfo.NotPure(op); } - bool IsSameVariableValue(VarMeExpr*) const; + virtual bool IsSameVariableValue(const VarMeExpr &) const; MeExpr *ResolveMeExprValue(); bool CouldThrowException() const; bool PointsToSomethingThatNeedsIncRef(); @@ -182,10 +182,8 @@ class ChiMeNode; // forward decl class MustDefMeNode; // forward decl class IassignMeStmt; // forward decl - // represant dread -class VarMeExpr : public MeExpr { - public: +class VarMeExpr final : public MeExpr { public: VarMeExpr(MapleAllocator *alloc, int32 exprid, OStIdx oidx, size_t vidx) : MeExpr(exprid, kMeOpVar), @@ -201,13 +199,13 @@ class VarMeExpr : public MeExpr { ~VarMeExpr() = default; - void Dump(IRMap*, int32 indent = 0) const; - bool IsUseSameSymbol(MeExpr*) const; - BaseNode *EmitExpr(SSATab*); - bool IsValidVerIdx(SSATab *ssaTab); - void SetDefByStmt(MeStmt *defStmt) { + void Dump(IRMap*, int32 indent = 0) const override; + bool IsUseSameSymbol(const MeExpr &) const override; + BaseNode &EmitExpr(SSATab &) override; + bool IsValidVerIdx(SSATab &ssaTab); + void SetDefByStmt(MeStmt &defStmt) override { defBy = kDefByStmt; - def.defStmt = defStmt; + def.defStmt = &defStmt; } bool IsDefByPhi() const { @@ -219,12 +217,13 @@ class VarMeExpr : public MeExpr { } BB *DefByBB(); - bool IsVolatile(SSATab*); + bool IsVolatile(SSATab &) override; // indicate if the variable is local variable but not a function formal variable - bool IsPureLocal(SSATab*, const MIRFunction*) const; - bool IsZeroVersion(SSATab*) const; - BB *GetDefByBBMeStmt(Dominance*, MeStmtPtr&); - VarMeExpr *ResolveVarMeValue(); + bool IsPureLocal(SSATab &, const MIRFunction &) const; + bool IsZeroVersion(SSATab &) const; + BB *GetDefByBBMeStmt(Dominance &, MeStmtPtr &); + bool IsSameVariableValue(const VarMeExpr &) const override; + VarMeExpr &ResolveVarMeValue(); const OStIdx &GetOStIdx() const { return ostIdx; @@ -282,28 +281,28 @@ class VarMeExpr : public MeExpr { def.defStmt = defStmt; } - MeVarPhiNode *GetDefPhi() { - return def.defPhi; + MeVarPhiNode &GetDefPhi() { + return *def.defPhi; } - void SetDefPhi(MeVarPhiNode *defPhi) { - def.defPhi = defPhi; + void SetDefPhi(MeVarPhiNode &defPhi) { + def.defPhi = &defPhi; } - ChiMeNode *GetDefChi() { - return def.defChi; + ChiMeNode &GetDefChi() { + return *def.defChi; } - void SetDefChi(ChiMeNode *defChi) { - def.defChi = defChi; + void SetDefChi(ChiMeNode &defChi) { + def.defChi = &defChi; } - MustDefMeNode *GetDefMustDef() { - return def.defMustDef; + MustDefMeNode &GetDefMustDef() { + return *def.defMustDef; } - void SetDefMustDef(MustDefMeNode *defMustDef) { - def.defMustDef = defMustDef; + void SetDefMustDef(MustDefMeNode &defMustDef) { + def.defMustDef = &defMustDef; } private: @@ -333,7 +332,7 @@ class MeVarPhiNode { MeVarPhiNode(VarMeExpr *var, MapleAllocator *alloc) : lhs(var), opnds(2, nullptr, alloc->Adapter()), isLive(true), defBB(nullptr) { - var->SetDefPhi(this); + var->SetDefPhi(*this); var->SetDefBy(kDefByPhi); opnds.pop_back(); opnds.pop_back(); @@ -341,13 +340,13 @@ class MeVarPhiNode { ~MeVarPhiNode() = default; - void UpdateLHS(VarMeExpr *var) { - lhs = var; - var->SetDefBy(kDefByPhi); - var->SetDefPhi(this); + void UpdateLHS(VarMeExpr &var) { + lhs = &var; + var.SetDefBy(kDefByPhi); + var.SetDefPhi(*this); } - bool IsPureLocal(SSATab *ssatab, MIRFunction *mirfunc); + bool IsPureLocal(SSATab &ssatab, const MIRFunction &mirfunc); void Dump(IRMap *irmap) const; VarMeExpr *GetOpnd(size_t idx) const { @@ -411,11 +410,11 @@ class RegMeExpr : public MeExpr { ~RegMeExpr() = default; - void Dump(IRMap*, int32 indent = 0) const; - BaseNode *EmitExpr(SSATab*); - void SetDefByStmt(MeStmt *defStmt) { + void Dump(IRMap*, int32 indent = 0) const override; + BaseNode &EmitExpr(SSATab &) override; + void SetDefByStmt(MeStmt &defStmt) override { defBy = kDefByStmt; - def.defStmt = defStmt; + def.defStmt = &defStmt; } bool IsDefByPhi() const { @@ -426,9 +425,11 @@ class RegMeExpr : public MeExpr { return IsDefByPhi() ? def.defPhi : nullptr; } - bool IsUseSameSymbol(MeExpr*) const; + bool IsSameVariableValue(const VarMeExpr &) const override; + + bool IsUseSameSymbol(const MeExpr &) const override; BB *DefByBB(); - RegMeExpr *FindDefByStmt(std::set *visited); + RegMeExpr *FindDefByStmt(std::set &visited); PregIdx16 GetRegIdx() const { return regIdx; @@ -462,31 +463,30 @@ class RegMeExpr : public MeExpr { return def.defStmt; } - MeRegPhiNode *GetDefPhi() { - return def.defPhi; + MeRegPhiNode &GetDefPhi() { + return *def.defPhi; } - MustDefMeNode *GetDefMustDef() { - return def.defMustDef; + MustDefMeNode &GetDefMustDef() { + return *def.defMustDef; } void SetDefStmt(MeStmt *defStmtVal) { def.defStmt = defStmtVal; } - void SetDefPhi(MeRegPhiNode *defPhiVal) { - def.defPhi = defPhiVal; + void SetDefPhi(MeRegPhiNode &defPhiVal) { + def.defPhi = &defPhiVal; } - void SetDefMustDef(MustDefMeNode *defMustDefVal) { - def.defMustDef = defMustDefVal; + void SetDefMustDef(MustDefMeNode &defMustDefVal) { + def.defMustDef = &defMustDefVal; } private: PregIdx16 regIdx; MeDefBy defBy; bool recursivePtr; // if pointer to recursive data structures; - // used only is_escaped is false PUIdx puIdx; OStIdx ostIdx; // the index in MEOptimizer's OriginalStTable; uint32 vstIdx; // the index in MEOptimizer's VersionStTable, 0 if not in VersionStTable @@ -508,10 +508,10 @@ class MeRegPhiNode { ~MeRegPhiNode() = default; - void UpdateLHS(RegMeExpr *reg) { - lhs = reg; - reg->SetDefBy(kDefByPhi); - reg->SetDefPhi(this); + void UpdateLHS(RegMeExpr ®) { + lhs = ® + reg.SetDefBy(kDefByPhi); + reg.SetDefPhi(*this); } void Dump(IRMap *irMap) const; @@ -567,7 +567,7 @@ class ConstMeExpr : public MeExpr { ~ConstMeExpr() = default; void Dump(IRMap*, int32 indent = 0) const; - BaseNode *EmitExpr(SSATab*); + BaseNode &EmitExpr(SSATab &); bool GeZero() const; bool GtZero() const; bool IsZero() const; @@ -610,7 +610,7 @@ class ConststrMeExpr : public MeExpr { ~ConststrMeExpr() = default; void Dump(IRMap*, int32 indent = 0) const; - BaseNode *EmitExpr(SSATab*); + BaseNode &EmitExpr(SSATab &); UStrIdx &GetStrIdx() { return strIdx; @@ -630,7 +630,7 @@ class Conststr16MeExpr : public MeExpr { ~Conststr16MeExpr() = default; void Dump(IRMap*, int32 indent = 0) const; - BaseNode *EmitExpr(SSATab*); + BaseNode &EmitExpr(SSATab &); U16StrIdx &GetStrIdx() { return strIdx; @@ -650,7 +650,7 @@ class SizeoftypeMeExpr : public MeExpr { ~SizeoftypeMeExpr() = default; void Dump(IRMap*, int32 indent = 0) const; - BaseNode *EmitExpr(SSATab*); + BaseNode &EmitExpr(SSATab &); TyIdx &GetTyIdx() { return tyIdx; @@ -671,7 +671,7 @@ class FieldsDistMeExpr : public MeExpr { ~FieldsDistMeExpr() = default; void Dump(IRMap*, int32 indent = 0) const; - BaseNode *EmitExpr(SSATab*); + BaseNode &EmitExpr(SSATab &); TyIdx &GetTyIdx() { return tyIdx; @@ -701,9 +701,9 @@ class AddrofMeExpr : public MeExpr { ~AddrofMeExpr() = default; - void Dump(IRMap*, int32 indent = 0) const; - bool IsUseSameSymbol(MeExpr*) const; - BaseNode *EmitExpr(SSATab*); + void Dump(IRMap*, int32 indent = 0) const override; + bool IsUseSameSymbol(const MeExpr &) const override; + BaseNode &EmitExpr(SSATab &) override; OStIdx &GetOstIdx() { return ostIdx; @@ -721,7 +721,7 @@ class AddrofMeExpr : public MeExpr { fieldID = fieldIDVal; } - uint32 GetHashIndex() const { + uint32 GetHashIndex() const override { return ostIdx.idx << 4; } @@ -737,7 +737,7 @@ class AddroffuncMeExpr : public MeExpr { ~AddroffuncMeExpr() = default; void Dump(IRMap*, int32 indent = 0) const; - BaseNode *EmitExpr(SSATab*); + BaseNode &EmitExpr(SSATab &); PUIdx GetPuIdx() { return puIdx; @@ -758,7 +758,7 @@ class GcmallocMeExpr : public MeExpr { ~GcmallocMeExpr() = default; void Dump(IRMap*, int32 indent = 0) const; - BaseNode *EmitExpr(SSATab*); + BaseNode &EmitExpr(SSATab &); TyIdx &GetTyIdx() { return tyIdx; @@ -797,11 +797,11 @@ class OpMeExpr : public MeExpr { OpMeExpr(const OpMeExpr &) = delete; OpMeExpr &operator=(const OpMeExpr &) = delete; - bool IsIdentical(const OpMeExpr *meexpr); - void Dump(IRMap*, int32 indent = 0) const; - bool IsUseSameSymbol(MeExpr*) const; - BaseNode *EmitExpr(SSATab*); - MeExpr *GetOpnd(size_t i) const { + bool IsIdentical(const OpMeExpr &meexpr); + void Dump(IRMap*, int32 indent = 0) const override; + bool IsUseSameSymbol(const MeExpr &) const override; + BaseNode &EmitExpr(SSATab &) override; + MeExpr *GetOpnd(size_t i) const override { CHECK_FATAL(i < kOpndNumOfOpMeExpr, "OpMeExpr cannot have more than 3 operands"); return opnds[i]; } @@ -855,7 +855,7 @@ class OpMeExpr : public MeExpr { fieldID = fieldIDVal; } - uint32 GetHashIndex() const { + uint32 GetHashIndex() const override { uint32 hashIdx = static_cast(GetOp()); for (auto &opnd : opnds) { if (opnd == nullptr) { @@ -904,17 +904,17 @@ class IvarMeExpr : public MeExpr { ~IvarMeExpr() = default; - void Dump(IRMap*, int32 indent = 0) const; - BaseNode *EmitExpr(SSATab*); - bool IsVolatile(SSATab*) { + void Dump(IRMap*, int32 indent = 0) const override; + BaseNode &EmitExpr(SSATab &) override; + bool IsVolatile(SSATab &) override { return IsVolatile(); } bool IsVolatile(); bool IsFinal(); bool IsRCWeak(); - bool IsUseSameSymbol(MeExpr*) const; - MeExpr *GetOpnd(size_t idx) const { + bool IsUseSameSymbol(const MeExpr &) const override; + MeExpr *GetOpnd(size_t idx) const override { ASSERT(idx == 0, "IvarMeExpr can only have 1 operand"); return base; } @@ -963,7 +963,6 @@ class IvarMeExpr : public MeExpr { fieldID = fieldIDVal; } - bool GetMaybeNull() { return maybeNull; } @@ -980,7 +979,7 @@ class IvarMeExpr : public MeExpr { mu = muVal; } - uint32 GetHashIndex() const { + uint32 GetHashIndex() const override { return static_cast(OP_iread) + fieldID + (static_cast(base->GetExprID()) << 4); } @@ -1014,11 +1013,11 @@ class NaryMeExpr : public MeExpr { ~NaryMeExpr() = default; - void Dump(IRMap*, int32 indent = 0) const; - bool IsIdentical(NaryMeExpr*) const; - bool IsUseSameSymbol(MeExpr*) const; - BaseNode *EmitExpr(SSATab*); - MeExpr *GetOpnd(size_t idx) const { + void Dump(IRMap*, int32 indent = 0) const override; + bool IsIdentical(NaryMeExpr &) const; + bool IsUseSameSymbol(const MeExpr &) const override; + BaseNode &EmitExpr(SSATab &) override; + MeExpr *GetOpnd(size_t idx) const override { ASSERT(idx < opnds.size(), "NaryMeExpr operand out of bounds"); return opnds[idx]; } @@ -1051,7 +1050,7 @@ class NaryMeExpr : public MeExpr { return boundCheck; } - const bool GetBoundCheck() const { + bool GetBoundCheck() const { return boundCheck; } @@ -1059,8 +1058,8 @@ class NaryMeExpr : public MeExpr { boundCheck = ch; } - uint32 GetHashIndex() const { - uint32 hashIdx = static_cast(GetOp()); + uint32 GetHashIndex() const override { + auto hashIdx = static_cast(GetOp()); for (uint32 i = 0; i < GetNumOpnds(); i++) { hashIdx += static_cast(opnds[i]->GetExprID()) << 3; } @@ -1122,7 +1121,7 @@ class MeStmt { return op == OP_dassign || op == OP_maydassign || op == OP_iassign || op == OP_regassign; } - void SetCallReturn(MeExpr*); + void SetCallReturn(MeExpr &); virtual MIRType *GetReturnType() const { return nullptr; } @@ -1154,7 +1153,7 @@ class MeStmt { isLive = mestmt->isLive; } - bool IsTheSameWorkcand(MeStmt*) const; + bool IsTheSameWorkcand(MeStmt &) const; virtual bool NeedDecref() const { return false; } @@ -1187,11 +1186,11 @@ class MeStmt { return nullptr; } - virtual MeExpr *GetLHSRef(SSATab *ssatab, bool excludelocalrefvar) { + virtual MeExpr *GetLHSRef(SSATab &ssatab, bool excludelocalrefvar) { return nullptr; } - virtual StmtNode *EmitStmt(SSATab *ssatab); + virtual StmtNode &EmitStmt(SSATab &ssatab); void RemoveNode() { // remove this node from the double link list if (prev != nullptr) { @@ -1324,12 +1323,12 @@ class MustDefMeNode { if (x->GetMeOp() == kMeOpReg) { RegMeExpr *reg = static_cast(x); reg->SetDefBy(kDefByMustDef); - reg->SetDefMustDef(this); + reg->SetDefMustDef(*this); } else { CHECK(x->GetMeOp() == kMeOpVar, "unexpected opcode"); VarMeExpr *var = static_cast(x); var->SetDefBy(kDefByMustDef); - var->SetDefMustDef(this); + var->SetDefMustDef(*this); } } @@ -1369,7 +1368,7 @@ class MustDefMeNode { lhs = mustDef.lhs; base = mustDef.base; isLive = mustDef.isLive; - UpdateLHS(lhs); + UpdateLHS(*lhs); } MustDefMeNode &operator=(const MustDefMeNode &mustDef) { @@ -1377,22 +1376,22 @@ class MustDefMeNode { lhs = mustDef.lhs; base = mustDef.base; isLive = mustDef.isLive; - UpdateLHS(lhs); + UpdateLHS(*lhs); } return *this; } - void UpdateLHS(MeExpr *x) { - lhs = x; - if (x->GetMeOp() == kMeOpReg) { - RegMeExpr *reg = static_cast(x); - reg->SetDefBy(kDefByMustDef); - reg->SetDefMustDef(this); + void UpdateLHS(MeExpr &x) { + lhs = &x; + if (x.GetMeOp() == kMeOpReg) { + auto ® = static_cast(x); + reg.SetDefBy(kDefByMustDef); + reg.SetDefMustDef(*this); } else { ASSERT(lhs->GetMeOp() == kMeOpVar, "unexpected opcode"); - VarMeExpr *var = static_cast(x); - var->SetDefBy(kDefByMustDef); - var->SetDefMustDef(this); + auto &var = static_cast(x); + var.SetDefBy(kDefByMustDef); + var.SetDefMustDef(*this); } } @@ -1533,14 +1532,14 @@ class DassignMeStmt : public MeStmt { return lhs; } - MeExpr *GetLHSRef(SSATab *ssatab, bool excludelocalrefvar); - void UpdateLHS(VarMeExpr *var) { - lhs = var; - var->SetDefBy(kDefByStmt); - var->SetDefStmt(this); + MeExpr *GetLHSRef(SSATab &ssatab, bool excludelocalrefvar); + void UpdateLHS(VarMeExpr &var) { + lhs = &var; + var.SetDefBy(kDefByStmt); + var.SetDefStmt(this); } - StmtNode *EmitStmt(SSATab *ssatab); + StmtNode &EmitStmt(SSATab &ssatab); private: MeExpr *rhs; @@ -1610,7 +1609,7 @@ class RegassignMeStmt : public MeStmt { lhs = value; } - StmtNode *EmitStmt(SSATab *ssatab); + StmtNode &EmitStmt(SSATab &ssatab); private: MeExpr *rhs; @@ -1708,8 +1707,8 @@ class MaydassignMeStmt : public MeStmt { return chiList.begin()->second->GetLHS(); } - MeExpr *GetLHSRef(SSATab *ssatab, bool excludelocalrefvar); - StmtNode *EmitStmt(SSATab *ssatab); + MeExpr *GetLHSRef(SSATab &ssatab, bool excludelocalrefvar); + StmtNode &EmitStmt(SSATab &ssatab); private: MeExpr *rhs; @@ -1779,7 +1778,7 @@ class IassignMeStmt : public MeStmt { chiList = value; } - MeExpr *GetLHSRef(SSATab *ssatab, bool excludelocalrefvar); + MeExpr *GetLHSRef(SSATab &ssatab, bool excludelocalrefvar); bool NeedDecref() const { return needDecref; } @@ -1825,7 +1824,7 @@ class IassignMeStmt : public MeStmt { lhsVar = val; } - StmtNode *EmitStmt(SSATab *ssatab); + StmtNode &EmitStmt(SSATab &ssatab); private: TyIdx tyIdx; @@ -1877,7 +1876,7 @@ class NaryMeStmt : public MeStmt { return nullptr; } - StmtNode *EmitStmt(SSATab *ssatab); + StmtNode &EmitStmt(SSATab &ssatab); private: MapleVector opnds; @@ -1913,7 +1912,7 @@ class AssignedPart { virtual ~AssignedPart() = default; void DumpAssignedPart(IRMap *irmap) const; - VarMeExpr *GetAssignedPartLHSRef(SSATab *ssatab, bool excludelocalrefvar); + VarMeExpr *GetAssignedPartLHSRef(SSATab &ssatab, bool excludelocalrefvar); protected: MapleVector mustDefList; @@ -1980,7 +1979,7 @@ class CallMeStmt : public NaryMeStmt, public MuChiMePart, public AssignedPart { return mustDefList.empty() ? nullptr : mustDefList.front().GetLHS(); } - MeExpr *GetLHSRef(SSATab *ssatab, bool excludelocalrefvar) { + MeExpr *GetLHSRef(SSATab &ssatab, bool excludelocalrefvar) { return GetAssignedPartLHSRef(ssatab, excludelocalrefvar); } @@ -2013,7 +2012,7 @@ class CallMeStmt : public NaryMeStmt, public MuChiMePart, public AssignedPart { return callee->GetReturnType(); } - StmtNode *EmitStmt(SSATab *ssatab); + StmtNode &EmitStmt(SSATab &ssatab); private: PUIdx puIdx; @@ -2060,7 +2059,7 @@ class IcallMeStmt : public NaryMeStmt, public MuChiMePart, public AssignedPart { return mustDefList.empty() ? nullptr : mustDefList.front().GetLHS(); } - MeExpr *GetLHSRef(SSATab *ssatab, bool excludelocalrefvar) { + MeExpr *GetLHSRef(SSATab &ssatab, bool excludelocalrefvar) { return GetAssignedPartLHSRef(ssatab, excludelocalrefvar); } @@ -2092,7 +2091,7 @@ class IcallMeStmt : public NaryMeStmt, public MuChiMePart, public AssignedPart { return GlobalTables::GetTypeTable().GetTypeFromTyIdx(retTyIdx); } - StmtNode *EmitStmt(SSATab *ssatab); + StmtNode &EmitStmt(SSATab &ssatab); TyIdx GetRetTyIdx() const { return retTyIdx; @@ -2169,7 +2168,7 @@ class IntrinsiccallMeStmt : public NaryMeStmt, public MuChiMePart, public Assign return mustDefList.empty() ? nullptr : mustDefList.front().GetLHS(); } - MeExpr *GetLHSRef(SSATab *ssatab, bool excludelocalrefvar) { + MeExpr *GetLHSRef(SSATab &ssatab, bool excludelocalrefvar) { return GetAssignedPartLHSRef(ssatab, excludelocalrefvar); } @@ -2197,7 +2196,7 @@ class IntrinsiccallMeStmt : public NaryMeStmt, public MuChiMePart, public Assign needIncref = false; } - StmtNode *EmitStmt(SSATab *ssatab); + StmtNode &EmitStmt(SSATab &ssatab); MIRIntrinsicID GetIntrinsic() const { return intrinsic; @@ -2237,14 +2236,13 @@ class RetMeStmt : public NaryMeStmt { // eval, free, decref, incref, decrefreset, assertnonnull class UnaryMeStmt : public MeStmt { public: - explicit UnaryMeStmt(const StmtNode *stt) : MeStmt(stt), opnd(nullptr), notNeedLock(false), decrefBeforeExit(false) {} + explicit UnaryMeStmt(const StmtNode *stt) : MeStmt(stt), opnd(nullptr), decrefBeforeExit(false) {} - explicit UnaryMeStmt(Opcode o) : MeStmt(o), opnd(nullptr), notNeedLock(false), decrefBeforeExit(false) {} + explicit UnaryMeStmt(Opcode o) : MeStmt(o), opnd(nullptr), decrefBeforeExit(false) {} explicit UnaryMeStmt(UnaryMeStmt *umestmt) : MeStmt(umestmt->GetOp()), opnd(umestmt->opnd), - notNeedLock(umestmt->GetNotNeedLock()), decrefBeforeExit(false) {} virtual ~UnaryMeStmt() = default; @@ -2269,25 +2267,16 @@ class UnaryMeStmt : public MeStmt { opnd = val; } - bool GetNotNeedLock() const { - return notNeedLock; - } - - void SetNotNeedLock(bool currNotNeedLock) { - notNeedLock = currNotNeedLock; - } - bool GetDecrefBeforeExit() const { return decrefBeforeExit; } void Dump(IRMap*) const; - StmtNode *EmitStmt(SSATab *ssatab); + StmtNode &EmitStmt(SSATab &ssatab); private: MeExpr *opnd; - bool notNeedLock; bool decrefBeforeExit; // true if decref is inserted due to anticipated function exit }; @@ -2305,7 +2294,7 @@ class GotoMeStmt : public MeStmt { offset = o; } - StmtNode *EmitStmt(SSATab *ssatab); + StmtNode &EmitStmt(SSATab &ssatab); private: uint32 offset; // the label @@ -2327,7 +2316,7 @@ class CondGotoMeStmt : public UnaryMeStmt { } void Dump(IRMap*) const; - StmtNode *EmitStmt(SSATab *ssatab); + StmtNode &EmitStmt(SSATab &ssatab); private: uint32 offset; // the label @@ -2342,7 +2331,7 @@ class JsTryMeStmt : public MeStmt { ~JsTryMeStmt() = default; - StmtNode *EmitStmt(SSATab *ssatab); + StmtNode &EmitStmt(SSATab &ssatab); private: uint16 catchOffset; @@ -2359,7 +2348,7 @@ class TryMeStmt : public MeStmt { offsets.push_back(curr); } - StmtNode *EmitStmt(SSATab *ssatab); + StmtNode &EmitStmt(SSATab &ssatab); private: MapleVector offsets; @@ -2375,7 +2364,7 @@ class CatchMeStmt : public MeStmt { ~CatchMeStmt() = default; - StmtNode *EmitStmt(SSATab *ssatab); + StmtNode &EmitStmt(SSATab &ssatab); private: MapleVector exceptionTyIdxVec; @@ -2405,7 +2394,7 @@ class SwitchMeStmt : public UnaryMeStmt { } void Dump(IRMap*) const; - StmtNode *EmitStmt(SSATab *ssatab); + StmtNode &EmitStmt(SSATab &ssatab); private: LabelIdx defaultLabel; @@ -2420,7 +2409,7 @@ class CommentMeStmt : public MeStmt { ~CommentMeStmt() = default; - StmtNode *EmitStmt(SSATab *ssatab); + StmtNode &EmitStmt(SSATab &ssatab); private: MapleString comment; @@ -2453,7 +2442,7 @@ class GosubMeStmt : public WithMuMeStmt { ~GosubMeStmt() = default; void Dump(IRMap*) const; - StmtNode *EmitStmt(SSATab *ssatab); + StmtNode &EmitStmt(SSATab &ssatab); private: uint32 offset; // the label @@ -2486,7 +2475,7 @@ class ThrowMeStmt : public WithMuMeStmt { } void Dump(IRMap*) const; - StmtNode *EmitStmt(SSATab *ssatab); + StmtNode &EmitStmt(SSATab &ssatab); private: MeExpr *opnd; @@ -2558,7 +2547,7 @@ class AssertMeStmt : public MeStmt { } void Dump(IRMap*) const; - StmtNode *EmitStmt(SSATab *ssatab); + StmtNode &EmitStmt(SSATab &ssatab); private: MeExpr *opnds[2]; @@ -2578,7 +2567,6 @@ void DumpMuList(IRMap *irmap, const MapleMap &mulist, int32 void DumpChiList(IRMap *irmap, const MapleMap &chilist); class DumpOptions { public: - static bool GetSimpleDump() { return simpleDump; } @@ -2591,6 +2579,5 @@ class DumpOptions { static bool simpleDump; static int dumpVsymNum; }; - } // namespace maple #endif // MAPLE_ME_INCLUDE_ME_IR_H diff --git a/src/maple_me/include/me_irmap.h b/src/maple_me/include/me_irmap.h index 38e1b7df35617e6f5242c6fe14786165f37091e9..7a487946b8a9ee455ea1d5ea50bb9bec3c16df74 100644 --- a/src/maple_me/include/me_irmap.h +++ b/src/maple_me/include/me_irmap.h @@ -23,33 +23,32 @@ constexpr int kHmapHashLength = 5107; namespace maple { class MeIRMap : public IRMap { public: - MeIRMap(MeFunction *f, Dominance *dom, MemPool *memPool, MemPool *tmpMemPool) - : IRMap(f->GetMeSSATab(), dom, memPool, tmpMemPool, kHmapHashLength), func(f) { - SetDumpStmtNum(MeOptions::stmtNum); + MeIRMap(MeFunction &f, Dominance &dom, MemPool &memPool, MemPool &tmpMemPool) + : IRMap(*f.GetMeSSATab(), dom, memPool, tmpMemPool, kHmapHashLength), func(f) { + SetDumpStmtNum(MeOption::stmtNum); } ~MeIRMap() {} - // following are virtual functions - BB *GetBB(BBId id) { - return func->GetBBFromID(id); + BB *GetBB(BBId id) override { + return func.GetBBFromID(id); } - BB *GetBBForLabIdx(LabelIdx lidx, PUIdx pidx = 0) { - return func->GetLabelBBIdMap()[lidx]; + BB *GetBBForLabIdx(LabelIdx lidx, PUIdx pidx = 0) override { + return func.GetLabelBBIdMap()[lidx]; } - void DumpBB(BB *bb); - void Dump(); - void EmitBB(BB*, BlockNode*); - void EmitBBStmts(BB*, BlockNode*); + void DumpBB(BB &bb); + void Dump() override; + void EmitBB(BB&, BlockNode&); + void EmitBBStmts(BB&, BlockNode&); MeFunction *GetFunc() const { - return func; + return &func; } private: - MeFunction *func; + MeFunction &func; }; class MeDoIRMap : public MeFuncPhase { @@ -63,6 +62,5 @@ class MeDoIRMap : public MeFuncPhase { return "irmap"; } }; - } // namespace maple #endif // MAPLE_ME_INCLUDE_ME_IRMAP_H diff --git a/src/maple_me/include/me_option.h b/src/maple_me/include/me_option.h index 0dafee54e476af2c1847615a96714e69d2a0acb6..245a02a3fee28db5fcd3b3b660892ad436f4e803 100644 --- a/src/maple_me/include/me_option.h +++ b/src/maple_me/include/me_option.h @@ -18,20 +18,26 @@ #include "mempool.h" #include "mempool_allocator.h" #include "types_def.h" +#include namespace maple { -class MeOptions { +class MeOption { public: - explicit MeOptions(MemPool *memPool) : optionAlloc(memPool) {} + explicit MeOption(MemPool &memPool) : optionAlloc(&memPool) {} void ParseOptions(int argc, char **argv, std::string &fileName); - ~MeOptions() {} + ~MeOption() {} void DumpUsage(); static bool DumpPhase(const std::string &phase); static std::unordered_set dumpPhases; + static constexpr int kLevelZero = 0; + static constexpr int kLevelOne = 1; + static constexpr int kLevelTwo = 2; + static constexpr int kLevelThree = 3; static bool dumpAfter; - static unsigned long range[2]; + static constexpr int kRangeArrayLen = 2; + static unsigned long range[kRangeArrayLen]; static bool useRange; static std::string dumpFunc; static bool quiet; @@ -46,8 +52,8 @@ class MeOptions { static bool lessThrowAlias; static bool finalFieldAlias; static bool regreadAtReturn; - void SplitPhases(const char *str, std::unordered_set &set); - void GetRange(const char *str); + void SplitPhases(const std::string &str, std::unordered_set &set); + void GetRange(const std::string &str); std::unordered_set &GetSkipPhases() { return skipPhases; @@ -60,9 +66,8 @@ class MeOptions { #ifndef DEBUGFUNC #define DEBUGFUNC(f) \ - (MeOptions::dumpPhases.find(PhaseName()) != MeOptions::dumpPhases.end() && \ - (MeOptions::dumpFunc.compare("*") == 0 || f->GetName().find(MeOptions::dumpFunc.c_str()) != std::string::npos)) + (MeOption::dumpPhases.find(PhaseName()) != MeOption::dumpPhases.end() && \ + (MeOption::dumpFunc.compare("*") == 0 || f->GetName().find(MeOption::dumpFunc.c_str()) != std::string::npos)) #endif - } // namespace maple #endif // MAPLE_ME_INCLUDE_ME_OPTION_H diff --git a/src/maple_me/include/me_phase.h b/src/maple_me/include/me_phase.h index fdfeb9bd8963b88c7c020c42035b89ee57aa6229..83301607cb54a2ea0c3582d664fe6c4d71a4d8c2 100644 --- a/src/maple_me/include/me_phase.h +++ b/src/maple_me/include/me_phase.h @@ -78,6 +78,5 @@ class MeFuncPhase : public Phase { std::string prevPhaseName; /* used in filename for emit */ bool isCFGChanged; // is this phase changed CFG }; - } // namespace maple -#endif // MAPLE_ME_INCLUDE_ME_PHASE_H +#endif // MAPLE_ME_INCLUDE_ME_PHASE_H \ No newline at end of file diff --git a/src/maple_me/include/me_phase_manager.h b/src/maple_me/include/me_phase_manager.h index 5a02b4c2de9734c975e30ac1006dd16a69a344f9..665c94397c6067257d1539ecbfbbc7530b398015 100644 --- a/src/maple_me/include/me_phase_manager.h +++ b/src/maple_me/include/me_phase_manager.h @@ -87,6 +87,5 @@ class MeFuncPhaseManager : public PhaseManager { bool genMempool; bool timePhases; }; - } // namespace maple -#endif // MAPLE_ME_INCLUDE_ME_PHASE_MANAGER_H +#endif // MAPLE_ME_INCLUDE_ME_PHASE_MANAGER_H \ No newline at end of file diff --git a/src/maple_me/include/me_phases.def b/src/maple_me/include/me_phases.def index b69ceebae31db34a58b8780951747023f7c7eaff..5fd60cbdff6b05b5f1cd9090dc3c532fd8dae080 100644 --- a/src/maple_me/include/me_phases.def +++ b/src/maple_me/include/me_phases.def @@ -18,5 +18,5 @@ FUNCAPHASE(MeFuncPhase_ALIASCLASS, MeDoAliasClass) FUNCAPHASE(MeFuncPhase_SSA, MeDoSSA) FUNCAPHASE(MeFuncPhase_IRMAP, MeDoIRMap) FUNCAPHASE(MeFuncPhase_BBLAYOUT, MeDoBBLayout) -FUNCTPHASE(MeFuncPhase_EMIT, MeDoEmission) +FUNCTPHASE(MeFuncPhase_EMIT, MeDoEmit) FUNCTPHASE(MeFuncPhase_RCLOWERING, MeDoRCLowering) diff --git a/src/maple_me/include/me_rc_lowering.h b/src/maple_me/include/me_rc_lowering.h index bd40ec69d32a7376b0ab4c3f842d3fbaf89d2ede..3f3461d447a31bd6e880603751641f46410fd9c0 100644 --- a/src/maple_me/include/me_rc_lowering.h +++ b/src/maple_me/include/me_rc_lowering.h @@ -23,11 +23,11 @@ namespace maple { class RCLowering { public: - RCLowering(MeFunction *f, KlassHierarchy *kh) + RCLowering(MeFunction &f, KlassHierarchy &kh) : func(f), - mirModule(&f->GetMIRModule()), - irMap(f->GetIRMap()), - ssaTab(f->GetMeSSATab()), + mirModule(f.GetMIRModule()), + irMap(*f.GetIRMap()), + ssaTab(*f.GetMeSSATab()), klassHierarchy(kh) {} virtual ~RCLowering() = default; @@ -37,56 +37,56 @@ class RCLowering { void RCLower(); void PostRCLower(); void Finish(); - void FastBBLower(BB *bb); + void FastBBLower(BB &bb); std::string PhaseName() const { return "rclowering"; } private: - MeFunction *func; - MIRModule *mirModule; - IRMap *irMap; - SSATab *ssaTab; - std::vector rets; // std::vector of return statement + MeFunction &func; + MIRModule &mirModule; + IRMap &irMap; + SSATab &ssaTab; + KlassHierarchy &klassHierarchy; + std::vector rets{}; // std::vector of return statement unsigned int tmpCount = 0; - KlassHierarchy *klassHierarchy; - std::map cleanUpVars; - std::map varOstMap; + std::map cleanUpVars{}; + std::map varOstMap{}; bool needSpecialHandleException = false; - std::set gcMallocObjects; + std::set gcMallocObjects{}; // used to store initialized map, help to optimize dec ref in first assignment - std::unordered_map*> initializedFields; + std::unordered_map*> initializedFields{}; void BBLower(BB *bb); void CreateCleanupIntrinsics(); void HandleArguments(); void InitRCFunc(); // create new symbol from name and return its ost - OriginalSt *RetrieveOSt(const char *name, bool isLocalrefvar) const; + OriginalSt *RetrieveOSt(const std::string &name, bool isLocalrefvar) const; /** * create new symbol from temp name and return its VarMeExpr * new symbols are stored in a set */ VarMeExpr *CreateNewTmpVarMeExpr(bool isLocalrefvar); - VarMeExpr *CreateVarMeExprFromSym(MIRSymbol *sym) const; + VarMeExpr *CreateVarMeExprFromSym(MIRSymbol &sym) const; // return true if the rhs is simple so we can adjust RC count before assignments - bool RCFirst(MeExpr *rhs); - IntrinsiccallMeStmt *GetVarRHSHandleStmt(MeStmt *stmt); - IntrinsiccallMeStmt *GetIvarRHSHandleStmt(MeStmt *stmt); - MIRIntrinsicID PrepareVolatileCall(MeStmt *stmt, MIRIntrinsicID index = INTRN_UNDEFINED); - IntrinsiccallMeStmt *CreateRCIntrinsic(MIRIntrinsicID intrnID, MeStmt *stmt, std::vector opnds, + bool RCFirst(MeExpr &rhs); + IntrinsiccallMeStmt *GetVarRHSHandleStmt(MeStmt &stmt); + IntrinsiccallMeStmt *GetIvarRHSHandleStmt(MeStmt &stmt); + MIRIntrinsicID PrepareVolatileCall(MeStmt &stmt, MIRIntrinsicID index = INTRN_UNDEFINED); + IntrinsiccallMeStmt *CreateRCIntrinsic(MIRIntrinsicID intrnID, MeStmt &stmt, std::vector opnds, bool assigned = false); void InitializedObjectFields(MeStmt &stmt); - bool IsInitialized(IvarMeExpr *ivar); + bool IsInitialized(IvarMeExpr &ivar); void PreprocessAssignMeStmt(MeStmt &stmt); - void HandleAssignMeStmtRHS(MeStmt *stmt); + void HandleAssignMeStmtRHS(MeStmt &stmt); void HandleAssignMeStmtRegLHS(MeStmt &stmt); void HandleAssignMeStmtVarLHS(MeStmt &stmt, MeExpr *pendingDec); void HandleAssignMeStmtIvarLHS(MeStmt &stmt); - void HandleCallAssignedMeStmt(MeStmt *stmt, MeExpr *pendingDec); - void HandleReturnVar(RetMeStmt *ret); - void HandleReturnIvar(RetMeStmt *ret); - void HandleReturnReg(RetMeStmt *ret); + void HandleCallAssignedMeStmt(MeStmt &stmt, MeExpr *pendingDec); + void HandleReturnVar(RetMeStmt &ret); + void HandleReturnIvar(RetMeStmt &ret); + void HandleReturnReg(RetMeStmt &ret); void HandleReturnWithCleanup(); void HandleReturnNeedBackup(); void HandleReturnStmt(); @@ -108,6 +108,5 @@ class MeDoRCLowering : public MeFuncPhase { return "rclowering"; } }; - } // namespace maple -#endif // MAPLE_ME_INCLUDE_ME_RC_LOWERING_H +#endif // MAPLE_ME_INCLUDE_ME_RC_LOWERING_H \ No newline at end of file diff --git a/src/maple_me/include/me_ssa.h b/src/maple_me/include/me_ssa.h index 49b2eaa51f5040ac89bef0f5cd0384f8fdd19234..704c6e02adfc82775abe43ff78e76607d7df4ab3 100644 --- a/src/maple_me/include/me_ssa.h +++ b/src/maple_me/include/me_ssa.h @@ -20,10 +20,9 @@ #include "me_phase.h" #include "ssa.h" #include "bb.h" +#include "dominance.h" namespace maple { -class Dominance; -class BB; class MeSSA : public maple::SSA, public AnalysisResult { public: explicit MeSSA(MeFunction *func, Dominance *dom, MemPool *memPool); @@ -55,6 +54,5 @@ class MeDoSSA : public MeFuncPhase { return "ssa"; } }; - } // namespace maple #endif // MAPLE_ME_INCLUDE_ME_SSA_H diff --git a/src/maple_me/include/me_ssa_tab.h b/src/maple_me/include/me_ssa_tab.h index 639982fe7d6dab6655891eba6b70bc2665018a27..fc0c5ceda2fa12d74e12ad51b87c510ccae90eb0 100644 --- a/src/maple_me/include/me_ssa_tab.h +++ b/src/maple_me/include/me_ssa_tab.h @@ -28,6 +28,5 @@ class MeDoSSATab : public MeFuncPhase { return "ssaTab"; } }; - } // namespace maple #endif // MAPLE_ME_INCLUDE_ME_SSA_TAB_H diff --git a/src/maple_me/include/me_ssa_update.h b/src/maple_me/include/me_ssa_update.h index acee4382b6196c46fd5c7da96dfb70b0c6c9a1d2..6127cec76e5c8910692fa4fcb3fec96092516d20 100644 --- a/src/maple_me/include/me_ssa_update.h +++ b/src/maple_me/include/me_ssa_update.h @@ -19,43 +19,40 @@ #include "me_irmap.h" namespace maple { -class SSAUpdate { +class MeSSAUpdate { public: - SSAUpdate &operator=(const SSAUpdate &p) = default; - SSAUpdate(const SSAUpdate &p) = default; - SSAUpdate(MeFunction *f, SSATab *stab, Dominance *d, MapleMap*> *cands, MemPool *mp) + MeSSAUpdate(MeFunction &f, SSATab &stab, Dominance &d, MapleMap*> &cands, MemPool &mp) : func(f), - irMap(f->GetIRMap()), + irMap(*f.GetIRMap()), ssaTab(stab), dom(d), ssaUpdateMp(mp), - ssaUpdateAlloc(ssaUpdateMp), + ssaUpdateAlloc(&mp), updateCands(cands), renameStacks(std::less(), ssaUpdateAlloc.Adapter()) {} - ~SSAUpdate() { - mempoolctrler.DeleteMemPool(ssaUpdateMp); + ~MeSSAUpdate() { + mempoolctrler.DeleteMemPool(&ssaUpdateMp); } void Run(); private: - MeFunction *func; - IRMap *irMap; - SSATab *ssaTab; - Dominance *dom; - MemPool *ssaUpdateMp; + MeFunction &func; + IRMap &irMap; + SSATab &ssaTab; + Dominance &dom; + MemPool &ssaUpdateMp; MapleAllocator ssaUpdateAlloc; - MapleMap*> *updateCands; + MapleMap*> &updateCands; MapleMap*> renameStacks; - void GetIterDomFrontier(const BB *bb, MapleSet *dfset, std::vector &visitedMap); + void GetIterDomFrontier(const BB &bb, MapleSet &dfset, std::vector &visitedMap); void InsertPhis(); - void RenamePhi(BB *bb); - MeExpr *RenameExpr(MeExpr *meexpr, bool &changed); - void RenameStmts(BB *bb); - void RenamePhiOpndsInSucc(BB *bb); - void RenameBB(BB *bb); + void RenamePhi(BB &bb); + MeExpr *RenameExpr(MeExpr &meexpr, bool &changed); + void RenameStmts(BB &bb); + void RenamePhiOpndsInSucc(BB &bb); + void RenameBB(BB &bb); }; - } // namespace maple #endif // MAPLE_ME_INCLUDE_ME_SSA_UPDATE_H diff --git a/src/maple_me/include/orig_symbol.h b/src/maple_me/include/orig_symbol.h index cd05db34f0322a3ff0dfb4c216d9af3fc885c54b..6a3e6a0a9025316ea13c8df4129c82390758e9a9 100644 --- a/src/maple_me/include/orig_symbol.h +++ b/src/maple_me/include/orig_symbol.h @@ -22,16 +22,15 @@ // This file defines the data structure OriginalSt that represents a program // symbol occurring in the code of the program being optimized. - namespace maple { constexpr int kInitVersion = 0; class VarMeExpr; class OriginalSt { public: - OriginalSt(OStIdx index, MapleAllocator *alloc, bool local, bool isFormal, FieldID fieldIDPara) + OriginalSt(OStIdx index, MapleAllocator &alloc, bool local, bool isFormal, FieldID fieldIDPara) : ostType(kUnkonwnOst), index(index), - versionsIndex(alloc->Adapter()), + versionsIndex(alloc.Adapter()), zeroVersionIndex(0), tyIdx(0), fieldID(fieldIDPara), @@ -46,19 +45,19 @@ class OriginalSt { symOrPreg(), puIdx(0) {} - OriginalSt(uint32 index, PregIdx rIdx, PUIdx pIdx, MapleAllocator *alloc) + OriginalSt(uint32 index, PregIdx rIdx, PUIdx pIdx, MapleAllocator &alloc) : OriginalSt(OStIdx(index), alloc, true, false, 0) { ostType = kPregOst; symOrPreg.pregIdx = rIdx; puIdx = pIdx; } - OriginalSt(uint32 index, MIRSymbol *mirSt, PUIdx pIdx, FieldID fieldIDPara, MapleAllocator *alloc) - : OriginalSt(OStIdx(index), alloc, mirSt->IsLocal(), mirSt->GetStorageClass() == kScFormal, fieldIDPara) { + OriginalSt(uint32 index, MIRSymbol &mirSt, PUIdx pIdx, FieldID fieldIDPara, MapleAllocator &alloc) + : OriginalSt(OStIdx(index), alloc, mirSt.IsLocal(), mirSt.GetStorageClass() == kScFormal, fieldIDPara) { ostType = kSymbolOst; - symOrPreg.mirSt = mirSt; + symOrPreg.mirSt = &mirSt; puIdx = pIdx; - ignoreRC = mirSt->IgnoreRC(); + ignoreRC = mirSt.IgnoreRC(); } void Dump() const; @@ -123,7 +122,7 @@ class OriginalSt { return (ostType == kSymbolOst) ? symOrPreg.mirSt->GetIsTmp() : false; } - bool Equal(const OriginalSt *ost) const; + bool Equal(const OriginalSt &ost) const; bool IsRealSymbol() const { return (ostType == kSymbolOst || ostType == kPregOst); @@ -184,7 +183,7 @@ class OriginalSt { fieldID = fieldIDPara; } - bool IsIgnoreRC() { + bool IsIgnoreRC() const { return ignoreRC; } @@ -192,7 +191,7 @@ class OriginalSt { return addressTaken; } - bool IsEPreLocalRefVar() { + bool IsEPreLocalRefVar() const { return epreLocalRefVar; } @@ -235,15 +234,15 @@ class OriginalSt { // This Table is for original symobols only. There is no SSA info attached and SSA is built based on this table. class OriginalStTable { public: - OriginalStTable(MemPool *memPool, MIRModule *mod); + OriginalStTable(MemPool &memPool, MIRModule &mod); ~OriginalStTable() {} - OriginalSt *FindOrCreateSymbolOriginalSt(MIRSymbol *mirSt, PUIdx puIdx, FieldID fld); + OriginalSt *FindOrCreateSymbolOriginalSt(MIRSymbol &mirSt, PUIdx puIdx, FieldID fld); OriginalSt *FindOrCreatePregOriginalSt(PregIdx pregIdx, PUIdx puIdx); - OriginalSt *CreateSymbolOriginalSt(MIRSymbol *mirSt, PUIdx pidx, FieldID fld); + OriginalSt *CreateSymbolOriginalSt(MIRSymbol &mirSt, PUIdx pidx, FieldID fld); OriginalSt *CreatePregOriginalSt(PregIdx pregIdx, PUIdx puIdx); - OriginalSt *FindSymbolOriginalSt(MIRSymbol *mirSt); - OriginalSt *GetOriginalStFromID(OStIdx id, bool checkfirst = false) { + OriginalSt *FindSymbolOriginalSt(MIRSymbol &mirSt); + const OriginalSt *GetOriginalStFromID(OStIdx id, bool checkfirst = false) { if (checkfirst && id.idx >= originalStVector.size()) { return nullptr; } @@ -255,13 +254,13 @@ class OriginalStTable { return originalStVector.size(); } - MIRSymbol *GetMIRSymbolFromOriginalSt(const OriginalSt *ost) const { - ASSERT(ost->IsRealSymbol(), "runtime check error"); - return ost->GetMIRSymbol(); + MIRSymbol *GetMIRSymbolFromOriginalSt(const OriginalSt &ost) const { + ASSERT(ost.IsRealSymbol(), "runtime check error"); + return ost.GetMIRSymbol(); } MIRSymbol *GetMIRSymbolFromID(OStIdx id) { - return GetMIRSymbolFromOriginalSt(GetOriginalStFromID(id, false)); + return GetMIRSymbolFromOriginalSt(*GetOriginalStFromID(id, false)); } MapleAllocator &GetAlloc() { @@ -272,11 +271,31 @@ class OriginalStTable { return originalStVector; } + void SetEPreLocalRefVar(const OStIdx &id, bool epreLocalrefvarPara = true) { + ASSERT(id.idx < originalStVector.size(), "symbol table index out of range"); + originalStVector[id.idx]->SetEPreLocalRefVar(epreLocalrefvarPara); + } + + void SetZeroVersionIndex(const OStIdx &id, size_t zeroVersionIndexParam) { + ASSERT(id.idx < originalStVector.size(), "symbol table index out of range"); + originalStVector[id.idx]->SetZeroVersionIndex(zeroVersionIndexParam); + } + + size_t GetVersionsIndexSize(const OStIdx &id) const { + ASSERT(id.idx < originalStVector.size(), "symbol table index out of range"); + return originalStVector[id.idx]->GetVersionsIndex().size(); + } + + void UpdateVarOstMap(const OStIdx &id, std::map &varOstMap) { + ASSERT(id.idx < originalStVector.size(), "symbol table index out of range"); + varOstMap[id] = originalStVector[id.idx]; + } + void Dump(); private: MapleAllocator alloc; - MIRModule *mirModule; + MIRModule &mirModule; MapleVector originalStVector; // the vector that map a OriginalSt's index to its pointer MapleUnorderedMap mirSt2Ost; // mir symbol to original table, this only exists for no-original variables. @@ -289,6 +308,5 @@ class OriginalStTable { OStIdx virtuaLostUnkownMem; OStIdx virtuaLostConstMem; }; - } // namespace maple #endif // MAPLE_ME_INCLUDE_ORIG_SYMBOL_H diff --git a/src/maple_me/include/ssa.h b/src/maple_me/include/ssa.h index 70861c527e797415760b9d8dc14aac382b7b631c..a48dd90adc4f41d009dc3956444d499a27334f44 100644 --- a/src/maple_me/include/ssa.h +++ b/src/maple_me/include/ssa.h @@ -124,6 +124,5 @@ class SSA { MapleVector bbRenamed; // indicate bb is renamed or not SSATab *ssaTab; }; - } // namespace maple -#endif // MAPLE_ME_INCLUDE_SSA_H +#endif // MAPLE_ME_INCLUDE_SSA_H \ No newline at end of file diff --git a/src/maple_me/include/ssa_mir_nodes.h b/src/maple_me/include/ssa_mir_nodes.h index f578b4f089a3e63ab0abc765cc06a263a5ef8682..5090ba670d441308ee9eeab40f99dba7561be2b3 100644 --- a/src/maple_me/include/ssa_mir_nodes.h +++ b/src/maple_me/include/ssa_mir_nodes.h @@ -20,7 +20,6 @@ /* This file define data structures to store SSA information in the IR instructions */ - namespace maple { struct OriginalStComparator { bool operator()(const OriginalSt *lhs, const OriginalSt *rhs) const { @@ -405,10 +404,9 @@ class StmtsSSAPart { template void SetSSAPartOf(const StmtNode *s, T *p) { - ssaPart[s->GetStmtID()] = p; + ssaPart[s->GetStmtID()] = static_cast(p); } - template <> void SetSSAPartOf(const StmtNode *s, VersionSt *vst) { VersionStPart *vStSSAPart = GetSSAPartMp()->New(); vStSSAPart->SetSSAVar(vst); @@ -531,6 +529,5 @@ inline bool HasMallocOpnd(const BaseNode *x) { return x->GetOpCode() == OP_malloc || x->GetOpCode() == OP_gcmalloc || x->GetOpCode() == OP_gcmallocjarray || x->GetOpCode() == OP_alloca; } - } // namespace maple #endif // MAPLE_ME_INCLUDE_SSA_MIR_NODES_H diff --git a/src/maple_me/include/ssa_tab.h b/src/maple_me/include/ssa_tab.h index e1a4a6a0654a4b0e96a26d1a4a79df2430e8afee..1199b5c1db654639871f06d7dffd167e3a8fe982 100644 --- a/src/maple_me/include/ssa_tab.h +++ b/src/maple_me/include/ssa_tab.h @@ -21,16 +21,14 @@ #include "ssa_mir_nodes.h" namespace maple { -class VersionStTable; class SSATab : public AnalysisResult { // represent the SSA table public: - MIRModule &mirModule; SSATab(MemPool *memPool, MemPool *versmp, MIRModule *mod) : AnalysisResult(memPool), mirModule(*mod), versionStTable(versmp), - originalStTable(memPool, mod), + originalStTable(*memPool, *mod), stmtsSSAPart(versmp), wholeProgramScope(false) {} @@ -44,25 +42,25 @@ class SSATab : public AnalysisResult { // following are handles to methods in originalStTable OriginalSt *CreateSymbolOriginalSt(MIRSymbol *mirSt, PUIdx puIdx, FieldID fld) { - return originalStTable.CreateSymbolOriginalSt(mirSt, puIdx, fld); + return originalStTable.CreateSymbolOriginalSt(*mirSt, puIdx, fld); } OriginalSt *FindOrCreateSymbolOriginalSt(MIRSymbol *mirSt, PUIdx puIdx, FieldID fld) { - return originalStTable.FindOrCreateSymbolOriginalSt(mirSt, puIdx, fld); + return originalStTable.FindOrCreateSymbolOriginalSt(*mirSt, puIdx, fld); } - OriginalSt *GetOriginalStFromID(OStIdx id) { + const OriginalSt *GetOriginalStFromID(OStIdx id) { return originalStTable.GetOriginalStFromID(id); } - OriginalSt *GetSymbolOriginalStFromID(OStIdx id) { - OriginalSt *ost = originalStTable.GetOriginalStFromID(id); + const OriginalSt *GetSymbolOriginalStFromID(OStIdx id) { + const OriginalSt *ost = originalStTable.GetOriginalStFromID(id); ASSERT(ost->IsSymbolOst(), "GetSymbolOriginalStFromid: id has wrong ost type"); return ost; } MIRSymbol *GetMIRSymbolFromOriginalSt(const OriginalSt *ost) { - return originalStTable.GetMIRSymbolFromOriginalSt(ost); + return originalStTable.GetMIRSymbolFromOriginalSt(*ost); } MIRSymbol *GetMIRSymbolFromID(OStIdx id) { @@ -97,12 +95,32 @@ class SSATab : public AnalysisResult { wholeProgramScope = val; } + MIRModule &GetModule() const { + return mirModule; + } + + void SetEPreLocalRefVar(const OStIdx &ostIdx, bool epreLocalrefvarPara = true) { + originalStTable.SetEPreLocalRefVar(ostIdx, epreLocalrefvarPara); + } + + void SetZeroVersionIndex(const OStIdx &ostIdx, size_t zeroVersionIndexParam) { + originalStTable.SetZeroVersionIndex(ostIdx, zeroVersionIndexParam); + } + + size_t GetVersionsIndexSize(const OStIdx &ostIdx) const { + return originalStTable.GetVersionsIndexSize(ostIdx); + } + + void UpdateVarOstMap(const OStIdx &ostIdx, std::map &varOstMap) { + originalStTable.UpdateVarOstMap(ostIdx, varOstMap); + } + private: + MIRModule &mirModule; VersionStTable versionStTable; // this uses special versmp because it will be freed earlier OriginalStTable originalStTable; StmtsSSAPart stmtsSSAPart; // this uses special versmp because it will be freed earlier bool wholeProgramScope; }; - } // namespace maple -#endif // MAPLE_ME_INCLUDE_SSA_TAB_H +#endif // MAPLE_ME_INCLUDE_SSA_TAB_H \ No newline at end of file diff --git a/src/maple_me/include/union_find.h b/src/maple_me/include/union_find.h index 33c240786d7cfaf09826ccca6312ab61723f2499..953ac11e1b6a8dc4f66aba5dd66a1cadef3f2ebb 100644 --- a/src/maple_me/include/union_find.h +++ b/src/maple_me/include/union_find.h @@ -27,11 +27,11 @@ namespace maple { // id. class UnionFind { public: - explicit UnionFind(maple::MemPool *memPool) - : ufAlloc(memPool), num(0), id(ufAlloc.Adapter()), sz(ufAlloc.Adapter()) {} + explicit UnionFind(maple::MemPool &memPool) + : ufAlloc(&memPool), num(0), id(ufAlloc.Adapter()), sz(ufAlloc.Adapter()) {} - UnionFind(maple::MemPool *memPool, maple::uint32 siz) - : ufAlloc(memPool), num(siz), id(siz, 0, ufAlloc.Adapter()), sz(siz, 0, ufAlloc.Adapter()) { + UnionFind(maple::MemPool &memPool, maple::uint32 siz) + : ufAlloc(&memPool), num(siz), id(siz, 0, ufAlloc.Adapter()), sz(siz, 0, ufAlloc.Adapter()) { Reinit(); } @@ -110,6 +110,5 @@ class UnionFind { // maintain a flat tree maple::MapleVector sz; // gives number of elements in the tree rooted there }; - } // namespace maple -#endif // MAPLE_ME_INCLUDE_UNION_FIND_H +#endif // MAPLE_ME_INCLUDE_UNION_FIND_H \ No newline at end of file diff --git a/src/maple_me/include/ver_symbol.h b/src/maple_me/include/ver_symbol.h index 17ac73101702db55010db7149bad559b18e1272a..5591200a07a271e8f042af38f11f8da6ec94fa40 100644 --- a/src/maple_me/include/ver_symbol.h +++ b/src/maple_me/include/ver_symbol.h @@ -56,7 +56,6 @@ class VersionSt { void SetDefBB(BB *defbb) { defBB = defbb; } - const BB *GetDefBB() const { return defBB; } @@ -225,6 +224,5 @@ class VersionStTable { MapleAllocator vstAlloc; // this stores versionStVector MapleVector versionStVector; // the vector that map a versionst's index to its pointer }; - } // namespace maple #endif // MAPLE_ME_INCLUDE_VER_SYMBOL_H diff --git a/src/maple_me/src/alias_analysis_table.cpp b/src/maple_me/src/alias_analysis_table.cpp index 32a51987e257612518a0c3914388f8dfdc19b1e1..047fcb9a55c5ec7d9e453e9742ee3f82e8867791 100644 --- a/src/maple_me/src/alias_analysis_table.cpp +++ b/src/maple_me/src/alias_analysis_table.cpp @@ -14,89 +14,89 @@ */ #include "alias_analysis_table.h" using namespace maple; -OriginalSt *AliasAnalysisTable::GetPrevLevelNode(const OriginalSt *ost) { - ASSERT(ost != nullptr, "wrong stmt!"); - return prevLevelNode[ost->GetIndex()]; +OriginalSt *AliasAnalysisTable::GetPrevLevelNode(const OriginalSt &ost) { + return prevLevelNode[ost.GetIndex()]; } -MapleVector *AliasAnalysisTable::GetNextLevelNodes(const OriginalSt *ost) { - ASSERT(ost != nullptr, "wrong stmt!"); - auto findNode = nextLevelNodes.find(ost->GetIndex()); +MapleVector *AliasAnalysisTable::GetNextLevelNodes(const OriginalSt &ost) { + auto findNode = nextLevelNodes.find(ost.GetIndex()); if (findNode == nextLevelNodes.end()) { MapleVector *newOriginalStVec = alloc.GetMemPool()->New>(alloc.Adapter()); - nextLevelNodes.insert(std::make_pair(ost->GetIndex(), newOriginalStVec)); + nextLevelNodes.insert(std::make_pair(ost.GetIndex(), newOriginalStVec)); return newOriginalStVec; } return findNode->second; } -OriginalSt *AliasAnalysisTable::FindOrCreateAddrofSymbolOriginalSt(const OriginalSt *ost) { - ASSERT(ost != nullptr, "wrong stmt!"); - if (prevLevelNode.find(ost->GetIndex()) != prevLevelNode.end()) { - return prevLevelNode[ost->GetIndex()]; +OriginalSt *AliasAnalysisTable::FindOrCreateAddrofSymbolOriginalSt(const OriginalSt &ost) { + if (prevLevelNode.find(ost.GetIndex()) != prevLevelNode.end()) { + return prevLevelNode[ost.GetIndex()]; } // create a new node - OriginalStTable *originalStTab = &(ssaTab->GetOriginalStTable()); - OriginalSt *prevLevelOst = memPool->New(originalStTab->Size(), ost->GetMIRSymbol(), - ost->GetPuIdx(), 0, &(originalStTab->GetAlloc())); - originalStTab->GetOriginalStVector().push_back(prevLevelOst); + OriginalStTable &originalStTab = ssaTab.GetOriginalStTable(); + OriginalSt *prevLevelOst = memPool->New(originalStTab.Size(), *ost.GetMIRSymbol(), + ost.GetPuIdx(), 0, originalStTab.GetAlloc()); + originalStTab.GetOriginalStVector().push_back(prevLevelOst); prevLevelOst->SetIndirectLev(-1); - MIRPtrType pointType(ost->GetTyIdx(), PTY_ptr); + MIRPtrType pointType(ost.GetTyIdx(), PTY_ptr); TyIdx newTyIdx = GlobalTables::GetTypeTable().GetOrCreateMIRType(&pointType); prevLevelOst->SetTyIdx(newTyIdx); - prevLevelOst->SetFieldID(ost->GetFieldID()); - GetNextLevelNodes(prevLevelOst)->push_back(const_cast(ost)); - prevLevelNode.insert(std::make_pair(ost->GetIndex(), prevLevelOst)); + prevLevelOst->SetFieldID(ost.GetFieldID()); + GetNextLevelNodes(*prevLevelOst)->push_back(const_cast(&ost)); + prevLevelNode.insert(std::make_pair(ost.GetIndex(), prevLevelOst)); return prevLevelOst; } -OriginalSt *AliasAnalysisTable::FindOrCreateExtraLevSymOrRegOriginalSt(OriginalSt *ost, TyIdx ptyIdx, FieldID fld) { - ASSERT(ost != nullptr, "wrong stmt!"); +OriginalSt *AliasAnalysisTable::FindOrCreateExtraLevSymOrRegOriginalSt(OriginalSt &ost, TyIdx ptyIdx, FieldID fld) { + TyIdx ptyIdxOfOSt = ost.GetTyIdx(); + FieldID fldIDInOSt = fld; + if (ptyIdxOfOSt != ptyIdx) { + klassHierarchy.UpdateFieldID(ptyIdx, ptyIdxOfOSt, fldIDInOSt); + } MapleVector *nextLevelOsts = GetNextLevelNodes(ost); - OriginalSt *nextLevOst = FindExtraLevOriginalSt(*nextLevelOsts, fld); + OriginalSt *nextLevOst = FindExtraLevOriginalSt(*nextLevelOsts, fldIDInOSt); if (nextLevOst != nullptr) { return nextLevOst; } // create a new node - OriginalStTable *originalStTab = &(ssaTab->GetOriginalStTable()); - if (ost->IsSymbolOst()) { - nextLevOst = memPool->New(originalStTab->Size(), ost->GetMIRSymbol(), - ost->GetPuIdx(), fld, &(originalStTab->GetAlloc())); + OriginalStTable &originalStTab = ssaTab.GetOriginalStTable(); + if (ost.IsSymbolOst()) { + nextLevOst = memPool->New(originalStTab.Size(), *ost.GetMIRSymbol(), + ost.GetPuIdx(), fldIDInOSt, originalStTab.GetAlloc()); } else { - nextLevOst = memPool->New(originalStTab->Size(), ost->GetPregIdx(), - ost->GetPuIdx(), &(originalStTab->GetAlloc())); + nextLevOst = memPool->New(originalStTab.Size(), ost.GetPregIdx(), + ost.GetPuIdx(), originalStTab.GetAlloc()); } - originalStTab->GetOriginalStVector().push_back(nextLevOst); - CHECK_FATAL(ost->GetIndirectLev() < INT8_MAX, "boundary check"); - nextLevOst->SetIndirectLev(ost->GetIndirectLev() + 1); - prevLevelNode.insert(std::make_pair(nextLevOst->GetIndex(), ost)); - ptyIdx = (ptyIdx == 0) ? ost->GetTyIdx() : ptyIdx; + originalStTab.GetOriginalStVector().push_back(nextLevOst); + CHECK_FATAL(ost.GetIndirectLev() < INT8_MAX, "boundary check"); + nextLevOst->SetIndirectLev(ost.GetIndirectLev() + 1); + prevLevelNode.insert(std::make_pair(nextLevOst->GetIndex(), &ost)); + ptyIdx = (ptyIdx == 0) ? ost.GetTyIdx() : ptyIdx; if (ptyIdx != 0) { // use the tyIdx info from the instruction MIRPtrType *ptType = dynamic_cast(GlobalTables::GetTypeTable().GetTypeFromTyIdx(ptyIdx)); if (ptType != nullptr) { TyIdxFieldAttrPair fieldPair = ptType->GetPointedTyIdxFldAttrPairWithFieldID(fld); nextLevOst->SetTyIdx(fieldPair.first); - nextLevOst->SetIsFinal(fieldPair.second.GetAttr(FLDATTR_final) && !mirModule->CurFunction()->IsConstructor()); + nextLevOst->SetIsFinal(fieldPair.second.GetAttr(FLDATTR_final) && !mirModule.CurFunction()->IsConstructor()); nextLevOst->SetIsPrivate(fieldPair.second.GetAttr(FLDATTR_private)); } else { nextLevOst->SetTyIdx(TyIdx(PTY_void)); } } ASSERT(!GlobalTables::GetTypeTable().GetTypeTable().empty(), "container check"); - if (GlobalTables::GetTypeTable().GetTypeFromTyIdx(ost->GetTyIdx())->PointsToConstString()) { + if (GlobalTables::GetTypeTable().GetTypeFromTyIdx(ost.GetTyIdx())->PointsToConstString()) { nextLevOst->SetIsFinal(true); } GetNextLevelNodes(ost)->push_back(nextLevOst); - ASSERT(originalStTab->GetOriginalStFromID(ost->GetIndex()) == ost, "OriginalStTable:: index inconsistent"); + ASSERT(originalStTab.GetOriginalStFromID(ost.GetIndex()) == &ost, "OriginalStTable:: index inconsistent"); return nextLevOst; } -OriginalSt *AliasAnalysisTable::FindOrCreateExtraLevOriginalSt(OriginalSt *ost, TyIdx ptyIdx, FieldID fld) { - ASSERT(ost != nullptr, "wrong stmt!"); - if (ost->IsSymbolOst() || ost->IsPregOst()) { +OriginalSt *AliasAnalysisTable::FindOrCreateExtraLevOriginalSt(OriginalSt &ost, TyIdx ptyIdx, FieldID fld) { + if (ost.IsSymbolOst() || ost.IsPregOst()) { return FindOrCreateExtraLevSymOrRegOriginalSt(ost, ptyIdx, fld); } return nullptr; @@ -111,11 +111,10 @@ OriginalSt *AliasAnalysisTable::FindExtraLevOriginalSt(const MapleVectorGetIndex()]; +OriginalSt *AliasAnalysisTable::FindOrCreateDiffFieldOriginalSt(const OriginalSt &ost, FieldID fld) { + OriginalSt *parentOst = prevLevelNode[ost.GetIndex()]; if (parentOst == nullptr) { - ASSERT(ost->IsSymbolOst(), "only SymbolOriginalSt expected"); + ASSERT(ost.IsSymbolOst(), "only SymbolOriginalSt expected"); parentOst = FindOrCreateAddrofSymbolOriginalSt(ost); } MapleVector *nextLevelOsts = GetNextLevelNodes(ost); @@ -133,16 +132,16 @@ OriginalSt *AliasAnalysisTable::FindOrCreateDiffFieldOriginalSt(const OriginalSt nextLevFieldPair = ptType->GetPointedTyIdxFldAttrPairWithFieldID(fld); } } - OriginalStTable *originalStTab = &(ssaTab->GetOriginalStTable()); + OriginalStTable *originalStTab = &(ssaTab.GetOriginalStTable()); if (parentOst->IsSymbolOst()) { - nextLevOst = memPool->New(originalStTab->Size(), parentOst->GetMIRSymbol(), - parentOst->GetPuIdx(), fld, &(originalStTab->GetAlloc())); + nextLevOst = memPool->New(originalStTab->Size(), *parentOst->GetMIRSymbol(), + parentOst->GetPuIdx(), fld, originalStTab->GetAlloc()); originalStTab->GetOriginalStVector().push_back(nextLevOst); ASSERT(parentOst->GetIndirectLev() < INT8_MAX, "boundary check"); nextLevOst->SetIndirectLev(parentOst->GetIndirectLev() + 1); prevLevelNode.insert(std::make_pair(nextLevOst->GetIndex(), parentOst)); nextLevOst->SetTyIdx(nextLevFieldPair.first); - bool isFinal = nextLevFieldPair.second.GetAttr(FLDATTR_final) && !mirModule->CurFunction()->IsConstructor(); + bool isFinal = nextLevFieldPair.second.GetAttr(FLDATTR_final) && !mirModule.CurFunction()->IsConstructor(); nextLevOst->SetIsFinal(isFinal); ASSERT(!GlobalTables::GetTypeTable().GetTypeTable().empty(), "container check"); if (GlobalTables::GetTypeTable().GetTypeFromTyIdx(parentOst->GetTyIdx())->PointsToConstString()) { @@ -155,9 +154,8 @@ OriginalSt *AliasAnalysisTable::FindOrCreateDiffFieldOriginalSt(const OriginalSt return nullptr; } -OriginalSt *AliasAnalysisTable::FindDiffFieldOriginalSt(const OriginalSt *ost, FieldID fld) { - ASSERT(ost != nullptr, "wrong stmt!"); - OriginalSt *parentOst = prevLevelNode[ost->GetIndex()]; - MapleVector *nextLevelOsts = GetNextLevelNodes(parentOst); +OriginalSt *AliasAnalysisTable::FindDiffFieldOriginalSt(const OriginalSt &ost, FieldID fld) { + OriginalSt *parentOst = prevLevelNode[ost.GetIndex()]; + MapleVector *nextLevelOsts = GetNextLevelNodes(*parentOst); return FindExtraLevOriginalSt(*nextLevelOsts, fld); } diff --git a/src/maple_me/src/alias_class.cpp b/src/maple_me/src/alias_class.cpp index c94513be4e7de97446f8d7542ebf8f1f4baf9ad6..64c03307c1359d6043a2ff1456071515de89ccdd 100644 --- a/src/maple_me/src/alias_class.cpp +++ b/src/maple_me/src/alias_class.cpp @@ -20,27 +20,30 @@ #include "mir_function.h" #include "mir_builder.h" -namespace maple { +namespace { + -static inline bool IsReadOnlyOst(const OriginalSt *ost) { - return (ost == nullptr) ? false : ost->GetMIRSymbol()->HasAddrOfValues(); } +namespace maple { + +static inline bool IsReadOnlyOst(const OriginalSt &ost) { + return ost.GetMIRSymbol()->HasAddrOfValues(); +} static inline bool IsPotentialAddress(PrimType ptyp) { return IsAddress(ptyp) || IsPrimitiveDynType(ptyp); } - -static inline bool OriginalStIsZeroLevAndAuto(const OriginalSt *ost) { - if (ost->GetIndirectLev() == 0 && ost->IsSymbolOst()) { - MIRSymbol *sym = ost->GetMIRSymbol(); +static inline bool OriginalStIsZeroLevAndAuto(const OriginalSt &ost) { + if (ost.GetIndirectLev() == 0 && ost.IsSymbolOst()) { + MIRSymbol *sym = ost.GetMIRSymbol(); return sym->GetStorageClass() == kScAuto || sym->GetStorageClass() == kScFormal; } return false; } -bool AliasClass::CallHasNoSideEffectOrPrivateDefEffect(StmtNode *stmt, FuncAttrKind attrKind) { +bool AliasClass::CallHasNoSideEffectOrPrivateDefEffect(StmtNode &stmt, FuncAttrKind attrKind) { ASSERT(attrKind == FUNCATTR_nosideeffect || attrKind == FUNCATTR_noprivate_defeffect, "Not supportted attrKind"); - CallNode *callStmt = dynamic_cast(stmt); + CallNode *callStmt = dynamic_cast(&stmt); if (callStmt == nullptr) { return false; } @@ -54,36 +57,36 @@ bool AliasClass::CallHasNoSideEffectOrPrivateDefEffect(StmtNode *stmt, FuncAttrK return hasAttr; } -bool AliasClass::CallHasSideEffect(StmtNode *stmt) { +bool AliasClass::CallHasSideEffect(StmtNode &stmt) { return calleeHasSideEffect ? true : !CallHasNoSideEffectOrPrivateDefEffect(stmt, FUNCATTR_nosideeffect); } -bool AliasClass::CallHasNoPrivateDefEffect(StmtNode *stmt) { +bool AliasClass::CallHasNoPrivateDefEffect(StmtNode &stmt) { return calleeHasSideEffect ? false : CallHasNoSideEffectOrPrivateDefEffect(stmt, FUNCATTR_noprivate_defeffect); } // here starts pass 1 code -AliasElem *AliasClass::FindOrCreateAliasElem(OriginalSt *ost) { - OStIdx ostIdx = ost->GetIndex(); +AliasElem *AliasClass::FindOrCreateAliasElem(OriginalSt &ost) { + OStIdx ostIdx = ost.GetIndex(); CHECK_FATAL(ostIdx.idx > 0 && ostIdx.idx < osym2Elem.size(), "Invalid ost index"); AliasElem *aelem = osym2Elem[ostIdx.idx]; if (aelem != nullptr) { return aelem; } - aelem = acMemPool->New(id2Elem.size(), ost); - if (ost->IsSymbolOst() && ost->GetIndirectLev() >= 0) { - MIRSymbol *sym = ost->GetMIRSymbol(); + aelem = acMemPool.New(id2Elem.size(), ost); + if (ost.IsSymbolOst() && ost.GetIndirectLev() >= 0) { + MIRSymbol *sym = ost.GetMIRSymbol(); if (sym->IsGlobal() && !sym->HasAddrOfValues() && !sym->GetIsTmp()) { globalsMayAffectedByClinitCheck.insert(ostIdx); if (!sym->IsReflectionClassInfo()) { - if (!ost->IsFinal() || InConstructorLikeFunc()) { + if (!ost.IsFinal() || InConstructorLikeFunc()) { globalsAffectedByCalls.insert(aelem->GetClassID()); } aelem->SetNextLevNotAllDefsSeen(true); } } } - if (aelem->GetOriginalSt()->IsFormal() || ost->GetIndirectLev() > 0) { + if (aelem->GetOriginalSt().IsFormal() || ost.GetIndirectLev() > 0) { aelem->SetNextLevNotAllDefsSeen(true); } id2Elem.push_back(aelem); @@ -92,9 +95,8 @@ AliasElem *AliasClass::FindOrCreateAliasElem(OriginalSt *ost) { return aelem; } -AliasElem *AliasClass::FindOrCreateExtraLevAliasElem(BaseNode *expr, TyIdx tyIdx, FieldID fieldId) { - ASSERT(expr != nullptr, "nullptr check"); - AliasElem *ae = CreateAliasElemsExpr(kOpcodeInfo.IsTypeCvt(expr->GetOpCode()) ? expr->Opnd(0) : expr); +AliasElem *AliasClass::FindOrCreateExtraLevAliasElem(BaseNode &expr, TyIdx tyIdx, FieldID fieldId) { + AliasElem *ae = CreateAliasElemsExpr(kOpcodeInfo.IsTypeCvt(expr.GetOpCode()) ? *expr.Opnd(0) : expr); if (ae == nullptr) { return nullptr; } @@ -102,36 +104,35 @@ AliasElem *AliasClass::FindOrCreateExtraLevAliasElem(BaseNode *expr, TyIdx tyIdx ASSERT(newOst, "null ptr check"); if (newOst->GetIndex().idx == osym2Elem.size()) { osym2Elem.push_back(nullptr); - ssaTab->GetVersionStTable().CreateVersionSt(newOst, kInitVersion); + ssaTab.GetVersionStTable().CreateVersionSt(newOst, kInitVersion); } - return FindOrCreateAliasElem(newOst); + return FindOrCreateAliasElem(*newOst); } -AliasElem *AliasClass::CreateAliasElemsExpr(BaseNode *expr) { - ASSERT(expr != nullptr, "nullptr check"); - switch (expr->GetOpCode()) { +AliasElem *AliasClass::CreateAliasElemsExpr(BaseNode &expr) { + switch (expr.GetOpCode()) { case OP_addrof: { - AddrofSSANode *addrof = static_cast(expr); - FindOrCreateAliasElem(addrof->GetSSAVar()->GetOrigSt()); + AddrofSSANode &addrof = static_cast(expr); + FindOrCreateAliasElem(*addrof.GetSSAVar()->GetOrigSt()); OriginalSt *newost = - GetAliasAnalysisTable()->FindOrCreateAddrofSymbolOriginalSt(addrof->GetSSAVar()->GetOrigSt()); + GetAliasAnalysisTable()->FindOrCreateAddrofSymbolOriginalSt(*addrof.GetSSAVar()->GetOrigSt()); if (newost->GetIndex().idx == osym2Elem.size()) { osym2Elem.push_back(nullptr); } - return FindOrCreateAliasElem(newost); + return FindOrCreateAliasElem(*newost); } case OP_dread: { - AddrofSSANode *dread = static_cast(expr); - return FindOrCreateAliasElem(dread->GetSSAVar()->GetOrigSt()); + AddrofSSANode &dread = static_cast(expr); + return FindOrCreateAliasElem(*dread.GetSSAVar()->GetOrigSt()); } case OP_regread: { - RegreadSSANode *rread = static_cast(expr); - return (rread->GetRegIdx() < 0) ? nullptr : FindOrCreateAliasElem(rread->GetSSAVar()->GetOrigSt()); + RegreadSSANode &rread = static_cast(expr); + return (rread.GetRegIdx() < 0) ? nullptr : FindOrCreateAliasElem(*rread.GetSSAVar()->GetOrigSt()); } case OP_iread: case OP_iaddrof: { - IreadNode *iread = static_cast(expr); - return FindOrCreateExtraLevAliasElem(iread->Opnd(0), iread->GetTyIdx(), iread->GetFieldID()); + IreadNode &iread = static_cast(expr); + return FindOrCreateExtraLevAliasElem(*iread.Opnd(0), iread.GetTyIdx(), iread.GetFieldID()); } case OP_malloc: case OP_gcmalloc: @@ -139,39 +140,39 @@ AliasElem *AliasClass::CreateAliasElemsExpr(BaseNode *expr) { case OP_add: case OP_sub: case OP_array: { - for (size_t i = 1; i < expr->NumOpnds(); i++) { - CreateAliasElemsExpr(expr->Opnd(i)); + for (size_t i = 1; i < expr.NumOpnds(); i++) { + CreateAliasElemsExpr(*expr.Opnd(i)); } - return CreateAliasElemsExpr(expr->Opnd(0)); + return CreateAliasElemsExpr(*expr.Opnd(0)); } case OP_intrinsicop: { - IntrinsicopNode *intrn = static_cast(expr); - if (intrn->GetIntrinsic() == INTRN_JAVA_MERGE && intrn->NumOpnds() == 1 && - intrn->GetNopndAt(0)->GetOpCode() == OP_dread) { - return CreateAliasElemsExpr(intrn->GetNopndAt(0)); + IntrinsicopNode &intrn = static_cast(expr); + if (intrn.GetIntrinsic() == INTRN_JAVA_MERGE && intrn.NumOpnds() == 1 && + intrn.GetNopndAt(0)->GetOpCode() == OP_dread) { + return CreateAliasElemsExpr(*intrn.GetNopndAt(0)); } // fall-through } default: - for (size_t i = 0; i < expr->NumOpnds(); i++) { - CreateAliasElemsExpr(expr->Opnd(i)); + for (size_t i = 0; i < expr.NumOpnds(); i++) { + CreateAliasElemsExpr(*expr.Opnd(i)); } } return nullptr; } // when a mustDef is a pointer, set its pointees' notAllDefsSeen flag to true -void AliasClass::SetNotAllDefsSeenForMustDefs(const StmtNode *callas) { - MapleVector *mustDefs = SSAGenericGetMustDefNode(callas, &ssaTab->GetStmtsSSAPart()); +void AliasClass::SetNotAllDefsSeenForMustDefs(const StmtNode &callas) { + MapleVector *mustDefs = SSAGenericGetMustDefNode(&callas, &ssaTab.GetStmtsSSAPart()); for (MustDefNode mustDef : *mustDefs) { - AliasElem *aliasElem = FindOrCreateAliasElem(mustDef.GetResult()->GetOrigSt()); + AliasElem *aliasElem = FindOrCreateAliasElem(*mustDef.GetResult()->GetOrigSt()); aliasElem->SetNextLevNotAllDefsSeen(true); } } -void AliasClass::ApplyUnionForDassignCopy(const AliasElem *lhsAe, const AliasElem *rhsAe, const BaseNode *rhs) { - if (rhsAe == nullptr || rhsAe->GetOriginalSt()->GetIndirectLev() > 0 || rhsAe->IsNotAllDefsSeen()) { - AliasElem *ae = FindAliasElem(lhsAe->GetOriginalSt()); +void AliasClass::ApplyUnionForDassignCopy(const AliasElem &lhsAe, const AliasElem *rhsAe, const BaseNode *rhs) { + if (rhsAe == nullptr || rhsAe->GetOriginalSt().GetIndirectLev() > 0 || rhsAe->IsNotAllDefsSeen()) { + AliasElem *ae = FindAliasElem(lhsAe.GetOriginalSt()); ae->SetNextLevNotAllDefsSeen(true); return; } @@ -179,13 +180,13 @@ void AliasClass::ApplyUnionForDassignCopy(const AliasElem *lhsAe, const AliasEle (rhs->GetOpCode() == OP_addrof && IsReadOnlyOst(rhsAe->GetOriginalSt()))) { return; } - unionFind.Union(lhsAe->GetClassID(), rhsAe->GetClassID()); + unionFind.Union(lhsAe.GetClassID(), rhsAe->GetClassID()); } -void AliasClass::SetPtrOpndNextLevNADS(const BaseNode *opnd, AliasElem *ae, bool hasNoPrivateDefEffect) { - if (IsPotentialAddress(opnd->GetPrimType()) && ae != nullptr && - !(hasNoPrivateDefEffect && ae->GetOriginalSt()->IsPrivate()) && - !(opnd->GetOpCode() == OP_addrof && IsReadOnlyOst(ae->GetOriginalSt()))) { +void AliasClass::SetPtrOpndNextLevNADS(const BaseNode &opnd, AliasElem *ae, bool hasNoPrivateDefEffect) { + if (IsPotentialAddress(opnd.GetPrimType()) && ae != nullptr && + !(hasNoPrivateDefEffect && ae->GetOriginalSt().IsPrivate()) && + !(opnd.GetOpCode() == OP_addrof && IsReadOnlyOst(ae->GetOriginalSt()))) { ae->SetNextLevNotAllDefsSeen(true); } } @@ -195,43 +196,43 @@ void AliasClass::SetPtrOpndsNextLevNADS(uint start, uint end, MapleVectorGetOpCode()) { +void AliasClass::ApplyUnionForCopies(StmtNode &stmt) { + switch (stmt.GetOpCode()) { case OP_maydassign: case OP_dassign: case OP_regassign: { // RHS - ASSERT(stmt->Opnd(0) != nullptr, "nullptr check"); - AliasElem *rhsAe = CreateAliasElemsExpr(stmt->Opnd(0)); + ASSERT(stmt.Opnd(0) != nullptr, "nullptr check"); + AliasElem *rhsAe = CreateAliasElemsExpr(*stmt.Opnd(0)); // LHS - OriginalSt *ost = ssaTab->GetStmtsSSAPart().SSAPartOf(stmt)->GetSSAVar()->GetOrigSt(); - AliasElem *lhsAe = FindOrCreateAliasElem(ost); + OriginalSt *ost = ssaTab.GetStmtsSSAPart().SSAPartOf(&stmt)->GetSSAVar()->GetOrigSt(); + AliasElem *lhsAe = FindOrCreateAliasElem(*ost); ASSERT(lhsAe != nullptr, "aliaselem of lhs should not be null"); - ApplyUnionForDassignCopy(lhsAe, rhsAe, stmt->Opnd(0)); + ApplyUnionForDassignCopy(*lhsAe, rhsAe, stmt.Opnd(0)); return; } case OP_iassign: { - IassignNode *iass = static_cast(stmt); - AliasElem *rhsAe = CreateAliasElemsExpr(iass->Opnd(1)); - AliasElem *lhsAe = FindOrCreateExtraLevAliasElem(iass->Opnd(0), iass->GetTyIdx(), iass->GetFieldID()); + IassignNode &iass = static_cast(stmt); + AliasElem *rhsAe = CreateAliasElemsExpr(*iass.Opnd(1)); + AliasElem *lhsAe = FindOrCreateExtraLevAliasElem(*iass.Opnd(0), iass.GetTyIdx(), iass.GetFieldID()); ASSERT(lhsAe != nullptr, "aliaselem of lhs should not be null"); - ApplyUnionForDassignCopy(lhsAe, rhsAe, iass->Opnd(1)); + ApplyUnionForDassignCopy(*lhsAe, rhsAe, iass.Opnd(1)); return; } case OP_throw: { - SetPtrOpndNextLevNADS(stmt->Opnd(0), CreateAliasElemsExpr(stmt->Opnd(0)), false); + SetPtrOpndNextLevNADS(*stmt.Opnd(0), CreateAliasElemsExpr(*stmt.Opnd(0)), false); return; } case OP_call: case OP_callassigned: { - CallNode *call = static_cast(stmt); - ASSERT(call->GetPUIdx() < GlobalTables::GetFunctionTable().GetFuncTable().size(), - "index out of range in AliasClass::ApplyUnionForCopies"); - SetPtrOpndsNextLevNADS(0, call->NumOpnds(), call->GetNopnd(), false); + CallNode &call = static_cast(stmt); + ASSERT(call.GetPUIdx() < GlobalTables::GetFunctionTable().GetFuncTable().size(), + "index out of range in AliasClass::ApplyUnionForCopies"); + SetPtrOpndsNextLevNADS(0, call.NumOpnds(), call.GetNopnd(), false); break; } case OP_icall: @@ -251,26 +252,26 @@ void AliasClass::ApplyUnionForCopies(StmtNode *stmt) { case OP_customcallassigned: case OP_polymorphiccallassigned: { if (CallHasSideEffect(stmt)) { - CallNode *call = static_cast(stmt); - SetPtrOpndsNextLevNADS(1, call->NumOpnds(), call->GetNopnd(), CallHasNoPrivateDefEffect(call)); + CallNode &call = static_cast(stmt); + SetPtrOpndsNextLevNADS(1, call.NumOpnds(), call.GetNopnd(), CallHasNoPrivateDefEffect(call)); } break; } case OP_intrinsiccall: case OP_intrinsiccallassigned: { - IntrinsiccallNode *innode = static_cast(stmt); - if (innode->GetIntrinsic() == INTRN_JAVA_POLYMORPHIC_CALL) { - SetPtrOpndsNextLevNADS(0, innode->NumOpnds(), innode->GetNopnd(), false); + IntrinsiccallNode &innode = static_cast(stmt); + if (innode.GetIntrinsic() == INTRN_JAVA_POLYMORPHIC_CALL) { + SetPtrOpndsNextLevNADS(0, innode.NumOpnds(), innode.GetNopnd(), false); break; } // fallthrough; } default: - for (size_t i = 0; i < stmt->NumOpnds(); i++) { - CreateAliasElemsExpr(stmt->Opnd(i)); + for (size_t i = 0; i < stmt.NumOpnds(); i++) { + CreateAliasElemsExpr(*stmt.Opnd(i)); } } - if (kOpcodeInfo.IsCallAssigned(stmt->GetOpCode())) { + if (kOpcodeInfo.IsCallAssigned(stmt.GetOpCode())) { SetNotAllDefsSeenForMustDefs(stmt); } } @@ -283,9 +284,9 @@ void AliasClass::CreateAssignSets() { if (unionFind.GetElementsNumber(rootID) > 1) { // only root id's have assignset if (id2Elem[rootID]->GetAssignSet() == nullptr) { - id2Elem[rootID]->SetAssignSet(acMemPool->New>(std::less(), acAlloc.Adapter())); + id2Elem[rootID]->assignSet = acMemPool.New>(std::less(), acAlloc.Adapter()); } - id2Elem[rootID]->GetAssignSet()->insert(id); + id2Elem[rootID]->AddAssignToSet(id); } } } @@ -314,7 +315,7 @@ void AliasClass::DumpAssignSets() { void AliasClass::UnionAllPointedTos() { std::vector pointedTos; for (AliasElem *aliasElem : id2Elem) { - if (aliasElem->GetOriginalSt()->GetIndirectLev() > 0) { + if (aliasElem->GetOriginalSt().GetIndirectLev() > 0) { aliasElem->SetNotAllDefsSeen(true); pointedTos.push_back(aliasElem); } @@ -339,7 +340,7 @@ void AliasClass::UnionNodes(std::vector &nextLevelOsts) { OriginalSt *ost2 = nextLevelOsts[j]; if ((ost1->GetFieldID() == 0 || ost2->GetFieldID() == 0 || ost1->GetFieldID() == ost2->GetFieldID()) && (finalFieldAlias || !(ost1->IsFinal() || ost2->IsFinal()))) { - unionFind.Union(FindAliasElem(ost1)->GetClassID(), FindAliasElem(ost2)->GetClassID()); + unionFind.Union(FindAliasElem(*ost1)->GetClassID(), FindAliasElem(*ost2)->GetClassID()); break; } } @@ -359,10 +360,10 @@ void AliasClass::ApplyUnionForPointedTos() { } } -void AliasClass::CollectRootIDOfNextLevelNodes(const OriginalSt *ost, std::set &rootIDOfNADSs) { +void AliasClass::CollectRootIDOfNextLevelNodes(const OriginalSt &ost, std::set &rootIDOfNADSs) { for (OriginalSt *nextLevelNode : *(GetAliasAnalysisTable()->GetNextLevelNodes(ost))) { if (finalFieldAlias || !nextLevelNode->IsFinal()) { - uint32 id = FindAliasElem(nextLevelNode)->GetClassID(); + uint32 id = FindAliasElem(*nextLevelNode)->GetClassID(); rootIDOfNADSs.insert(unionFind.Root(id)); } } @@ -403,15 +404,15 @@ void AliasClass::UnionForNotAllDefsSeen() { // fabricate the imaginary not_all_def_seen AliasElem AliasElem *AliasClass::FindOrCreateDummyNADSAe() { - MIRSymbol *dummySym = mirModule->GetMIRBuilder()->GetOrCreateSymbol((TyIdx)PTY_i32, "__nads_dummysym__", kStVar, + MIRSymbol *dummySym = mirModule.GetMIRBuilder()->GetOrCreateSymbol((TyIdx)PTY_i32, "__nads_dummysym__", kStVar, kScGlobal, nullptr, kScopeGlobal, false); ASSERT(dummySym != nullptr, "nullptr check"); dummySym->SetIsTmp(true); dummySym->SetIsDeleted(); - OriginalSt *dummyOst = ssaTab->GetOriginalStTable().CreateSymbolOriginalSt(dummySym, 0, 0); - ssaTab->GetVersionStTable().FindOrCreateVersionSt(dummyOst, kInitVersion); + OriginalSt *dummyOst = ssaTab.GetOriginalStTable().CreateSymbolOriginalSt(*dummySym, 0, 0); + ssaTab.GetVersionStTable().FindOrCreateVersionSt(dummyOst, kInitVersion); if (osym2Elem.size() == dummyOst->GetIndex().idx) { - AliasElem *dummyAe = acMemPool->New(osym2Elem.size(), dummyOst); + AliasElem *dummyAe = acMemPool.New(osym2Elem.size(), *dummyOst); dummyAe->SetNotAllDefsSeen(true); id2Elem.push_back(dummyAe); osym2Elem.push_back(dummyAe); @@ -488,43 +489,31 @@ int AliasClass::GetOffset(const Klass &super, Klass &base) const { return offset; } -bool AliasClass::AliasAccordingToFieldID(const OriginalSt *ostA, const OriginalSt *ostB) { - if (ostA->GetFieldID() == 0 || ostB->GetFieldID() == 0) { +bool AliasClass::AliasAccordingToFieldID(const OriginalSt &ostA, const OriginalSt &ostB) { + if (ostA.GetFieldID() == 0 || ostB.GetFieldID() == 0) { return true; } MIRType *mirTypeA = GlobalTables::GetTypeTable().GetTypeFromTyIdx(GetAliasAnalysisTable()->GetPrevLevelNode(ostA)->GetTyIdx()); MIRType *mirTypeB = GlobalTables::GetTypeTable().GetTypeFromTyIdx(GetAliasAnalysisTable()->GetPrevLevelNode(ostB)->GetTyIdx()); - if (mirTypeA->GetKind() == kTypePointer && mirTypeB->GetKind() == kTypePointer) { - mirTypeA = (static_cast(mirTypeA))->GetPointedType(); - mirTypeB = (static_cast(mirTypeB))->GetPointedType(); - } - if (mirTypeA->GetKind() != kTypeClass || mirTypeB->GetKind() != kTypeClass) { - return true; - } - - Klass *klassA = klassHierarchy->GetKlassFromTyIdx(mirTypeA->GetTypeIndex()); - ASSERT(klassA != nullptr, "null ptr check"); - Klass *klassB = klassHierarchy->GetKlassFromTyIdx(mirTypeB->GetTypeIndex()); - ASSERT(klassB != nullptr, "null ptr check"); - int offset = 0; - if (klassHierarchy->IsSuperKlass(klassA, klassB)) { - offset = GetOffset(*klassA, *klassB); - } else if (klassHierarchy->IsSuperKlass(klassB, klassA)) { - offset = -GetOffset(*klassB, *klassA); - } else { - return false; + TyIdx idxA = mirTypeA->GetTypeIndex(); + TyIdx idxB = mirTypeB->GetTypeIndex(); + FieldID fldA = ostA.GetFieldID(); + if (idxA != idxB) { + if (!(klassHierarchy->UpdateFieldID(idxA, idxB, fldA))) { + return false; + } } - return ((ostA->GetFieldID() + offset) == ostB->GetFieldID()); + return fldA == ostB.GetFieldID(); } void AliasClass::ProcessIdsAliasWithRoot(const std::set &idsAliasWithRoot, std::vector &newGroups) { for (uint idA : idsAliasWithRoot) { bool unioned = false; for (uint idB : newGroups) { - OriginalSt *ostA = id2Elem[idA]->GetOriginalSt(); - OriginalSt *ostB = id2Elem[idB]->GetOriginalSt(); + OriginalSt &ostA = id2Elem[idA]->GetOriginalSt(); + OriginalSt &ostB = id2Elem[idB]->GetOriginalSt(); if (AliasAccordingToType(GetAliasAnalysisTable()->GetPrevLevelNode(ostA)->GetTyIdx(), GetAliasAnalysisTable()->GetPrevLevelNode(ostB)->GetTyIdx()) && AliasAccordingToFieldID(ostA, ostB)) { @@ -569,10 +558,10 @@ void AliasClass::CreateClassSets() { uint rootID = unionFind.Root(id); if (unionFind.GetElementsNumber(rootID) > 1) { if (id2Elem[rootID]->GetClassSet() == nullptr) { - id2Elem[rootID]->SetClassSet(acMemPool->New>(std::less(), acAlloc.Adapter())); + id2Elem[rootID]->classSet = acMemPool.New>(std::less(), acAlloc.Adapter()); } - aliasElem->SetClassSet(id2Elem[rootID]->GetClassSet()); - aliasElem->GetClassSet()->insert(id); + aliasElem->classSet = id2Elem[rootID]->classSet; + aliasElem->AddClassToSet(id); } } CollectNotAllDefsSeenAes(); @@ -587,10 +576,8 @@ void AliasClass::CreateClassSets() { #endif } -void AliasElem::Dump(MIRModule *mod) const { - if (ost) { - ost->Dump(); - } +void AliasElem::Dump(MIRModule &mod) const { + ost.Dump(); LogInfo::MapleLogger() << "id" << id << ((notAllDefsSeen) ? "? " : " "); } @@ -616,27 +603,27 @@ void AliasClass::DumpClassSets() { } // here starts pass 2 code -void AliasClass::InsertMayUseExpr(BaseNode *expr) { - for (size_t i = 0; i < expr->NumOpnds(); i++) { - InsertMayUseExpr(expr->Opnd(i)); +void AliasClass::InsertMayUseExpr(BaseNode &expr) { + for (size_t i = 0; i < expr.NumOpnds(); i++) { + InsertMayUseExpr(*expr.Opnd(i)); } - if (expr->GetOpCode() != OP_iread) { + if (expr.GetOpCode() != OP_iread) { return; } AliasElem *rhsAe = CreateAliasElemsExpr(expr); if (rhsAe == nullptr) { rhsAe = FindOrCreateDummyNADSAe(); } - IreadSSANode *ireadNode = static_cast(expr); - ireadNode->GetMayUse().SetOpnd( - ssaTab->GetVersionStTable().GetVersionStFromID(rhsAe->GetOriginalSt()->GetZeroVersionIndex())); - ASSERT(ireadNode->GetMayUse().GetOpnd() != nullptr, "AliasClass::InsertMayUseExpr(): iread cannot have empty mayuse"); + IreadSSANode &ireadNode = static_cast(expr); + ireadNode.GetMayUse().SetOpnd( + ssaTab.GetVersionStTable().GetVersionStFromID(rhsAe->GetOriginalSt().GetZeroVersionIndex())); + ASSERT(ireadNode.GetMayUse().GetOpnd() != nullptr, "AliasClass::InsertMayUseExpr(): iread cannot have empty mayuse"); } // collect the mayUses caused by globalsAffectedByCalls. void AliasClass::CollectMayUseFromGlobalsAffectedByCalls(std::set &mayUseOsts) { for (uint elemID : globalsAffectedByCalls) { - mayUseOsts.insert(id2Elem[elemID]->GetOriginalSt()); + mayUseOsts.insert(&id2Elem[elemID]->GetOriginalSt()); } } @@ -645,12 +632,12 @@ void AliasClass::CollectMayUseFromNADS(std::set &mayUseOsts) { for (AliasElem *notAllDefsSeenAE : notAllDefsSeenClassSetRoots) { if (notAllDefsSeenAE->GetClassSet() == nullptr) { // single mayUse - mayUseOsts.insert(notAllDefsSeenAE->GetOriginalSt()); + mayUseOsts.insert(¬AllDefsSeenAE->GetOriginalSt()); } else { for (uint elemID : *(notAllDefsSeenAE->GetClassSet())) { AliasElem *ae = id2Elem[elemID]; if (!OriginalStIsZeroLevAndAuto(ae->GetOriginalSt())) { - mayUseOsts.insert(ae->GetOriginalSt()); + mayUseOsts.insert(&ae->GetOriginalSt()); } } } @@ -658,10 +645,10 @@ void AliasClass::CollectMayUseFromNADS(std::set &mayUseOsts) { } // insert the ost of mayUseOsts into mayUseNodes -void AliasClass::InsertMayUseNode(std::set &mayUseOsts, MapleMap *mayUseNodes) { +void AliasClass::InsertMayUseNode(std::set &mayUseOsts, MapleMap &mayUseNodes) { for (OriginalSt *ost : mayUseOsts) { - mayUseNodes->insert(std::make_pair( - ost->GetIndex(), MayUseNode(ssaTab->GetVersionStTable().GetVersionStFromID(ost->GetZeroVersionIndex())))); + mayUseNodes.insert(std::make_pair( + ost->GetIndex(), MayUseNode(ssaTab.GetVersionStTable().GetVersionStFromID(ost->GetZeroVersionIndex())))); } } @@ -669,26 +656,26 @@ void AliasClass::InsertMayUseNode(std::set &mayUseOsts, MapleMap mayUseOsts; // 1. collect mayUses caused by not_all_def_seen_ae. CollectMayUseFromNADS(mayUseOsts); // 2. collect mayUses caused by globals_affected_by_call. CollectMayUseFromGlobalsAffectedByCalls(mayUseOsts); - MapleMap *mayUseNodes = SSAGenericGetMayUseNode(stmt, &ssaTab->GetStmtsSSAPart()); - InsertMayUseNode(mayUseOsts, mayUseNodes); + MapleMap *mayUseNodes = SSAGenericGetMayUseNode(&stmt, &ssaTab.GetStmtsSSAPart()); + InsertMayUseNode(mayUseOsts, *mayUseNodes); } // collect next_level_nodes of the ost of ReturnOpnd into mayUseOsts -void AliasClass::CollectPtsToOfReturnOpnd(const OriginalSt *ost, std::set &mayUseOsts) { +void AliasClass::CollectPtsToOfReturnOpnd(const OriginalSt &ost, std::set &mayUseOsts) { for (OriginalSt *nextLevelOst : *(GetAliasAnalysisTable()->GetNextLevelNodes(ost))) { - AliasElem *indAe = FindAliasElem(nextLevelOst); - if (!indAe->IsNotAllDefsSeen() && (!indAe->GetOriginalSt()->IsFinal() || finalFieldAlias)) { + AliasElem *indAe = FindAliasElem(*nextLevelOst); + if (!indAe->IsNotAllDefsSeen() && (!indAe->GetOriginalSt().IsFinal() || finalFieldAlias)) { if (indAe->GetClassSet() == nullptr) { - mayUseOsts.insert(indAe->GetOriginalSt()); + mayUseOsts.insert(&indAe->GetOriginalSt()); } else { for (uint elemID : *(indAe->GetClassSet())) { - mayUseOsts.insert(id2Elem[elemID]->GetOriginalSt()); + mayUseOsts.insert(&id2Elem[elemID]->GetOriginalSt()); } } } @@ -696,11 +683,11 @@ void AliasClass::CollectPtsToOfReturnOpnd(const OriginalSt *ost, std::setGetOpCode() == OP_return && stmt->NumOpnds() != 0) { +void AliasClass::InsertReturnOpndMayUse(const StmtNode &stmt) { + if (stmt.GetOpCode() == OP_return && stmt.NumOpnds() != 0) { // insert mayuses for the return operand's next level - BaseNode *retv = stmt->Opnd(0); - AliasElem *ae = CreateAliasElemsExpr(retv); + BaseNode *retv = stmt.Opnd(0); + AliasElem *ae = CreateAliasElemsExpr(*retv); if (IsPotentialAddress(retv->GetPrimType()) && ae != nullptr && !ae->IsNextLevNotAllDefsSeen() && !(retv->GetOpCode() == OP_addrof && IsReadOnlyOst(ae->GetOriginalSt()))) { std::set mayUseOsts; @@ -712,66 +699,78 @@ void AliasClass::InsertReturnOpndMayUse(const StmtNode *stmt) { } } // insert mayUses - MapleMap *mayUseNodes = SSAGenericGetMayUseNode(stmt, &ssaTab->GetStmtsSSAPart()); - InsertMayUseNode(mayUseOsts, mayUseNodes); + MapleMap *mayUseNodes = SSAGenericGetMayUseNode(&stmt, &ssaTab.GetStmtsSSAPart()); + InsertMayUseNode(mayUseOsts, *mayUseNodes); } } } -void AliasClass::InsertMayUseAll(const StmtNode *stmt) { - MapleMap *mayUseNodes = SSAGenericGetMayUseNode(stmt, &ssaTab->GetStmtsSSAPart()); +void AliasClass::InsertMayUseAll(const StmtNode &stmt) { + MapleMap *mayUseNodes = SSAGenericGetMayUseNode(&stmt, &ssaTab.GetStmtsSSAPart()); for (AliasElem *ae : id2Elem) { - if (ae->GetOriginalSt() != nullptr && ae->GetOriginalSt()->GetIndirectLev() >= 0 && - !ae->GetOriginalSt()->IsPregOst()) { + if (ae->GetOriginalSt().GetIndirectLev() >= 0 && + !ae->GetOriginalSt().IsPregOst()) { mayUseNodes->insert(std::make_pair( - ae->GetOriginalSt()->GetIndex(), - MayUseNode(ssaTab->GetVersionStTable().GetVersionStFromID(ae->GetOriginalSt()->GetZeroVersionIndex())))); + ae->GetOriginalSt().GetIndex(), + MayUseNode(ssaTab.GetVersionStTable().GetVersionStFromID(ae->GetOriginalSt().GetZeroVersionIndex())))); } } } -void AliasClass::CollectMayDefForDassign(const StmtNode *stmt, std::set &mayDefOsts) { +void AliasClass::CollectMayDefForDassign(const StmtNode &stmt, std::set &mayDefOsts) { MayDefPartWithVersionSt *theSSAPart = - static_cast(ssaTab->GetStmtsSSAPart().SSAPartOf(stmt)); + static_cast(ssaTab.GetStmtsSSAPart().SSAPartOf(&stmt)); AliasElem *lhsAe = osym2Elem.at(theSSAPart->GetSSAVar()->GetOrigIdx().idx); ASSERT(lhsAe != nullptr, "aliaselem of lhs should not be null"); if (lhsAe->GetClassSet() != nullptr) { for (uint elemID : *(lhsAe->GetClassSet())) { if (elemID != lhsAe->GetClassID()) { - OriginalSt *ostOfAliasAE = id2Elem[elemID]->GetOriginalSt(); - if (ostOfAliasAE->GetTyIdx() == lhsAe->GetOriginalSt()->GetMIRSymbol()->GetTyIdx()) { - mayDefOsts.insert(ostOfAliasAE); + OriginalSt &ostOfAliasAE = id2Elem[elemID]->GetOriginalSt(); + if (ostOfAliasAE.GetTyIdx() == lhsAe->GetOriginalSt().GetMIRSymbol()->GetTyIdx()) { + mayDefOsts.insert(&ostOfAliasAE); } } } } } -void AliasClass::InsertMayDefNode(std::set &mayDefOsts, MapleMap *mayDefNodes, - StmtNode *stmt, BBId bbID) { +void AliasClass::InsertMayDefNode(std::set &mayDefOsts, MapleMap &mayDefNodes, + StmtNode &stmt, BBId bbID) { for (OriginalSt *mayDefOst : mayDefOsts) { - mayDefNodes->insert(std::make_pair( + mayDefNodes.insert(std::make_pair( mayDefOst->GetIndex(), - MayDefNode(ssaTab->GetVersionStTable().GetVersionStFromID(mayDefOst->GetZeroVersionIndex()), stmt))); + MayDefNode(ssaTab.GetVersionStTable().GetVersionStFromID(mayDefOst->GetZeroVersionIndex()), &stmt))); } } -void AliasClass::InsertMayDefDassign(StmtNode *stmt, BBId bbID) { +void AliasClass::InsertMayDefDassign(StmtNode &stmt, BBId bbID) { std::set mayDefOsts; CollectMayDefForDassign(stmt, mayDefOsts); - MapleMap *mayDefNodes = SSAGenericGetMayDefNodes(stmt, &ssaTab->GetStmtsSSAPart()); - InsertMayDefNode(mayDefOsts, mayDefNodes, stmt, bbID); + MapleMap *mayDefNodes = SSAGenericGetMayDefNodes(&stmt, &ssaTab.GetStmtsSSAPart()); + InsertMayDefNode(mayDefOsts, *mayDefNodes, stmt, bbID); } -void AliasClass::CollectMayDefForIassign(StmtNode *stmt, std::set &mayDefOsts) { - IassignNode *iass = static_cast(stmt); - AliasElem *baseAe = CreateAliasElemsExpr(iass->Opnd(0)); +bool AliasClass::IsEquivalentField(TyIdx tyIdxA, FieldID fldA, TyIdx tyIdxB, FieldID fldB) { + if (tyIdxA != tyIdxB) { + klassHierarchy->UpdateFieldID(tyIdxA, tyIdxB, fldA); + } + return fldA == fldB; +} + +void AliasClass::CollectMayDefForIassign(StmtNode &stmt, std::set &mayDefOsts) { + IassignNode &iass = static_cast(stmt); + AliasElem *baseAe = CreateAliasElemsExpr(*iass.Opnd(0)); AliasElem *lhsAe = nullptr; if (baseAe != nullptr) { // get the next-level-ost that will be assigned to OriginalSt *lhsOst = nullptr; - for (OriginalSt *nextLevelNode : *(GetAliasAnalysisTable()->GetNextLevelNodes(baseAe->GetOriginalSt()))) { - if (nextLevelNode->GetFieldID() == iass->GetFieldID()) { + TyIdx tyIdxOfIass = iass.GetTyIdx(); + FieldID fldOfIass = iass.GetFieldID(); + OriginalSt &ostOfBaseExpr = baseAe->GetOriginalSt(); + TyIdx tyIdxOfBaseOSt = ostOfBaseExpr.GetTyIdx(); + for (OriginalSt *nextLevelNode : *(GetAliasAnalysisTable()->GetNextLevelNodes(ostOfBaseExpr))) { + FieldID fldOfNextLevelOSt = nextLevelNode->GetFieldID(); + if (IsEquivalentField(tyIdxOfIass, fldOfIass, tyIdxOfBaseOSt, fldOfNextLevelOSt)) { lhsOst = nextLevelNode; break; } @@ -783,58 +782,57 @@ void AliasClass::CollectMayDefForIassign(StmtNode *stmt, std::set & } // lhsAe does not alias with any ae if (lhsAe->GetClassSet() == nullptr) { - mayDefOsts.insert(lhsAe->GetOriginalSt()); + mayDefOsts.insert(&lhsAe->GetOriginalSt()); return; } for (uint elemID : *(lhsAe->GetClassSet())) { AliasElem *aliasElem = id2Elem[elemID]; - OriginalSt *ostOfAliasAE = aliasElem->GetOriginalSt(); + OriginalSt &ostOfAliasAE = aliasElem->GetOriginalSt(); if (aliasElem != lhsAe && OriginalStIsZeroLevAndAuto(ostOfAliasAE)) { continue; } - mayDefOsts.insert(ostOfAliasAE); + mayDefOsts.insert(&ostOfAliasAE); } } void AliasClass::InsertMayDefNodeExcludeFinalOst(std::set &mayDefOsts, - MapleMap *mayDefNodes, StmtNode *stmt, BBId bbID) { + MapleMap &mayDefNodes, StmtNode &stmt, BBId bbID) { for (OriginalSt *mayDefOst : mayDefOsts) { if (!mayDefOst->IsFinal()) { - mayDefNodes->insert(std::make_pair( + mayDefNodes.insert(std::make_pair( mayDefOst->GetIndex(), - MayDefNode(ssaTab->GetVersionStTable().GetVersionStFromID(mayDefOst->GetZeroVersionIndex()), stmt))); + MayDefNode(ssaTab.GetVersionStTable().GetVersionStFromID(mayDefOst->GetZeroVersionIndex()), &stmt))); } } } -void AliasClass::InsertMayDefIassign(StmtNode *stmt, BBId bbID) { +void AliasClass::InsertMayDefIassign(StmtNode &stmt, BBId bbID) { std::set mayDefOsts; CollectMayDefForIassign(stmt, mayDefOsts); - MapleMap *mayDefNodes = SSAGenericGetMayDefNodes(stmt, &ssaTab->GetStmtsSSAPart()); + MapleMap *mayDefNodes = SSAGenericGetMayDefNodes(&stmt, &ssaTab.GetStmtsSSAPart()); if (mayDefNodes == nullptr) { return; } if (mayDefOsts.size() == 1) { - InsertMayDefNode(mayDefOsts, mayDefNodes, stmt, bbID); + InsertMayDefNode(mayDefOsts, *mayDefNodes, stmt, bbID); } else { - InsertMayDefNodeExcludeFinalOst(mayDefOsts, mayDefNodes, stmt, bbID); + InsertMayDefNodeExcludeFinalOst(mayDefOsts, *mayDefNodes, stmt, bbID); } ASSERT(!mayDefNodes->empty(), "AliasClass::InsertMayUseIassign(): iassign cannot have empty maydef"); } -void AliasClass::InsertMayDefUseSyncOps(StmtNode *stmt, BBId bbID) { +void AliasClass::InsertMayDefUseSyncOps(StmtNode &stmt, BBId bbID) { std::set aliasSet; // collect the full alias set first - for (size_t i = 0; i < stmt->NumOpnds(); i++) { - BaseNode *addrBase = stmt->Opnd(i); + for (size_t i = 0; i < stmt.NumOpnds(); i++) { + BaseNode *addrBase = stmt.Opnd(i); if (addrBase->GetOpCode() == OP_addrof || addrBase->GetOpCode() == OP_dread || addrBase->GetOpCode() == OP_regread) { OriginalSt *ost = (addrBase->GetOpCode() == OP_regread) ? static_cast(addrBase)->GetSSAVar()->GetOrigSt() : static_cast(addrBase)->GetSSAVar()->GetOrigSt(); if (addrBase->GetOpCode() != OP_addrof) { - // addrBase->op == OP_dread or OP_regread - for (OriginalSt *nextLevelOst : *(GetAliasAnalysisTable()->GetNextLevelNodes(ost))) { + for (OriginalSt *nextLevelOst : *(GetAliasAnalysisTable()->GetNextLevelNodes(*ost))) { AliasElem *opndAE = osym2Elem[nextLevelOst->GetIndex().idx]; if (opndAE->GetClassSet() != nullptr) { aliasSet.insert(opndAE->GetClassSet()->cbegin(), opndAE->GetClassSet()->cend()); @@ -845,29 +843,29 @@ void AliasClass::InsertMayDefUseSyncOps(StmtNode *stmt, BBId bbID) { for (AliasElem *notAllDefsSeenAE : notAllDefsSeenClassSetRoots) { if (notAllDefsSeenAE->GetClassSet() != nullptr) { aliasSet.insert(notAllDefsSeenAE->GetClassSet()->cbegin(), notAllDefsSeenAE->GetClassSet()->cend()); - } else if (notAllDefsSeenAE->GetOriginalSt() != nullptr) { + } else { aliasSet.insert(notAllDefsSeenAE->GetClassID()); } } } } // do the insertion according to aliasSet - MayDefMayUsePart *theSSAPart = static_cast(ssaTab->GetStmtsSSAPart().SSAPartOf(stmt)); + MayDefMayUsePart *theSSAPart = static_cast(ssaTab.GetStmtsSSAPart().SSAPartOf(&stmt)); for (uint elemid : aliasSet) { AliasElem *aliasElem = id2Elem[elemid]; - OriginalSt *ostOfAliasAE = aliasElem->GetOriginalSt(); - if (!ostOfAliasAE->IsFinal() && !OriginalStIsZeroLevAndAuto(ostOfAliasAE)) { - OStIdx ostIdx = ostOfAliasAE->GetIndex(); - VersionSt *vst0 = ssaTab->GetVersionStTable().GetVersionStFromID(ostOfAliasAE->GetZeroVersionIndex()); + OriginalSt &ostOfAliasAE = aliasElem->GetOriginalSt(); + if (!ostOfAliasAE.IsFinal() && !OriginalStIsZeroLevAndAuto(ostOfAliasAE)) { + OStIdx ostIdx = ostOfAliasAE.GetIndex(); + VersionSt *vst0 = ssaTab.GetVersionStTable().GetVersionStFromID(ostOfAliasAE.GetZeroVersionIndex()); theSSAPart->GetMayUseNodes().insert(std::make_pair(ostIdx, MayUseNode(vst0))); - theSSAPart->GetMayDefNodes().insert(std::make_pair(ostIdx, MayDefNode(vst0, stmt))); + theSSAPart->GetMayDefNodes().insert(std::make_pair(ostIdx, MayDefNode(vst0, &stmt))); } } } // collect mayDefs caused by mustDefs -void AliasClass::CollectMayDefForMustDefs(const StmtNode *stmt, std::set &mayDefOsts) { - MapleVector *mustDefs = SSAGenericGetMustDefNode(stmt, &ssaTab->GetStmtsSSAPart()); +void AliasClass::CollectMayDefForMustDefs(const StmtNode &stmt, std::set &mayDefOsts) { + MapleVector *mustDefs = SSAGenericGetMustDefNode(&stmt, &ssaTab.GetStmtsSSAPart()); for (MustDefNode mustDef : *mustDefs) { VersionSt *vst = mustDef.GetResult(); OriginalSt *ost = vst->GetOrigSt(); @@ -878,56 +876,56 @@ void AliasClass::CollectMayDefForMustDefs(const StmtNode *stmt, std::setGetClassSet())) { AliasElem *ae = id2Elem[elemID]; if (elemID != lhsAe->GetClassID() && - ae->GetOriginalSt()->GetTyIdx() == lhsAe->GetOriginalSt()->GetMIRSymbol()->GetTyIdx()) { - mayDefOsts.insert(ae->GetOriginalSt()); + ae->GetOriginalSt().GetTyIdx() == lhsAe->GetOriginalSt().GetMIRSymbol()->GetTyIdx()) { + mayDefOsts.insert(&ae->GetOriginalSt()); } } } } -void AliasClass::CollectMayUseForCallOpnd(const StmtNode *stmt, std::set &mayUseOsts) { - for (size_t i = 0; i < stmt->NumOpnds(); i++) { - BaseNode *expr = stmt->Opnd(i); - InsertMayUseExpr(expr); +void AliasClass::CollectMayUseForCallOpnd(const StmtNode &stmt, std::set &mayUseOsts) { + for (size_t i = 0; i < stmt.NumOpnds(); i++) { + BaseNode *expr = stmt.Opnd(i); + InsertMayUseExpr(*expr); if (!IsPotentialAddress(expr->GetPrimType())) { continue; } - AliasElem *ae = CreateAliasElemsExpr(expr); + AliasElem *ae = CreateAliasElemsExpr(*expr); if (ae == nullptr || ae->IsNextLevNotAllDefsSeen()) { continue; } - if (GlobalTables::GetTypeTable().GetTypeFromTyIdx(ae->GetOriginalSt()->GetTyIdx())->PointsToConstString()) { + if (GlobalTables::GetTypeTable().GetTypeFromTyIdx(ae->GetOriginalSt().GetTyIdx())->PointsToConstString()) { continue; } for (OriginalSt *nextLevelOst : *(GetAliasAnalysisTable()->GetNextLevelNodes(ae->GetOriginalSt()))) { - AliasElem *indAe = FindAliasElem(nextLevelOst); + AliasElem *indAe = FindAliasElem(*nextLevelOst); - if (indAe->GetOriginalSt()->IsFinal() && !finalFieldAlias) { + if (indAe->GetOriginalSt().IsFinal() && !finalFieldAlias) { continue; } if (indAe->GetClassSet() == nullptr) { - mayUseOsts.insert(indAe->GetOriginalSt()); + mayUseOsts.insert(&indAe->GetOriginalSt()); } else { for (uint elemID : *(indAe->GetClassSet())) { - mayUseOsts.insert(id2Elem[elemID]->GetOriginalSt()); + mayUseOsts.insert(&id2Elem[elemID]->GetOriginalSt()); } } } } } -void AliasClass::InsertMayDefNodeForCall(std::set &mayDefOsts, MapleMap *mayDefNodes, - StmtNode *stmt, BBId bbID, bool hasNoPrivateDefEffect) { +void AliasClass::InsertMayDefNodeForCall(std::set &mayDefOsts, MapleMap &mayDefNodes, + StmtNode &stmt, BBId bbID, bool hasNoPrivateDefEffect) { for (OriginalSt *mayDefOst : mayDefOsts) { if (!hasNoPrivateDefEffect || !mayDefOst->IsPrivate()) { - mayDefNodes->insert(std::make_pair( + mayDefNodes.insert(std::make_pair( mayDefOst->GetIndex(), - MayDefNode(ssaTab->GetVersionStTable().GetVersionStFromID(mayDefOst->GetZeroVersionIndex()), stmt))); + MayDefNode(ssaTab.GetVersionStTable().GetVersionStFromID(mayDefOst->GetZeroVersionIndex()), &stmt))); } } } @@ -935,41 +933,41 @@ void AliasClass::InsertMayDefNodeForCall(std::set &mayDefOsts, Mapl // Insert mayDefs and mayUses for the callees. // Four kinds of mayDefs and mayUses are inserted, which are caused by callee // opnds, not_all_def_seen_ae, globalsAffectedByCalls, and mustDefs. -void AliasClass::InsertMayDefUseCall(StmtNode *stmt, BBId bbID, bool hasSideEffect, bool hasNoPrivateDefEffect) { - MayDefMayUsePart *theSSAPart = static_cast(ssaTab->GetStmtsSSAPart().SSAPartOf(stmt)); +void AliasClass::InsertMayDefUseCall(StmtNode &stmt, BBId bbID, bool hasSideEffect, bool hasNoPrivateDefEffect) { + MayDefMayUsePart *theSSAPart = static_cast(ssaTab.GetStmtsSSAPart().SSAPartOf(&stmt)); std::set mayDefUseOstsA; // 1. collect mayDefs and mayUses caused by callee-opnds CollectMayUseForCallOpnd(stmt, mayDefUseOstsA); // 2. collect mayDefs and mayUses caused by not_all_def_seen_ae CollectMayUseFromNADS(mayDefUseOstsA); - InsertMayUseNode(mayDefUseOstsA, &(theSSAPart->GetMayUseNodes())); + InsertMayUseNode(mayDefUseOstsA, theSSAPart->GetMayUseNodes()); // insert may def node, if the callee has side-effect. if (hasSideEffect) { - InsertMayDefNodeForCall(mayDefUseOstsA, &(theSSAPart->GetMayDefNodes()), stmt, bbID, hasNoPrivateDefEffect); + InsertMayDefNodeForCall(mayDefUseOstsA, theSSAPart->GetMayDefNodes(), stmt, bbID, hasNoPrivateDefEffect); } // 3. insert mayDefs and mayUses caused by globalsAffectedByCalls std::set mayDefUseOstsB; CollectMayUseFromGlobalsAffectedByCalls(mayDefUseOstsB); - InsertMayUseNode(mayDefUseOstsB, &(theSSAPart->GetMayUseNodes())); + InsertMayUseNode(mayDefUseOstsB, theSSAPart->GetMayUseNodes()); // insert may def node, if the callee has side-effect. if (hasSideEffect) { - InsertMayDefNodeExcludeFinalOst(mayDefUseOstsB, &(theSSAPart->GetMayDefNodes()), stmt, bbID); - if (kOpcodeInfo.IsCallAssigned(stmt->GetOpCode())) { + InsertMayDefNodeExcludeFinalOst(mayDefUseOstsB, theSSAPart->GetMayDefNodes(), stmt, bbID); + if (kOpcodeInfo.IsCallAssigned(stmt.GetOpCode())) { // 4. insert mayDefs caused by the mustDefs std::set mayDefOstsC; CollectMayDefForMustDefs(stmt, mayDefOstsC); - InsertMayDefNodeExcludeFinalOst(mayDefOstsC, &(theSSAPart->GetMayDefNodes()), stmt, bbID); + InsertMayDefNodeExcludeFinalOst(mayDefOstsC, theSSAPart->GetMayDefNodes(), stmt, bbID); } } } void AliasClass::InsertMayUseNodeExcludeFinalOst(const std::set &mayUseOsts, - MapleMap *mayUseNodes) { + MapleMap &mayUseNodes) { for (OriginalSt *mayUseOst : mayUseOsts) { if (!mayUseOst->IsFinal()) { - mayUseNodes->insert( + mayUseNodes.insert( std::make_pair(mayUseOst->GetIndex(), - MayUseNode(ssaTab->GetVersionStTable().GetVersionStFromID(mayUseOst->GetZeroVersionIndex())))); + MayUseNode(ssaTab.GetVersionStTable().GetVersionStFromID(mayUseOst->GetZeroVersionIndex())))); } } } @@ -977,47 +975,45 @@ void AliasClass::InsertMayUseNodeExcludeFinalOst(const std::set &ma // Insert mayDefs and mayUses for intrinsiccall. // Four kinds of mayDefs and mayUses are inserted, which are caused by callee // opnds, not_all_def_seen_ae, globalsAffectedByCalls, and mustDefs. -void AliasClass::InsertMayDefUseIntrncall(StmtNode *stmt, BBId bbID) { - MayDefMayUsePart *theSSAPart = static_cast(ssaTab->GetStmtsSSAPart().SSAPartOf(stmt)); - IntrinsiccallNode *intrinNode = static_cast(stmt); - IntrinDesc *intrinDesc = &IntrinDesc::intrinTable[intrinNode->GetIntrinsic()]; +void AliasClass::InsertMayDefUseIntrncall(StmtNode &stmt, BBId bbID) { + MayDefMayUsePart *theSSAPart = static_cast(ssaTab.GetStmtsSSAPart().SSAPartOf(&stmt)); + IntrinsiccallNode &intrinNode = static_cast(stmt); + IntrinDesc *intrinDesc = &IntrinDesc::intrinTable[intrinNode.GetIntrinsic()]; std::set mayDefUseOsts; // 1. collect mayDefs and mayUses caused by not_all_defs_seen_ae CollectMayUseFromNADS(mayDefUseOsts); // 2. collect mayDefs and mayUses caused by globalsAffectedByCalls CollectMayUseFromGlobalsAffectedByCalls(mayDefUseOsts); - InsertMayUseNodeExcludeFinalOst(mayDefUseOsts, &(theSSAPart->GetMayUseNodes())); + InsertMayUseNodeExcludeFinalOst(mayDefUseOsts, theSSAPart->GetMayUseNodes()); if (!intrinDesc->HasNoSideEffect() || calleeHasSideEffect) { - InsertMayDefNodeExcludeFinalOst(mayDefUseOsts, &(theSSAPart->GetMayDefNodes()), stmt, bbID); + InsertMayDefNodeExcludeFinalOst(mayDefUseOsts, theSSAPart->GetMayDefNodes(), stmt, bbID); } - if (kOpcodeInfo.IsCallAssigned(stmt->GetOpCode())) { + if (kOpcodeInfo.IsCallAssigned(stmt.GetOpCode())) { // 3. insert maydefs caused by the mustdefs std::set mayDefOsts; CollectMayDefForMustDefs(stmt, mayDefOsts); - InsertMayDefNodeExcludeFinalOst(mayDefOsts, &(theSSAPart->GetMayDefNodes()), stmt, bbID); + InsertMayDefNodeExcludeFinalOst(mayDefOsts, theSSAPart->GetMayDefNodes(), stmt, bbID); } } -void AliasClass::InsertMayDefUseClinitCheck(IntrinsiccallNode *stmt, BBId bbID) { - MayDefMayUsePart *theSSAPart = static_cast(ssaTab->GetStmtsSSAPart().SSAPartOf(stmt)); +void AliasClass::InsertMayDefUseClinitCheck(IntrinsiccallNode &stmt, BBId bbID) { + MayDefMayUsePart *theSSAPart = static_cast(ssaTab.GetStmtsSSAPart().SSAPartOf(&stmt)); for (OStIdx ostIdx : globalsMayAffectedByClinitCheck) { AliasElem *ae = osym2Elem[ostIdx.idx]; - if (ae->GetOriginalSt() != nullptr) { - OriginalSt *ostOfAE = ae->GetOriginalSt(); - std::string typeNameOfOst = ostOfAE->GetMIRSymbol()->GetName(); - std::string typeNameOfStmt = GlobalTables::GetTypeTable().GetTypeFromTyIdx(stmt->GetTyIdx())->GetName(); - if (typeNameOfOst.find(typeNameOfStmt) != std::string::npos) { - theSSAPart->GetMayDefNodes().insert(std::make_pair( - ostOfAE->GetIndex(), - MayDefNode(ssaTab->GetVersionStTable().GetVersionStFromID(ostOfAE->GetZeroVersionIndex()), stmt))); - } + OriginalSt &ostOfAE = ae->GetOriginalSt(); + std::string typeNameOfOst = ostOfAE.GetMIRSymbol()->GetName(); + std::string typeNameOfStmt = GlobalTables::GetTypeTable().GetTypeFromTyIdx(stmt.GetTyIdx())->GetName(); + if (typeNameOfOst.find(typeNameOfStmt) != std::string::npos) { + theSSAPart->GetMayDefNodes().insert(std::make_pair( + ostOfAE.GetIndex(), + MayDefNode(ssaTab.GetVersionStTable().GetVersionStFromID(ostOfAE.GetZeroVersionIndex()), &stmt))); } } return; } -void AliasClass::GenericInsertMayDefUse(StmtNode *stmt, BBId bbID) { - switch (stmt->GetOpCode()) { +void AliasClass::GenericInsertMayDefUse(StmtNode &stmt, BBId bbID) { + switch (stmt.GetOpCode()) { case OP_return: { InsertMayUseReturn(stmt); // insert mayuses caused by its return operand being a pointer @@ -1025,7 +1021,7 @@ void AliasClass::GenericInsertMayDefUse(StmtNode *stmt, BBId bbID) { break; } case OP_throw: { - if (mirModule->GetSrcLang() != kSrcLangJs && lessThrowAlias) { + if (mirModule.GetSrcLang() != kSrcLangJs && lessThrowAlias) { ASSERT(GetBB(bbID) != nullptr, "GetBB(bbID) is nullptr in AliasClass::GenericInsertMayDefUse"); if (!GetBB(bbID)->IsGoto()) { InsertMayUseReturn(stmt); @@ -1063,8 +1059,8 @@ void AliasClass::GenericInsertMayDefUse(StmtNode *stmt, BBId bbID) { return; } case OP_intrinsiccallwithtype: { - IntrinsiccallNode *innode = static_cast(stmt); - if (innode->GetIntrinsic() == INTRN_JAVA_CLINIT_CHECK) { + IntrinsiccallNode &innode = static_cast(stmt); + if (innode.GetIntrinsic() == INTRN_JAVA_CLINIT_CHECK) { InsertMayDefUseClinitCheck(innode, bbID); } InsertMayDefUseIntrncall(stmt, bbID); @@ -1094,9 +1090,8 @@ void AliasClass::GenericInsertMayDefUse(StmtNode *stmt, BBId bbID) { default: break; } - for (size_t i = 0; i < stmt->NumOpnds(); ++i) { - InsertMayUseExpr(stmt->Opnd(i)); + for (size_t i = 0; i < stmt.NumOpnds(); ++i) { + InsertMayUseExpr(*stmt.Opnd(i)); } } - } // namespace maple diff --git a/src/maple_me/src/bb.cpp b/src/maple_me/src/bb.cpp index a57cec2a8cf0a1a56eadc17e87ad3895c5647d5b..417ce724d3381ec544f4a9f06504b6ad19e1ffad 100644 --- a/src/maple_me/src/bb.cpp +++ b/src/maple_me/src/bb.cpp @@ -107,7 +107,7 @@ void BB::DumpPhi(const MIRModule *mod) { } } -PhiNode *BB::PhiofVerStInserted(VersionSt *vsym) { +const PhiNode *BB::PhiofVerStInserted(VersionSt *vsym) { auto phiit = phiList.find(vsym->GetOrigSt()); return (phiit != phiList.end()) ? &(*phiit).second : nullptr; } @@ -364,5 +364,4 @@ void BB::DumpMeRegPhiList(IRMap *irMap) { (*phiIt).second->Dump(irMap); } } - -} // namespace maple +} // namespace maple \ No newline at end of file diff --git a/src/maple_me/src/dominance.cpp b/src/maple_me/src/dominance.cpp index fbd2a58b9311e39a3bd7e0347f332977f40951ea..e37ea0007f2e83a1399f1a06fa4297d9f5ba219b 100644 --- a/src/maple_me/src/dominance.cpp +++ b/src/maple_me/src/dominance.cpp @@ -16,19 +16,18 @@ #include /* ================= for Dominance ================= */ - namespace maple { -void Dominance::PostOrderWalk(BB *bb, int32 &pid, std::vector &visitedMap) { - ASSERT(bb->GetBBId().idx < visitedMap.size(), "index out of range in Dominance::PostOrderWalk"); - if (visitedMap[bb->GetBBId().idx]) { +void Dominance::PostOrderWalk(BB &bb, int32 &pid, std::vector &visitedMap) { + ASSERT(bb.GetBBId().idx < visitedMap.size(), "index out of range in Dominance::PostOrderWalk"); + if (visitedMap[bb.GetBBId().idx]) { return; } - visitedMap[bb->GetBBId().idx] = true; - for (BB *suc : bb->GetSucc()) { - PostOrderWalk(suc, pid, visitedMap); + visitedMap[bb.GetBBId().idx] = true; + for (BB *suc : bb.GetSucc()) { + PostOrderWalk(*suc, pid, visitedMap); } - ASSERT(bb->GetBBId().idx < postOrderIDVec.size(), "index out of range in Dominance::PostOrderWalk"); - postOrderIDVec[bb->GetBBId().idx] = pid++; + ASSERT(bb.GetBBId().idx < postOrderIDVec.size(), "index out of range in Dominance::PostOrderWalk"); + postOrderIDVec[bb.GetBBId().idx] = pid++; return; } @@ -49,21 +48,23 @@ void Dominance::GenPostOrderID() { } } -BB *Dominance::Intersect(BB *bb1, const BB *bb2) { - while (bb1 != bb2) { - while (postOrderIDVec[bb1->GetBBId().idx] < postOrderIDVec[bb2->GetBBId().idx]) { - bb1 = doms[bb1->GetBBId().idx]; +BB *Dominance::Intersect(BB &bb1, const BB &bb2) { + auto *ptrBB1 = &bb1; + auto *ptrBB2 = &bb2; + while (ptrBB1 != ptrBB2) { + while (postOrderIDVec[ptrBB1->GetBBId().idx] < postOrderIDVec[ptrBB2->GetBBId().idx]) { + ptrBB1 = doms[ptrBB1->GetBBId().idx]; } - while (postOrderIDVec[bb2->GetBBId().idx] < postOrderIDVec[bb1->GetBBId().idx]) { - bb2 = doms[bb2->GetBBId().idx]; + while (postOrderIDVec[ptrBB2->GetBBId().idx] < postOrderIDVec[ptrBB1->GetBBId().idx]) { + ptrBB2 = doms[ptrBB2->GetBBId().idx]; } } - return bb1; + return ptrBB1; } -bool Dominance::CommonEntryBBIsPred(const BB *bb) { - for (BB *suc : GetCommonEntryBB()->GetSucc()) { - if (suc == bb) { +bool Dominance::CommonEntryBBIsPred(const BB &bb) { + for (BB *suc : GetCommonEntryBB().GetSucc()) { + if (suc == &bb) { return true; } } @@ -72,15 +73,15 @@ bool Dominance::CommonEntryBBIsPred(const BB *bb) { // Figure 3 in "A Simple, Fast Dominance Algorithm" by Keith Cooper et al. void Dominance::ComputeDominance() { - doms.at(commonEntryBB->GetBBId().idx) = commonEntryBB; + doms.at(commonEntryBB.GetBBId().idx) = &commonEntryBB; bool changed = false; do { changed = false; for (size_t i = 1; i < reversePostOrder.size(); i++) { BB *bb = reversePostOrder[i]; BB *pre = nullptr; - if (CommonEntryBBIsPred(bb) || bb->GetPred().empty()) { - pre = commonEntryBB; + if (CommonEntryBBIsPred(*bb) || bb->GetPred().empty()) { + pre = &commonEntryBB; } else { pre = bb->GetPred(0); } @@ -93,7 +94,7 @@ void Dominance::ComputeDominance() { for (; j < bb->GetPred().size(); j++) { pre = bb->GetPred(j); if (doms[pre->GetBBId().idx] != nullptr && pre != bb) { - newIDom = Intersect(pre, newIDom); + newIDom = Intersect(*pre, *newIDom); } } if (doms[bb->GetBBId().idx] != newIDom) { @@ -107,7 +108,7 @@ void Dominance::ComputeDominance() { // Figure 5 in "A Simple, Fast Dominance Algorithm" by Keith Cooper et al. void Dominance::ComputeDomFrontiers() { for (BB *bb : bbVec) { - if (bb == nullptr || bb == commonExitBB) { + if (bb == nullptr || bb == &commonExitBB) { continue; } if (bb->GetPred().size() < 2) { @@ -115,7 +116,7 @@ void Dominance::ComputeDomFrontiers() { } for (BB *pre : bb->GetPred()) { BB *runner = pre; - while (runner != doms[bb->GetBBId().idx] && runner != commonEntryBB) { + while (runner != doms[bb->GetBBId().idx] && runner != &commonEntryBB) { domFrontier[runner->GetBBId().idx].insert(bb->GetBBId()); runner = doms[runner->GetBBId().idx]; } @@ -139,11 +140,11 @@ void Dominance::ComputeDomChildren() { } } -void Dominance::ComputeDtPreorder(const BB *bb, size_t &num) { +void Dominance::ComputeDtPreorder(const BB &bb, size_t &num) { CHECK_FATAL(num < dtPreOrder.size(), "index out of range in Dominance::ComputeDtPreorder"); - dtPreOrder[num++] = bb->GetBBId(); - for (BBId k : domChildren[bb->GetBBId().idx]) { - ComputeDtPreorder(bbVec[k.idx], num); + dtPreOrder[num++] = bb.GetBBId(); + for (BBId k : domChildren[bb.GetBBId().idx]) { + ComputeDtPreorder(*bbVec[k.idx], num); } } @@ -154,42 +155,42 @@ void Dominance::ComputeDtDfn() { } // true if b1 dominates b2 -bool Dominance::Dominate(const BB *b1, BB *b2) { - if (b1 == b2) { +bool Dominance::Dominate(const BB &b1, BB &b2) { + if (&b1 == &b2) { return true; } - CHECK_FATAL(b2->GetBBId().idx < doms.size(), "index out of range in Dominance::Dominate "); - if (doms[b2->GetBBId().idx] == nullptr) { + CHECK_FATAL(b2.GetBBId().idx < doms.size(), "index out of range in Dominance::Dominate "); + if (doms[b2.GetBBId().idx] == nullptr) { return false; } - BB *imdom = b2; + BB *imdom = &b2; do { if (imdom == nullptr) { return false; } imdom = doms[imdom->GetBBId().idx]; - if (imdom == b1) { + if (imdom == &b1) { return true; } - } while (imdom != commonEntryBB); + } while (imdom != &commonEntryBB); return false; } /* ================= for PostDominance ================= */ -void Dominance::PdomPostOrderWalk(BB *bb, int32 &pid, std::vector &visitedMap) { - ASSERT(bb->GetBBId().idx < visitedMap.size(), "index out of range in Dominance::PdomPostOrderWalk"); - if (bbVec[bb->GetBBId().idx] == nullptr) { +void Dominance::PdomPostOrderWalk(BB &bb, int32 &pid, std::vector &visitedMap) { + ASSERT(bb.GetBBId().idx < visitedMap.size(), "index out of range in Dominance::PdomPostOrderWalk"); + if (bbVec[bb.GetBBId().idx] == nullptr) { return; } - if (visitedMap[bb->GetBBId().idx]) { + if (visitedMap[bb.GetBBId().idx]) { return; } - visitedMap[bb->GetBBId().idx] = true; - for (BB *pre : bb->GetPred()) { - PdomPostOrderWalk(pre, pid, visitedMap); + visitedMap[bb.GetBBId().idx] = true; + for (BB *pre : bb.GetPred()) { + PdomPostOrderWalk(*pre, pid, visitedMap); } - CHECK_FATAL(bb->GetBBId().idx < pdomPostOrderIDVec.size(), "index out of range in Dominance::PdomPostOrderWalk"); - pdomPostOrderIDVec[bb->GetBBId().idx] = pid++; + CHECK_FATAL(bb.GetBBId().idx < pdomPostOrderIDVec.size(), "index out of range in Dominance::PdomPostOrderWalk"); + pdomPostOrderIDVec[bb.GetBBId().idx] = pid++; return; } @@ -210,21 +211,23 @@ void Dominance::PdomGenPostOrderID() { } } -BB *Dominance::PdomIntersect(BB *bb1, const BB *bb2) { - while (bb1 != bb2) { - while (pdomPostOrderIDVec[bb1->GetBBId().idx] < pdomPostOrderIDVec[bb2->GetBBId().idx]) { - bb1 = pdoms[bb1->GetBBId().idx]; +BB *Dominance::PdomIntersect(BB &bb1, const BB &bb2) { + auto *ptrBB1 = &bb1; + auto *ptrBB2 = &bb2; + while (ptrBB1 != ptrBB2) { + while (pdomPostOrderIDVec[ptrBB1->GetBBId().idx] < pdomPostOrderIDVec[ptrBB2->GetBBId().idx]) { + ptrBB1 = pdoms[ptrBB1->GetBBId().idx]; } - while (pdomPostOrderIDVec[bb2->GetBBId().idx] < pdomPostOrderIDVec[bb1->GetBBId().idx]) { - bb2 = pdoms[bb2->GetBBId().idx]; + while (pdomPostOrderIDVec[ptrBB2->GetBBId().idx] < pdomPostOrderIDVec[ptrBB1->GetBBId().idx]) { + ptrBB2 = pdoms[ptrBB2->GetBBId().idx]; } } - return bb1; + return ptrBB1; } // Figure 3 in "A Simple, Fast Dominance Algorithm" by Keith Cooper et al. void Dominance::ComputePostDominance() { - pdoms.at(commonExitBB->GetBBId().idx) = commonExitBB; + pdoms.at(commonExitBB.GetBBId().idx) = &commonExitBB; bool changed = false; do { changed = false; @@ -232,7 +235,7 @@ void Dominance::ComputePostDominance() { BB *bb = pdomReversePostOrder[i]; BB *suc = nullptr; if (bb->GetAttributes(kBBAttrIsExit) || bb->GetSucc().empty()) { - suc = commonExitBB; + suc = &commonExitBB; } else { suc = bb->GetSucc(0); } @@ -242,13 +245,13 @@ void Dominance::ComputePostDominance() { j++; } if (pdoms[suc->GetBBId().idx] == nullptr) { - suc = commonExitBB; + suc = &commonExitBB; } BB *newIDom = suc; for (; j < bb->GetSucc().size(); j++) { suc = bb->GetSucc(j); if (pdoms[suc->GetBBId().idx] != nullptr && suc != bb) { - newIDom = PdomIntersect(suc, newIDom); + newIDom = PdomIntersect(*suc, *newIDom); } } if (pdoms[bb->GetBBId().idx] != newIDom) { @@ -263,7 +266,7 @@ void Dominance::ComputePostDominance() { // Figure 5 in "A Simple, Fast Dominance Algorithm" by Keith Cooper et al. void Dominance::ComputePdomFrontiers() { for (BB *bb : bbVec) { - if (bb == nullptr || bb == commonEntryBB) { + if (bb == nullptr || bb == &commonEntryBB) { continue; } if (bb->GetSucc().size() < 2) { @@ -271,7 +274,7 @@ void Dominance::ComputePdomFrontiers() { } for (BB *suc : bb->GetSucc()) { BB *runner = suc; - while (runner != pdoms[bb->GetBBId().idx] && runner != commonEntryBB) { + while (runner != pdoms[bb->GetBBId().idx] && runner != &commonEntryBB) { pdomFrontier[runner->GetBBId().idx].insert(bb->GetBBId()); ASSERT(pdoms[runner->GetBBId().idx] != nullptr, "ComputePdomFrontiers: pdoms[] is nullptr"); runner = pdoms[runner->GetBBId().idx]; @@ -296,11 +299,11 @@ void Dominance::ComputePdomChildren() { } } -void Dominance::ComputePdtPreorder(const BB *bb, size_t &num) { +void Dominance::ComputePdtPreorder(const BB &bb, size_t &num) { ASSERT(num < pdtPreOrder.size(), "index out of range in Dominance::ComputePdtPreOrder"); - pdtPreOrder[num++] = bb->GetBBId(); - for (BBId k : pdomChildren[bb->GetBBId().idx]) { - ComputePdtPreorder(bbVec[k.idx], num); + pdtPreOrder[num++] = bb.GetBBId(); + for (BBId k : pdomChildren[bb.GetBBId().idx]) { + ComputePdtPreorder(*bbVec[k.idx], num); } } @@ -311,24 +314,24 @@ void Dominance::ComputePdtDfn() { } // true if b1 postdominates b2 -bool Dominance::PostDominate(const BB *b1, BB *b2) { - if (b1 == b2) { +bool Dominance::PostDominate(const BB &b1, BB &b2) { + if (&b1 == &b2) { return true; } - CHECK_FATAL(b2->GetBBId().idx < pdoms.size(), "index out of range in Dominance::PostDominate"); - if (pdoms[b2->GetBBId().idx] == nullptr) { + CHECK_FATAL(b2.GetBBId().idx < pdoms.size(), "index out of range in Dominance::PostDominate"); + if (pdoms[b2.GetBBId().idx] == nullptr) { return false; } - BB *impdom = b2; + BB *impdom = &b2; do { if (impdom == nullptr) { return false; } impdom = pdoms[impdom->GetBBId().idx]; - if (impdom == b1) { + if (impdom == &b1) { return true; } - } while (impdom != commonExitBB); + } while (impdom != &commonExitBB); return false; } @@ -379,5 +382,4 @@ void Dominance::DumpPdoms() { } LogInfo::MapleLogger() << std::endl << std::endl; } - } // namespace maple diff --git a/src/maple_me/src/func_emit.cpp b/src/maple_me/src/func_emit.cpp index 58d076b2e00169da0ad505c19f05153d077735ac..404ea97b2b2e2af1736084bfd4e9f43d8e4d1615 100644 --- a/src/maple_me/src/func_emit.cpp +++ b/src/maple_me/src/func_emit.cpp @@ -16,17 +16,17 @@ #include "mir_function.h" namespace maple { -void FuncEmit::EmitLabelForBB(MIRFunction *func, BB *bb) { - ASSERT(bb->GetBBLabel() != 0, "Should have a label"); +void FuncEmit::EmitLabelForBB(MIRFunction &func, BB &bb) { + ASSERT(bb.GetBBLabel() != 0, "Should have a label"); // create labelnode - LabelNode *label = func->GetCodeMempool()->New(); - label->SetLabelIdx(bb->GetBBLabel()); - if (bb->IsEmpty()) { - bb->SetFirst(label); - bb->SetLast(label); + LabelNode *label = func.GetCodeMempool()->New(); + label->SetLabelIdx(bb.GetBBLabel()); + if (bb.IsEmpty()) { + bb.SetFirst(label); + bb.SetLast(label); } else { // Insert label before the first non-comment statement of bb - StmtNode *first = bb->GetStmtNodes().begin().d(); + StmtNode *first = bb.GetStmtNodes().begin().d(); StmtNode *firstPrev = nullptr; while (first != nullptr && first->GetOpCode() == OP_comment) { firstPrev = first; @@ -35,20 +35,20 @@ void FuncEmit::EmitLabelForBB(MIRFunction *func, BB *bb) { // "first" points to the first non-comment statement, or nullptr if (first != nullptr) { label->InsertAfterThis(first); - if (first == bb->GetStmtNodes().begin().d()) { - bb->SetFirst(label); + if (first == bb.GetStmtNodes().begin().d()) { + bb.SetFirst(label); } } else { label->InsertBeforeThis(firstPrev); - if (firstPrev == bb->GetStmtNodes().rbegin().base().d()) { - bb->SetLast(label); + if (firstPrev == bb.GetStmtNodes().rbegin().base().d()) { + bb.SetLast(label); } } } } -static void ConvertMaydassign(BB *bb) { - for (auto &stmt : bb->GetStmtNodes()) { +static void ConvertMaydassign(BB &bb) { + for (auto &stmt : bb.GetStmtNodes()) { if (stmt.GetOpCode() == OP_maydassign) { stmt.SetOpCode(OP_dassign); } @@ -56,21 +56,21 @@ static void ConvertMaydassign(BB *bb) { } // Inserting BBs in bblist into func's body. -void FuncEmit::EmitBeforeHSSA(MIRFunction *func, const MapleVector &bbList) { +void FuncEmit::EmitBeforeHSSA(MIRFunction &func, const MapleVector &bbList) { StmtNode *lastStmt = nullptr; /* last stmt of previous bb */ - func->GetBody()->SetFirst(nullptr); /* reset body first stmt */ - func->GetBody()->SetLast(nullptr); + func.GetBody()->SetFirst(nullptr); /* reset body first stmt */ + func.GetBody()->SetLast(nullptr); for (BB *bb : bbList) { if (bb == nullptr) { continue; } - ConvertMaydassign(bb); + ConvertMaydassign(*bb); if (bb->GetBBLabel() != 0) { - EmitLabelForBB(func, bb); + EmitLabelForBB(func, *bb); } if (!bb->IsEmpty()) { - if (func->GetBody()->GetFirst() == nullptr) { - func->GetBody()->SetFirst(bb->GetStmtNodes().begin().d()); + if (func.GetBody()->GetFirst() == nullptr) { + func.GetBody()->SetFirst(bb->GetStmtNodes().begin().d()); } if (lastStmt != nullptr) { bb->GetStmtNodes().push_front(lastStmt); @@ -79,12 +79,12 @@ void FuncEmit::EmitBeforeHSSA(MIRFunction *func, const MapleVector &bbList) } if (bb->AddBackEndTry()) { /* generate op_endtry andd added to next, it could be in an empty bb. */ - StmtNode *endtry = func->GetCodeMempool()->New(OP_endtry); + StmtNode *endtry = func.GetCodeMempool()->New(OP_endtry); + CHECK_FATAL(lastStmt != nullptr, "EmitBeforeHSSA: shouldn't insert before a null stmt"); endtry->InsertBeforeThis(lastStmt); lastStmt = endtry; } } - func->GetBody()->SetLast(lastStmt); + func.GetBody()->SetLast(lastStmt); } - } // namespace maple diff --git a/src/maple_me/src/irmap.cpp b/src/maple_me/src/irmap.cpp index a8d3597aaf9ae3121e0d8549c343f7d079d5b9f7..88e39dafc732db35ef66575e701d06d5083aa363 100644 --- a/src/maple_me/src/irmap.cpp +++ b/src/maple_me/src/irmap.cpp @@ -21,96 +21,93 @@ namespace maple { // recursively invoke itself in a pre-order traversal of the dominator tree of // the CFG to build the HSSA representation for the code in each BB -void IRMap::BuildBB(BB *bb, std::vector &bbIRMapProcessed) { - if (bb == nullptr) { - return; - } - BBId bbid = bb->GetBBId(); +void IRMap::BuildBB(BB &bb, std::vector &bbIRMapProcessed) { + BBId bbid = bb.GetBBId(); if (bbIRMapProcessed[bbid.idx]) { return; } bbIRMapProcessed[bbid.idx] = true; - curBB = bb; + curBB = &bb; SetCurFunction(bb); // iterate phi list to update the definition by phi BuildPhiMeNode(bb); - if (!bb->IsEmpty()) { - for (auto &stmt : bb->GetStmtNodes()) { - MeStmt *meStmt = BuildMeStmt(&stmt); - bb->AddMeStmtLast(meStmt); + if (!bb.IsEmpty()) { + for (auto &stmt : bb.GetStmtNodes()) { + MeStmt *meStmt = BuildMeStmt(stmt); + bb.AddMeStmtLast(meStmt); } } // travesal bb's dominated tree - ASSERT(bbid.idx < dom->GetDomChildrenSize(), " index out of range in IRMap::BuildBB"); - const MapleSet &domChildren = dom->GetDomChildren(bbid.idx); + ASSERT(bbid.idx < dom.GetDomChildrenSize(), " index out of range in IRMap::BuildBB"); + const MapleSet &domChildren = dom.GetDomChildren(bbid.idx); for (auto bbit = domChildren.begin(); bbit != domChildren.end(); bbit++) { BBId childbbid = *bbit; - BuildBB(GetBB(childbbid), bbIRMapProcessed); + BuildBB(*GetBB(childbbid), bbIRMapProcessed); } } -void IRMap::BuildPhiMeNode(BB *bb) { - for (auto phi : bb->GetPhiList()) { +void IRMap::BuildPhiMeNode(BB &bb) { + for (auto phi : bb.GetPhiList()) { OriginalSt *origst = phi.first; VersionSt *verSt = phi.second.GetResult(); if (origst->IsPregOst()) { MeRegPhiNode *phimenode = NewInPool(); - RegMeExpr *medef = GetOrCreateRegFromVerSt(verSt); - phimenode->UpdateLHS(medef); - phimenode->SetDefBB(bb); + RegMeExpr *medef = GetOrCreateRegFromVerSt(*verSt); + phimenode->UpdateLHS(*medef); + phimenode->SetDefBB(&bb); // build phi operands for (VersionSt *opnd : phi.second.GetPhiOpns()) { - phimenode->GetOpnds().push_back(GetOrCreateRegFromVerSt(opnd)); + phimenode->GetOpnds().push_back(GetOrCreateRegFromVerSt(*opnd)); } - bb->GetMeregphiList().insert(std::make_pair(medef->GetOstIdx(), phimenode)); + bb.GetMeregphiList().insert(std::make_pair(medef->GetOstIdx(), phimenode)); } else { MeVarPhiNode *phimenode = NewInPool(); - VarMeExpr *medef = GetOrCreateVarFromVerSt(verSt); - phimenode->UpdateLHS(medef); - phimenode->SetDefBB(bb); + VarMeExpr *medef = GetOrCreateVarFromVerSt(*verSt); + phimenode->UpdateLHS(*medef); + phimenode->SetDefBB(&bb); // build phi operands for (VersionSt *opnd : phi.second.GetPhiOpns()) { - phimenode->GetOpnds().push_back(GetOrCreateVarFromVerSt(opnd)); + phimenode->GetOpnds().push_back(GetOrCreateVarFromVerSt(*opnd)); } - bb->GetMevarPhiList().insert(std::make_pair(medef->GetOStIdx(), phimenode)); + bb.GetMevarPhiList().insert(std::make_pair(medef->GetOStIdx(), phimenode)); } } } -VarMeExpr *IRMap::CreateVarMeExprVersion(const VarMeExpr *origExpr) { - VarMeExpr *varmeexpr = New(&irMapAlloc, exprID++, origExpr->GetOStIdx(), verst2MeExprTable.size()); +VarMeExpr *IRMap::CreateVarMeExprVersion(const VarMeExpr &origExpr) { + VarMeExpr *varmeexpr = New(&irMapAlloc, exprID++, origExpr.GetOStIdx(), verst2MeExprTable.size()); verst2MeExprTable.push_back(varmeexpr); - varmeexpr->InitBase(origExpr->GetOp(), origExpr->GetPrimType(), origExpr->GetNumOpnds()); - varmeexpr->SetFieldID(origExpr->GetFieldID()); + varmeexpr->InitBase(origExpr.GetOp(), origExpr.GetPrimType(), origExpr.GetNumOpnds()); + varmeexpr->SetFieldID(origExpr.GetFieldID()); return varmeexpr; } -MeExpr *IRMap::CreateAddrofMeExpr(MeExpr *expr) { - if (expr->GetMeOp() == kMeOpVar) { - VarMeExpr *varmeexpr = static_cast(expr); - AddrofMeExpr addrofme(kInvalidExprID, varmeexpr->GetOStIdx()); +MeExpr *IRMap::CreateAddrofMeExpr(MeExpr &expr) { + if (expr.GetMeOp() == kMeOpVar) { + VarMeExpr &varmeexpr = static_cast(expr); + AddrofMeExpr addrofme(kInvalidExprID, varmeexpr.GetOStIdx()); addrofme.SetOp(OP_addrof); addrofme.SetPtyp(PTY_ptr); - return HashMeExpr(&addrofme); + return HashMeExpr(addrofme); } else { - ASSERT(expr->GetMeOp() == kMeOpIvar, "expecting IVarMeExpr"); - IvarMeExpr *ivarexpr = static_cast(expr); + ASSERT(expr.GetMeOp() == kMeOpIvar, "expecting IVarMeExpr"); + IvarMeExpr &ivarexpr = static_cast(expr); OpMeExpr opmeexpr(kInvalidExprID); - opmeexpr.SetFieldID(ivarexpr->GetFieldID()); - opmeexpr.SetTyIdx(ivarexpr->GetTyIdx()); - opmeexpr.SetOpnd(0, ivarexpr->GetBase()); + opmeexpr.SetFieldID(ivarexpr.GetFieldID()); + opmeexpr.SetTyIdx(ivarexpr.GetTyIdx()); + opmeexpr.SetOpnd(0, ivarexpr.GetBase()); opmeexpr.SetOp(OP_iaddrof); - opmeexpr.SetPtyp(PTY_ref); + opmeexpr.SetPtyp(PTY_ptr); opmeexpr.SetNumOpnds(1); - return HashMeExpr(&opmeexpr); + return HashMeExpr(opmeexpr); } } VarMeExpr *IRMap::CreateNewGlobalTmp(GStrIdx strIdx, PrimType ptyp) { MIRSymbol *st = - mirModule->GetMIRBuilder()->CreateSymbol((TyIdx)ptyp, strIdx, kStVar, kScGlobal, nullptr, kScopeGlobal); + mirModule.GetMIRBuilder()->CreateSymbol((TyIdx)ptyp, strIdx, kStVar, kScGlobal, nullptr, kScopeGlobal); st->SetIsTmp(true); - OriginalSt *oSt = ssaTab->CreateSymbolOriginalSt(st, 0, 0); + OriginalSt *oSt = ssaTab.CreateSymbolOriginalSt(st, 0, 0); VarMeExpr *varx = New(&irMapAlloc, exprID++, oSt->GetIndex(), oSt->GetZeroVersionIndex()); varx->InitBase(OP_dread, ptyp, 0); return varx; @@ -118,9 +115,9 @@ VarMeExpr *IRMap::CreateNewGlobalTmp(GStrIdx strIdx, PrimType ptyp) { VarMeExpr *IRMap::CreateNewLocalRefVarTmp(GStrIdx strIdx, TyIdx tIdx) { MIRSymbol *st = - mirModule->GetMIRBuilder()->CreateSymbol(tIdx, strIdx, kStVar, kScAuto, mirModule->CurFunction(), kScopeLocal); + mirModule.GetMIRBuilder()->CreateSymbol(tIdx, strIdx, kStVar, kScAuto, mirModule.CurFunction(), kScopeLocal); st->SetInstrumented(); - OriginalSt *oSt = ssaTab->CreateSymbolOriginalSt(st, mirModule->CurFunction()->GetPuidx(), 0); + OriginalSt *oSt = ssaTab.CreateSymbolOriginalSt(st, mirModule.CurFunction()->GetPuidx(), 0); oSt->SetZeroVersionIndex(verst2MeExprTable.size()); verst2MeExprTable.push_back(nullptr); oSt->GetVersionsIndex().push_back(oSt->GetZeroVersionIndex()); @@ -130,34 +127,34 @@ VarMeExpr *IRMap::CreateNewLocalRefVarTmp(GStrIdx strIdx, TyIdx tIdx) { return newlocalrefvar; } -RegMeExpr *IRMap::CreateRegMeExprVersion(const OriginalSt *pregOrgst) { +RegMeExpr *IRMap::CreateRegMeExprVersion(const OriginalSt &pregOrgst) { RegMeExpr *regreadexpr = - NewInPool(exprID++, pregOrgst->GetPregIdx(), pregOrgst->GetPuIdx(), pregOrgst->GetIndex(), 0); - regreadexpr->InitBase(OP_regread, pregOrgst->GetMIRPreg()->GetPrimType(), 0); + NewInPool(exprID++, pregOrgst.GetPregIdx(), pregOrgst.GetPuIdx(), pregOrgst.GetIndex(), 0); + regreadexpr->InitBase(OP_regread, pregOrgst.GetMIRPreg()->GetPrimType(), 0); regMeExprTable.push_back(regreadexpr); return regreadexpr; } -RegMeExpr *IRMap::CreateRegMeExprVersion(const RegMeExpr *origExpr) { +RegMeExpr *IRMap::CreateRegMeExprVersion(const RegMeExpr &origExpr) { RegMeExpr *regreadexpr = - NewInPool(exprID++, origExpr->GetRegIdx(), origExpr->GetPuIdx(), origExpr->GetOstIdx(), 0); - regreadexpr->InitBase(origExpr->GetOp(), origExpr->GetPrimType(), origExpr->GetNumOpnds()); + NewInPool(exprID++, origExpr.GetRegIdx(), origExpr.GetPuIdx(), origExpr.GetOstIdx(), 0); + regreadexpr->InitBase(origExpr.GetOp(), origExpr.GetPrimType(), origExpr.GetNumOpnds()); regMeExprTable.push_back(regreadexpr); return regreadexpr; } -RegMeExpr *IRMap::CreateRefRegMeExpr(MIRSymbol *mirSt) { - MIRFunction *mirfunc = mirModule->CurFunction(); - MIRType *sttype = mirSt->GetType(); +RegMeExpr *IRMap::CreateRefRegMeExpr(MIRSymbol &mirSt) { + MIRFunction *mirfunc = mirModule.CurFunction(); + MIRType *sttype = mirSt.GetType(); PrimType ptyp = sttype->GetPrimType(); - ASSERT(ptyp == PTY_ref || ptyp == PTY_ptr, "only PTY_ref or PTY_ptr"); + ASSERT(ptyp == PTY_ref, "only PTY_ref needed"); PregIdx regidx = mirfunc->GetPregTab()->CreateRefPreg(sttype); ASSERT(regidx <= 0xffff, "register oversized"); MIRPreg *preg = mirfunc->GetPregTab()->PregFromPregIdx(regidx); - if (!mirSt->IgnoreRC()) { + if (!mirSt.IgnoreRC()) { preg->SetNeedRC(); } - OriginalSt *oSt = ssaTab->GetOriginalStTable().CreatePregOriginalSt(regidx, mirfunc->GetPuidx()); + OriginalSt *oSt = ssaTab.GetOriginalStTable().CreatePregOriginalSt(regidx, mirfunc->GetPuidx()); RegMeExpr *regreadexpr = NewInPool(exprID++, regidx, mirfunc->GetPuidx(), oSt->GetIndex(), 0); regreadexpr->InitBase(OP_regread, ptyp, 0); regMeExprTable.push_back(regreadexpr); @@ -165,76 +162,76 @@ RegMeExpr *IRMap::CreateRefRegMeExpr(MIRSymbol *mirSt) { } RegMeExpr *IRMap::CreateRegMeExpr(PrimType ptyp) { - MIRFunction *mirfunc = mirModule->CurFunction(); + MIRFunction *mirfunc = mirModule.CurFunction(); PregIdx regidx = mirfunc->GetPregTab()->CreatePreg(ptyp); ASSERT(regidx <= 0xffff, "register oversized"); - OriginalSt *oSt = ssaTab->GetOriginalStTable().CreatePregOriginalSt(regidx, mirfunc->GetPuidx()); + OriginalSt *oSt = ssaTab.GetOriginalStTable().CreatePregOriginalSt(regidx, mirfunc->GetPuidx()); RegMeExpr *regreadexpr = NewInPool(exprID++, regidx, mirfunc->GetPuidx(), oSt->GetIndex(), 0); regreadexpr->InitBase(OP_regread, ptyp, 0); regMeExprTable.push_back(regreadexpr); return regreadexpr; } -RegMeExpr *IRMap::CreateRegRefMeExpr(MIRType *mirType) { - MIRFunction *mirfunc = mirModule->CurFunction(); - PregIdx regidx = mirfunc->GetPregTab()->CreateRefPreg(mirType); +RegMeExpr *IRMap::CreateRegRefMeExpr(MIRType &mirType) { + MIRFunction *mirfunc = mirModule.CurFunction(); + PregIdx regidx = mirfunc->GetPregTab()->CreateRefPreg(&mirType); ASSERT(regidx <= 0xffff, "register oversized"); - OriginalSt *oSt = ssaTab->GetOriginalStTable().CreatePregOriginalSt(regidx, mirfunc->GetPuidx()); + OriginalSt *oSt = ssaTab.GetOriginalStTable().CreatePregOriginalSt(regidx, mirfunc->GetPuidx()); RegMeExpr *regreadexpr = NewInPool(exprID++, regidx, mirfunc->GetPuidx(), oSt->GetIndex(), 0); - regreadexpr->InitBase(OP_regread, mirType->GetPrimType(), 0); + regreadexpr->InitBase(OP_regread, mirType.GetPrimType(), 0); regMeExprTable.push_back(regreadexpr); return regreadexpr; } -RegMeExpr *IRMap::CreateRegRefMeExpr(MeExpr *meExpr) { +RegMeExpr *IRMap::CreateRegRefMeExpr(MeExpr &meExpr) { MIRType *mirType = nullptr; - switch (meExpr->GetMeOp()) { + switch (meExpr.GetMeOp()) { case kMeOpVar: { - VarMeExpr *varmeexpr = static_cast(meExpr); - OriginalSt *oSt = ssaTab->GetOriginalStFromID(varmeexpr->GetOStIdx()); + VarMeExpr &varmeexpr = static_cast(meExpr); + const OriginalSt *oSt = ssaTab.GetOriginalStFromID(varmeexpr.GetOStIdx()); ASSERT(oSt->GetTyIdx() != 0, "expect oSt->tyIdx to be initialized"); mirType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(oSt->GetTyIdx()); break; } case kMeOpIvar: { - IvarMeExpr *ivarmeexpr = static_cast(meExpr); - MIRType *ptrmirtype = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ivarmeexpr->GetTyIdx()); + IvarMeExpr &ivarmeexpr = static_cast(meExpr); + MIRType *ptrmirtype = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ivarmeexpr.GetTyIdx()); ASSERT(ptrmirtype->GetKind() == kTypePointer, "must be point type for ivar"); MIRPtrType *realmirtype = static_cast(ptrmirtype); - FieldID fieldID = ivarmeexpr->GetFieldID(); + FieldID fieldID = ivarmeexpr.GetFieldID(); if (fieldID > 0) { mirType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(realmirtype->GetPointedTyIdxWithFieldID(fieldID)); } else { mirType = realmirtype->GetPointedType(); } - ASSERT(mirType->GetPrimType() == meExpr->GetPrimType() || - !(IsAddress(mirType->GetPrimType()) && IsAddress(meExpr->GetPrimType())), + ASSERT(mirType->GetPrimType() == meExpr.GetPrimType() || + !(IsAddress(mirType->GetPrimType()) && IsAddress(meExpr.GetPrimType())), "inconsistent type"); ASSERT(mirType->GetPrimType() == PTY_ref, "CreateRegRefMeExpr: only ref type expected"); break; } case kMeOpOp: - if (meExpr->GetOp() == OP_retype) { - OpMeExpr *opmeexpr = static_cast(meExpr); - ASSERT(opmeexpr->GetTyIdx() != 0, "expect opmeexpr->tyIdx to be initialized"); - mirType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(opmeexpr->GetTyIdx()); + if (meExpr.GetOp() == OP_retype) { + OpMeExpr &opmeexpr = static_cast(meExpr); + ASSERT(opmeexpr.GetTyIdx() != 0, "expect opmeexpr.tyIdx to be initialized"); + mirType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(opmeexpr.GetTyIdx()); break; } // fall thru default: return CreateRegMeExpr(PTY_ptr); } - return CreateRegRefMeExpr(mirType); + return CreateRegRefMeExpr(*mirType); } -VarMeExpr *IRMap::GetOrCreateVarFromVerSt(const VersionSt *verSt) { - size_t vindex = verSt->GetIndex(); +VarMeExpr *IRMap::GetOrCreateVarFromVerSt(const VersionSt &verSt) { + size_t vindex = verSt.GetIndex(); ASSERT(vindex < verst2MeExprTable.size(), "GetOrCreateVarFromVerSt: index %d is out of range", vindex); MeExpr *meExpr = verst2MeExprTable.at(vindex); if (meExpr != nullptr) { return static_cast(meExpr); } - OriginalSt *oSt = verSt->GetOrigSt(); + OriginalSt *oSt = verSt.GetOrigSt(); ASSERT(oSt->IsSymbolOst(), "GetOrCreateVarFromVerSt: wrong ost_type"); VarMeExpr *varx = New(&irMapAlloc, exprID++, oSt->GetIndex(), vindex); ASSERT(!GlobalTables::GetTypeTable().GetTypeTable().empty(), "container check"); @@ -244,106 +241,106 @@ VarMeExpr *IRMap::GetOrCreateVarFromVerSt(const VersionSt *verSt) { return varx; } -VarMeExpr *IRMap::GetOrCreateZeroVersionVarMeExpr(OriginalSt *oSt) { - ASSERT(oSt->GetZeroVersionIndex() < verst2MeExprTable.size(), +VarMeExpr *IRMap::GetOrCreateZeroVersionVarMeExpr(const OriginalSt &oSt) { + ASSERT(oSt.GetZeroVersionIndex() < verst2MeExprTable.size(), "GetOrCreateZeroVersionVarMeExpr: version index of osym's kInitVersion out of range"); - if (oSt->GetZeroVersionIndex() == 0) { - oSt->SetZeroVersionIndex(verst2MeExprTable.size()); + if (oSt.GetZeroVersionIndex() == 0) { + ssaTab.SetZeroVersionIndex(oSt.GetIndex(), verst2MeExprTable.size()); verst2MeExprTable.push_back(nullptr); } - if (verst2MeExprTable[oSt->GetZeroVersionIndex()] == nullptr) { - VarMeExpr *varmeexpr = New(&irMapAlloc, exprID++, oSt->GetIndex(), oSt->GetZeroVersionIndex()); - varmeexpr->SetFieldID(oSt->GetFieldID()); + if (verst2MeExprTable[oSt.GetZeroVersionIndex()] == nullptr) { + VarMeExpr *varmeexpr = New(&irMapAlloc, exprID++, oSt.GetIndex(), oSt.GetZeroVersionIndex()); + varmeexpr->SetFieldID(oSt.GetFieldID()); varmeexpr->SetOp(OP_dread); ASSERT(!GlobalTables::GetTypeTable().GetTypeTable().empty(), "container check"); - varmeexpr->SetPtyp(GlobalTables::GetTypeTable().GetTypeFromTyIdx(oSt->GetTyIdx())->GetPrimType()); + varmeexpr->SetPtyp(GlobalTables::GetTypeTable().GetTypeFromTyIdx(oSt.GetTyIdx())->GetPrimType()); varmeexpr->SetNumOpnds(0); - verst2MeExprTable[oSt->GetZeroVersionIndex()] = varmeexpr; + verst2MeExprTable[oSt.GetZeroVersionIndex()] = varmeexpr; return varmeexpr; } - return static_cast(verst2MeExprTable[oSt->GetZeroVersionIndex()]); + return static_cast(verst2MeExprTable[oSt.GetZeroVersionIndex()]); } -RegMeExpr *IRMap::GetOrCreateRegFromVerSt(const VersionSt *verSt) { - size_t vindex = verSt->GetIndex(); +RegMeExpr *IRMap::GetOrCreateRegFromVerSt(const VersionSt &verSt) { + size_t vindex = verSt.GetIndex(); ASSERT(vindex < verst2MeExprTable.size(), " GetOrCreateRegFromVerSt: index %d is out of range", vindex); MeExpr *meExpr = verst2MeExprTable[vindex]; if (meExpr != nullptr) { return static_cast(meExpr); } - OriginalSt *oSt = verSt->GetOrigSt(); + OriginalSt *oSt = verSt.GetOrigSt(); ASSERT(oSt->IsPregOst(), "GetOrCreateRegFromVerSt: PregOST expected"); RegMeExpr *regx = - NewInPool(exprID++, oSt->GetPregIdx(), mirModule->CurFunction()->GetPuidx(), oSt->GetIndex(), vindex); + NewInPool(exprID++, oSt->GetPregIdx(), mirModule.CurFunction()->GetPuidx(), oSt->GetIndex(), vindex); regx->InitBase(OP_regread, oSt->GetMIRPreg()->GetPrimType(), 0); regMeExprTable.push_back(regx); verst2MeExprTable[vindex] = regx; return regx; } -MeExpr *IRMap::BuildLHSVar(const VersionSt *verSt, DassignMeStmt *defMeStmt, DassignNode *dassign) { +MeExpr *IRMap::BuildLHSVar(const VersionSt &verSt, DassignMeStmt &defMeStmt, DassignNode &dassign) { VarMeExpr *medef = GetOrCreateVarFromVerSt(verSt); - medef->SetDefStmt(defMeStmt); + medef->SetDefStmt(&defMeStmt); medef->SetDefBy(kDefByStmt); - verst2MeExprTable.at(verSt->GetIndex()) = medef; + verst2MeExprTable.at(verSt.GetIndex()) = medef; return medef; } -MeExpr *IRMap::BuildLHSReg(const VersionSt *verSt, RegassignMeStmt *defMeStmt, const RegassignNode *regassign) { +MeExpr *IRMap::BuildLHSReg(const VersionSt &verSt, RegassignMeStmt &defMeStmt, const RegassignNode ®assign) { RegMeExpr *medef = GetOrCreateRegFromVerSt(verSt); - medef->SetPtyp(regassign->GetPrimType()); - medef->SetDefStmt(defMeStmt); + medef->SetPtyp(regassign.GetPrimType()); + medef->SetDefStmt(&defMeStmt); medef->SetDefBy(kDefByStmt); - verst2MeExprTable.at(verSt->GetIndex()) = medef; + verst2MeExprTable.at(verSt.GetIndex()) = medef; return medef; } -IvarMeExpr *IRMap::BuildLHSIvar(MeExpr *baseAddr, IassignMeStmt *iassignMeStmt, FieldID fieldID) { +IvarMeExpr *IRMap::BuildLHSIvar(MeExpr &baseAddr, IassignMeStmt &iassignMeStmt, FieldID fieldID) { IvarMeExpr *medef = New(exprID++); medef->SetFieldID(fieldID); - medef->SetTyIdx(iassignMeStmt->GetTyIdx()); - medef->SetBase(baseAddr); - medef->SetDefStmt(iassignMeStmt); + medef->SetTyIdx(iassignMeStmt.GetTyIdx()); + medef->SetBase(&baseAddr); + medef->SetDefStmt(&iassignMeStmt); medef->SetOp(OP_iread); - medef->SetPtyp(iassignMeStmt->GetRHS()->GetPrimType()); - PutToBucket(medef->GetHashIndex() % mapHashLength, medef); + medef->SetPtyp(iassignMeStmt.GetRHS()->GetPrimType()); + PutToBucket(medef->GetHashIndex() % mapHashLength, *medef); return medef; } -IvarMeExpr *IRMap::BuildLHSIvarFromIassMeStmt(IassignMeStmt *iassignMeStmt) { - return BuildLHSIvar(iassignMeStmt->GetLHSVal()->GetBase(), iassignMeStmt, iassignMeStmt->GetLHSVal()->GetFieldID()); +IvarMeExpr *IRMap::BuildLHSIvarFromIassMeStmt(IassignMeStmt &iassignMeStmt) { + return BuildLHSIvar(*iassignMeStmt.GetLHSVal()->GetBase(), iassignMeStmt, iassignMeStmt.GetLHSVal()->GetFieldID()); } // build Me chilist from MayDefNode list -void IRMap::BuildChiList(MeStmt *meStmt, MapleMap &mayDefNodes, +void IRMap::BuildChiList(MeStmt &meStmt, MapleMap &mayDefNodes, MapleMap &outList) { for (auto it = mayDefNodes.begin(); it != mayDefNodes.end(); it++) { MayDefNode &maydefnode = it->second; VersionSt *opndst = maydefnode.GetOpnd(); VersionSt *resst = maydefnode.GetResult(); - ChiMeNode *chimestmt = New(meStmt); - chimestmt->SetRHS(GetOrCreateVarFromVerSt(opndst)); - VarMeExpr *lhs = GetOrCreateVarFromVerSt(resst); + ChiMeNode *chimestmt = New(&meStmt); + chimestmt->SetRHS(GetOrCreateVarFromVerSt(*opndst)); + VarMeExpr *lhs = GetOrCreateVarFromVerSt(*resst); lhs->SetDefBy(kDefByChi); - lhs->SetDefChi(chimestmt); + lhs->SetDefChi(*chimestmt); chimestmt->SetLHS(lhs); outList.insert(std::make_pair(lhs->GetOStIdx(), chimestmt)); } } -void IRMap::BuildMustDefList(MeStmt *meStmt, MapleVector &mustdeflist, +void IRMap::BuildMustDefList(MeStmt &meStmt, MapleVector &mustdeflist, MapleVector &mustdefList) { for (auto it = mustdeflist.begin(); it != mustdeflist.end(); it++) { MustDefNode &mustdefnode = *it; VersionSt *verSt = mustdefnode.GetResult(); - VarMeExpr *lhs = GetOrCreateVarFromVerSt(verSt); + VarMeExpr *lhs = GetOrCreateVarFromVerSt(*verSt); ASSERT(lhs->GetMeOp() == kMeOpReg || lhs->GetMeOp() == kMeOpVar, "unexpected opcode"); - mustdefList.push_back(MustDefMeNode(lhs, meStmt)); + mustdefList.push_back(MustDefMeNode(lhs, &meStmt)); } } -MeStmt *IRMap::BuildMeStmtWithNoSSAPart(StmtNode *stmt) { - Opcode op = stmt->GetOpCode(); +MeStmt *IRMap::BuildMeStmtWithNoSSAPart(StmtNode &stmt) { + Opcode op = stmt.GetOpCode(); switch (op) { case OP_jscatch: case OP_finally: @@ -353,27 +350,27 @@ MeStmt *IRMap::BuildMeStmtWithNoSSAPart(StmtNode *stmt) { case OP_membarrelease: case OP_membarstorestore: case OP_membarstoreload: - return New(stmt); + return New(&stmt); case OP_goto: - return New(stmt); + return New(&stmt); case OP_comment: - return NewInPool(stmt); + return NewInPool(&stmt); case OP_jstry: - return New(stmt); + return New(&stmt); case OP_catch: - return NewInPool(stmt); + return NewInPool(&stmt); case OP_brfalse: case OP_brtrue: { - CondGotoNode *condGotoNode = static_cast(stmt); - CondGotoMeStmt *condGotoMeStmt = New(stmt); - condGotoMeStmt->SetOpnd(0, BuildExpr(condGotoNode->Opnd(0))); + CondGotoNode &condGotoNode = static_cast(stmt); + CondGotoMeStmt *condGotoMeStmt = New(&stmt); + condGotoMeStmt->SetOpnd(0, BuildExpr(*condGotoNode.Opnd(0))); return condGotoMeStmt; } case OP_try: { - TryNode *tryNode = static_cast(stmt); - TryMeStmt *tryMeStmt = NewInPool(stmt); - for (size_t i = 0; i < tryNode->GetOffsetsCount(); i++) { - tryMeStmt->OffsetsPushBack(tryNode->GetOffset(i)); + TryNode &tryNode = static_cast(stmt); + TryMeStmt *tryMeStmt = NewInPool(&stmt); + for (size_t i = 0; i < tryNode.GetOffsetsCount(); i++) { + tryMeStmt->OffsetsPushBack(tryNode.GetOffset(i)); } return tryMeStmt; } @@ -381,10 +378,10 @@ MeStmt *IRMap::BuildMeStmtWithNoSSAPart(StmtNode *stmt) { case OP_eval: case OP_free: case OP_switch: { - UnaryStmtNode *unaryStmt = static_cast(stmt); + UnaryStmtNode &unaryStmt = static_cast(stmt); UnaryMeStmt *unMeStmt = - static_cast((op == OP_switch) ? NewInPool(stmt) : New(stmt)); - unMeStmt->SetOpnd(0, BuildExpr(unaryStmt->Opnd(0))); + static_cast((op == OP_switch) ? NewInPool(&stmt) : New(&stmt)); + unMeStmt->SetOpnd(0, BuildExpr(*unaryStmt.Opnd(0))); return unMeStmt; } default: @@ -392,46 +389,46 @@ MeStmt *IRMap::BuildMeStmtWithNoSSAPart(StmtNode *stmt) { } } -MeStmt *IRMap::BuildMeStmt(StmtNode *stmt) { - AccessSSANodes *ssaPart = ssaTab->GetStmtsSSAPart().SSAPartOf(stmt); +MeStmt *IRMap::BuildMeStmt(StmtNode &stmt) { + AccessSSANodes *ssaPart = ssaTab.GetStmtsSSAPart().SSAPartOf(&stmt); if (ssaPart == nullptr) { return BuildMeStmtWithNoSSAPart(stmt); } - Opcode op = stmt->GetOpCode(); + Opcode op = stmt.GetOpCode(); switch (op) { case OP_dassign: { - DassignMeStmt *meStmt = NewInPool(stmt); - DassignNode *dassiNode = static_cast(stmt); - meStmt->SetRHS(BuildExpr(dassiNode->GetRHS())); - VarMeExpr *varlhs = static_cast(BuildLHSVar(ssaPart->GetSSAVar(), meStmt, dassiNode)); + DassignMeStmt *meStmt = NewInPool(&stmt); + DassignNode &dassiNode = static_cast(stmt); + meStmt->SetRHS(BuildExpr(*dassiNode.GetRHS())); + VarMeExpr *varlhs = static_cast(BuildLHSVar(*ssaPart->GetSSAVar(), *meStmt, dassiNode)); meStmt->SetLHS(varlhs); - BuildChiList(meStmt, ssaPart->GetMayDefNodes(), *(meStmt->GetChiList())); + BuildChiList(*meStmt, ssaPart->GetMayDefNodes(), *meStmt->GetChiList()); return meStmt; } case OP_regassign: { - RegassignMeStmt *meStmt = New(stmt); - RegassignNode *regNode = static_cast(stmt); - meStmt->SetRHS(BuildExpr(regNode->Opnd(0))); - RegMeExpr *regLHS = static_cast(BuildLHSReg(ssaPart->GetSSAVar(), meStmt, regNode)); + RegassignMeStmt *meStmt = New(&stmt); + RegassignNode ®Node = static_cast(stmt); + meStmt->SetRHS(BuildExpr(*regNode.Opnd(0))); + RegMeExpr *regLHS = static_cast(BuildLHSReg(*ssaPart->GetSSAVar(), *meStmt, regNode)); meStmt->SetLHS(regLHS); return meStmt; } case OP_iassign: { - IassignNode *iasNode = static_cast(stmt); - IassignMeStmt *meStmt = NewInPool(stmt); - meStmt->SetTyIdx(iasNode->GetTyIdx()); - meStmt->SetRHS(BuildExpr(iasNode->GetRHS())); - meStmt->SetLHSVal(BuildLHSIvar(BuildExpr(iasNode->Opnd(0)), meStmt, iasNode->GetFieldID())); - BuildChiList(meStmt, ssaPart->GetMayDefNodes(), *(meStmt->GetChiList())); + IassignNode &iasNode = static_cast(stmt); + IassignMeStmt *meStmt = NewInPool(&stmt); + meStmt->SetTyIdx(iasNode.GetTyIdx()); + meStmt->SetRHS(BuildExpr(*iasNode.GetRHS())); + meStmt->SetLHSVal(BuildLHSIvar(*BuildExpr(*iasNode.Opnd(0)), *meStmt, iasNode.GetFieldID())); + BuildChiList(*meStmt, ssaPart->GetMayDefNodes(), *(meStmt->GetChiList())); return meStmt; } case OP_maydassign: { - MaydassignMeStmt *meStmt = NewInPool(stmt); - DassignNode *dassiNode = static_cast(stmt); - meStmt->SetRHS(BuildExpr(dassiNode->GetRHS())); + MaydassignMeStmt *meStmt = NewInPool(&stmt); + DassignNode &dassiNode = static_cast(stmt); + meStmt->SetRHS(BuildExpr(*dassiNode.GetRHS())); meStmt->SetMayDassignSym(ssaPart->GetSSAVar()->GetOrigSt()); - meStmt->SetFieldID(dassiNode->GetFieldID()); - BuildChiList(meStmt, ssaPart->GetMayDefNodes(), *(meStmt->GetChiList())); + meStmt->SetFieldID(dassiNode.GetFieldID()); + BuildChiList(*meStmt, ssaPart->GetMayDefNodes(), *(meStmt->GetChiList())); return meStmt; } case OP_call: @@ -450,17 +447,17 @@ MeStmt *IRMap::BuildMeStmt(StmtNode *stmt) { case OP_interfaceicallassigned: case OP_customcallassigned: case OP_polymorphiccallassigned: { - CallMeStmt *callMeStmt = NewInPool(stmt); - CallNode *intrinNode = static_cast(stmt); - callMeStmt->SetPUIdx(intrinNode->GetPUIdx()); - for (size_t i = 0; i < intrinNode->NumOpnds(); i++) { - callMeStmt->GetOpnds().push_back(BuildExpr(intrinNode->Opnd(i))); + CallMeStmt *callMeStmt = NewInPool(&stmt); + CallNode &intrinNode = static_cast(stmt); + callMeStmt->SetPUIdx(intrinNode.GetPUIdx()); + for (size_t i = 0; i < intrinNode.NumOpnds(); i++) { + callMeStmt->GetOpnds().push_back(BuildExpr(*intrinNode.Opnd(i))); } BuildMuList(ssaPart->GetMayUseNodes(), *(callMeStmt->GetMuList())); if (kOpcodeInfo.IsCallAssigned(op)) { - BuildMustDefList(callMeStmt, ssaPart->GetMustDefNodes(), *(callMeStmt->GetMustDefList())); + BuildMustDefList(*callMeStmt, ssaPart->GetMustDefNodes(), *(callMeStmt->GetMustDefList())); } - BuildChiList(callMeStmt, ssaPart->GetMayDefNodes(), *(callMeStmt->GetChiList())); + BuildChiList(*callMeStmt, ssaPart->GetMayDefNodes(), *(callMeStmt->GetChiList())); return callMeStmt; } case OP_icall: @@ -471,54 +468,54 @@ MeStmt *IRMap::BuildMeStmt(StmtNode *stmt) { case OP_intrinsiccallassigned: case OP_intrinsiccallwithtypeassigned: { NaryMeStmt *naryMeStmt = (op == OP_icall || op == OP_icallassigned) - ? static_cast(NewInPool(stmt)) - : static_cast(NewInPool(stmt)); - NaryStmtNode *naryStmtNode = static_cast(stmt); - for (size_t i = 0; i < naryStmtNode->NumOpnds(); i++) { - naryMeStmt->GetOpnds().push_back(BuildExpr(naryStmtNode->Opnd(i))); + ? static_cast(NewInPool(&stmt)) + : static_cast(NewInPool(&stmt)); + NaryStmtNode &naryStmtNode = static_cast(stmt); + for (size_t i = 0; i < naryStmtNode.NumOpnds(); i++) { + naryMeStmt->GetOpnds().push_back(BuildExpr(*naryStmtNode.Opnd(i))); } BuildMuList(ssaPart->GetMayUseNodes(), *(naryMeStmt->GetMuList())); if (kOpcodeInfo.IsCallAssigned(op)) { - BuildMustDefList(naryMeStmt, ssaPart->GetMustDefNodes(), *(naryMeStmt->GetMustDefList())); + BuildMustDefList(*naryMeStmt, ssaPart->GetMustDefNodes(), *(naryMeStmt->GetMustDefList())); } - BuildChiList(naryMeStmt, ssaPart->GetMayDefNodes(), *(naryMeStmt->GetChiList())); + BuildChiList(*naryMeStmt, ssaPart->GetMayDefNodes(), *(naryMeStmt->GetChiList())); return naryMeStmt; } case OP_return: { - NaryStmtNode *retStmt = static_cast(stmt); - RetMeStmt *meStmt = NewInPool(stmt); - for (size_t i = 0; i < retStmt->NumOpnds(); i++) { - meStmt->GetOpnds().push_back(BuildExpr(retStmt->Opnd(i))); + NaryStmtNode &retStmt = static_cast(stmt); + RetMeStmt *meStmt = NewInPool(&stmt); + for (size_t i = 0; i < retStmt.NumOpnds(); i++) { + meStmt->GetOpnds().push_back(BuildExpr(*retStmt.Opnd(i))); } BuildMuList(ssaPart->GetMayUseNodes(), *(meStmt->GetMuList())); return meStmt; } case OP_retsub: { - WithMuMeStmt *retSub = NewInPool(stmt); + WithMuMeStmt *retSub = NewInPool(&stmt); BuildMuList(ssaPart->GetMayUseNodes(), *(retSub->GetMuList())); return retSub; } case OP_gosub: { - GosubMeStmt *goSub = NewInPool(stmt); + GosubMeStmt *goSub = NewInPool(&stmt); BuildMuList(ssaPart->GetMayUseNodes(), *(goSub->GetMuList())); return goSub; } case OP_throw: { - UnaryStmtNode *unaryNode = static_cast(stmt); - ThrowMeStmt *tmeStmt = NewInPool(stmt); - tmeStmt->SetMeStmtOpndValue(BuildExpr(unaryNode->Opnd(0))); + UnaryStmtNode &unaryNode = static_cast(stmt); + ThrowMeStmt *tmeStmt = NewInPool(&stmt); + tmeStmt->SetMeStmtOpndValue(BuildExpr(*unaryNode.Opnd(0))); BuildMuList(ssaPart->GetMayUseNodes(), *(tmeStmt->GetMuList())); return tmeStmt; } case OP_syncenter: case OP_syncexit: { - NaryStmtNode *naryNode = static_cast(stmt); - SyncMeStmt *naryStmt = NewInPool(stmt); - for (size_t i = 0; i < naryNode->NumOpnds(); i++) { - naryStmt->GetOpnds().push_back(BuildExpr(naryNode->Opnd(i))); + NaryStmtNode &naryNode = static_cast(stmt); + SyncMeStmt *naryStmt = NewInPool(&stmt); + for (size_t i = 0; i < naryNode.NumOpnds(); i++) { + naryStmt->GetOpnds().push_back(BuildExpr(*naryNode.Opnd(i))); } BuildMuList(ssaPart->GetMayUseNodes(), *(naryStmt->GetMuList())); - BuildChiList(naryStmt, ssaPart->GetMayDefNodes(), *(naryStmt->GetChiList())); + BuildChiList(*naryStmt, ssaPart->GetMayDefNodes(), *(naryStmt->GetChiList())); return naryStmt; } default: { @@ -532,113 +529,113 @@ void IRMap::BuildMuList(MapleMap &mayuselist, MapleMap mapitem : mayuselist) { MayUseNode &mayusenode = mapitem.second; VersionSt *verSt = mayusenode.GetOpnd(); - VarMeExpr *varmeexpr = GetOrCreateVarFromVerSt(verSt); + VarMeExpr *varmeexpr = GetOrCreateVarFromVerSt(*verSt); mulist.insert(std::make_pair(varmeexpr->GetOStIdx(), varmeexpr)); } } -MeExpr *IRMap::BuildExpr(BaseNode *mirnode) { +MeExpr *IRMap::BuildExpr(BaseNode &mirNode) { MeExpr *retmeexpr = nullptr; - Opcode op = mirnode->GetOpCode(); + Opcode op = mirNode.GetOpCode(); switch (op) { case OP_addrof: { - AddrofSSANode *addrofnode = static_cast(mirnode); - VersionSt *verSt = addrofnode->GetSSAVar(); + AddrofSSANode &addrofnode = static_cast(mirNode); + VersionSt *verSt = addrofnode.GetSSAVar(); OriginalSt *oSt = verSt->GetOrigSt(); AddrofMeExpr addrofme(kInvalidExprID, oSt->GetIndex()); - addrofme.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - addrofme.SetFieldID(addrofnode->GetFieldID()); - retmeexpr = HashMeExpr(&addrofme); + addrofme.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + addrofme.SetFieldID(addrofnode.GetFieldID()); + retmeexpr = HashMeExpr(addrofme); break; } case OP_dread: { - AddrofSSANode *addrofnode = static_cast(mirnode); - VersionSt *verSt = addrofnode->GetSSAVar(); - VarMeExpr *varmeexpr = GetOrCreateVarFromVerSt(verSt); - varmeexpr->InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); + AddrofSSANode &addrofnode = static_cast(mirNode); + VersionSt *verSt = addrofnode.GetSSAVar(); + VarMeExpr *varmeexpr = GetOrCreateVarFromVerSt(*verSt); + varmeexpr->InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); if (verSt->GetOrigSt()->IsRealSymbol()) { ASSERT(!verSt->GetOrigSt()->IsPregOst(), "not expect preg symbol here"); varmeexpr->SetPtyp( GlobalTables::GetTypeTable().GetTypeFromTyIdx(verSt->GetOrigSt()->GetTyIdx())->GetPrimType()); - varmeexpr->SetFieldID(addrofnode->GetFieldID()); + varmeexpr->SetFieldID(addrofnode.GetFieldID()); } retmeexpr = varmeexpr; break; } case OP_regread: { - RegreadSSANode *regnode = static_cast(mirnode); - VersionSt *verSt = regnode->GetSSAVar(); - RegMeExpr *regmeexpr = GetOrCreateRegFromVerSt(verSt); - regmeexpr->InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); + RegreadSSANode ®node = static_cast(mirNode); + VersionSt *verSt = regnode.GetSSAVar(); + RegMeExpr *regmeexpr = GetOrCreateRegFromVerSt(*verSt); + regmeexpr->InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); retmeexpr = regmeexpr; break; } case OP_addroffunc: { - AddroffuncNode *addfuncnode = static_cast(mirnode); - PUIdx puidx = addfuncnode->GetPUIdx(); + AddroffuncNode &addfuncnode = static_cast(mirNode); + PUIdx puidx = addfuncnode.GetPUIdx(); AddroffuncMeExpr addrfuncme(kInvalidExprID, puidx); - addrfuncme.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - retmeexpr = HashMeExpr(&addrfuncme); + addrfuncme.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + retmeexpr = HashMeExpr(addrfuncme); break; } case OP_gcmalloc: case OP_gcpermalloc: { - GCMallocNode *gcmallocnode = static_cast(mirnode); - TyIdx tyidx = gcmallocnode->GetTyIdx(); + GCMallocNode &gcmallocnode = static_cast(mirNode); + TyIdx tyidx = gcmallocnode.GetTyIdx(); GcmallocMeExpr gcmallocme(kInvalidExprID, tyidx); - gcmallocme.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - retmeexpr = HashMeExpr(&gcmallocme); + gcmallocme.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + retmeexpr = HashMeExpr(gcmallocme); break; } case OP_sizeoftype: { - SizeoftypeNode *sizeoftypenode = static_cast(mirnode); - SizeoftypeMeExpr sizemeexpr(kInvalidExprID, sizeoftypenode->GetTyIdx()); - sizemeexpr.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - retmeexpr = HashMeExpr(&sizemeexpr); + SizeoftypeNode &sizeoftypenode = static_cast(mirNode); + SizeoftypeMeExpr sizemeexpr(kInvalidExprID, sizeoftypenode.GetTyIdx()); + sizemeexpr.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + retmeexpr = HashMeExpr(sizemeexpr); break; } case OP_fieldsdist: { - FieldsDistNode *fieldsDistNode = static_cast(mirnode); - FieldsDistMeExpr fieldsDistExpr(kInvalidExprID, fieldsDistNode->GetTyIdx(), fieldsDistNode->GetFiledID1(), - fieldsDistNode->GetFiledID2()); - fieldsDistExpr.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - retmeexpr = HashMeExpr(&fieldsDistExpr); + FieldsDistNode &fieldsDistNode = static_cast(mirNode); + FieldsDistMeExpr fieldsDistExpr(kInvalidExprID, fieldsDistNode.GetTyIdx(), fieldsDistNode.GetFiledID1(), + fieldsDistNode.GetFiledID2()); + fieldsDistExpr.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + retmeexpr = HashMeExpr(fieldsDistExpr); break; } case OP_iread: { - IreadSSANode *ireadnode = static_cast(mirnode); + IreadSSANode &ireadnode = static_cast(mirNode); IvarMeExpr ivarmeexpr(kInvalidExprID); - ivarmeexpr.SetFieldID(ireadnode->GetFieldID()); - ivarmeexpr.SetTyIdx(ireadnode->GetTyIdx()); - ivarmeexpr.SetBase(BuildExpr(ireadnode->Opnd(0))); - ivarmeexpr.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - VersionSt *verSt = ireadnode->GetMayUse().GetOpnd(); + ivarmeexpr.SetFieldID(ireadnode.GetFieldID()); + ivarmeexpr.SetTyIdx(ireadnode.GetTyIdx()); + ivarmeexpr.SetBase(BuildExpr(*ireadnode.Opnd(0))); + ivarmeexpr.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + VersionSt *verSt = ireadnode.GetMayUse().GetOpnd(); if (verSt != nullptr) { - VarMeExpr *varmeexpr = GetOrCreateVarFromVerSt(verSt); + VarMeExpr *varmeexpr = GetOrCreateVarFromVerSt(*verSt); ivarmeexpr.SetMuVal(varmeexpr); } - retmeexpr = HashMeExpr(&ivarmeexpr); + retmeexpr = HashMeExpr(ivarmeexpr); ASSERT(static_cast(retmeexpr)->GetMu() != nullptr, "BuildExpr: ivar node cannot have mu == nullptr"); break; } case OP_constval: { - ConstvalNode *constnode = static_cast(mirnode); - retmeexpr = CreateConstMeExpr(constnode->GetPrimType(), constnode->GetConstVal()); + ConstvalNode &constnode = static_cast(mirNode); + retmeexpr = CreateConstMeExpr(constnode.GetPrimType(), *constnode.GetConstVal()); break; } case OP_conststr: { - ConststrNode *constnode = static_cast(mirnode); - ConststrMeExpr conststrmeexpr(kInvalidExprID, constnode->GetStrIdx()); - conststrmeexpr.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - retmeexpr = HashMeExpr(&conststrmeexpr); + ConststrNode &constnode = static_cast(mirNode); + ConststrMeExpr conststrmeexpr(kInvalidExprID, constnode.GetStrIdx()); + conststrmeexpr.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + retmeexpr = HashMeExpr(conststrmeexpr); break; } case OP_conststr16: { - Conststr16Node *constnode = static_cast(mirnode); - Conststr16MeExpr conststrmeexpr(kInvalidExprID, constnode->GetStrIdx()); - conststrmeexpr.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - retmeexpr = HashMeExpr(&conststrmeexpr); + Conststr16Node &constnode = static_cast(mirNode); + Conststr16MeExpr conststrmeexpr(kInvalidExprID, constnode.GetStrIdx()); + conststrmeexpr.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + retmeexpr = HashMeExpr(conststrmeexpr); break; } case OP_eq: @@ -651,13 +648,13 @@ MeExpr *IRMap::BuildExpr(BaseNode *mirnode) { case OP_cmpl: case OP_cmp: { OpMeExpr opmeexpr(kInvalidExprID); - CompareNode *cmpnode = static_cast(mirnode); - opmeexpr.SetOpnd(0, BuildExpr(cmpnode->Opnd(0))); - opmeexpr.SetOpnd(1, BuildExpr(cmpnode->Opnd(1))); - opmeexpr.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - opmeexpr.SetOpndType(cmpnode->GetOpndType()); - retmeexpr = HashMeExpr(&opmeexpr); - static_cast(retmeexpr)->SetOpndType(cmpnode->GetOpndType()); + CompareNode &cmpnode = static_cast(mirNode); + opmeexpr.SetOpnd(0, BuildExpr(*cmpnode.Opnd(0))); + opmeexpr.SetOpnd(1, BuildExpr(*cmpnode.Opnd(1))); + opmeexpr.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + opmeexpr.SetOpndType(cmpnode.GetOpndType()); + retmeexpr = HashMeExpr(opmeexpr); + static_cast(retmeexpr)->SetOpndType(cmpnode.GetOpndType()); break; } case OP_ceil: @@ -665,21 +662,21 @@ MeExpr *IRMap::BuildExpr(BaseNode *mirnode) { case OP_floor: case OP_trunc: { OpMeExpr opmeexpr(kInvalidExprID); - TypeCvtNode *tycvtnode = static_cast(mirnode); - opmeexpr.SetOpnd(0, BuildExpr(tycvtnode->Opnd(0))); - opmeexpr.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - opmeexpr.SetOpndType(tycvtnode->FromType()); - retmeexpr = HashMeExpr(&opmeexpr); + TypeCvtNode &tycvtnode = static_cast(mirNode); + opmeexpr.SetOpnd(0, BuildExpr(*tycvtnode.Opnd(0))); + opmeexpr.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + opmeexpr.SetOpndType(tycvtnode.FromType()); + retmeexpr = HashMeExpr(opmeexpr); break; } case OP_retype: { OpMeExpr opmeexpr(kInvalidExprID); - RetypeNode *tycvtnode = static_cast(mirnode); - opmeexpr.SetOpnd(0, BuildExpr(tycvtnode->Opnd(0))); - opmeexpr.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - opmeexpr.SetOpndType(tycvtnode->FromType()); - opmeexpr.SetTyIdx(tycvtnode->GetTyIdx()); - retmeexpr = HashMeExpr(&opmeexpr); + RetypeNode &tycvtnode = static_cast(mirNode); + opmeexpr.SetOpnd(0, BuildExpr(*tycvtnode.Opnd(0))); + opmeexpr.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + opmeexpr.SetOpndType(tycvtnode.FromType()); + opmeexpr.SetTyIdx(tycvtnode.GetTyIdx()); + retmeexpr = HashMeExpr(opmeexpr); break; } case OP_abs: @@ -691,53 +688,53 @@ MeExpr *IRMap::BuildExpr(BaseNode *mirnode) { case OP_alloca: case OP_malloc: { OpMeExpr opmeexpr(kInvalidExprID); - UnaryNode *unnode = static_cast(mirnode); - opmeexpr.SetOpnd(0, BuildExpr(unnode->Opnd(0))); - opmeexpr.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - retmeexpr = HashMeExpr(&opmeexpr); + UnaryNode &unnode = static_cast(mirNode); + opmeexpr.SetOpnd(0, BuildExpr(*unnode.Opnd(0))); + opmeexpr.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + retmeexpr = HashMeExpr(opmeexpr); break; } case OP_iaddrof: { OpMeExpr opmeexpr(kInvalidExprID); - IreadNode *unnode = static_cast(mirnode); - opmeexpr.SetTyIdx(unnode->GetTyIdx()); - opmeexpr.SetFieldID(unnode->GetFieldID()); - opmeexpr.SetOpnd(0, BuildExpr(unnode->Opnd(0))); - opmeexpr.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - retmeexpr = HashMeExpr(&opmeexpr); + IreadNode &unnode = static_cast(mirNode); + opmeexpr.SetTyIdx(unnode.GetTyIdx()); + opmeexpr.SetFieldID(unnode.GetFieldID()); + opmeexpr.SetOpnd(0, BuildExpr(*unnode.Opnd(0))); + opmeexpr.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + retmeexpr = HashMeExpr(opmeexpr); break; } case OP_sext: case OP_zext: case OP_extractbits: { OpMeExpr opmeexpr(kInvalidExprID); - ExtractbitsNode *extnode = static_cast(mirnode); - opmeexpr.SetOpnd(0, BuildExpr(extnode->Opnd(0))); - opmeexpr.SetBitsOffSet(extnode->GetBitsOffset()); - opmeexpr.SetBitsSize(extnode->GetBitsSize()); - opmeexpr.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - retmeexpr = HashMeExpr(&opmeexpr); + ExtractbitsNode &extnode = static_cast(mirNode); + opmeexpr.SetOpnd(0, BuildExpr(*extnode.Opnd(0))); + opmeexpr.SetBitsOffSet(extnode.GetBitsOffset()); + opmeexpr.SetBitsSize(extnode.GetBitsSize()); + opmeexpr.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + retmeexpr = HashMeExpr(opmeexpr); break; } case OP_gcmallocjarray: case OP_gcpermallocjarray: { OpMeExpr opmeexpr(kInvalidExprID); - JarrayMallocNode *gcnode = static_cast(mirnode); - opmeexpr.SetOpnd(0, BuildExpr(gcnode->Opnd(0))); - opmeexpr.GetTyIdx() = gcnode->GetTyIdx(); - opmeexpr.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - retmeexpr = HashMeExpr(&opmeexpr); + JarrayMallocNode &gcnode = static_cast(mirNode); + opmeexpr.SetOpnd(0, BuildExpr(*gcnode.Opnd(0))); + opmeexpr.GetTyIdx() = gcnode.GetTyIdx(); + opmeexpr.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + retmeexpr = HashMeExpr(opmeexpr); break; } case OP_resolveinterfacefunc: case OP_resolvevirtualfunc: { OpMeExpr opmeexpr(kInvalidExprID); - ResolveFuncNode *rsnode = static_cast(mirnode); - opmeexpr.SetOpnd(0, BuildExpr(rsnode->Opnd(0))); - opmeexpr.SetOpnd(1, BuildExpr(rsnode->Opnd(1))); - opmeexpr.SetFieldID(rsnode->GetPuIdx()); - opmeexpr.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - retmeexpr = HashMeExpr(&opmeexpr); + ResolveFuncNode &rsnode = static_cast(mirNode); + opmeexpr.SetOpnd(0, BuildExpr(*rsnode.Opnd(0))); + opmeexpr.SetOpnd(1, BuildExpr(*rsnode.Opnd(1))); + opmeexpr.SetFieldID(rsnode.GetPuIdx()); + opmeexpr.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + retmeexpr = HashMeExpr(opmeexpr); break; } case OP_sub: @@ -756,53 +753,53 @@ MeExpr *IRMap::BuildExpr(BaseNode *mirnode) { case OP_lior: case OP_add: { OpMeExpr opmeexpr(kInvalidExprID); - BinaryNode *bnode = static_cast(mirnode); - opmeexpr.SetOpnd(0, BuildExpr(bnode->Opnd(0))); - opmeexpr.SetOpnd(1, BuildExpr(bnode->Opnd(1))); - opmeexpr.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - retmeexpr = HashMeExpr(&opmeexpr); + BinaryNode &bnode = static_cast(mirNode); + opmeexpr.SetOpnd(0, BuildExpr(*bnode.Opnd(0))); + opmeexpr.SetOpnd(1, BuildExpr(*bnode.Opnd(1))); + opmeexpr.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + retmeexpr = HashMeExpr(opmeexpr); break; } case OP_select: { OpMeExpr opmeexpr(kInvalidExprID); - TernaryNode *bnode = static_cast(mirnode); - opmeexpr.SetOpnd(0, BuildExpr(bnode->Opnd(0))); - opmeexpr.SetOpnd(1, BuildExpr(bnode->Opnd(1))); - opmeexpr.SetOpnd(2, BuildExpr(bnode->Opnd(2))); - opmeexpr.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - retmeexpr = HashMeExpr(&opmeexpr); + TernaryNode &bnode = static_cast(mirNode); + opmeexpr.SetOpnd(0, BuildExpr(*bnode.Opnd(0))); + opmeexpr.SetOpnd(1, BuildExpr(*bnode.Opnd(1))); + opmeexpr.SetOpnd(2, BuildExpr(*bnode.Opnd(2))); + opmeexpr.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + retmeexpr = HashMeExpr(opmeexpr); break; } case OP_array: { - ArrayNode *arrnode = static_cast(mirnode); - NaryMeExpr arrmeexpr(&tempAlloc, kInvalidExprID, arrnode->GetTyIdx(), INTRN_UNDEFINED, arrnode->GetBoundsCheck()); - for (size_t i = 0; i < arrnode->NumOpnds(); i++) { - arrmeexpr.GetOpnds().push_back(BuildExpr(arrnode->Opnd(i))); + ArrayNode &arrnode = static_cast(mirNode); + NaryMeExpr arrmeexpr(&tempAlloc, kInvalidExprID, arrnode.GetTyIdx(), INTRN_UNDEFINED, arrnode.GetBoundsCheck()); + for (size_t i = 0; i < arrnode.NumOpnds(); i++) { + arrmeexpr.GetOpnds().push_back(BuildExpr(*arrnode.Opnd(i))); } - arrmeexpr.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - retmeexpr = HashMeExpr(&arrmeexpr); + arrmeexpr.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + retmeexpr = HashMeExpr(arrmeexpr); break; } case OP_intrinsicop: { - IntrinsicopNode *intrinnode = static_cast(mirnode); - size_t numopnds = intrinnode->NumOpnds(); - NaryMeExpr narymeexpr(&tempAlloc, kInvalidExprID, TyIdx(0), intrinnode->GetIntrinsic(), false); + IntrinsicopNode &intrinnode = static_cast(mirNode); + size_t numopnds = intrinnode.NumOpnds(); + NaryMeExpr narymeexpr(&tempAlloc, kInvalidExprID, TyIdx(0), intrinnode.GetIntrinsic(), false); for (size_t i = 0; i < numopnds; i++) { - narymeexpr.GetOpnds().push_back(BuildExpr(intrinnode->Opnd(i))); + narymeexpr.GetOpnds().push_back(BuildExpr(*intrinnode.Opnd(i))); } - narymeexpr.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - retmeexpr = HashMeExpr(&narymeexpr); + narymeexpr.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + retmeexpr = HashMeExpr(narymeexpr); break; } case OP_intrinsicopwithtype: { - IntrinsicopNode *intrinnode = static_cast(mirnode); - size_t numopnds = intrinnode->NumOpnds(); - NaryMeExpr narymeexpr(&irMapAlloc, kInvalidExprID, intrinnode->GetTyIdx(), intrinnode->GetIntrinsic(), false); + IntrinsicopNode &intrinnode = static_cast(mirNode); + size_t numopnds = intrinnode.NumOpnds(); + NaryMeExpr narymeexpr(&irMapAlloc, kInvalidExprID, intrinnode.GetTyIdx(), intrinnode.GetIntrinsic(), false); for (size_t i = 0; i < numopnds; i++) { - narymeexpr.GetOpnds().push_back(BuildExpr(intrinnode->Opnd(i))); + narymeexpr.GetOpnds().push_back(BuildExpr(*intrinnode.Opnd(i))); } - narymeexpr.InitBase(mirnode->GetOpCode(), mirnode->GetPrimType(), mirnode->GetNumOpnds()); - retmeexpr = HashMeExpr(&narymeexpr); + narymeexpr.InitBase(mirNode.GetOpCode(), mirNode.GetPrimType(), mirNode.GetNumOpnds()); + retmeexpr = HashMeExpr(narymeexpr); break; } default: @@ -811,13 +808,13 @@ MeExpr *IRMap::BuildExpr(BaseNode *mirnode) { return retmeexpr; } -void IRMap::PutToBucket(uint32 hashidx, MeExpr *meExpr) { +void IRMap::PutToBucket(uint32 hashidx, MeExpr &meExpr) { MeExpr *headexpr = hashTable[hashidx]; if (headexpr == nullptr) { - hashTable[hashidx] = meExpr; + hashTable[hashidx] = &meExpr; } else { - meExpr->SetNext(headexpr); - hashTable[hashidx] = meExpr; + meExpr.SetNext(headexpr); + hashTable[hashidx] = &meExpr; } } @@ -826,28 +823,28 @@ void IRMap::PutToBucket(uint32 hashidx, MeExpr *meExpr) { If ivar_use is the first use of the same ivar coming from an iassign (ivar_def), then update its mu: ivar_def->mu = ivar_use->mu. */ -static bool AreIvarIdentical(IvarMeExpr *ivarUse, IvarMeExpr *ivarDef) { - if (ivarDef->GetBase()->GetExprID() != ivarUse->GetBase()->GetExprID()) { +static bool AreIvarIdentical(IvarMeExpr &ivarUse, IvarMeExpr &ivarDef) { + if (ivarDef.GetBase()->GetExprID() != ivarUse.GetBase()->GetExprID()) { return false; } - if (ivarDef->GetFieldID() != ivarUse->GetFieldID()) { + if (ivarDef.GetFieldID() != ivarUse.GetFieldID()) { return false; } - if (ivarUse->GetTyIdx() != ivarDef->GetTyIdx()) { + if (ivarUse.GetTyIdx() != ivarDef.GetTyIdx()) { return false; } // check the two mu being identical - if (ivarUse->GetMu() != ivarDef->GetMu()) { - if (ivarDef->GetMu() != nullptr && ivarUse->GetMu() != nullptr && ivarDef->GetMu()->GetDefBy() == kDefByChi && - ivarUse->GetMu()->GetDefBy() == kDefByChi) { - ChiMeNode *ivarDefChi = ivarDef->GetMu()->GetDefChi(); - ChiMeNode *ivarUseChi = ivarUse->GetMu()->GetDefChi(); - if (ivarDefChi->GetBase() != nullptr && ivarDefChi->GetBase() == ivarUseChi->GetBase()) { + if (ivarUse.GetMu() != ivarDef.GetMu()) { + if (ivarDef.GetMu() != nullptr && ivarUse.GetMu() != nullptr && ivarDef.GetMu()->GetDefBy() == kDefByChi && + ivarUse.GetMu()->GetDefBy() == kDefByChi) { + ChiMeNode &ivarDefChi = ivarDef.GetMu()->GetDefChi(); + ChiMeNode &ivarUseChi = ivarUse.GetMu()->GetDefChi(); + if (ivarDefChi.GetBase() != nullptr && ivarDefChi.GetBase() == ivarUseChi.GetBase()) { return true; } } - if (ivarDef->GetMu() == nullptr && ivarDef->GetDefStmt() != nullptr && ivarUse->GetMu()) { - IassignMeStmt *iass = ivarDef->GetDefStmt(); + if (ivarDef.GetMu() == nullptr && ivarDef.GetDefStmt() != nullptr && ivarUse.GetMu()) { + IassignMeStmt *iass = ivarDef.GetDefStmt(); if (iass->GetOp() != OP_iassign) { // this can happen due to use of placement new return false; @@ -855,8 +852,8 @@ static bool AreIvarIdentical(IvarMeExpr *ivarUse, IvarMeExpr *ivarDef) { for (auto xit = iass->GetChiList()->begin(); xit != iass->GetChiList()->end(); xit++) { ChiMeNode *chi = xit->second; - if (chi->GetLHS()->GetExprID() == ivarUse->GetMu()->GetExprID()) { - ivarDef->SetMuVal(ivarUse->GetMu()); + if (chi->GetLHS()->GetExprID() == ivarUse.GetMu()->GetExprID()) { + ivarDef.SetMuVal(ivarUse.GetMu()); return true; } } @@ -866,62 +863,62 @@ static bool AreIvarIdentical(IvarMeExpr *ivarUse, IvarMeExpr *ivarDef) { return true; } -MeExpr *IRMap::HashMeExpr(MeExpr *meExpr) { - uint32 hidx = meExpr->GetHashIndex() % mapHashLength; - switch (meExpr->GetMeOp()) { +MeExpr *IRMap::HashMeExpr(MeExpr &meExpr) { + uint32 hidx = meExpr.GetHashIndex() % mapHashLength; + switch (meExpr.GetMeOp()) { case kMeOpIvar: { - IvarMeExpr *ivarmeexpr = static_cast(meExpr); + IvarMeExpr &ivarmeexpr = static_cast(meExpr); IvarMeExpr *itexpr = static_cast(hashTable[hidx]); while (itexpr != nullptr) { - if (itexpr->GetMeOp() == kMeOpIvar && AreIvarIdentical(ivarmeexpr, itexpr)) { + if (itexpr->GetMeOp() == kMeOpIvar && AreIvarIdentical(ivarmeexpr, *itexpr)) { return itexpr; } itexpr = static_cast(itexpr->GetNext()); } - IvarMeExpr *newivarexpr = New(exprID++, *ivarmeexpr); - PutToBucket(hidx, newivarexpr); + IvarMeExpr *newivarexpr = New(exprID++, ivarmeexpr); + PutToBucket(hidx, *newivarexpr); return newivarexpr; } case kMeOpOp: { - OpMeExpr *opmeexpr = static_cast(meExpr); - if (!kOpcodeInfo.NotPure(opmeexpr->GetOp())) { + OpMeExpr &opmeexpr = static_cast(meExpr); + if (!kOpcodeInfo.NotPure(opmeexpr.GetOp())) { MeExpr *itexpr = hashTable[hidx]; while (itexpr != nullptr) { - if (opmeexpr->IsIdentical(static_cast(itexpr))) { + if (opmeexpr.IsIdentical(*static_cast(itexpr))) { return itexpr; } itexpr = itexpr->GetNext(); } } - OpMeExpr *newopmeexpr = New(*opmeexpr, exprID++); + OpMeExpr *newopmeexpr = New(opmeexpr, exprID++); newopmeexpr->UpdateDepth(); - PutToBucket(hidx, newopmeexpr); + PutToBucket(hidx, *newopmeexpr); return newopmeexpr; } case kMeOpConst: { - ConstMeExpr *constmeexpr = static_cast(meExpr); + ConstMeExpr &constmeexpr = static_cast(meExpr); ConstMeExpr *itexpr = static_cast(hashTable[hidx]); - MIRConst *mirconst = constmeexpr->GetConstVal(); + MIRConst *mirconst = constmeexpr.GetConstVal(); while (itexpr != nullptr) { if (itexpr->GetMeOp() != kMeOpConst) { itexpr = static_cast(itexpr->GetNext()); continue; } MIRConst *itmirconst = itexpr->GetConstVal(); - if (*mirconst == *itmirconst && meExpr->GetPrimType() == itexpr->GetPrimType()) { + if (*mirconst == *itmirconst && meExpr.GetPrimType() == itexpr->GetPrimType()) { return itexpr; } itexpr = static_cast(itexpr->GetNext()); } ConstMeExpr *newconstmeexpr = New(exprID++, mirconst); - newconstmeexpr->InitBase(meExpr->GetOp(), meExpr->GetPrimType(), meExpr->GetNumOpnds()); - PutToBucket(hidx, newconstmeexpr); + newconstmeexpr->InitBase(meExpr.GetOp(), meExpr.GetPrimType(), meExpr.GetNumOpnds()); + PutToBucket(hidx, *newconstmeexpr); return newconstmeexpr; } case kMeOpConststr: { - ConststrMeExpr *constmeexpr = static_cast(meExpr); + ConststrMeExpr &constmeexpr = static_cast(meExpr); ConststrMeExpr *itexpr = static_cast(hashTable[hidx]); - UStrIdx strIdx = constmeexpr->GetStrIdx(); + UStrIdx strIdx = constmeexpr.GetStrIdx(); while (itexpr != nullptr) { if (itexpr->GetMeOp() != kMeOpConststr) { itexpr = static_cast(itexpr->GetNext()); @@ -934,14 +931,14 @@ MeExpr *IRMap::HashMeExpr(MeExpr *meExpr) { itexpr = static_cast(itexpr->GetNext()); } ConststrMeExpr *newconstmeexpr = New(exprID++, strIdx); - newconstmeexpr->InitBase(meExpr->GetOp(), meExpr->GetPrimType(), meExpr->GetNumOpnds()); - PutToBucket(hidx, newconstmeexpr); + newconstmeexpr->InitBase(meExpr.GetOp(), meExpr.GetPrimType(), meExpr.GetNumOpnds()); + PutToBucket(hidx, *newconstmeexpr); return newconstmeexpr; } case kMeOpConststr16: { - Conststr16MeExpr *constmeexpr = static_cast(meExpr); + Conststr16MeExpr &constmeexpr = static_cast(meExpr); Conststr16MeExpr *itexpr = static_cast(hashTable[hidx]); - U16StrIdx strIdx = constmeexpr->GetStrIdx(); + U16StrIdx strIdx = constmeexpr.GetStrIdx(); while (itexpr != nullptr) { if (itexpr->GetMeOp() != kMeOpConststr16) { itexpr = static_cast(itexpr->GetNext()); @@ -954,70 +951,70 @@ MeExpr *IRMap::HashMeExpr(MeExpr *meExpr) { itexpr = static_cast(itexpr->GetNext()); } Conststr16MeExpr *newconstmeexpr = New(exprID++, strIdx); - newconstmeexpr->InitBase(meExpr->GetOp(), meExpr->GetPrimType(), meExpr->GetNumOpnds()); - PutToBucket(hidx, newconstmeexpr); + newconstmeexpr->InitBase(meExpr.GetOp(), meExpr.GetPrimType(), meExpr.GetNumOpnds()); + PutToBucket(hidx, *newconstmeexpr); return newconstmeexpr; } case kMeOpSizeoftype: { - SizeoftypeMeExpr *sizeoftypeexpr = static_cast(meExpr); + SizeoftypeMeExpr &sizeoftypeexpr = static_cast(meExpr); SizeoftypeMeExpr *itexpr = static_cast(hashTable[hidx]); while (itexpr != nullptr) { if (itexpr->GetMeOp() != kMeOpSizeoftype) { itexpr = static_cast(itexpr->GetNext()); continue; } - if (itexpr->GetTyIdx() == sizeoftypeexpr->GetTyIdx()) { + if (itexpr->GetTyIdx() == sizeoftypeexpr.GetTyIdx()) { return itexpr; } itexpr = static_cast(itexpr->GetNext()); } - SizeoftypeMeExpr *newmeexpr = New(exprID++, sizeoftypeexpr->GetTyIdx()); - newmeexpr->InitBase(meExpr->GetOp(), meExpr->GetPrimType(), meExpr->GetNumOpnds()); - PutToBucket(hidx, newmeexpr); + SizeoftypeMeExpr *newmeexpr = New(exprID++, sizeoftypeexpr.GetTyIdx()); + newmeexpr->InitBase(meExpr.GetOp(), meExpr.GetPrimType(), meExpr.GetNumOpnds()); + PutToBucket(hidx, *newmeexpr); return newmeexpr; } case kMeOpFieldsDist: { - FieldsDistMeExpr *fieldsDistExpr = static_cast(meExpr); + FieldsDistMeExpr &fieldsDistExpr = static_cast(meExpr); FieldsDistMeExpr *itexpr = static_cast(hashTable[hidx]); while (itexpr != nullptr) { if (itexpr->GetMeOp() != kMeOpFieldsDist) { itexpr = static_cast(itexpr->GetNext()); continue; } - if (itexpr->GetTyIdx() == fieldsDistExpr->GetTyIdx() && - itexpr->GetFieldID1() == fieldsDistExpr->GetFieldID1() && - itexpr->GetFieldID2() == fieldsDistExpr->GetFieldID2()) { + if (itexpr->GetTyIdx() == fieldsDistExpr.GetTyIdx() && + itexpr->GetFieldID1() == fieldsDistExpr.GetFieldID1() && + itexpr->GetFieldID2() == fieldsDistExpr.GetFieldID2()) { return itexpr; } itexpr = static_cast(itexpr->GetNext()); } - FieldsDistMeExpr *newmeexpr = New(exprID++, fieldsDistExpr->GetTyIdx(), - fieldsDistExpr->GetFieldID1(), fieldsDistExpr->GetFieldID2()); - newmeexpr->InitBase(meExpr->GetOp(), meExpr->GetPrimType(), meExpr->GetNumOpnds()); - PutToBucket(hidx, newmeexpr); + FieldsDistMeExpr *newmeexpr = New(exprID++, fieldsDistExpr.GetTyIdx(), + fieldsDistExpr.GetFieldID1(), fieldsDistExpr.GetFieldID2()); + newmeexpr->InitBase(meExpr.GetOp(), meExpr.GetPrimType(), meExpr.GetNumOpnds()); + PutToBucket(hidx, *newmeexpr); return newmeexpr; } case kMeOpAddrof: { - AddrofMeExpr *addrofmeexpr = static_cast(meExpr); + AddrofMeExpr &addrofmeexpr = static_cast(meExpr); AddrofMeExpr *itexpr = static_cast(hashTable[hidx]); while (itexpr != nullptr) { if (itexpr->GetMeOp() != kMeOpAddrof) { itexpr = static_cast(itexpr->GetNext()); continue; } - if (itexpr->GetOstIdx() == addrofmeexpr->GetOstIdx() && itexpr->GetFieldID() == addrofmeexpr->GetFieldID()) { + if (itexpr->GetOstIdx() == addrofmeexpr.GetOstIdx() && itexpr->GetFieldID() == addrofmeexpr.GetFieldID()) { return itexpr; } itexpr = static_cast(itexpr->GetNext()); } - AddrofMeExpr *newaddrofmeexpr = New(exprID++, addrofmeexpr->GetOstIdx()); - newaddrofmeexpr->InitBase(meExpr->GetOp(), meExpr->GetPrimType(), meExpr->GetNumOpnds()); - newaddrofmeexpr->SetFieldID(addrofmeexpr->GetFieldID()); - PutToBucket(hidx, newaddrofmeexpr); + AddrofMeExpr *newaddrofmeexpr = New(exprID++, addrofmeexpr.GetOstIdx()); + newaddrofmeexpr->InitBase(meExpr.GetOp(), meExpr.GetPrimType(), meExpr.GetNumOpnds()); + newaddrofmeexpr->SetFieldID(addrofmeexpr.GetFieldID()); + PutToBucket(hidx, *newaddrofmeexpr); return newaddrofmeexpr; } case kMeOpNary: { - NaryMeExpr *narymeexpr = static_cast(meExpr); + NaryMeExpr &narymeexpr = static_cast(meExpr); NaryMeExpr *itexpr = static_cast(hashTable[hidx]); while (itexpr != nullptr) { if ((itexpr->GetOp() == OP_array || @@ -1027,35 +1024,35 @@ MeExpr *IRMap::HashMeExpr(MeExpr *meExpr) { } itexpr = static_cast(itexpr->GetNext()); } - NaryMeExpr *newnarymeexpr = NewInPool(exprID++, *narymeexpr); - newnarymeexpr->InitBase(meExpr->GetOp(), meExpr->GetPrimType(), meExpr->GetNumOpnds()); + NaryMeExpr *newnarymeexpr = NewInPool(exprID++, narymeexpr); + newnarymeexpr->InitBase(meExpr.GetOp(), meExpr.GetPrimType(), meExpr.GetNumOpnds()); newnarymeexpr->UpdateDepth(); - PutToBucket(hidx, newnarymeexpr); + PutToBucket(hidx, *newnarymeexpr); return newnarymeexpr; } case kMeOpAddroffunc: { - AddroffuncMeExpr *funcmeexpr = static_cast(meExpr); + AddroffuncMeExpr &funcmeexpr = static_cast(meExpr); AddroffuncMeExpr *itexpr = static_cast(hashTable[hidx]); while (itexpr != nullptr) { if (itexpr->GetMeOp() != kMeOpAddroffunc) { itexpr = static_cast(itexpr->GetNext()); continue; } - if (itexpr->GetPuIdx() == funcmeexpr->GetPuIdx()) { + if (itexpr->GetPuIdx() == funcmeexpr.GetPuIdx()) { return itexpr; } itexpr = static_cast(itexpr->GetNext()); } - AddroffuncMeExpr *newexpr = New(exprID++, funcmeexpr->GetPuIdx()); - newexpr->InitBase(meExpr->GetOp(), meExpr->GetPrimType(), meExpr->GetNumOpnds()); - PutToBucket(hidx, newexpr); + AddroffuncMeExpr *newexpr = New(exprID++, funcmeexpr.GetPuIdx()); + newexpr->InitBase(meExpr.GetOp(), meExpr.GetPrimType(), meExpr.GetNumOpnds()); + PutToBucket(hidx, *newexpr); return newexpr; } case kMeOpGcmalloc: { - GcmallocMeExpr *gcmeexpr = static_cast(meExpr); - GcmallocMeExpr *newexpr = New(exprID++, gcmeexpr->GetTyIdx()); - newexpr->InitBase(meExpr->GetOp(), meExpr->GetPrimType(), meExpr->GetNumOpnds()); - PutToBucket(hidx, newexpr); + GcmallocMeExpr &gcmeexpr = static_cast(meExpr); + GcmallocMeExpr *newexpr = New(exprID++, gcmeexpr.GetTyIdx()); + newexpr->InitBase(meExpr.GetOp(), meExpr.GetPrimType(), meExpr.GetNumOpnds()); + PutToBucket(hidx, *newexpr); return newexpr; } default: @@ -1066,64 +1063,64 @@ MeExpr *IRMap::HashMeExpr(MeExpr *meExpr) { // replace meExpr with repexpr. meExpr must be a kid of origexpr // return repexpr's parent if replaced, otherwise return nullptr -MeExpr *IRMap::ReplaceMeExprExpr(MeExpr *origExpr, MeExpr *meExpr, MeExpr *repexpr) { - if (origExpr->IsLeaf()) { - return origExpr; +MeExpr *IRMap::ReplaceMeExprExpr(MeExpr &origExpr, MeExpr &meExpr, MeExpr &repexpr) { + if (origExpr.IsLeaf()) { + return &origExpr; } - switch (origExpr->GetMeOp()) { + switch (origExpr.GetMeOp()) { case kMeOpOp: { - OpMeExpr *opmeexpr = static_cast(origExpr); - OpMeExpr newmeexpr(*opmeexpr, kInvalidExprID); + OpMeExpr &opmeexpr = static_cast(origExpr); + OpMeExpr newmeexpr(opmeexpr, kInvalidExprID); bool needRehash = false; for (uint32 i = 0; i < kOpndNumOfOpMeExpr; i++) { - if (!opmeexpr->GetOpnd(i)) { + if (!opmeexpr.GetOpnd(i)) { continue; } - if (opmeexpr->GetOpnd(i) == meExpr) { + if (opmeexpr.GetOpnd(i) == &meExpr) { needRehash = true; - newmeexpr.SetOpnd(i, repexpr); - } else if (!opmeexpr->GetOpnd(i)->IsLeaf()) { - newmeexpr.SetOpnd(i, ReplaceMeExprExpr(newmeexpr.GetOpnd(i), meExpr, repexpr)); - if (newmeexpr.GetOpnd(i) != opmeexpr->GetOpnd(i)) { + newmeexpr.SetOpnd(i, &repexpr); + } else if (!opmeexpr.GetOpnd(i)->IsLeaf()) { + newmeexpr.SetOpnd(i, ReplaceMeExprExpr(*newmeexpr.GetOpnd(i), meExpr, repexpr)); + if (newmeexpr.GetOpnd(i) != opmeexpr.GetOpnd(i)) { needRehash = true; } } } - return needRehash ? HashMeExpr(&newmeexpr) : origExpr; + return needRehash ? HashMeExpr(newmeexpr) : &origExpr; } case kMeOpNary: { - NaryMeExpr *narymeexpr = static_cast(origExpr); - NaryMeExpr newmeexpr(&irMapAlloc, kInvalidExprID, *narymeexpr); - const MapleVector &opnds = narymeexpr->GetOpnds(); + NaryMeExpr &narymeexpr = static_cast(origExpr); + NaryMeExpr newmeexpr(&irMapAlloc, kInvalidExprID, narymeexpr); + const MapleVector &opnds = narymeexpr.GetOpnds(); bool needRehash = false; for (size_t i = 0; i < opnds.size(); i++) { MeExpr *opnd = opnds[i]; - if (opnd == meExpr) { - newmeexpr.SetOpnd(i, repexpr); + if (opnd == &meExpr) { + newmeexpr.SetOpnd(i, &repexpr); needRehash = true; } else if (!opnd->IsLeaf()) { - newmeexpr.SetOpnd(i, ReplaceMeExprExpr(newmeexpr.GetOpnd(i), meExpr, repexpr)); + newmeexpr.SetOpnd(i, ReplaceMeExprExpr(*newmeexpr.GetOpnd(i), meExpr, repexpr)); if (newmeexpr.GetOpnd(i) != opnd) { needRehash = true; } } } - return needRehash ? HashMeExpr(&newmeexpr) : origExpr; + return needRehash ? HashMeExpr(newmeexpr) : &origExpr; } case kMeOpIvar: { - IvarMeExpr *ivarexpr = static_cast(origExpr); - IvarMeExpr newmeexpr(kInvalidExprID, *ivarexpr); + IvarMeExpr &ivarexpr = static_cast(origExpr); + IvarMeExpr newmeexpr(kInvalidExprID, ivarexpr); bool needRehash = false; - if (ivarexpr->GetBase() == meExpr) { - newmeexpr.SetBase(repexpr); + if (ivarexpr.GetBase() == &meExpr) { + newmeexpr.SetBase(&repexpr); needRehash = true; - } else if (!ivarexpr->GetBase()->IsLeaf()) { - newmeexpr.SetBase(ReplaceMeExprExpr(newmeexpr.GetBase(), meExpr, repexpr)); - if (newmeexpr.GetBase() != ivarexpr->GetBase()) { + } else if (!ivarexpr.GetBase()->IsLeaf()) { + newmeexpr.SetBase(ReplaceMeExprExpr(*newmeexpr.GetBase(), meExpr, repexpr)); + if (newmeexpr.GetBase() != ivarexpr.GetBase()) { needRehash = true; } } - return needRehash ? HashMeExpr(&newmeexpr) : origExpr; + return needRehash ? HashMeExpr(newmeexpr) : &origExpr; } default: ASSERT(false, "NYI"); @@ -1131,22 +1128,22 @@ MeExpr *IRMap::ReplaceMeExprExpr(MeExpr *origExpr, MeExpr *meExpr, MeExpr *repex } } -bool IRMap::ReplaceMeExprStmtOpnd(uint32 opndID, MeStmt *meStmt, MeExpr *meExpr, MeExpr *repExpr) { - MeExpr *opnd = meStmt->GetOpnd(opndID); - if (opnd == meExpr) { - meStmt->SetOpnd(opndID, repExpr); +bool IRMap::ReplaceMeExprStmtOpnd(uint32 opndID, MeStmt &meStmt, MeExpr &meExpr, MeExpr &repExpr) { + MeExpr *opnd = meStmt.GetOpnd(opndID); + if (opnd == &meExpr) { + meStmt.SetOpnd(opndID, &repExpr); return true; } else if (!opnd->IsLeaf()) { - meStmt->SetOpnd(opndID, ReplaceMeExprExpr(opnd, meExpr, repExpr)); - return meStmt->GetOpnd(opndID) != opnd; + meStmt.SetOpnd(opndID, ReplaceMeExprExpr(*opnd, meExpr, repExpr)); + return meStmt.GetOpnd(opndID) != opnd; } return false; } // replace meExpr in meStmt with repexpr -bool IRMap::ReplaceMeExprStmt(MeStmt *meStmt, MeExpr *meExpr, MeExpr *repexpr) { +bool IRMap::ReplaceMeExprStmt(MeStmt &meStmt, MeExpr &meExpr, MeExpr &repexpr) { bool isReplaced = false; - switch (meStmt->GetOp()) { + switch (meStmt.GetOp()) { case OP_dassign: case OP_regassign: case OP_maydassign: @@ -1184,7 +1181,7 @@ bool IRMap::ReplaceMeExprStmt(MeStmt *meStmt, MeExpr *meExpr, MeExpr *repexpr) { case OP_polymorphiccallassigned: case OP_icallassigned: case OP_return: { - for (size_t i = 0; i < meStmt->NumMeStmtOpnds(); i++) { + for (size_t i = 0; i < meStmt.NumMeStmtOpnds(); i++) { bool curOpndReplaced = ReplaceMeExprStmtOpnd(i, meStmt, meExpr, repexpr); isReplaced = isReplaced || curOpndReplaced; } @@ -1196,11 +1193,11 @@ bool IRMap::ReplaceMeExprStmt(MeStmt *meStmt, MeExpr *meExpr, MeExpr *repexpr) { case OP_intrinsiccallassigned: case OP_xintrinsiccallassigned: case OP_intrinsiccallwithtypeassigned: { - for (size_t i = 0; i < meStmt->NumMeStmtOpnds(); i++) { - MeExpr *opnd = meStmt->GetOpnd(i); + for (size_t i = 0; i < meStmt.NumMeStmtOpnds(); i++) { + MeExpr *opnd = meStmt.GetOpnd(i); if (opnd->IsLeaf() && opnd->GetMeOp() == kMeOpVar) { VarMeExpr *varmeexpr = static_cast(opnd); - OriginalSt *orgsym = ssaTab->GetOriginalStFromID(varmeexpr->GetOStIdx()); + const OriginalSt *orgsym = ssaTab.GetOriginalStFromID(varmeexpr->GetOStIdx()); if (orgsym->IsSymbolOst() && orgsym->GetMIRSymbol()->GetAttr(ATTR_static)) { // its address may be taken continue; @@ -1212,10 +1209,10 @@ bool IRMap::ReplaceMeExprStmt(MeStmt *meStmt, MeExpr *meExpr, MeExpr *repexpr) { break; } case OP_iassign: { - IassignMeStmt *ivarstmt = static_cast(meStmt); + IassignMeStmt &ivarstmt = static_cast(meStmt); bool baseIsReplaced = ReplaceMeExprStmtOpnd(0, meStmt, meExpr, repexpr); if (baseIsReplaced) { - ivarstmt->SetLHSVal(BuildLHSIvar(ivarstmt->GetOpnd(0), ivarstmt, ivarstmt->GetLHSVal()->GetFieldID())); + ivarstmt.SetLHSVal(BuildLHSIvar(*ivarstmt.GetOpnd(0), ivarstmt, ivarstmt.GetLHSVal()->GetFieldID())); } bool rhsReplaced = ReplaceMeExprStmtOpnd(1, meStmt, meExpr, repexpr); isReplaced = baseIsReplaced || rhsReplaced; @@ -1234,102 +1231,102 @@ bool IRMap::ReplaceMeExprStmt(MeStmt *meStmt, MeExpr *meExpr, MeExpr *repexpr) { return isReplaced; } -MeRegPhiNode *IRMap::CreateMeRegPhi(RegMeExpr *mevar) { +MeRegPhiNode *IRMap::CreateMeRegPhi(RegMeExpr &mevar) { MeRegPhiNode *phimereg = NewInPool(); phimereg->UpdateLHS(mevar); return phimereg; } -MeVarPhiNode *IRMap::CreateMeVarPhi(VarMeExpr *mevar) { +MeVarPhiNode *IRMap::CreateMeVarPhi(VarMeExpr &mevar) { MeVarPhiNode *phimevar = NewInPool(); phimevar->UpdateLHS(mevar); return phimevar; } -DassignMeStmt *IRMap::CreateDassignMeStmt(MeExpr *lhs, MeExpr *rhs, BB *curbb) { +DassignMeStmt *IRMap::CreateDassignMeStmt(MeExpr &lhs, MeExpr &rhs, BB &curbb) { DassignMeStmt *meStmt = NewInPool(); - meStmt->SetRHS(rhs); - VarMeExpr *var = static_cast(lhs); - meStmt->SetLHS(var); - var->SetDefBy(kDefByStmt); - var->SetDefStmt(meStmt); - meStmt->SetBB(curbb); + meStmt->SetRHS(&rhs); + VarMeExpr &var = static_cast(lhs); + meStmt->SetLHS(&var); + var.SetDefBy(kDefByStmt); + var.SetDefStmt(meStmt); + meStmt->SetBB(&curbb); return meStmt; } -RegassignMeStmt *IRMap::CreateRegassignMeStmt(MeExpr *lhs, MeExpr *rhs, BB *curbb) { +RegassignMeStmt *IRMap::CreateRegassignMeStmt(MeExpr &lhs, MeExpr &rhs, BB &curbb) { RegassignMeStmt *meStmt = New(); - ASSERT(lhs->GetMeOp() == kMeOpReg, "Create regassign without lhs == regread"); - meStmt->SetRHS(rhs); - RegMeExpr *reg = static_cast(lhs); - meStmt->SetLHS(reg); - reg->SetDefBy(kDefByStmt); - reg->SetDefStmt(meStmt); - meStmt->SetBB(curbb); + ASSERT(lhs.GetMeOp() == kMeOpReg, "Create regassign without lhs == regread"); + meStmt->SetRHS(&rhs); + RegMeExpr ® = static_cast(lhs); + meStmt->SetLHS(®); + reg.SetDefBy(kDefByStmt); + reg.SetDefStmt(meStmt); + meStmt->SetBB(&curbb); return meStmt; } // get the false goto bb, if condgoto is brtrue, take the other bb of brture @lable // otherwise, take the bb of @lable -BB *IRMap::GetFalseBrBB(CondGotoMeStmt *condgoto) { - LabelIdx lblidx = (LabelIdx)condgoto->GetOffset(); +BB *IRMap::GetFalseBrBB(CondGotoMeStmt &condgoto) { + LabelIdx lblidx = (LabelIdx)condgoto.GetOffset(); BB *gotobb = GetBBForLabIdx(lblidx); - BB *bb = condgoto->GetBB(); + BB *bb = condgoto.GetBB(); ASSERT(bb->GetSucc().size() == 2, "array size error"); - if (condgoto->GetOp() == OP_brfalse) { + if (condgoto.GetOp() == OP_brfalse) { return gotobb; } else { return gotobb == bb->GetSucc(0) ? bb->GetSucc(1) : bb->GetSucc(0); } } -MeExpr *IRMap::CreateConstMeExpr(PrimType ptyp, MIRConst *mirconst) { - ConstMeExpr constmeexpr(kInvalidExprID, mirconst); +MeExpr *IRMap::CreateConstMeExpr(PrimType ptyp, MIRConst &mirconst) { + ConstMeExpr constmeexpr(kInvalidExprID, &mirconst); constmeexpr.SetOp(OP_constval); constmeexpr.SetPtyp(ptyp); - return HashMeExpr(&constmeexpr); + return HashMeExpr(constmeexpr); } MeExpr *IRMap::CreateIntConstMeExpr(int64 value, PrimType ptyp) { MIRIntConst *intconst = - mirModule->GetMemPool()->New(value, GlobalTables::GetTypeTable().GetPrimType(ptyp)); - return CreateConstMeExpr(ptyp, intconst); + mirModule.GetMemPool()->New(value, GlobalTables::GetTypeTable().GetPrimType(ptyp)); + return CreateConstMeExpr(ptyp, *intconst); } -MeExpr *IRMap::CreateMeExprBinary(Opcode op, PrimType ptyp, MeExpr *expr0, MeExpr *expr1) { +MeExpr *IRMap::CreateMeExprBinary(Opcode op, PrimType ptyp, MeExpr &expr0, MeExpr &expr1) { OpMeExpr opmeexpr(kInvalidExprID); - opmeexpr.SetOpnd(0, expr0); - opmeexpr.SetOpnd(1, expr1); + opmeexpr.SetOpnd(0, &expr0); + opmeexpr.SetOpnd(1, &expr1); opmeexpr.InitBase(op, ptyp, 2); - return HashMeExpr(&opmeexpr); + return HashMeExpr(opmeexpr); } -MeExpr *IRMap::CreateMeExprSelect(PrimType ptyp, MeExpr *expr0, MeExpr *expr1, MeExpr *expr2) { +MeExpr *IRMap::CreateMeExprSelect(PrimType ptyp, MeExpr &expr0, MeExpr &expr1, MeExpr &expr2) { OpMeExpr opmeexpr(kInvalidExprID); - opmeexpr.SetOpnd(0, expr0); - opmeexpr.SetOpnd(1, expr1); - opmeexpr.SetOpnd(2, expr2); + opmeexpr.SetOpnd(0, &expr0); + opmeexpr.SetOpnd(1, &expr1); + opmeexpr.SetOpnd(2, &expr2); opmeexpr.InitBase(OP_select, ptyp, 3); - return HashMeExpr(&opmeexpr); + return HashMeExpr(opmeexpr); } -MeExpr *IRMap::CreateMeExprCompare(Opcode op, PrimType resptyp, PrimType opndptyp, MeExpr *opnd0, MeExpr *opnd1) { +MeExpr *IRMap::CreateMeExprCompare(Opcode op, PrimType resptyp, PrimType opndptyp, MeExpr &opnd0, MeExpr &opnd1) { OpMeExpr opmeexpr(kInvalidExprID); - opmeexpr.SetOpnd(0, opnd0); - opmeexpr.SetOpnd(1, opnd1); + opmeexpr.SetOpnd(0, &opnd0); + opmeexpr.SetOpnd(1, &opnd1); opmeexpr.InitBase(op, resptyp, 2); opmeexpr.SetOpndType(opndptyp); - MeExpr *retmeexpr = HashMeExpr(&opmeexpr); + MeExpr *retmeexpr = HashMeExpr(opmeexpr); static_cast(retmeexpr)->SetOpndType(opndptyp); return retmeexpr; } -MeExpr *IRMap::CreateMeExprTypeCvt(PrimType ptyp, PrimType opndptyp, MeExpr *opnd0) { +MeExpr *IRMap::CreateMeExprTypeCvt(PrimType ptyp, PrimType opndptyp, MeExpr &opnd0) { OpMeExpr opmeexpr(kInvalidExprID); - opmeexpr.SetOpnd(0, opnd0); + opmeexpr.SetOpnd(0, &opnd0); opmeexpr.InitBase(OP_cvt, ptyp, 1); opmeexpr.SetOpndType(opndptyp); - return HashMeExpr(&opmeexpr); + return HashMeExpr(opmeexpr); } IntrinsiccallMeStmt *IRMap::CreateIntrinsicCallMeStmt(MIRIntrinsicID idx, std::vector &opnds, TyIdx tyidx) { @@ -1356,12 +1353,11 @@ IntrinsiccallMeStmt *IRMap::CreateIntrinsicCallAssignedMeStmt(MIRIntrinsicID idx return meStmt; } -MeExpr *IRMap::CreateAddrofMeExprFromNewSymbol(MIRSymbol *st, PUIdx puidx) { - OriginalSt *baseOst = ssaTab->CreateSymbolOriginalSt(st, puidx, 0); +MeExpr *IRMap::CreateAddrofMeExprFromNewSymbol(MIRSymbol &st, PUIdx puidx) { + OriginalSt *baseOst = ssaTab.CreateSymbolOriginalSt(&st, puidx, 0); AddrofMeExpr addrofme(kInvalidExprID, baseOst->GetIndex()); addrofme.SetOp(OP_addrof); addrofme.SetPtyp(PTY_ptr); - return HashMeExpr(&addrofme); + return HashMeExpr(addrofme); } - } // namespace maple diff --git a/src/maple_me/src/irmap_emit.cpp b/src/maple_me/src/irmap_emit.cpp index 9dc228181f3082f029036492c33ab8f1dd749b80..eaa88d5387b3dd50b495bf39f26fd0942517b089 100644 --- a/src/maple_me/src/irmap_emit.cpp +++ b/src/maple_me/src/irmap_emit.cpp @@ -19,96 +19,96 @@ #include "orig_symbol.h" namespace maple { -bool VarMeExpr::IsValidVerIdx(SSATab *ssaTab) { - OriginalSt *ost = ssaTab->GetOriginalStFromID(ostIdx); +bool VarMeExpr::IsValidVerIdx(SSATab &ssaTab) { + const OriginalSt *ost = ssaTab.GetOriginalStFromID(ostIdx); if (ost == nullptr || !ost->IsSymbolOst()) { return false; } StIdx stIdx = ost->GetMIRSymbol()->GetStIdx(); - return stIdx.Islocal() ? ssaTab->mirModule.CurFunction()->GetSymTab()->IsValidIdx(stIdx.Idx()) + return stIdx.Islocal() ? ssaTab.GetModule().CurFunction()->GetSymTab()->IsValidIdx(stIdx.Idx()) : GlobalTables::GetGsymTable().IsValidIdx(stIdx.Idx()); } -BaseNode *VarMeExpr::EmitExpr(SSATab *ssaTab) { - MIRSymbol *symbol = ssaTab->GetMIRSymbolFromID(GetOStIdx()); +BaseNode &VarMeExpr::EmitExpr(SSATab &ssaTab) { + MIRSymbol *symbol = ssaTab.GetMIRSymbolFromID(GetOStIdx()); if (symbol->IsLocal()) { symbol->ResetIsDeleted(); } - AddrofNode *addrofNode = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New( + AddrofNode *addrofNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( OP_dread, PrimType(GetPrimType()), symbol->GetStIdx(), GetFieldID()); ASSERT(addrofNode->GetPrimType() != kPtyInvalid, "runtime check error"); ASSERT(IsValidVerIdx(ssaTab), "runtime check error"); - return addrofNode; + return *addrofNode; } -BaseNode *RegMeExpr::EmitExpr(SSATab *ssaTab) { - RegreadNode *regRead = ssaTab->mirModule.CurFunction()->GetCodeMemPool()->New(); +BaseNode &RegMeExpr::EmitExpr(SSATab &ssaTab) { + RegreadNode *regRead = ssaTab.GetModule().CurFunction()->GetCodeMemPool()->New(); regRead->SetPrimType(GetPrimType()); regRead->SetRegIdx(regIdx); ASSERT(regIdx < 0 || - static_cast(static_cast(regIdx)) < ssaTab->mirModule.CurFunction()->GetPregTab()->Size(), + static_cast(static_cast(regIdx)) < ssaTab.GetModule().CurFunction()->GetPregTab()->Size(), "RegMeExpr::EmitExpr: pregIdx exceeds preg table size"); - return regRead; + return *regRead; } -BaseNode *ConstMeExpr::EmitExpr(SSATab *ssaTab) { +BaseNode &ConstMeExpr::EmitExpr(SSATab &ssaTab) { ConstvalNode *exprConst = - ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(PrimType(GetPrimType()), constVal); + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(PrimType(GetPrimType()), constVal); // if int const has been promoted from dyn int const, remove the type tag if (IsPrimitiveInteger(exprConst->GetPrimType())) { MIRIntConst *intConst = static_cast(exprConst->GetConstVal()); intConst->SetValue(intConst->GetValueUnderType()); } - return exprConst; + return *exprConst; } -BaseNode *ConststrMeExpr::EmitExpr(SSATab *ssaTab) { +BaseNode &ConststrMeExpr::EmitExpr(SSATab &ssaTab) { ConststrNode *exprConst = - ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(PrimType(GetPrimType()), strIdx); - return exprConst; + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(PrimType(GetPrimType()), strIdx); + return *exprConst; } -BaseNode *Conststr16MeExpr::EmitExpr(SSATab *ssaTab) { +BaseNode &Conststr16MeExpr::EmitExpr(SSATab &ssaTab) { Conststr16Node *exprConst = - ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(PrimType(GetPrimType()), strIdx); - return exprConst; + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(PrimType(GetPrimType()), strIdx); + return *exprConst; } -BaseNode *SizeoftypeMeExpr::EmitExpr(SSATab *ssaTab) { +BaseNode &SizeoftypeMeExpr::EmitExpr(SSATab &ssaTab) { SizeoftypeNode *exprSizeoftype = - ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(PrimType(GetPrimType()), tyIdx); - return exprSizeoftype; + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(PrimType(GetPrimType()), tyIdx); + return *exprSizeoftype; } -BaseNode *FieldsDistMeExpr::EmitExpr(SSATab *ssaTab) { - FieldsDistNode *exprSizeoftype = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New( +BaseNode &FieldsDistMeExpr::EmitExpr(SSATab &ssaTab) { + FieldsDistNode *exprSizeoftype = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( PrimType(GetPrimType()), tyIdx, fieldID1, fieldID2); - return exprSizeoftype; + return *exprSizeoftype; } -BaseNode *AddrofMeExpr::EmitExpr(SSATab *ssaTab) { - MIRSymbol *symbol = ssaTab->GetMIRSymbolFromID(ostIdx); +BaseNode &AddrofMeExpr::EmitExpr(SSATab &ssaTab) { + MIRSymbol *symbol = ssaTab.GetMIRSymbolFromID(ostIdx); if (symbol->IsLocal()) { symbol->ResetIsDeleted(); } - AddrofNode *addrofNode = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New( + AddrofNode *addrofNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( OP_addrof, PrimType(GetPrimType()), symbol->GetStIdx(), fieldID); - return addrofNode; + return *addrofNode; } -BaseNode *AddroffuncMeExpr::EmitExpr(SSATab *ssaTab) { +BaseNode &AddroffuncMeExpr::EmitExpr(SSATab &ssaTab) { AddroffuncNode *addroffuncNode = - ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(PrimType(GetPrimType()), puIdx); - return addroffuncNode; + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(PrimType(GetPrimType()), puIdx); + return *addroffuncNode; } -BaseNode *GcmallocMeExpr::EmitExpr(SSATab *ssaTab) { - GCMallocNode *gcmallocNode = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New( +BaseNode &GcmallocMeExpr::EmitExpr(SSATab &ssaTab) { + GCMallocNode *gcmallocNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( Opcode(GetOp()), PrimType(GetPrimType()), tyIdx); - return gcmallocNode; + return *gcmallocNode; } -BaseNode *OpMeExpr::EmitExpr(SSATab *ssaTab) { +BaseNode &OpMeExpr::EmitExpr(SSATab &ssaTab) { switch (GetOp()) { case OP_add: case OP_ashr: @@ -126,10 +126,11 @@ BaseNode *OpMeExpr::EmitExpr(SSATab *ssaTab) { case OP_shl: case OP_sub: { BinaryNode *binaryNode = - ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(Opcode(GetOp()), PrimType(GetPrimType())); - binaryNode->SetBOpnd(opnds[0]->EmitExpr(ssaTab), 0); - binaryNode->SetBOpnd(opnds[1]->EmitExpr(ssaTab), 1); - return binaryNode; + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp()), + PrimType(GetPrimType())); + binaryNode->SetBOpnd(&opnds[0]->EmitExpr(ssaTab), 0); + binaryNode->SetBOpnd(&opnds[1]->EmitExpr(ssaTab), 1); + return *binaryNode; } case OP_eq: case OP_ne: @@ -141,11 +142,11 @@ BaseNode *OpMeExpr::EmitExpr(SSATab *ssaTab) { case OP_cmpg: case OP_cmp: { CompareNode *cmpNode = - ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(Opcode(GetOp()), PrimType(GetPrimType())); - cmpNode->SetBOpnd(opnds[0]->EmitExpr(ssaTab), 0); - cmpNode->SetBOpnd(opnds[1]->EmitExpr(ssaTab), 1); + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp()), PrimType(GetPrimType())); + cmpNode->SetBOpnd(&opnds[0]->EmitExpr(ssaTab), 0); + cmpNode->SetBOpnd(&opnds[1]->EmitExpr(ssaTab), 1); cmpNode->SetOpndType(opndType); - return cmpNode; + return *cmpNode; } case OP_abs: case OP_bnot: @@ -156,149 +157,148 @@ BaseNode *OpMeExpr::EmitExpr(SSATab *ssaTab) { case OP_alloca: case OP_malloc: { UnaryNode *unaryNode = - ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(Opcode(GetOp()), PrimType(GetPrimType())); - unaryNode->SetOpnd(opnds[0]->EmitExpr(ssaTab)); - return unaryNode; + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp()), PrimType(GetPrimType())); + unaryNode->SetOpnd(&opnds[0]->EmitExpr(ssaTab)); + return *unaryNode; } case OP_sext: case OP_zext: case OP_extractbits: { - ExtractbitsNode *unode = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New( + ExtractbitsNode *unode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( Opcode(GetOp()), PrimType(GetPrimType())); - unode->SetOpnd(opnds[0]->EmitExpr(ssaTab)); + unode->SetOpnd(&opnds[0]->EmitExpr(ssaTab)); unode->SetBitsOffset(bitsOffset); unode->SetBitsSize(bitsSize); - return unode; + return *unode; } case OP_select: { TernaryNode *ternaryNode = - ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(Opcode(GetOp()), PrimType(GetPrimType())); - ternaryNode->SetOpnd(opnds[0]->EmitExpr(ssaTab), 0); - ternaryNode->SetOpnd(opnds[1]->EmitExpr(ssaTab), 1); - ternaryNode->SetOpnd(opnds[2]->EmitExpr(ssaTab), 2); - return ternaryNode; + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp()), PrimType(GetPrimType())); + ternaryNode->SetOpnd(&opnds[0]->EmitExpr(ssaTab), 0); + ternaryNode->SetOpnd(&opnds[1]->EmitExpr(ssaTab), 1); + ternaryNode->SetOpnd(&opnds[2]->EmitExpr(ssaTab), 2); + return *ternaryNode; } case OP_ceil: case OP_cvt: case OP_floor: case OP_trunc: { TypeCvtNode *cvtNode = - ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(Opcode(GetOp()), PrimType(GetPrimType())); - cvtNode->SetOpnd(opnds[0]->EmitExpr(ssaTab)); + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp()), PrimType(GetPrimType())); + cvtNode->SetOpnd(&opnds[0]->EmitExpr(ssaTab)); cvtNode->SetFromType(opndType); - return cvtNode; + return *cvtNode; } case OP_retype: { - RetypeNode *cvtNode = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(PrimType(GetPrimType())); - cvtNode->SetOpnd(opnds[0]->EmitExpr(ssaTab)); + RetypeNode *cvtNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(PrimType(GetPrimType())); + cvtNode->SetOpnd(&opnds[0]->EmitExpr(ssaTab)); cvtNode->SetFromType(opndType); cvtNode->SetTyIdx(tyIdx); - return cvtNode; + return *cvtNode; } case OP_gcmallocjarray: case OP_gcpermallocjarray: { - JarrayMallocNode *arrayMalloc = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New( + JarrayMallocNode *arrayMalloc = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( Opcode(GetOp()), PrimType(GetPrimType())); - arrayMalloc->SetOpnd(opnds[0]->EmitExpr(ssaTab)); + arrayMalloc->SetOpnd(&opnds[0]->EmitExpr(ssaTab)); arrayMalloc->SetTyIdx(tyIdx); - return arrayMalloc; + return *arrayMalloc; } case OP_resolveinterfacefunc: case OP_resolvevirtualfunc: { - ResolveFuncNode *resolveNode = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New( + ResolveFuncNode *resolveNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( Opcode(GetOp()), PrimType(GetPrimType())); - resolveNode->SetBOpnd(opnds[0]->EmitExpr(ssaTab), 0); - resolveNode->SetBOpnd(opnds[1]->EmitExpr(ssaTab), 1); + resolveNode->SetBOpnd(&opnds[0]->EmitExpr(ssaTab), 0); + resolveNode->SetBOpnd(&opnds[1]->EmitExpr(ssaTab), 1); resolveNode->SetPuIdx(fieldID); - return resolveNode; + return *resolveNode; } case OP_iaddrof: { IaddrofNode *iaddrof = - ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(OP_iaddrof, PrimType(GetPrimType())); - iaddrof->SetOpnd(opnds[0]->EmitExpr(ssaTab)); + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(OP_iaddrof, PrimType(GetPrimType())); + iaddrof->SetOpnd(&opnds[0]->EmitExpr(ssaTab)); iaddrof->SetTyIdx(tyIdx); iaddrof->SetFieldID(fieldID); - return iaddrof; + return *iaddrof; } default: - ASSERT(false, "unexpected op"); - return nullptr; + CHECK_FATAL(false, "unexpected op"); } } -BaseNode *NaryMeExpr::EmitExpr(SSATab *ssaTab) { +BaseNode &NaryMeExpr::EmitExpr(SSATab &ssaTab) { BaseNode *nodeToReturn = nullptr; NaryOpnds *nopndPart = nullptr; if (GetOp() == OP_array) { - ArrayNode *arrayNode = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New( - &(ssaTab->mirModule), PrimType(GetPrimType()), tyIdx); + ArrayNode *arrayNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( + &(ssaTab.GetModule()), PrimType(GetPrimType()), tyIdx); arrayNode->SetNumOpnds(GetNumOpnds()); arrayNode->SetBoundsCheck(GetBoundCheck()); nopndPart = arrayNode; nodeToReturn = arrayNode; } else { - IntrinsicopNode *intrinNode = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New( - &(ssaTab->mirModule), GetOp(), PrimType(GetPrimType()), tyIdx); + IntrinsicopNode *intrinNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( + &(ssaTab.GetModule()), GetOp(), PrimType(GetPrimType()), tyIdx); intrinNode->SetNumOpnds(GetNumOpnds()); intrinNode->SetIntrinsic(intrinsic); nopndPart = intrinNode; nodeToReturn = intrinNode; } for (auto it = GetOpnds().begin(); it != GetOpnds().end(); it++) { - nopndPart->GetNopnd().push_back((*it)->EmitExpr(ssaTab)); + nopndPart->GetNopnd().push_back(&(*it)->EmitExpr(ssaTab)); } - return nodeToReturn; + return *nodeToReturn; } -BaseNode *IvarMeExpr::EmitExpr(SSATab *ssaTab) { +BaseNode &IvarMeExpr::EmitExpr(SSATab &ssaTab) { IreadNode *ireadNode = - ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(OP_iread, PrimType(GetPrimType())); - ireadNode->SetOpnd(base->EmitExpr(ssaTab)); + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(OP_iread, PrimType(GetPrimType())); + ireadNode->SetOpnd(&base->EmitExpr(ssaTab)); ireadNode->SetFieldID(fieldID); ireadNode->SetTyIdx(tyIdx); ASSERT(ireadNode->GetPrimType() != kPtyInvalid, ""); ASSERT(tyIdx != 0, "wrong tyIdx for iread node in me emit"); ireadNode->SetTyIdx(tyIdx); - return ireadNode; + return *ireadNode; } -StmtNode *MeStmt::EmitStmt(SSATab *ssaTab) { - StmtNode *stmt = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(Opcode(GetOp())); +StmtNode &MeStmt::EmitStmt(SSATab &ssaTab) { + StmtNode *stmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp())); stmt->SetSrcPos(GetSrcPosition()); - return stmt; + return *stmt; } -StmtNode *DassignMeStmt::EmitStmt(SSATab *ssaTab) { - DassignNode *dassignStmt = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(); - MIRSymbol *symbol = ssaTab->GetMIRSymbolFromID(GetVarLHS()->GetOStIdx()); +StmtNode &DassignMeStmt::EmitStmt(SSATab &ssaTab) { + DassignNode *dassignStmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(); + MIRSymbol *symbol = ssaTab.GetMIRSymbolFromID(GetVarLHS()->GetOStIdx()); if (symbol->IsLocal()) { symbol->ResetIsDeleted(); } dassignStmt->SetStIdx(symbol->GetStIdx()); dassignStmt->SetFieldID(GetVarLHS()->GetFieldID()); - dassignStmt->SetRHS(GetRHS()->EmitExpr(ssaTab)); + dassignStmt->SetRHS(&GetRHS()->EmitExpr(ssaTab)); dassignStmt->SetSrcPos(GetSrcPosition()); - return dassignStmt; + return *dassignStmt; } -StmtNode *RegassignMeStmt::EmitStmt(SSATab *ssaTab) { - RegassignNode *regassignStmt = ssaTab->mirModule.GetMIRBuilder()->CreateStmtRegassign( - lhs->GetPrimType(), lhs->GetRegIdx(), rhs->EmitExpr(ssaTab)); +StmtNode &RegassignMeStmt::EmitStmt(SSATab &ssaTab) { + RegassignNode *regassignStmt = ssaTab.GetModule().GetMIRBuilder()->CreateStmtRegassign( + lhs->GetPrimType(), lhs->GetRegIdx(), &rhs->EmitExpr(ssaTab)); regassignStmt->SetSrcPos(GetSrcPosition()); - return regassignStmt; + return *regassignStmt; } -StmtNode *MaydassignMeStmt::EmitStmt(SSATab *ssaTab) { - DassignNode *dassignStmt = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(); +StmtNode &MaydassignMeStmt::EmitStmt(SSATab &ssaTab) { + DassignNode *dassignStmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(); MIRSymbol *symbol = mayDSSym->GetMIRSymbol(); if (symbol->IsLocal()) { symbol->ResetIsDeleted(); } dassignStmt->SetStIdx(symbol->GetStIdx()); dassignStmt->SetFieldID(fieldID); - dassignStmt->SetRHS(rhs->EmitExpr(ssaTab)); + dassignStmt->SetRHS(&rhs->EmitExpr(ssaTab)); dassignStmt->SetSrcPos(GetSrcPosition()); - return dassignStmt; + return *dassignStmt; } void MeStmt::EmitCallReturnVector(SSATab *ssaTab, CallReturnVector *nrets) { @@ -308,7 +308,7 @@ void MeStmt::EmitCallReturnVector(SSATab *ssaTab, CallReturnVector *nrets) { } MeExpr *meExpr = mustDefs->front().GetLHS(); if (meExpr->GetMeOp() == kMeOpVar) { - OriginalSt *ost = ssaTab->GetOriginalStFromID(static_cast(meExpr)->GetOStIdx()); + const OriginalSt *ost = ssaTab->GetOriginalStFromID(static_cast(meExpr)->GetOStIdx()); MIRSymbol *symbol = ost->GetMIRSymbol(); nrets->push_back(CallReturnPair(symbol->GetStIdx(), RegFieldPair(0, 0))); } else if (meExpr->GetMeOp() == kMeOpReg) { @@ -316,60 +316,60 @@ void MeStmt::EmitCallReturnVector(SSATab *ssaTab, CallReturnVector *nrets) { } } -StmtNode *IassignMeStmt::EmitStmt(SSATab *ssaTab) { - IassignNode *iassignNode = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(); +StmtNode &IassignMeStmt::EmitStmt(SSATab &ssaTab) { + IassignNode *iassignNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(); iassignNode->SetTyIdx(tyIdx); iassignNode->SetFieldID(lhsVar->GetFieldID()); - iassignNode->SetAddrExpr(lhsVar->GetBase()->EmitExpr(ssaTab)); - iassignNode->SetRHS(rhs->EmitExpr(ssaTab)); + iassignNode->SetAddrExpr(&lhsVar->GetBase()->EmitExpr(ssaTab)); + iassignNode->SetRHS(&rhs->EmitExpr(ssaTab)); iassignNode->SetSrcPos(GetSrcPosition()); - return iassignNode; + return *iassignNode; } -StmtNode *CallMeStmt::EmitStmt(SSATab *ssaTab) { +StmtNode &CallMeStmt::EmitStmt(SSATab &ssaTab) { if (GetOp() != OP_icall && GetOp() != OP_icallassigned) { CallNode *callNode = - ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(&(ssaTab->mirModule), Opcode(GetOp())); + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(&(ssaTab.GetModule()), Opcode(GetOp())); callNode->SetPUIdx(puIdx); callNode->SetTyIdx(tyIdx); callNode->GetNopnd().resize(NumMeStmtOpnds()); for (size_t i = 0; i < NumMeStmtOpnds(); i++) { - callNode->SetOpnd(GetOpnd(i)->EmitExpr(ssaTab), i); + callNode->SetOpnd(&GetOpnd(i)->EmitExpr(ssaTab), i); } callNode->SetNumOpnds(callNode->GetNopndSize()); callNode->SetSrcPos(GetSrcPosition()); if (kOpcodeInfo.IsCallAssigned(GetOp())) { - EmitCallReturnVector(ssaTab, &callNode->GetReturnVec()); + EmitCallReturnVector(&ssaTab, &callNode->GetReturnVec()); for (size_t j = 0; j < callNode->GetReturnVec().size(); j++) { CallReturnPair retPair = callNode->GetReturnVec()[j]; if (!retPair.second.IsReg()) { StIdx stIdx = retPair.first; if (stIdx.Islocal()) { - MIRSymbolTable *symbolTab = ssaTab->mirModule.CurFunction()->GetSymTab(); + MIRSymbolTable *symbolTab = ssaTab.GetModule().CurFunction()->GetSymTab(); MIRSymbol *symbol = symbolTab->GetSymbolFromStIdx(stIdx.Idx()); symbol->ResetIsDeleted(); } } } } - return callNode; + return *callNode; } else { IcallNode *icallNode = - ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(&(ssaTab->mirModule), Opcode(GetOp())); + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(&(ssaTab.GetModule()), Opcode(GetOp())); icallNode->GetNopnd().resize(NumMeStmtOpnds()); for (size_t i = 0; i < NumMeStmtOpnds(); i++) { - icallNode->SetOpnd(GetOpnd(i)->EmitExpr(ssaTab), i); + icallNode->SetOpnd(&GetOpnd(i)->EmitExpr(ssaTab), i); } icallNode->SetNumOpnds(icallNode->GetNopndSize()); icallNode->SetSrcPos(GetSrcPosition()); if (kOpcodeInfo.IsCallAssigned(GetOp())) { - EmitCallReturnVector(ssaTab, &icallNode->GetReturnVec()); + EmitCallReturnVector(&ssaTab, &icallNode->GetReturnVec()); icallNode->SetRetTyIdx(TyIdx(PTY_void)); for (size_t j = 0; j < icallNode->GetReturnVec().size(); j++) { CallReturnPair retPair = icallNode->GetReturnVec()[j]; if (!retPair.second.IsReg()) { StIdx stIdx = retPair.first; - MIRSymbolTable *symbolTab = ssaTab->mirModule.CurFunction()->GetSymTab(); + MIRSymbolTable *symbolTab = ssaTab.GetModule().CurFunction()->GetSymTab(); MIRSymbol *symbol = symbolTab->GetSymbolFromStIdx(stIdx.Idx()); icallNode->SetRetTyIdx(symbol->GetType()->GetTypeIndex()); if (stIdx.Islocal()) { @@ -377,32 +377,32 @@ StmtNode *CallMeStmt::EmitStmt(SSATab *ssaTab) { } } else { PregIdx pregIdx = (PregIdx)retPair.second.GetPregIdx(); - MIRPreg *preg = ssaTab->mirModule.CurFunction()->GetPregTab()->PregFromPregIdx(pregIdx); + MIRPreg *preg = ssaTab.GetModule().CurFunction()->GetPregTab()->PregFromPregIdx(pregIdx); icallNode->SetRetTyIdx(TyIdx(preg->GetPrimType())); } } } - return icallNode; + return *icallNode; } } -StmtNode *IcallMeStmt::EmitStmt(SSATab *ssaTab) { +StmtNode &IcallMeStmt::EmitStmt(SSATab &ssaTab) { IcallNode *icallNode = - ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(&(ssaTab->mirModule), Opcode(GetOp())); + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(&(ssaTab.GetModule()), Opcode(GetOp())); icallNode->GetNopnd().resize(NumMeStmtOpnds()); for (size_t i = 0; i < NumMeStmtOpnds(); i++) { - icallNode->SetOpnd(GetOpnd(i)->EmitExpr(ssaTab), i); + icallNode->SetOpnd(&GetOpnd(i)->EmitExpr(ssaTab), i); } icallNode->SetNumOpnds(icallNode->GetNopndSize()); icallNode->SetSrcPos(GetSrcPosition()); if (kOpcodeInfo.IsCallAssigned(GetOp())) { - EmitCallReturnVector(ssaTab, &icallNode->GetReturnVec()); + EmitCallReturnVector(&ssaTab, &icallNode->GetReturnVec()); icallNode->SetRetTyIdx(TyIdx(PTY_void)); for (size_t j = 0; j < icallNode->GetReturnVec().size(); j++) { CallReturnPair retPair = icallNode->GetReturnVec()[j]; if (!retPair.second.IsReg()) { StIdx stIdx = retPair.first; - MIRSymbolTable *symbolTab = ssaTab->mirModule.CurFunction()->GetSymTab(); + MIRSymbolTable *symbolTab = ssaTab.GetModule().CurFunction()->GetSymTab(); MIRSymbol *symbol = symbolTab->GetSymbolFromStIdx(stIdx.Idx()); icallNode->SetRetTyIdx(symbol->GetType()->GetTypeIndex()); if (stIdx.Islocal()) { @@ -410,140 +410,138 @@ StmtNode *IcallMeStmt::EmitStmt(SSATab *ssaTab) { } } else { PregIdx pregIdx = (PregIdx)retPair.second.GetPregIdx(); - MIRPreg *preg = ssaTab->mirModule.CurFunction()->GetPregTab()->PregFromPregIdx(pregIdx); + MIRPreg *preg = ssaTab.GetModule().CurFunction()->GetPregTab()->PregFromPregIdx(pregIdx); icallNode->SetRetTyIdx(TyIdx(preg->GetPrimType())); } } } - return icallNode; + return *icallNode; } -StmtNode *IntrinsiccallMeStmt::EmitStmt(SSATab *ssaTab) { +StmtNode &IntrinsiccallMeStmt::EmitStmt(SSATab &ssaTab) { IntrinsiccallNode *callNode = - ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(&(ssaTab->mirModule), Opcode(GetOp())); + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(&(ssaTab.GetModule()), + Opcode(GetOp())); callNode->SetIntrinsic(intrinsic); callNode->SetTyIdx(tyIdx); callNode->GetNopnd().resize(NumMeStmtOpnds()); for (size_t i = 0; i < NumMeStmtOpnds(); i++) { - callNode->SetOpnd(GetOpnd(i)->EmitExpr(ssaTab), i); + callNode->SetOpnd(&GetOpnd(i)->EmitExpr(ssaTab), i); } callNode->SetNumOpnds(callNode->GetNopndSize()); callNode->SetSrcPos(GetSrcPosition()); if (kOpcodeInfo.IsCallAssigned(GetOp())) { - EmitCallReturnVector(ssaTab, &callNode->GetReturnVec()); + EmitCallReturnVector(&ssaTab, &callNode->GetReturnVec()); for (size_t j = 0; j < callNode->GetReturnVec().size(); j++) { CallReturnPair retPair = callNode->GetReturnVec()[j]; if (!retPair.second.IsReg()) { StIdx stIdx = retPair.first; if (stIdx.Islocal()) { - MIRSymbolTable *symbolTab = ssaTab->mirModule.CurFunction()->GetSymTab(); + MIRSymbolTable *symbolTab = ssaTab.GetModule().CurFunction()->GetSymTab(); MIRSymbol *symbol = symbolTab->GetSymbolFromStIdx(stIdx.Idx()); symbol->ResetIsDeleted(); } } } } - return callNode; + return *callNode; } -StmtNode *NaryMeStmt::EmitStmt(SSATab *ssaTab) { +StmtNode &NaryMeStmt::EmitStmt(SSATab &ssaTab) { NaryStmtNode *naryStmt = - ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(&(ssaTab->mirModule), Opcode(GetOp())); + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(&(ssaTab.GetModule()), Opcode(GetOp())); naryStmt->GetNopnd().resize(NumMeStmtOpnds()); for (size_t i = 0; i < NumMeStmtOpnds(); i++) { - naryStmt->SetOpnd(opnds[i]->EmitExpr(ssaTab), i); + naryStmt->SetOpnd(&opnds[i]->EmitExpr(ssaTab), i); } naryStmt->SetNumOpnds(naryStmt->GetNopndSize()); naryStmt->SetSrcPos(GetSrcPosition()); - return naryStmt; + return *naryStmt; } -StmtNode *UnaryMeStmt::EmitStmt(SSATab *ssaTab) { - UnaryStmtNode *unaryStmt = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(Opcode(GetOp())); - unaryStmt->SetOpnd(opnd->EmitExpr(ssaTab), 0); +StmtNode &UnaryMeStmt::EmitStmt(SSATab &ssaTab) { + UnaryStmtNode *unaryStmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp())); + unaryStmt->SetOpnd(&opnd->EmitExpr(ssaTab), 0); unaryStmt->SetSrcPos(GetSrcPosition()); - if (GetNotNeedLock()) { - ssaTab->mirModule.GetRcNoNeedingLock().insert(unaryStmt->GetStmtID()); - } - return unaryStmt; + return *unaryStmt; } -StmtNode *GotoMeStmt::EmitStmt(SSATab *ssaTab) { - GotoNode *gotoNode = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(OP_goto); +StmtNode &GotoMeStmt::EmitStmt(SSATab &ssaTab) { + GotoNode *gotoNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(OP_goto); gotoNode->SetOffset(offset); gotoNode->SetSrcPos(GetSrcPosition()); - return gotoNode; + return *gotoNode; } -StmtNode *CondGotoMeStmt::EmitStmt(SSATab *ssaTab) { - CondGotoNode *cgNode = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(Opcode(GetOp())); +StmtNode &CondGotoMeStmt::EmitStmt(SSATab &ssaTab) { + CondGotoNode *cgNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp())); cgNode->SetOffset(offset); - cgNode->SetOpnd(GetOpnd()->EmitExpr(ssaTab)); + cgNode->SetOpnd(&GetOpnd()->EmitExpr(ssaTab)); cgNode->SetSrcPos(GetSrcPosition()); - return cgNode; + return *cgNode; } -StmtNode *JsTryMeStmt::EmitStmt(SSATab *ssaTab) { - JsTryNode *jtNode = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(); +StmtNode &JsTryMeStmt::EmitStmt(SSATab &ssaTab) { + JsTryNode *jtNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(); jtNode->SetCatchOffset(catchOffset); jtNode->SetFinallyOffset(finallyOffset); jtNode->SetSrcPos(GetSrcPosition()); - return jtNode; + return *jtNode; } -StmtNode *TryMeStmt::EmitStmt(SSATab *ssaTab) { - TryNode *tryNode = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(&(ssaTab->mirModule)); +StmtNode &TryMeStmt::EmitStmt(SSATab &ssaTab) { + TryNode *tryNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(&(ssaTab.GetModule())); tryNode->ResizeOffsets(offsets.size()); for (size_t i = 0; i < offsets.size(); i++) { tryNode->SetOffset(offsets[i], i); } tryNode->SetSrcPos(GetSrcPosition()); - return tryNode; + return *tryNode; } -StmtNode *CatchMeStmt::EmitStmt(SSATab *ssaTab) { - CatchNode *catchNode = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(&(ssaTab->mirModule)); +StmtNode &CatchMeStmt::EmitStmt(SSATab &ssaTab) { + CatchNode *catchNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(&(ssaTab.GetModule())); catchNode->SetExceptionTyIdxVec(exceptionTyIdxVec); catchNode->SetSrcPos(GetSrcPosition()); - return catchNode; + return *catchNode; } -StmtNode *SwitchMeStmt::EmitStmt(SSATab *ssaTab) { - SwitchNode *switchNode = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(&(ssaTab->mirModule)); +StmtNode &SwitchMeStmt::EmitStmt(SSATab &ssaTab) { + SwitchNode *switchNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(&(ssaTab.GetModule())); switchNode->SetDefaultLabel(defaultLabel); switchNode->SetSwitchTable(switchTable); - switchNode->SetSwitchOpnd(GetOpnd()->EmitExpr(ssaTab)); + switchNode->SetSwitchOpnd(&GetOpnd()->EmitExpr(ssaTab)); switchNode->SetSrcPos(GetSrcPosition()); - return switchNode; + return *switchNode; } -StmtNode *CommentMeStmt::EmitStmt(SSATab *ssaTab) { - CommentNode *commentNode = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(&(ssaTab->mirModule)); +StmtNode &CommentMeStmt::EmitStmt(SSATab &ssaTab) { + CommentNode *commentNode = + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(&(ssaTab.GetModule())); commentNode->SetComment(comment); commentNode->SetSrcPos(GetSrcPosition()); - return commentNode; + return *commentNode; } -StmtNode *ThrowMeStmt::EmitStmt(SSATab *ssaTab) { - UnaryStmtNode *unaryStmt = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(OP_throw); - unaryStmt->SetOpnd(opnd->EmitExpr(ssaTab), 0); +StmtNode &ThrowMeStmt::EmitStmt(SSATab &ssaTab) { + UnaryStmtNode *unaryStmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(OP_throw); + unaryStmt->SetOpnd(&opnd->EmitExpr(ssaTab), 0); unaryStmt->SetSrcPos(GetSrcPosition()); - return unaryStmt; + return *unaryStmt; } -StmtNode *GosubMeStmt::EmitStmt(SSATab *ssaTab) { - GotoNode *gosubNode = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(OP_gosub); +StmtNode &GosubMeStmt::EmitStmt(SSATab &ssaTab) { + GotoNode *gosubNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(OP_gosub); gosubNode->SetOffset(offset); gosubNode->SetSrcPos(GetSrcPosition()); - return gosubNode; + return *gosubNode; } -StmtNode *AssertMeStmt::EmitStmt(SSATab *ssaTab) { - AssertStmtNode *assertStmt = ssaTab->mirModule.CurFunction()->GetCodeMempool()->New(Opcode(GetOp())); - assertStmt->SetBOpnd(opnds[0]->EmitExpr(ssaTab), 0); - assertStmt->SetBOpnd(opnds[1]->EmitExpr(ssaTab), 1); +StmtNode &AssertMeStmt::EmitStmt(SSATab &ssaTab) { + AssertStmtNode *assertStmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp())); + assertStmt->SetBOpnd(&opnds[0]->EmitExpr(ssaTab), 0); + assertStmt->SetBOpnd(&opnds[1]->EmitExpr(ssaTab), 1); assertStmt->SetSrcPos(GetSrcPosition()); - return assertStmt; + return *assertStmt; } - } // namespace maple diff --git a/src/maple_me/src/me_alias_class.cpp b/src/maple_me/src/me_alias_class.cpp index 17b4586f21beb4e217c395be80ea10159e0a7e59..6a37a4bab89f6f83cfd05744a3a2eaf50ca402ae 100644 --- a/src/maple_me/src/me_alias_class.cpp +++ b/src/maple_me/src/me_alias_class.cpp @@ -25,13 +25,13 @@ namespace maple { // This phase performs alias analysis based on Steensgaard's algorithm and // represent the resulting alias relationships in the Maple IR representation bool MeAliasClass::HasWriteToStaticFinal() const { - auto eIt = func->valid_end(); - for (auto bIt = func->valid_begin(); bIt != eIt; ++bIt) { + auto eIt = func.valid_end(); + for (auto bIt = func.valid_begin(); bIt != eIt; ++bIt) { for (auto &stmt : (*bIt)->GetStmtNodes()) { if (stmt.GetOpCode() == OP_dassign) { DassignNode &dass = static_cast(stmt); if (dass.GetStIdx().IsGlobal()) { - MIRSymbol *sym = mirModule->CurFunction()->GetLocalOrGlobalSymbol(dass.GetStIdx()); + MIRSymbol *sym = mirModule.CurFunction()->GetLocalOrGlobalSymbol(dass.GetStIdx()); if (sym->IsFinal()) { return true; } @@ -49,8 +49,8 @@ AnalysisResult *MeDoAliasClass::Run(MeFunction *func, MeFuncResultMgr *m, Module MemPool *aliasClassMp = NewMemPool(); KlassHierarchy *kh = static_cast(mrm->GetAnalysisResult(MoPhase_CHA, &func->GetMIRModule())); MeAliasClass *aliasClass = aliasClassMp->New( - aliasClassMp, &func->GetMIRModule(), func->GetMeSSATab(), func, MeOptions::lessThrowAlias, - MeOptions::finalFieldAlias, MeOptions::ignoreIPA, DEBUGFUNC(func), MeOptions::setCalleeHasSideEffect, kh); + *aliasClassMp, func->GetMIRModule(), *func->GetMeSSATab(), *func, MeOption::lessThrowAlias, + MeOption::finalFieldAlias, MeOption::ignoreIPA, DEBUGFUNC(func), MeOption::setCalleeHasSideEffect, kh); // pass 1 through the program statements if (DEBUGFUNC(func)) { LogInfo::MapleLogger() << "\n============ Alias Classification Pass 1 ============" << std::endl; @@ -58,7 +58,7 @@ AnalysisResult *MeDoAliasClass::Run(MeFunction *func, MeFuncResultMgr *m, Module auto eIt = func->valid_end(); for (auto bIt = func->valid_begin(); bIt != eIt; ++bIt) { for (auto &stmt : (*bIt)->GetStmtNodes()) { - aliasClass->ApplyUnionForCopies(&stmt); + aliasClass->ApplyUnionForCopies(stmt); } } aliasClass->CreateAssignSets(); @@ -66,14 +66,14 @@ AnalysisResult *MeDoAliasClass::Run(MeFunction *func, MeFuncResultMgr *m, Module aliasClass->DumpAssignSets(); } aliasClass->ReinitUnionFind(); - if (MeOptions::noSteensgaard) { + if (MeOption::noSteensgaard) { aliasClass->UnionAllPointedTos(); } else { aliasClass->ApplyUnionForPointedTos(); aliasClass->UnionForNotAllDefsSeen(); } // TBAA - if (!MeOptions::noTBAA) { + if (!MeOption::noTBAA) { aliasClass->ReconstructAliasGroups(); } aliasClass->CreateClassSets(); @@ -89,7 +89,7 @@ AnalysisResult *MeDoAliasClass::Run(MeFunction *func, MeFuncResultMgr *m, Module for (auto bIt = func->valid_begin(); bIt != eIt; ++bIt) { auto *bb = *bIt; for (auto &stmt : bb->GetStmtNodes()) { - aliasClass->GenericInsertMayDefUse(&stmt, bb->GetBBId()); + aliasClass->GenericInsertMayDefUse(stmt, bb->GetBBId()); } } timer.Stop(); @@ -99,5 +99,4 @@ AnalysisResult *MeDoAliasClass::Run(MeFunction *func, MeFuncResultMgr *m, Module } return aliasClass; } - } // namespace maple diff --git a/src/maple_me/src/me_bb_layout.cpp b/src/maple_me/src/me_bb_layout.cpp index 34a7ecb8b843b3067bdcf281ed08f509d0372b91..e7d00f1b2f38a5290b02433c29a84f9d4ef9cfbd 100644 --- a/src/maple_me/src/me_bb_layout.cpp +++ b/src/maple_me/src/me_bb_layout.cpp @@ -35,46 +35,46 @@ // 5. do step 3 for nextBB until all bbs are laid out namespace maple { -static void CreateGoto(BB *bb, MeFunction *func, BB *fallthru) { - if (fallthru->GetBBLabel() == 0) { - func->CreateBBLabel(fallthru); +static void CreateGoto(BB &bb, MeFunction &func, BB &fallthru) { + if (fallthru.GetBBLabel() == 0) { + func.CreateBBLabel(&fallthru); } - if (func->GetIRMap() != nullptr) { + if (func.GetIRMap() != nullptr) { GotoNode stmt(OP_goto); - GotoMeStmt *newGoto = func->GetIRMap()->New(&stmt); - newGoto->SetOffset(fallthru->GetBBLabel()); - bb->AddMeStmtLast(newGoto); + GotoMeStmt *newGoto = func.GetIRMap()->New(&stmt); + newGoto->SetOffset(fallthru.GetBBLabel()); + bb.AddMeStmtLast(newGoto); } else { - GotoNode *newGoto = func->GetMirFunc()->GetCodeMempool()->New(OP_goto); - newGoto->SetOffset(fallthru->GetBBLabel()); - bb->AddStmtNode(newGoto); + GotoNode *newGoto = func.GetMirFunc()->GetCodeMempool()->New(OP_goto); + newGoto->SetOffset(fallthru.GetBBLabel()); + bb.AddStmtNode(newGoto); } - bb->SetKind(kBBGoto); + bb.SetKind(kBBGoto); } // return true if bb is empty and its kind is fallthru. -bool BBLayout::BBEmptyAndFallthru(const BB *bb) { - if (bb->GetAttributes(kBBAttrIsTryEnd)) { +bool BBLayout::BBEmptyAndFallthru(const BB &bb) { + if (bb.GetAttributes(kBBAttrIsTryEnd)) { return false; } - if (bb->GetKind() == kBBFallthru) { - if (func->GetIRMap() != nullptr) { - return bb->IsMeStmtEmpty(); + if (bb.GetKind() == kBBFallthru) { + if (func.GetIRMap() != nullptr) { + return bb.IsMeStmtEmpty(); } else { - return bb->IsEmpty(); + return bb.IsEmpty(); } } return false; } // Return true if bb only has conditonal branch stmt except comment -bool BBLayout::BBContainsOnlyCondGoto(BB *bb) { - if (bb->GetAttributes(kBBAttrIsTryEnd)) { +bool BBLayout::BBContainsOnlyCondGoto(BB &bb) { + if (bb.GetAttributes(kBBAttrIsTryEnd)) { return false; } - if (bb->GetKind() == kBBCondGoto) { - if (func->GetIRMap() != nullptr) { - auto &meStmts = bb->GetMeStmts(); + if (bb.GetKind() == kBBCondGoto) { + if (func.GetIRMap() != nullptr) { + auto &meStmts = bb.GetMeStmts(); if (meStmts.empty()) { return false; } @@ -85,17 +85,17 @@ bool BBLayout::BBContainsOnlyCondGoto(BB *bb) { } return (meStmts.back().IsCondBr()); } else { - StmtNode *stmt = bb->GetStmtNodes().begin().d(); + StmtNode *stmt = bb.GetStmtNodes().begin().d(); if (stmt == nullptr) { return false; } - auto &stmtNodes = bb->GetStmtNodes(); + auto &stmtNodes = bb.GetStmtNodes(); for (auto itStmt = stmtNodes.begin(); itStmt != stmtNodes.rbegin().base(); ++itStmt) { if (!itStmt->IsCondBr() && itStmt->GetOpCode() != OP_comment) { return false; } } - return (bb->GetStmtNodes().back().IsCondBr()); + return (bb.GetStmtNodes().back().IsCondBr()); } } return false; @@ -135,13 +135,13 @@ static Opcode GetOppositeOp(Opcode opc1) { return opc; } -bool BBLayout::BBContainsOnlyGoto(BB *bb) { - if (bb->GetAttributes(kBBAttrIsTryEnd)) { +bool BBLayout::BBContainsOnlyGoto(BB &bb) { + if (bb.GetAttributes(kBBAttrIsTryEnd)) { return false; } - if (bb->GetKind() == kBBGoto) { - if (func->GetIRMap() != nullptr) { - auto &meStmts = bb->GetMeStmts(); + if (bb.GetKind() == kBBGoto) { + if (func.GetIRMap() != nullptr) { + auto &meStmts = bb.GetMeStmts(); if (meStmts.empty()) { return false; } @@ -152,18 +152,18 @@ bool BBLayout::BBContainsOnlyGoto(BB *bb) { } return meStmts.back().GetOp() == OP_goto; } else { - StmtNode *stmt = bb->GetStmtNodes().begin().d(); + StmtNode *stmt = bb.GetStmtNodes().begin().d(); if (stmt == nullptr) { return false; } - auto &stmtNodes = bb->GetStmtNodes(); + auto &stmtNodes = bb.GetStmtNodes(); for (auto itStmt = stmtNodes.begin(); itStmt != stmtNodes.rbegin().base(); ++itStmt) { if (itStmt->GetOpCode() != OP_goto && itStmt->GetOpCode() != OP_comment) { return false; } } - return bb->GetStmtNodes().back().GetOpCode() == OP_goto; + return bb.GetStmtNodes().back().GetOpCode() == OP_goto; } } return false; @@ -176,26 +176,26 @@ bool BBLayout::BBContainsOnlyGoto(BB *bb) { // toafter_bb are both not in try block. // The other case is fromBB has one predecessor and one successor and // contains only goto stmt. -bool BBLayout::BBCanBeMoved(BB *fromBB, const BB *toAfterBB) { - if (fromBB->GetPred().size() > 1) { +bool BBLayout::BBCanBeMoved(BB &fromBB, const BB &toAfterBB) { + if (fromBB.GetPred().size() > 1) { return false; } - if (laidOut[fromBB->GetBBId().idx]) { + if (laidOut[fromBB.GetBBId().idx]) { return false; } - if (fromBB->GetAttributes(kBBAttrArtificial) || - (!fromBB->GetAttributes(kBBAttrIsTry) && !toAfterBB->GetAttributes(kBBAttrIsTry))) { - return fromBB->GetSucc().size() == 1; + if (fromBB.GetAttributes(kBBAttrArtificial) || + (!fromBB.GetAttributes(kBBAttrIsTry) && !toAfterBB.GetAttributes(kBBAttrIsTry))) { + return fromBB.GetSucc().size() == 1; } return BBContainsOnlyGoto(fromBB); } // Return true if bb1 and bb2 has the branch conditon.such as // bb1 : brfalse (a > 3) bb2: brfalse (a > 3)/ brtrue (a <= 3) -bool BBLayout::HasSameBranchCond(BB *bb1, BB *bb2) { - if (func->GetIRMap() != nullptr) { - CondGotoMeStmt &meStmt1 = static_cast(bb1->GetMeStmts().back()); - CondGotoMeStmt &meStmt2 = static_cast(bb2->GetMeStmts().back()); +bool BBLayout::HasSameBranchCond(BB &bb1, BB &bb2) { + if (func.GetIRMap() != nullptr) { + CondGotoMeStmt &meStmt1 = static_cast(bb1.GetMeStmts().back()); + CondGotoMeStmt &meStmt2 = static_cast(bb2.GetMeStmts().back()); MeExpr *expr1 = meStmt1.GetOpnd(); MeExpr *expr2 = meStmt2.GetOpnd(); // Compare the opcode. @@ -218,8 +218,8 @@ bool BBLayout::HasSameBranchCond(BB *bb1, BB *bb2) { return false; } } else { - CondGotoNode &stmt1 = static_cast(bb1->GetStmtNodes().back()); - CondGotoNode &stmt2 = static_cast(bb2->GetStmtNodes().back()); + CondGotoNode &stmt1 = static_cast(bb1.GetStmtNodes().back()); + CondGotoNode &stmt2 = static_cast(bb2.GetStmtNodes().back()); if (stmt1.GetOpCode() != stmt2.GetOpCode() && stmt1.GetOpCode() != GetOppositeOp(stmt2.GetOpCode())) { return false; } @@ -248,9 +248,9 @@ bool BBLayout::HasSameBranchCond(BB *bb1, BB *bb2) { // (2) bb's last statement is a conditonal branch, if the branch target is a BB with a single // condtioal branch statement and has the same condtion as bb's last statement, optimize the // branch target to the eventual target. -void BBLayout::OptimizeBranchTarget(BB *bb) { - if (func->GetIRMap() != nullptr) { - auto &meStmts = bb->GetMeStmts(); +void BBLayout::OptimizeBranchTarget(BB &bb) { + if (func.GetIRMap() != nullptr) { + auto &meStmts = bb.GetMeStmts(); if (meStmts.empty()) { return; } @@ -258,7 +258,7 @@ void BBLayout::OptimizeBranchTarget(BB *bb) { return; } } else { - auto &stmtNodes = bb->GetStmtNodes(); + auto &stmtNodes = bb.GetStmtNodes(); if (stmtNodes.rbegin().base().d() == nullptr) { return; } @@ -267,17 +267,17 @@ void BBLayout::OptimizeBranchTarget(BB *bb) { } } start_: - ASSERT(!bb->GetSucc().empty(), "container check"); - BB *brTargetBB = bb->GetSucc(0); - if (bb->GetKind() == kBBCondGoto) { - brTargetBB = bb->GetSucc(1); + ASSERT(!bb.GetSucc().empty(), "container check"); + BB *brTargetBB = bb.GetSucc(0); + if (bb.GetKind() == kBBCondGoto) { + brTargetBB = bb.GetSucc(1); } if (brTargetBB->GetAttributes(kBBAttrWontExit)) { return; } - if (!BBContainsOnlyGoto(brTargetBB) && !BBEmptyAndFallthru(brTargetBB) && - !(bb->GetKind() == kBBCondGoto && brTargetBB->GetKind() == kBBCondGoto && bb != brTargetBB && - BBContainsOnlyCondGoto(brTargetBB) && HasSameBranchCond(bb, brTargetBB))) { + if (!BBContainsOnlyGoto(*brTargetBB) && !BBEmptyAndFallthru(*brTargetBB) && + !(bb.GetKind() == kBBCondGoto && brTargetBB->GetKind() == kBBCondGoto && &bb != brTargetBB && + BBContainsOnlyCondGoto(*brTargetBB) && HasSameBranchCond(bb, *brTargetBB))) { return; } // optimize stmt @@ -286,11 +286,11 @@ start_: newTargetBB = brTargetBB->GetSucc(1); } if (newTargetBB->GetBBLabel() == 0) { - func->CreateBBLabel(newTargetBB); + func.CreateBBLabel(newTargetBB); } LabelIdx newTargetLabel = newTargetBB->GetBBLabel(); - if (func->GetIRMap() != nullptr) { - auto &lastStmt = bb->GetMeStmts().back(); + if (func.GetIRMap() != nullptr) { + auto &lastStmt = bb.GetMeStmts().back(); if (lastStmt.GetOp() == OP_goto) { GotoMeStmt &gotoMeStmt = static_cast(lastStmt); ASSERT(brTargetBB->GetBBLabel() == gotoMeStmt.GetOffset(), "OptimizeBranchTarget: wrong branch target BB"); @@ -301,7 +301,7 @@ start_: gotoMeStmt.SetOffset(newTargetLabel); } } else { - StmtNode &lastStmt = bb->GetStmtNodes().back(); + StmtNode &lastStmt = bb.GetStmtNodes().back(); if (lastStmt.GetOpCode() == OP_goto) { GotoNode &gotoNode = static_cast(lastStmt); ASSERT(brTargetBB->GetBBLabel() == gotoNode.GetOffset(), "OptimizeBranchTarget: wrong branch target BB"); @@ -313,13 +313,13 @@ start_: } } // update CFG - if (bb->GetKind() == kBBCondGoto) { - bb->SetSucc(1, newTargetBB); + if (bb.GetKind() == kBBCondGoto) { + bb.SetSucc(1, newTargetBB); } else { - bb->SetSucc(0, newTargetBB); + bb.SetSucc(0, newTargetBB); } - newTargetBB->GetPred().push_back(bb); - bb->RemoveBBFromVector(brTargetBB->GetPred()); + newTargetBB->GetPred().push_back(&bb); + bb.RemoveBBFromVector(brTargetBB->GetPred()); if (brTargetBB->GetPred().empty() && !laidOut[brTargetBB->GetBBId().idx]) { laidOut[brTargetBB->GetBBId().idx] = true; brTargetBB->RemoveBBFromVector(newTargetBB->GetPred()); @@ -327,44 +327,44 @@ start_: goto start_; // repeat until no more opportunity } -void BBLayout::AddBB(BB *bb) { - CHECK_FATAL(bb->GetBBId().idx < laidOut.size(), "index oout of range in BBLayout::AddBB"); - ASSERT(!laidOut[bb->GetBBId().idx], "AddBB: bb already laid out"); - layoutBBs.push_back(bb); - CHECK_FATAL(bb->GetBBId().idx < laidOut.size(), "index out of range in BBLayout::AddBB"); - laidOut[bb->GetBBId().idx] = true; - if (DEBUGFUNC(func)) { - LogInfo::MapleLogger() << "bb id " << bb->GetBBId().idx << " kind is " << bb->StrAttribute(); +void BBLayout::AddBB(BB &bb) { + CHECK_FATAL(bb.GetBBId().idx < laidOut.size(), "index oout of range in BBLayout::AddBB"); + ASSERT(!laidOut[bb.GetBBId().idx], "AddBB: bb already laid out"); + layoutBBs.push_back(&bb); + CHECK_FATAL(bb.GetBBId().idx < laidOut.size(), "index out of range in BBLayout::AddBB"); + laidOut[bb.GetBBId().idx] = true; + if (DEBUGFUNC((&func))) { + LogInfo::MapleLogger() << "bb id " << bb.GetBBId().idx << " kind is " << bb.StrAttribute(); } bool isTry = false; - if (func->GetIRMap() != nullptr) { - isTry = !bb->GetMeStmts().empty() && bb->GetMeStmts().front().GetOp() == OP_try; + if (func.GetIRMap() != nullptr) { + isTry = !bb.GetMeStmts().empty() && bb.GetMeStmts().front().GetOp() == OP_try; } else { - isTry = !bb->GetStmtNodes().empty() && bb->GetStmtNodes().front().GetOpCode() == OP_try; + isTry = !bb.GetStmtNodes().empty() && bb.GetStmtNodes().front().GetOpCode() == OP_try; } if (isTry) { ASSERT(!tryOutstanding, "BBLayout::AddBB: cannot lay out another try without ending the last one"); tryOutstanding = true; - if (DEBUGFUNC(func)) { + if (DEBUGFUNC((&func))) { LogInfo::MapleLogger() << " try"; } } - if (bb->GetAttributes(kBBAttrIsTryEnd) && func->GetMIRModule().IsJavaModule()) { + if (bb.GetAttributes(kBBAttrIsTryEnd) && func.GetMIRModule().IsJavaModule()) { tryOutstanding = false; - if (DEBUGFUNC(func)) { + if (DEBUGFUNC((&func))) { LogInfo::MapleLogger() << " endtry"; } } - if (DEBUGFUNC(func)) { + if (DEBUGFUNC((&func))) { LogInfo::MapleLogger() << std::endl; } return; } -BB *BBLayout::GetFallThruBBSkippingEmpty(BB *bb) { - ASSERT(bb->GetKind() == kBBFallthru || bb->GetKind() == kBBCondGoto, "GetFallThruSkippingEmpty: unexpected BB kind"); - ASSERT(!bb->GetSucc().empty(), "container check"); - BB *fallthru = bb->GetSucc().front(); +BB *BBLayout::GetFallThruBBSkippingEmpty(BB &bb) { + ASSERT(bb.GetKind() == kBBFallthru || bb.GetKind() == kBBCondGoto, "GetFallThruSkippingEmpty: unexpected BB kind"); + ASSERT(!bb.GetSucc().empty(), "container check"); + BB *fallthru = bb.GetSucc().front(); do { if (fallthru->GetPred().size() > 1) { return fallthru; @@ -372,7 +372,7 @@ BB *BBLayout::GetFallThruBBSkippingEmpty(BB *bb) { if (fallthru->GetAttributes(kBBAttrIsTryEnd)) { return fallthru; } - if (func->GetIRMap() != nullptr) { + if (func.GetIRMap() != nullptr) { if (!fallthru->IsMeStmtEmpty()) { return fallthru; } @@ -382,42 +382,42 @@ BB *BBLayout::GetFallThruBBSkippingEmpty(BB *bb) { } } laidOut[fallthru->GetBBId().idx] = true; - fallthru->RemoveBBFromPred(bb); + fallthru->RemoveBBFromPred(&bb); BB *oldFallthru = fallthru; fallthru = oldFallthru->GetSucc().front(); - bb->ReplaceSucc(oldFallthru, fallthru); + bb.ReplaceSucc(oldFallthru, fallthru); } while (true); } // bb end with a goto statement; remove the goto stmt if its target // is its fallthru nextBB. -void BBLayout::ChangeToFallthruFromGoto(BB *bb) { - ASSERT(bb->GetKind() == kBBGoto, "ChangeToFallthruFromGoto: unexpected BB kind"); - if (func->GetIRMap() != nullptr) { - bb->RemoveMeStmt(to_ptr(bb->GetMeStmts().rbegin())); +void BBLayout::ChangeToFallthruFromGoto(BB &bb) { + ASSERT(bb.GetKind() == kBBGoto, "ChangeToFallthruFromGoto: unexpected BB kind"); + if (func.GetIRMap() != nullptr) { + bb.RemoveMeStmt(to_ptr(bb.GetMeStmts().rbegin())); } else { - bb->RemoveLastStmt(); + bb.RemoveLastStmt(); } - bb->SetKind(kBBFallthru); + bb.SetKind(kBBFallthru); } // bb does not end with a branch statement; if its fallthru is not nextBB, // perform the fix by either laying out the fallthru immediately or adding a goto -void BBLayout::ResolveUnconditionalFallThru(BB *bb, BB *nextBB) { - ASSERT(bb->GetKind() == kBBFallthru || bb->GetKind() == kBBGoto, "ResolveUnconditionalFallThru: unexpected BB kind"); - if (bb->GetKind() == kBBGoto) { +void BBLayout::ResolveUnconditionalFallThru(BB &bb, BB &nextBB) { + ASSERT(bb.GetKind() == kBBFallthru || bb.GetKind() == kBBGoto, "ResolveUnconditionalFallThru: unexpected BB kind"); + if (bb.GetKind() == kBBGoto) { return; } - ASSERT(bb->GetAttributes(kBBAttrIsTry) || bb->GetAttributes(kBBAttrWontExit) || bb->GetSucc().size() == 1, + ASSERT(bb.GetAttributes(kBBAttrIsTry) || bb.GetAttributes(kBBAttrWontExit) || bb.GetSucc().size() == 1, "runtime check error"); BB *fallthru = GetFallThruBBSkippingEmpty(bb); - if (fallthru != nextBB) { - if (BBCanBeMoved(fallthru, bb)) { - AddBB(fallthru); - ResolveUnconditionalFallThru(fallthru, nextBB); - OptimizeBranchTarget(fallthru); + if (fallthru != &nextBB) { + if (BBCanBeMoved(*fallthru, bb)) { + AddBB(*fallthru); + ResolveUnconditionalFallThru(*fallthru, nextBB); + OptimizeBranchTarget(*fallthru); } else { - CreateGoto(bb, func, fallthru); + CreateGoto(bb, func, *fallthru); OptimizeBranchTarget(bb); } } @@ -426,14 +426,14 @@ void BBLayout::ResolveUnconditionalFallThru(BB *bb, BB *nextBB) { AnalysisResult *MeDoBBLayout::Run(MeFunction *func, MeFuncResultMgr *m, ModuleResultMgr *mrm) { // mempool used in analysisresult MemPool *layoutMp = NewMemPool(); - BBLayout *bbLayout = layoutMp->New(layoutMp, func); + BBLayout *bbLayout = layoutMp->New(*layoutMp, *func); // assume common_entry_bb is always bb 0 ASSERT(func->front() == func->GetCommonEntryBB(), "assume bb[0] is the commont entry bb"); BB *bb = func->GetFirstBB(); while (bb != nullptr) { - bbLayout->AddBB(bb); + bbLayout->AddBB(*bb); if (bb->GetKind() == kBBCondGoto || bb->GetKind() == kBBGoto) { - bbLayout->OptimizeBranchTarget(bb); + bbLayout->OptimizeBranchTarget(*bb); } BB *nextBB = bbLayout->NextBB(); if (nextBB != nullptr) { @@ -454,11 +454,11 @@ AnalysisResult *MeDoBBLayout::Run(MeFunction *func, MeFuncResultMgr *m, ModuleRe } // based on nextBB, may need to fix current bb's fall-thru if (bb->GetKind() == kBBFallthru) { - bbLayout->ResolveUnconditionalFallThru(bb, nextBB); + bbLayout->ResolveUnconditionalFallThru(*bb, *nextBB); } else if (bb->GetKind() == kBBCondGoto) { - BB *fallthru = bbLayout->GetFallThruBBSkippingEmpty(bb); + BB *fallthru = bbLayout->GetFallThruBBSkippingEmpty(*bb); BB *brTargetBB = bb->GetSucc(1); - if (brTargetBB != fallthru && fallthru->GetPred().size() > 1 && bbLayout->BBCanBeMoved(brTargetBB, bb)) { + if (brTargetBB != fallthru && fallthru->GetPred().size() > 1 && bbLayout->BBCanBeMoved(*brTargetBB, *bb)) { // flip the sense of the condgoto and lay out brTargetBB right here if (fallthru->GetBBLabel() == 0) { func->CreateBBLabel(fallthru); @@ -474,14 +474,14 @@ AnalysisResult *MeDoBBLayout::Run(MeFunction *func, MeFuncResultMgr *m, ModuleRe condGotoNode.SetOffset(fallthru->GetBBLabel()); condGotoNode.SetOpCode((condGotoNode.GetOpCode() == OP_brtrue) ? OP_brfalse : OP_brtrue); } - bbLayout->AddBB(brTargetBB); - bbLayout->ResolveUnconditionalFallThru(brTargetBB, nextBB); - bbLayout->OptimizeBranchTarget(brTargetBB); + bbLayout->AddBB(*brTargetBB); + bbLayout->ResolveUnconditionalFallThru(*brTargetBB, *nextBB); + bbLayout->OptimizeBranchTarget(*brTargetBB); } else if (fallthru != nextBB) { - if (bbLayout->BBCanBeMoved(fallthru, bb)) { - bbLayout->AddBB(fallthru); - bbLayout->ResolveUnconditionalFallThru(fallthru, nextBB); - bbLayout->OptimizeBranchTarget(fallthru); + if (bbLayout->BBCanBeMoved(*fallthru, *bb)) { + bbLayout->AddBB(*fallthru); + bbLayout->ResolveUnconditionalFallThru(*fallthru, *nextBB); + bbLayout->OptimizeBranchTarget(*fallthru); } else { // create a new fallthru that contains a goto to the original fallthru BB *newFallthru = func->NewBasicBlock(); @@ -513,8 +513,8 @@ AnalysisResult *MeDoBBLayout::Run(MeFunction *func, MeFuncResultMgr *m, ModuleRe if (DEBUGFUNC(func)) { LogInfo::MapleLogger() << "Created fallthru and goto original fallthru" << std::endl; } - bbLayout->AddBB(newFallthru); - bbLayout->OptimizeBranchTarget(newFallthru); + bbLayout->AddBB(*newFallthru); + bbLayout->OptimizeBranchTarget(*newFallthru); } } } @@ -523,20 +523,20 @@ AnalysisResult *MeDoBBLayout::Run(MeFunction *func, MeFuncResultMgr *m, ModuleRe BB *gotoTarget = bb->GetSucc().front(); CHECK_FATAL(gotoTarget != nullptr, "null ptr check"); - if (gotoTarget != nextBB && bbLayout->BBCanBeMoved(gotoTarget, bb)) { - bbLayout->AddBB(gotoTarget); - bbLayout->ChangeToFallthruFromGoto(bb); - bbLayout->ResolveUnconditionalFallThru(gotoTarget, nextBB); - bbLayout->OptimizeBranchTarget(gotoTarget); + if (gotoTarget != nextBB && bbLayout->BBCanBeMoved(*gotoTarget, *bb)) { + bbLayout->AddBB(*gotoTarget); + bbLayout->ChangeToFallthruFromGoto(*bb); + bbLayout->ResolveUnconditionalFallThru(*gotoTarget, *nextBB); + bbLayout->OptimizeBranchTarget(*gotoTarget); } else if (gotoTarget->GetKind() == kBBCondGoto && gotoTarget->GetPred().size() == 1) { BB *targetNext = gotoTarget->GetSucc().front(); - if (targetNext != nextBB && bbLayout->BBCanBeMoved(targetNext, bb)) { - bbLayout->AddBB(gotoTarget); - bbLayout->ChangeToFallthruFromGoto(bb); - bbLayout->OptimizeBranchTarget(gotoTarget); - bbLayout->AddBB(targetNext); - bbLayout->ResolveUnconditionalFallThru(targetNext, nextBB); - bbLayout->OptimizeBranchTarget(targetNext); + if (targetNext != nextBB && bbLayout->BBCanBeMoved(*targetNext, *bb)) { + bbLayout->AddBB(*gotoTarget); + bbLayout->ChangeToFallthruFromGoto(*bb); + bbLayout->OptimizeBranchTarget(*gotoTarget); + bbLayout->AddBB(*targetNext); + bbLayout->ResolveUnconditionalFallThru(*targetNext, *nextBB); + bbLayout->OptimizeBranchTarget(*targetNext); } } } @@ -553,5 +553,4 @@ AnalysisResult *MeDoBBLayout::Run(MeFunction *func, MeFuncResultMgr *m, ModuleRe } return bbLayout; } - } // namespace maple diff --git a/src/maple_me/src/me_cfg.cpp b/src/maple_me/src/me_cfg.cpp index e5f8b7ead6143d7e581530ce980b9b2c2c1ef58b..cb3464bbf10773fa6506e0f1338d8d2d8f459bfe 100644 --- a/src/maple_me/src/me_cfg.cpp +++ b/src/maple_me/src/me_cfg.cpp @@ -21,14 +21,18 @@ #include "me_irmap.h" #include "mir_builder.h" +namespace { +constexpr int kFuncNameLenLimit = 80; +} + namespace maple { -void MirCFG::BuildMirCFG() { - MapleVector entryBlocks(func->GetAlloc().Adapter()); - MapleVector exitBlocks(func->GetAlloc().Adapter()); - auto eIt = func->valid_end(); - for (auto bIt = func->valid_begin(); bIt != eIt; ++bIt) { - if (bIt == func->common_entry() || bIt == func->common_exit()) { +void MeCFG::BuildMirCFG() { + MapleVector entryBlocks(func.GetAlloc().Adapter()); + MapleVector exitBlocks(func.GetAlloc().Adapter()); + auto eIt = func.valid_end(); + for (auto bIt = func.valid_begin(); bIt != eIt; ++bIt) { + if (bIt == func.common_entry() || bIt == func.common_exit()) { continue; } BB *bb = *bIt; @@ -49,7 +53,7 @@ void MirCFG::BuildMirCFG() { ASSERT(lastStmt.GetOpCode() == OP_goto, "runtime check error"); GotoNode &gotoStmt = static_cast(lastStmt); LabelIdx lblIdx = (LabelIdx)gotoStmt.GetOffset(); - BB *meBB = func->GetLabelBBIdMap()[lblIdx]; + BB *meBB = func.GetLabelBBIdMap()[lblIdx]; bb->GetSucc().push_back(meBB); meBB->GetPred().push_back(bb); break; @@ -66,7 +70,7 @@ void MirCFG::BuildMirCFG() { /* link goto */ CondGotoNode &gotoStmt = static_cast(lastStmt); LabelIdx lblIdx = (LabelIdx)gotoStmt.GetOffset(); - BB *meBB = func->GetLabelBBIdMap()[lblIdx]; + BB *meBB = func.GetLabelBBIdMap()[lblIdx]; bb->GetSucc().push_back(meBB); meBB->GetPred().push_back(bb); break; @@ -76,12 +80,12 @@ void MirCFG::BuildMirCFG() { ASSERT(lastStmt.GetOpCode() == OP_switch, "runtime check error"); SwitchNode &switchStmt = static_cast(lastStmt); LabelIdx lblIdx = switchStmt.GetDefaultLabel(); - BB *mirBB = func->GetLabelBBIdMap()[lblIdx]; + BB *mirBB = func.GetLabelBBIdMap()[lblIdx]; bb->GetSucc().push_back(mirBB); mirBB->GetPred().push_back(bb); for (size_t j = 0; j < switchStmt.GetSwitchTable().size(); j++) { lblIdx = switchStmt.GetCasePair(j).second; - BB *meBB = func->GetLabelBBIdMap()[lblIdx]; + BB *meBB = func.GetLabelBBIdMap()[lblIdx]; // Avoid duplicate succs. auto it = std::find(bb->GetSucc().begin(), bb->GetSucc().end(), meBB); if (it == bb->GetSucc().end()) { @@ -106,15 +110,15 @@ void MirCFG::BuildMirCFG() { } /* deal try blocks, add catch handler to try's succ */ if (bb->GetAttributes(kBBAttrIsTry)) { - ASSERT((func->GetBBTryNodeMap().find(bb) != func->GetBBTryNodeMap().end()), "try bb without try"); - StmtNode *currTry = func->GetBBTryNodeMap()[bb]; + ASSERT((func.GetBBTryNodeMap().find(bb) != func.GetBBTryNodeMap().end()), "try bb without try"); + StmtNode *currTry = func.GetBBTryNodeMap()[bb]; TryNode *tryNode = static_cast(currTry); bool hasFinallyHandler = false; /* add exception handler bb */ for (size_t j = 0; j < tryNode->GetOffsetsCount(); j++) { LabelIdx labelIdx = tryNode->GetOffset(j); - ASSERT(func->GetLabelBBIdMap().find(labelIdx) != func->GetLabelBBIdMap().end(), "runtime check error"); - BB *meBB = func->GetLabelBBIdMap()[labelIdx]; + ASSERT(func.GetLabelBBIdMap().find(labelIdx) != func.GetLabelBBIdMap().end(), "runtime check error"); + BB *meBB = func.GetLabelBBIdMap()[labelIdx]; ASSERT(meBB != nullptr, "null ptr check"); ASSERT(meBB->GetAttributes(kBBAttrIsCatch), "runtime check error"); size_t si = 0; @@ -138,7 +142,7 @@ void MirCFG::BuildMirCFG() { bb->SetAttributes(kBBAttrIsExit); // may exit exitBlocks.push_back(bb); } - } else if ((func->GetMIRModule().GetSrcLang() == kSrcLangJava) && bb->GetAttributes(kBBAttrIsExit)) { + } else if ((func.GetMIRModule().GetSrcLang() == kSrcLangJava) && bb->GetAttributes(kBBAttrIsExit)) { // deal with throw bb, if throw bb in a tryblock and has finallyhandler auto &stmtNodes = bb->GetStmtNodes(); if (!stmtNodes.empty() && stmtNodes.back().GetOpCode() == OP_throw) { @@ -151,23 +155,23 @@ void MirCFG::BuildMirCFG() { } // merge all blocks in entryBlocks for (auto it = entryBlocks.begin(); it != entryBlocks.end(); ++it) { - func->GetCommonEntryBB()->GetSucc().push_back(*it); + func.GetCommonEntryBB()->GetSucc().push_back(*it); } // merge all blocks in exitBlocks for (auto it = exitBlocks.begin(); it != exitBlocks.end(); ++it) { - func->GetCommonExitBB()->GetPred().push_back(*it); + func.GetCommonExitBB()->GetPred().push_back(*it); } } -bool MirCFG::FindExprUse(BaseNode *expr, StIdx stIdx) { - if (expr->GetOpCode() == OP_addrof || expr->GetOpCode() == OP_dread) { - AddrofNode *addofNode = static_cast(expr); - return addofNode->GetStIdx() == stIdx; - } else if (expr->GetOpCode() == OP_iread) { - return FindExprUse(expr->Opnd(0), stIdx); +bool MeCFG::FindExprUse(BaseNode &expr, StIdx stIdx) { + if (expr.GetOpCode() == OP_addrof || expr.GetOpCode() == OP_dread) { + AddrofNode &addofNode = static_cast(expr); + return addofNode.GetStIdx() == stIdx; + } else if (expr.GetOpCode() == OP_iread) { + return FindExprUse(*expr.Opnd(0), stIdx); } else { - for (size_t i = 0; i < expr->NumOpnds(); i++) { - if (FindExprUse(expr->Opnd(i), stIdx)) { + for (size_t i = 0; i < expr.NumOpnds(); i++) { + if (FindExprUse(*expr.Opnd(i), stIdx)) { return true; } } @@ -175,8 +179,8 @@ bool MirCFG::FindExprUse(BaseNode *expr, StIdx stIdx) { return false; } -bool MirCFG::FindUse(StmtNode *stmt, StIdx stID) { - Opcode opcode = stmt->GetOpCode(); +bool MeCFG::FindUse(StmtNode &stmt, StIdx stID) { + Opcode opcode = stmt.GetOpCode(); switch (opcode) { case OP_call: case OP_virtualcall: @@ -204,39 +208,39 @@ bool MirCFG::FindUse(StmtNode *stmt, StIdx stID) { case OP_intrinsiccallwithtypeassigned: case OP_syncenter: case OP_syncexit: { - for (size_t i = 0; i < stmt->NumOpnds(); i++) { - BaseNode *argExpr = stmt->Opnd(i); - if (FindExprUse(argExpr, stID)) { + for (size_t i = 0; i < stmt.NumOpnds(); i++) { + BaseNode *argExpr = stmt.Opnd(i); + if (FindExprUse(*argExpr, stID)) { return true; } } break; } case OP_dassign: { - DassignNode *dNode = static_cast(stmt); - return FindExprUse(dNode->GetRHS(), stID); + DassignNode &dNode = static_cast(stmt); + return FindExprUse(*dNode.GetRHS(), stID); } case OP_regassign: { - RegassignNode *rNode = static_cast(stmt); - if (rNode->GetRegIdx() < 0) { + RegassignNode &rNode = static_cast(stmt); + if (rNode.GetRegIdx() < 0) { return false; } - return FindExprUse(rNode->Opnd(0), stID); + return FindExprUse(*rNode.Opnd(0), stID); } case OP_iassign: { - IassignNode *iNode = static_cast(stmt); - if (FindExprUse(iNode->Opnd(0), stID)) { + IassignNode &iNode = static_cast(stmt); + if (FindExprUse(*iNode.Opnd(0), stID)) { return true; } else { - return FindExprUse(iNode->GetRHS(), stID); + return FindExprUse(*iNode.GetRHS(), stID); } } case OP_assertnonnull: case OP_eval: case OP_free: case OP_switch: { - BaseNode *argExpr = stmt->Opnd(0); - return FindExprUse(argExpr, stID); + BaseNode *argExpr = stmt.Opnd(0); + return FindExprUse(*argExpr, stID); } default: break; @@ -244,16 +248,16 @@ bool MirCFG::FindUse(StmtNode *stmt, StIdx stID) { return false; } -bool MirCFG::FindDef(StmtNode *stmt, StIdx stid) { - if (stmt->GetOpCode() != OP_dassign && !kOpcodeInfo.IsCallAssigned(stmt->GetOpCode())) { +bool MeCFG::FindDef(StmtNode &stmt, StIdx stid) { + if (stmt.GetOpCode() != OP_dassign && !kOpcodeInfo.IsCallAssigned(stmt.GetOpCode())) { return false; } - if (stmt->GetOpCode() == OP_dassign) { - DassignNode *dassStmt = static_cast(stmt); - return dassStmt->GetStIdx() == stid; + if (stmt.GetOpCode() == OP_dassign) { + DassignNode &dassStmt = static_cast(stmt); + return dassStmt.GetStIdx() == stid; } else { - CallNode *cnode = static_cast(stmt); - CallReturnVector &nrets = cnode->GetReturnVec(); + CallNode &cnode = static_cast(stmt); + CallReturnVector &nrets = cnode.GetReturnVec(); if (nrets.size() != 0) { ASSERT(nrets.size() == 1, "Single Ret value for now."); StIdx stidx = nrets[0].first; @@ -267,9 +271,9 @@ bool MirCFG::FindDef(StmtNode *stmt, StIdx stid) { } // Return true if there is no use or def of sym betweent from to to. -bool MirCFG::HasNoOccBetween(StmtNode *from, StmtNode *to, StIdx stIdx) { - for (StmtNode *stmt = from; stmt && stmt != to; stmt = stmt->GetNext()) { - if (FindUse(stmt, stIdx) || FindDef(stmt, stIdx)) { +bool MeCFG::HasNoOccBetween(StmtNode &from, StmtNode &to, StIdx stIdx) { + for (StmtNode *stmt = &from; stmt && stmt != &to; stmt = stmt->GetNext()) { + if (FindUse(*stmt, stIdx) || FindDef(*stmt, stIdx)) { return false; } } @@ -277,10 +281,10 @@ bool MirCFG::HasNoOccBetween(StmtNode *from, StmtNode *to, StIdx stIdx) { } // Fix the initially created CFG -void MirCFG::FixMirCFG() { - auto eIt = func->valid_end(); - for (auto bIt = func->valid_begin(); bIt != eIt; ++bIt) { - if (bIt == func->common_entry() || bIt == func->common_exit()) { +void MeCFG::FixMirCFG() { + auto eIt = func.valid_end(); + for (auto bIt = func.valid_begin(); bIt != eIt; ++bIt) { + if (bIt == func.common_entry() || bIt == func.common_exit()) { continue; } auto *bb = *bIt; @@ -298,7 +302,7 @@ void MirCFG::FixMirCFG() { StIdx stidx = nrets[0].first; RegFieldPair regfieldpair = nrets[0].second; if (!regfieldpair.IsReg()) { - sym = func->GetMirFunc()->GetLocalOrGlobalSymbol(stidx); + sym = func.GetMirFunc()->GetLocalOrGlobalSymbol(stidx); } } } else if (stmt->GetOpCode() == OP_dassign) { @@ -307,15 +311,15 @@ void MirCFG::FixMirCFG() { if (dassStmt->GetRHS()->GetOpCode() == OP_dread) { continue; } - sym = func->GetMirFunc()->GetLocalOrGlobalSymbol(dassStmt->GetStIdx()); + sym = func.GetMirFunc()->GetLocalOrGlobalSymbol(dassStmt->GetStIdx()); } if (sym == nullptr || sym->GetType()->GetPrimType() != PTY_ref || !sym->IsLocal()) { continue; } - if (FindUse(stmt, sym->GetStIdx())) { - func->GetMirFunc()->IncTempCount(); - std::string tempStr = std::string("tempRet").append(std::to_string(func->GetMirFunc()->GetTempCount())); - MIRBuilder *builder = func->GetMirFunc()->GetModule()->GetMIRBuilder(); + if (FindUse(*stmt, sym->GetStIdx())) { + func.GetMirFunc()->IncTempCount(); + std::string tempStr = std::string("tempRet").append(std::to_string(func.GetMirFunc()->GetTempCount())); + MIRBuilder *builder = func.GetMirFunc()->GetModule()->GetMIRBuilder(); MIRSymbol *targetSt = builder->GetOrCreateLocalDecl(tempStr.c_str(), sym->GetType()); targetSt->ResetIsDeleted(); if (stmt->GetOpCode() == OP_dassign) { @@ -344,12 +348,15 @@ void MirCFG::FixMirCFG() { } // 2. Split bb to two bbs if there are use and def the same ref var in bb. - for (auto bIt = func->valid_begin(); bIt != eIt; ++bIt) { - if (bIt == func->common_entry() || bIt == func->common_exit()) { + for (auto bIt = func.valid_begin(); bIt != eIt; ++bIt) { + if (bIt == func.common_entry() || bIt == func.common_exit()) { continue; } auto *bb = *bIt; - if (bb && bb->GetAttributes(kBBAttrIsTry)) { + if (bb == nullptr) { + continue; + } + if (bb->GetAttributes(kBBAttrIsTry)) { for (auto &splitPoint : bb->GetStmtNodes()) { StmtNode *nextStmt = splitPoint.GetNext(); if (nextStmt != nullptr && @@ -358,7 +365,7 @@ void MirCFG::FixMirCFG() { if (nextStmt->GetOpCode() == OP_dassign) { DassignNode *dassignStmt = static_cast(nextStmt); const StIdx stIdx = dassignStmt->GetStIdx(); - sym = func->GetMirFunc()->GetLocalOrGlobalSymbol(stIdx); + sym = func.GetMirFunc()->GetLocalOrGlobalSymbol(stIdx); } else { CallNode *cNode = static_cast(nextStmt); CallReturnVector &nrets = cNode->GetReturnVec(); @@ -367,22 +374,22 @@ void MirCFG::FixMirCFG() { StIdx stIdx = nrets[0].first; RegFieldPair regFieldPair = nrets[0].second; if (!regFieldPair.IsReg()) { - sym = func->GetMirFunc()->GetLocalOrGlobalSymbol(stIdx); + sym = func.GetMirFunc()->GetLocalOrGlobalSymbol(stIdx); } } } if (sym == nullptr || sym->GetType()->GetPrimType() != PTY_ref || !sym->IsLocal()) { continue; } - if (HasNoOccBetween(bb->GetStmtNodes().begin().d(), nextStmt, sym->GetStIdx())) { + if (HasNoOccBetween(*bb->GetStmtNodes().begin().d(), *nextStmt, sym->GetStIdx())) { continue; } - BB *newBB = func->SplitBB(bb, &splitPoint); + BB *newBB = func.SplitBB(bb, &splitPoint); // because SplitBB will insert a bb, we need update bIt & eIt - auto newBBIt = std::find(func->cbegin(), func->cend(), bb); + auto newBBIt = std::find(func.cbegin(), func.cend(), bb); bIt = build_filter_iterator( - newBBIt, std::bind(FilterNullPtr::const_iterator>, std::placeholders::_1, func->end())); - eIt = func->valid_end(); + newBBIt, std::bind(FilterNullPtr::const_iterator>, std::placeholders::_1, func.end())); + eIt = func.valid_end(); for (size_t si = 0; si < newBB->GetSucc().size(); si++) { BB *sucBB = newBB->GetSucc(si); if (sucBB->GetAttributes(kBBAttrIsCatch)) { @@ -404,7 +411,7 @@ void MirCFG::FixMirCFG() { } // fast path StmtNode *stmt = bb->GetTheOnlyStmtNode(); - if (stmt) { + if (stmt != nullptr) { size_t si = 0; // simplify the cfg removing all succs of this bb for (; si < bb->GetSucc().size(); si++) { @@ -422,13 +429,13 @@ void MirCFG::FixMirCFG() { while (splitPoint != nullptr && splitPoint->GetOpCode() == OP_comment) { splitPoint = splitPoint->GetPrev(); } - ASSERT(splitPoint != nullptr, "just check"); - BB *newBB = func->SplitBB(bb, splitPoint); + CHECK_FATAL(splitPoint != nullptr, "null ptr check"); + BB *newBB = func.SplitBB(bb, splitPoint); // because SplitBB will insert a bb, we need update bIt & eIt - auto newBBIt = std::find(func->cbegin(), func->cend(), bb); + auto newBBIt = std::find(func.cbegin(), func.cend(), bb); bIt = build_filter_iterator( - newBBIt, std::bind(FilterNullPtr::const_iterator>, std::placeholders::_1, func->end())); - eIt = func->valid_end(); + newBBIt, std::bind(FilterNullPtr::const_iterator>, std::placeholders::_1, func.end())); + eIt = func.valid_end(); // redirect all succs of new bb to bb size_t si = 0; for (; si < newBB->GetSucc().size(); si++) { @@ -447,9 +454,9 @@ void MirCFG::FixMirCFG() { // used only after DSE because it looks at live field of VersionSt -void MirCFG::ConvertPhis2IdentityAssigns(BB *meBB) { - auto phiIt = meBB->GetPhiList().begin(); - while (phiIt != meBB->GetPhiList().end()) { +void MeCFG::ConvertPhis2IdentityAssigns(BB &meBB) { + auto phiIt = meBB.GetPhiList().begin(); + while (phiIt != meBB.GetPhiList().end()) { if (!(*phiIt).second.GetResult()->IsLive()) { phiIt++; continue; @@ -459,72 +466,72 @@ void MirCFG::ConvertPhis2IdentityAssigns(BB *meBB) { if (ost->IsSymbolOst() && ost->GetIndirectLev() == 0) { MIRSymbol *st = ost->GetMIRSymbol(); MIRType *type = GlobalTables::GetTypeTable().GetTypeFromTyIdx(st->GetTyIdx()); - AddrofNode *dread = func->GetMIRModule().GetMIRBuilder()->CreateDread(st, GetRegPrimType(type->GetPrimType())); - AddrofSSANode *dread2 = func->GetMirFunc()->GetCodeMemPool()->New(dread); + AddrofNode *dread = func.GetMIRModule().GetMIRBuilder()->CreateDread(st, GetRegPrimType(type->GetPrimType())); + AddrofSSANode *dread2 = func.GetMirFunc()->GetCodeMemPool()->New(dread); dread2->SetSSAVar((*phiIt).second.GetPhiOpnd(0)); - DassignNode *dassign = func->GetMIRModule().GetMIRBuilder()->CreateStmtDassign(st, 0, dread2); - func->GetMeSSATab()->GetStmtsSSAPart().SetSSAPartOf( - dassign, func->GetMeSSATab()->GetStmtsSSAPart().GetSSAPartMp()->New( - &func->GetMeSSATab()->GetStmtsSSAPart().GetSSAPartAlloc())); + DassignNode *dassign = func.GetMIRModule().GetMIRBuilder()->CreateStmtDassign(st, 0, dread2); + func.GetMeSSATab()->GetStmtsSSAPart().SetSSAPartOf( + dassign, func.GetMeSSATab()->GetStmtsSSAPart().GetSSAPartMp()->New( + &func.GetMeSSATab()->GetStmtsSSAPart().GetSSAPartAlloc())); MayDefPartWithVersionSt *theSSAPart = - static_cast(func->GetMeSSATab()->GetStmtsSSAPart().SSAPartOf(dassign)); + static_cast(func.GetMeSSATab()->GetStmtsSSAPart().SSAPartOf(dassign)); theSSAPart->SetSSAVar((*phiIt).second.GetResult()); - meBB->PrependStmtNode(dassign); + meBB.PrependStmtNode(dassign); } phiIt++; } - meBB->GetPhiList().clear(); // delete all the phis - auto varPhiIt = meBB->GetMevarPhiList().begin(); - while (varPhiIt != meBB->GetMevarPhiList().end()) { + meBB.GetPhiList().clear(); // delete all the phis + auto varPhiIt = meBB.GetMevarPhiList().begin(); + while (varPhiIt != meBB.GetMevarPhiList().end()) { if (!(*varPhiIt).second->GetIsLive()) { varPhiIt++; continue; } // replace phi with identify assignment as it only has 1 opnd - OriginalSt *ost = func->GetMeSSATab()->GetOriginalStFromID(varPhiIt->first); + const OriginalSt *ost = func.GetMeSSATab()->GetOriginalStFromID(varPhiIt->first); if (ost->IsSymbolOst() && ost->GetIndirectLev() == 0) { - DassignMeStmt *dassign = func->GetIRMap()->NewInPool(); + DassignMeStmt *dassign = func.GetIRMap()->NewInPool(); MeVarPhiNode *varPhi = varPhiIt->second; dassign->SetLHS(varPhi->GetLHS()); dassign->SetRHS(varPhi->GetOpnd(0)); dassign->SetBB(varPhi->GetDefBB()); dassign->SetIsLive(varPhi->GetIsLive()); - meBB->PrependMeStmt(dassign); + meBB.PrependMeStmt(dassign); } varPhiIt++; } - meBB->GetMevarPhiList().clear(); // delete all the phis - auto regPhiIt = meBB->GetMeregphiList().begin(); - while (regPhiIt != meBB->GetMeregphiList().end()) { + meBB.GetMevarPhiList().clear(); // delete all the phis + auto regPhiIt = meBB.GetMeregphiList().begin(); + while (regPhiIt != meBB.GetMeregphiList().end()) { if (!(*regPhiIt).second->GetIsLive()) { regPhiIt++; continue; } // replace phi with identify assignment as it only has 1 opnd - OriginalSt *ost = func->GetMeSSATab()->GetOriginalStFromID(regPhiIt->first); + const OriginalSt *ost = func.GetMeSSATab()->GetOriginalStFromID(regPhiIt->first); if (ost->IsSymbolOst() && ost->GetIndirectLev() == 0) { - RegassignMeStmt *regass = func->GetIRMap()->New(); + RegassignMeStmt *regass = func.GetIRMap()->New(); MeRegPhiNode *regPhi = regPhiIt->second; regass->SetLHS(regPhi->GetLHS()); regass->SetRHS(regPhi->GetOpnd(0)); regass->SetBB(regPhi->GetDefBB()); regass->SetIsLive(regPhi->GetIsLive()); - meBB->PrependMeStmt(regass); + meBB.PrependMeStmt(regass); } regPhiIt++; } - meBB->GetMeregphiList().clear(); // delete all the phis + meBB.GetMeregphiList().clear(); // delete all the phis } // analyse the CFG to find the BBs that are not reachable from function entries // and delete them -void MirCFG::UnreachCodeAnalysis(bool updatePhi) { - std::vector visitedBBs(func->NumBBs(), false); - func->GetCommonEntryBB()->FindReachableBBs(visitedBBs); +void MeCFG::UnreachCodeAnalysis(bool updatePhi) { + std::vector visitedBBs(func.NumBBs(), false); + func.GetCommonEntryBB()->FindReachableBBs(visitedBBs); // delete the unreached bb - auto eIt = func->valid_end(); - for (auto bIt = func->valid_begin(); bIt != eIt; ++bIt) { - if (bIt == func->common_exit()) { + auto eIt = func.valid_end(); + for (auto bIt = func.valid_begin(); bIt != eIt; ++bIt) { + if (bIt == func.common_exit()) { continue; } auto *bb = *bIt; @@ -533,33 +540,33 @@ void MirCFG::UnreachCodeAnalysis(bool updatePhi) { bb->SetAttributes(kBBAttrWontExit); /* avoid redundant pred before adding to common_exit_bb's pred list */ size_t pi = 0; - for (; pi < func->GetCommonExitBB()->GetPred().size(); pi++) { - if (bb == func->GetCommonExitBB()->GetPred(pi)) { + for (; pi < func.GetCommonExitBB()->GetPred().size(); pi++) { + if (bb == func.GetCommonExitBB()->GetPred(pi)) { break; } } - if (pi == func->GetCommonExitBB()->GetPred().size()) { - func->GetCommonExitBB()->GetPred().push_back(bb); + if (pi == func.GetCommonExitBB()->GetPred().size()) { + func.GetCommonExitBB()->GetPred().push_back(bb); } - if (!MeOptions::quiet) { + if (!MeOption::quiet) { LogInfo::MapleLogger() << "#### BB " << bb->GetBBId().idx << " deleted because unreachable\n"; } if (bb->GetAttributes(kBBAttrIsTryEnd)) { // unreachable bb has try end info - auto bbIt = std::find(func->rbegin(), func->rend(), bb); + auto bbIt = std::find(func.rbegin(), func.rend(), bb); auto prevIt = ++bbIt; - for (auto it = prevIt; it != func->rend(); ++it) { + for (auto it = prevIt; it != func.rend(); ++it) { if (*it != nullptr) { // move entrytry tag to previous bb with try if ((*it)->GetAttributes(kBBAttrIsTry) && !(*it)->GetAttributes(kBBAttrIsTryEnd)) { (*it)->SetAttributes(kBBAttrIsTryEnd); - func->GetEndTryBB2TryBB()[*it] = func->GetEndTryBB2TryBB()[bb]; + func.GetEndTryBB2TryBB()[*it] = func.GetEndTryBB2TryBB()[bb]; } break; } } } - func->DeleteBasicBlock(bb); + func.DeleteBasicBlock(bb); // remove the bb from its succ's pred_ list for (auto it = bb->GetSucc().begin(); it != bb->GetSucc().end(); it++) { BB *sucBB = *it; @@ -568,17 +575,17 @@ void MirCFG::UnreachCodeAnalysis(bool updatePhi) { } else { sucBB->RemoveBBFromPred(bb); if (sucBB->GetPred().size() == 1) { - ConvertPhis2IdentityAssigns(sucBB); + ConvertPhis2IdentityAssigns(*sucBB); } else if (sucBB->GetPred().empty()) { sucBB->GetPhiList().clear(); } } } // remove the bb from common_exit_bb's pred list if it is there - for (auto it = func->GetCommonExitBB()->GetPred().begin(); - it != func->GetCommonExitBB()->GetPred().end(); it++) { + for (auto it = func.GetCommonExitBB()->GetPred().begin(); + it != func.GetCommonExitBB()->GetPred().end(); it++) { if (*it == bb) { - func->GetCommonExitBB()->RemoveBBFromPred(bb); + func.GetCommonExitBB()->RemoveBBFromPred(bb); break; } } @@ -589,38 +596,38 @@ void MirCFG::UnreachCodeAnalysis(bool updatePhi) { // analyse the CFG to find the BBs that will not reach any function exit; these // are BBs inside infinite loops; mark their wontExit flag and create // artificial edges from them to common_exit_bb -void MirCFG::WontExitAnalysis() { - if (func->NumBBs() == 0) { +void MeCFG::WontExitAnalysis() { + if (func.NumBBs() == 0) { return; } - std::vector visitedBBs(func->NumBBs(), false); - func->GetCommonExitBB()->FindWillExitBBs(visitedBBs); - auto eIt = func->valid_end(); - for (auto bIt = func->valid_begin(); bIt != eIt; ++bIt) { - if (bIt == func->common_entry()) { + std::vector visitedBBs(func.NumBBs(), false); + func.GetCommonExitBB()->FindWillExitBBs(visitedBBs); + auto eIt = func.valid_end(); + for (auto bIt = func.valid_begin(); bIt != eIt; ++bIt) { + if (bIt == func.common_entry()) { continue; } auto *bb = *bIt; uint32 idx = bb->GetBBId().idx; if (!visitedBBs[idx]) { bb->SetAttributes(kBBAttrWontExit); - if (!MeOptions::quiet) { + if (!MeOption::quiet) { LogInfo::MapleLogger() << "#### BB " << idx << " wont exit\n"; } if (bb->GetKind() == kBBGoto) { // create artificial BB to transition to common_exit_bb - BB *newBB = func->NewBasicBlock(); + BB *newBB = func.NewBasicBlock(); // update bIt & eIt - auto newBBIt = std::find(func->cbegin(), func->cend(), bb); + auto newBBIt = std::find(func.cbegin(), func.cend(), bb); bIt = build_filter_iterator( - newBBIt, std::bind(FilterNullPtr::const_iterator>, std::placeholders::_1, func->end())); - eIt = func->valid_end(); + newBBIt, std::bind(FilterNullPtr::const_iterator>, std::placeholders::_1, func.end())); + eIt = func.valid_end(); newBB->SetKind(kBBReturn); newBB->SetAttributes(kBBAttrIsExit); newBB->SetAttributes(kBBAttrArtificial); bb->GetSucc().push_back(newBB); newBB->GetPred().push_back(bb); - func->GetCommonExitBB()->GetPred().push_back(newBB); + func.GetCommonExitBB()->GetPred().push_back(newBB); } } } @@ -628,32 +635,36 @@ void MirCFG::WontExitAnalysis() { // CFG Verify // Check bb-vec and bb-list are strictly consistent. -void MirCFG::Verify() { +void MeCFG::Verify() { // Check every bb in bb-list. - auto eIt = func->valid_end(); - for (auto bIt = func->valid_begin(); bIt != eIt; ++bIt) { - if (bIt == func->common_entry() || bIt == func->common_exit()) { + auto eIt = func.valid_end(); + for (auto bIt = func.valid_begin(); bIt != eIt; ++bIt) { + if (bIt == func.common_entry() || bIt == func.common_exit()) { continue; } auto *bb = *bIt; - ASSERT(bb->GetBBId().idx < func->GetAllBBs().size(), "CFG Error!"); - ASSERT(func->GetBBFromID(bb->GetBBId()) == bb, "CFG Error!"); + ASSERT(bb->GetBBId().idx < func.GetAllBBs().size(), "CFG Error!"); + ASSERT(func.GetBBFromID(bb->GetBBId()) == bb, "CFG Error!"); if (bb->IsEmpty()) { continue; } ASSERT(bb->GetKind() != kBBUnknown, "runtime check error"); /* verify succ[1] is goto bb */ if (bb->GetKind() == kBBCondGoto) { - ASSERT(bb->GetAttributes(kBBAttrIsTry) || bb->GetAttributes(kBBAttrWontExit) || - (bb->GetStmtNodes().rbegin().base().d() != nullptr && bb->GetSucc().size() == 2), ""); + if (!bb->GetAttributes(kBBAttrIsTry) && !bb->GetAttributes(kBBAttrWontExit)) { + ASSERT(bb->GetStmtNodes().rbegin().base().d() != nullptr, "runtime check error"); + ASSERT(bb->GetSucc().size() == 2, "runtime check error"); + } ASSERT(bb->GetSucc(1)->GetBBLabel() == static_cast(bb->GetStmtNodes().back()).GetOffset(), "runtime check error"); } else if (bb->GetKind() == kBBGoto) { if (bb->GetStmtNodes().back().GetOpCode() == OP_throw) { continue; } - ASSERT(bb->GetAttributes(kBBAttrIsTry) || bb->GetAttributes(kBBAttrWontExit) || - (bb->GetStmtNodes().rbegin().base().d() != nullptr && bb->GetSucc().size() == 1), ""); + if (!bb->GetAttributes(kBBAttrIsTry) && !bb->GetAttributes(kBBAttrWontExit)) { + ASSERT(bb->GetStmtNodes().rbegin().base().d() != nullptr, "runtime check error"); + ASSERT(bb->GetSucc().size() == 1, "runtime check error"); + } ASSERT(bb->GetSucc(0)->GetBBLabel() == static_cast(bb->GetStmtNodes().back()).GetOffset(), "runtime check error"); } @@ -661,9 +672,9 @@ void MirCFG::Verify() { } // check that all the target labels in jump statements are defined -void MirCFG::VerifyLabels(void) { - auto eIt = func->valid_end(); - for (auto bIt = func->valid_begin(); bIt != eIt; ++bIt) { +void MeCFG::VerifyLabels(void) { + auto eIt = func.valid_end(); + for (auto bIt = func.valid_begin(); bIt != eIt; ++bIt) { BB *mirBB = *bIt; auto &stmtNodes = mirBB->GetStmtNodes(); if (stmtNodes.rbegin().base().d() == nullptr) { @@ -673,37 +684,37 @@ void MirCFG::VerifyLabels(void) { if (mirBB->GetStmtNodes().back().GetOpCode() == OP_throw) { continue; } - ASSERT(func->GetLabelBBIdMap()[(LabelIdx) static_cast(stmtNodes.back()).GetOffset()]->GetBBLabel() == + ASSERT(func.GetLabelBBIdMap()[(LabelIdx) static_cast(stmtNodes.back()).GetOffset()]->GetBBLabel() == (LabelIdx) static_cast(stmtNodes.back()).GetOffset(), "undefined label in goto"); } else if (mirBB->GetKind() == kBBCondGoto) { ASSERT( - func->GetLabelBBIdMap()[(LabelIdx) static_cast(stmtNodes.back()).GetOffset()]->GetBBLabel() == + func.GetLabelBBIdMap()[(LabelIdx) static_cast(stmtNodes.back()).GetOffset()]->GetBBLabel() == (LabelIdx) static_cast(stmtNodes.back()).GetOffset(), "undefined label in conditional branch"); } else if (mirBB->GetKind() == kBBSwitch) { SwitchNode &switchStmt = static_cast(stmtNodes.back()); LabelIdx targetLabIdx = switchStmt.GetDefaultLabel(); - BB *bb = func->GetLabelBBIdMap()[targetLabIdx]; + BB *bb = func.GetLabelBBIdMap()[targetLabIdx]; ASSERT(bb->GetBBLabel() == targetLabIdx, "undefined label in switch"); for (size_t j = 0; j < switchStmt.GetSwitchTable().size(); j++) { targetLabIdx = switchStmt.GetCasePair(j).second; - bb = func->GetLabelBBIdMap()[targetLabIdx]; + bb = func.GetLabelBBIdMap()[targetLabIdx]; ASSERT(bb->GetBBLabel() == targetLabIdx, "undefined switch target label"); } } } } -void MirCFG::Dump() { +void MeCFG::Dump() { // BSF Dump the cfg // map visited_map; // set visited_set; LogInfo::MapleLogger() << "####### CFG Dump: "; - ASSERT(func->NumBBs() != 0, "size to be allocated is 0"); - bool *visitedMap = static_cast(calloc(func->NumBBs(), sizeof(bool))); + ASSERT(func.NumBBs() != 0, "size to be allocated is 0"); + bool *visitedMap = static_cast(calloc(func.NumBBs(), sizeof(bool))); if (visitedMap != nullptr) { std::queue qu; - qu.push(func->GetFirstBB()); + qu.push(func.GetFirstBB()); while (!qu.empty()) { BB *bb = qu.front(); qu.pop(); @@ -751,8 +762,8 @@ static bool ContainsConststr(const BaseNode *x) { } /* generate dot file for cfg */ -void MirCFG::DumpToFile(const char *prefix, bool dumpInStrs) { - if (MeOptions::noDot) { +void MeCFG::DumpToFile(const std::string &prefix, bool dumpInStrs) { + if (MeOption::noDot) { return; } std::ofstream cfgFile; @@ -760,26 +771,26 @@ void MirCFG::DumpToFile(const char *prefix, bool dumpInStrs) { std::streambuf *buf = cfgFile.rdbuf(); LogInfo::MapleLogger().rdbuf(buf); std::string fileName; - if (prefix != nullptr) { + if (!prefix.empty()) { fileName.append(prefix); fileName.append("-"); } // the func name length may exceed OS's file name limit, so truncate after 80 chars - if (func->GetName().size() <= 80) { - fileName.append(func->GetName()); + if (func.GetName().size() <= kFuncNameLenLimit) { + fileName.append(func.GetName()); } else { - fileName.append(func->GetName().c_str(), 80); + fileName.append(func.GetName().c_str(), kFuncNameLenLimit); } ReplaceFilename(fileName); fileName.append(".dot"); cfgFile.open(fileName.c_str(), std::ios::trunc); cfgFile << "digraph {\n"; - cfgFile << " # /*" << func->GetName().c_str() << " (red line is exception handler)*/\n"; + cfgFile << " # /*" << func.GetName().c_str() << " (red line is exception handler)*/\n"; /* dump edge */ - auto eIt = func->valid_end(); - for (auto bIt = func->valid_begin(); bIt != eIt; ++bIt) { + auto eIt = func.valid_end(); + for (auto bIt = func.valid_begin(); bIt != eIt; ++bIt) { auto *bb = *bIt; - if (bIt == func->common_exit()) { + if (bIt == func.common_exit()) { /* specical case for common_exit_bb */ for (auto it = bb->GetPred().begin(); it != bb->GetPred().end(); it++) { cfgFile << "BB" << (*it)->GetBBId().idx << " -> " @@ -790,7 +801,7 @@ void MirCFG::DumpToFile(const char *prefix, bool dumpInStrs) { for (auto it = bb->GetSucc().begin(); it != bb->GetSucc().end(); it++) { cfgFile << "BB" << bb->GetBBId().idx << " -> " << "BB" << (*it)->GetBBId().idx; - if (bb == func->GetCommonEntryBB()) { + if (bb == func.GetCommonEntryBB()) { cfgFile << "[style=dotted];\n"; continue; } @@ -804,8 +815,8 @@ void MirCFG::DumpToFile(const char *prefix, bool dumpInStrs) { } /* dump instruction in each BB */ if (dumpInStrs) { - eIt = func->valid_end(); - for (auto bIt = func->valid_begin(); bIt != eIt; ++bIt) { + eIt = func.valid_end(); + for (auto bIt = func.valid_begin(); bIt != eIt; ++bIt) { auto *bb = *bIt; if (bb->IsEmpty()) { continue; @@ -816,10 +827,10 @@ void MirCFG::DumpToFile(const char *prefix, bool dumpInStrs) { cfgFile << "BB" << bb->GetBBId().idx << "[shape=box,label= \" BB" << bb->GetBBId().idx << ":\n{ "; } if (bb->GetBBLabel() != 0) { - cfgFile << "@" << func->GetMirFunc()->GetLabelName(bb->GetBBLabel()) << ":\n"; + cfgFile << "@" << func.GetMirFunc()->GetLabelName(bb->GetBBLabel()) << ":\n"; } for (auto phiIt = bb->GetPhiList().begin(); phiIt != bb->GetPhiList().end(); phiIt++) { - (*phiIt).second.Dump(&(func->GetMIRModule())); + (*phiIt).second.Dump(&(func.GetMIRModule())); } for (auto &stmt : bb->GetStmtNodes()) { // avoid printing content that may contain " as this needs to be quoted @@ -829,7 +840,7 @@ void MirCFG::DumpToFile(const char *prefix, bool dumpInStrs) { if (ContainsConststr(&stmt)) { continue; } - stmt.Dump(&(func->GetMIRModule()), 1); + stmt.Dump(&(func.GetMIRModule()), 1); } cfgFile << "}\"];\n"; } @@ -839,5 +850,4 @@ void MirCFG::DumpToFile(const char *prefix, bool dumpInStrs) { cfgFile.close(); LogInfo::MapleLogger().rdbuf(coutBuf); } - } // namespace maple diff --git a/src/maple_me/src/me_dominance.cpp b/src/maple_me/src/me_dominance.cpp index fcbaef7d4fe4425c56abd5855a1ece7e29cea3bd..90d9f2165edda3ffd2603b792e63ed3e015399da 100644 --- a/src/maple_me/src/me_dominance.cpp +++ b/src/maple_me/src/me_dominance.cpp @@ -25,14 +25,14 @@ namespace maple { AnalysisResult *MeDoDominance::Run(MeFunction *func, MeFuncResultMgr *m, ModuleResultMgr *mrm) { MemPool *memPool = NewMemPool(); - Dominance *dom = memPool->New(memPool, NewMemPool(), (MapleVector *)&func->GetAllBBs(), - func->GetCommonEntryBB(), func->GetCommonExitBB()); + Dominance *dom = memPool->New(*memPool, *NewMemPool(), func->GetAllBBs(), + *func->GetCommonEntryBB(), *func->GetCommonExitBB()); dom->GenPostOrderID(); dom->ComputeDominance(); dom->ComputeDomFrontiers(); dom->ComputeDomChildren(); size_t num = 0; - dom->ComputeDtPreorder(func->GetCommonEntryBB(), num); + dom->ComputeDtPreorder(*func->GetCommonEntryBB(), num); dom->GetDtPreOrder().resize(num); dom->ComputeDtDfn(); dom->PdomGenPostOrderID(); @@ -40,7 +40,7 @@ AnalysisResult *MeDoDominance::Run(MeFunction *func, MeFuncResultMgr *m, ModuleR dom->ComputePdomFrontiers(); dom->ComputePdomChildren(); num = 0; - dom->ComputePdtPreorder(func->GetCommonExitBB(), num); + dom->ComputePdtPreorder(*func->GetCommonExitBB(), num); dom->GetPdtPreOrder().resize(num); dom->ComputePdtDfn(); if (DEBUGFUNC(func)) { @@ -50,5 +50,4 @@ AnalysisResult *MeDoDominance::Run(MeFunction *func, MeFuncResultMgr *m, ModuleR } return dom; } - } // namespace maple diff --git a/src/maple_me/src/me_emit.cpp b/src/maple_me/src/me_emit.cpp index 2abca1fe20cb0da029277cbe60b12a2db8c35762..1f135ef27ee7ad3b10631feb506fed3691104deb 100644 --- a/src/maple_me/src/me_emit.cpp +++ b/src/maple_me/src/me_emit.cpp @@ -19,17 +19,17 @@ namespace maple { /* emit IR to specified file */ -AnalysisResult *MeDoEmission::Run(MeFunction *func, MeFuncResultMgr *m, ModuleResultMgr *mrm) { +AnalysisResult *MeDoEmit::Run(MeFunction *func, MeFuncResultMgr *m, ModuleResultMgr *mrm) { bool emitHssaOrAfter = (func->GetIRMap() != nullptr); if (func->NumBBs() > 0) { /* generate bblist after layout (bb physical position) */ - if (!MeOptions::quiet) { - ASSERT(m->GetAnalysisPhase(MeFuncPhase_BBLAYOUT), "null ptr check"); + if (!MeOption::quiet) { + CHECK_FATAL(m->GetAnalysisPhase(MeFuncPhase_BBLAYOUT) != nullptr, "null ptr check"); LogInfo::MapleLogger() << "===== Check/run Depended Phase [ " << m->GetAnalysisPhase(MeFuncPhase_BBLAYOUT)->PhaseName() << " ]=====\n"; } BBLayout *layoutBBs = static_cast(m->GetAnalysisResult(MeFuncPhase_BBLAYOUT, func)); - if (!MeOptions::quiet) { + if (!MeOption::quiet) { LogInfo::MapleLogger() << "===== Depended Phase ended =====\n"; } ASSERT(layoutBBs != nullptr, "layout phase has problem"); @@ -51,27 +51,17 @@ AnalysisResult *MeDoEmission::Run(MeFunction *func, MeFuncResultMgr *m, ModuleRe } for (BB *bb : layoutBBs->GetBBs()) { ASSERT(bb != nullptr, "null ptr check"); - func->GetIRMap()->EmitBB(bb, mirFunction->GetBody()); + func->GetIRMap()->EmitBB(*bb, *mirFunction->GetBody()); } } else { - func->EmitBeforeHSSA(func->GetMirFunc(), layoutBBs->GetBBs()); + auto *mirFunc = func->GetMirFunc(); + if (mirFunc != nullptr) { + func->EmitBeforeHSSA(*mirFunc, layoutBBs->GetBBs()); + } } if (DEBUGFUNC(func)) { LogInfo::MapleLogger() << "\n==============after meemit =============" << std::endl; func->GetMirFunc()->Dump(); - LogInfo::MapleLogger() << "\nRC operations do not need locking" << std::endl; - auto eIt = func->valid_end(); - for (auto bIt = func->valid_begin(); bIt != eIt; ++bIt) { - BB *bb = *bIt; - for (auto &stmt : bb->GetStmtNodes()) { - if (func->GetMIRModule().GetRcNoNeedingLock().find(stmt.GetStmtID()) != - func->GetMIRModule().GetRcNoNeedingLock().end()) { - LogInfo::MapleLogger() << func->GetMIRModule().GetFileNameFromFileNum(stmt.GetSrcPos().FileNum()) << ":" - << stmt.GetSrcPos().LineNum() << "\t"; - stmt.Dump(&func->GetMIRModule(), 0); - } - } - } } if (DEBUGFUNC(func)) { func->GetTheCfg()->DumpToFile("emit", true); @@ -79,5 +69,4 @@ AnalysisResult *MeDoEmission::Run(MeFunction *func, MeFuncResultMgr *m, ModuleRe } return nullptr; } - } // namespace maple diff --git a/src/maple_me/src/me_function.cpp b/src/maple_me/src/me_function.cpp index 601f04e1aef4d5062d2d6a91af768e156dd2c62c..405cb8ee11da4ab3b988258a66126dd854dec889 100644 --- a/src/maple_me/src/me_function.cpp +++ b/src/maple_me/src/me_function.cpp @@ -79,7 +79,7 @@ void MeFunction::SetTryBlockInfo(const StmtNode *nextStmt, StmtNode *tryStmt, BB void MeFunction::CreateBasicBlocks() { if (mirModule.CurFunction()->IsEmpty()) { - if (!MeOptions::quiet) { + if (!MeOption::quiet) { LogInfo::MapleLogger() << "function is empty, cfg is nullptr\n"; } return; @@ -397,7 +397,7 @@ void MeFunction::CreateBasicBlocks() { } void MeFunction::Prepare(unsigned long rangeNum) { - if (!MeOptions::quiet) { + if (!MeOption::quiet) { LogInfo::MapleLogger() << "---Preparing Function < " << mirModule.CurFunction()->GetName() << " > [" << rangeNum << "] ---\n"; } @@ -413,7 +413,7 @@ void MeFunction::Prepare(unsigned long rangeNum) { return; } RemoveEhEdgesInSyncRegion(); - theCFG = memPool->New(this); + theCFG = memPool->New(*this); theCFG->BuildMirCFG(); theCFG->FixMirCFG(); theCFG->VerifyLabels(); @@ -487,7 +487,7 @@ void MeFunction::CloneBasicBlock(BB *newBB, BB *orig) { return; } for (auto &stmt : orig->GetStmtNodes()) { - StmtNode *newStmt = static_cast(stmt.CloneTree(mirModule.CurFuncCodeMemPoolAllocator())); + StmtNode *newStmt = static_cast(stmt.CloneTree(mirModule.GetCurFuncCodeMPAllocator())); ASSERT(newStmt != nullptr, "null ptr check"); newStmt->SetNext(nullptr); newStmt->SetPrev(nullptr); @@ -610,5 +610,4 @@ void MeFunction::RemoveEhEdgesInSyncRegion() { } } } - } // namespace maple diff --git a/src/maple_me/src/me_ir.cpp b/src/maple_me/src/me_ir.cpp index 5598336cec26c0b5a8cf970186dc8d92c39d871c..adbcd834a030e1c924672c428f75440c073d38e6 100644 --- a/src/maple_me/src/me_ir.cpp +++ b/src/maple_me/src/me_ir.cpp @@ -21,36 +21,36 @@ namespace maple { -constexpr int32 kDefaultPrintIndentNum = 5; +constexpr int32_t kDefaultPrintIndentNum = 5; -bool MeExpr::IsTheSameWorkcand(MeExpr *meexpr) const { - ASSERT((exprID != -1 || meexpr->GetExprID() != -1), "at least one of them should not be none initialized"); - if (exprID == meexpr->GetExprID()) { +bool MeExpr::IsTheSameWorkcand(const MeExpr &expr) const { + ASSERT((exprID != -1 || expr.GetExprID() != -1), "at least one of them should not be none initialized"); + if (exprID == expr.GetExprID()) { return true; } - if (op != meexpr->GetOp()) { + if (op != expr.GetOp()) { return false; } - if (IsPrimitiveFloat(primType) != IsPrimitiveFloat(meexpr->GetPrimType())) { + if (IsPrimitiveFloat(primType) != IsPrimitiveFloat(expr.GetPrimType())) { return false; } - if (GetPrimTypeSize(primType) != GetPrimTypeSize(meexpr->GetPrimType())) { + if (GetPrimTypeSize(primType) != GetPrimTypeSize(expr.GetPrimType())) { return false; } - if (op == OP_cvt && primType != meexpr->GetPrimType()) { + if (op == OP_cvt && primType != expr.GetPrimType()) { // exclude cvt for different return type return false; } if (op == OP_sext && - static_cast(this)->GetBitsSize() != static_cast(meexpr)->GetBitsSize()) { + static_cast(this)->GetBitsSize() != static_cast(expr).GetBitsSize()) { return false; } if (op == OP_resolveinterfacefunc || op == OP_resolvevirtualfunc) { - if (static_cast(this)->GetFieldID() != static_cast(meexpr)->GetFieldID()) { + if (static_cast(this)->GetFieldID() != static_cast(expr).GetFieldID()) { return false; } } - return IsUseSameSymbol(meexpr); + return IsUseSameSymbol(expr); } void MeExpr::UpdateDepth() { @@ -77,12 +77,12 @@ void MeExpr::UpdateDepth() { MeExpr *MeExpr::ResolveMeExprValue() { MeExpr *cmpOpLocal = this; while (cmpOpLocal != nullptr && cmpOpLocal->GetMeOp() == kMeOpVar) { - VarMeExpr *varCmpOp = static_cast(cmpOpLocal); + auto *varCmpOp = static_cast(cmpOpLocal); if (varCmpOp->GetDefBy() == kDefByStmt) { cmpOpLocal = static_cast(varCmpOp->GetDefStmt())->GetRHS(); } else if (varCmpOp->GetDefBy() == kDefByChi) { - ChiMeNode *defchi = varCmpOp->GetDefChi(); - MeStmt *base = defchi->GetBase(); + ChiMeNode &defchi = varCmpOp->GetDefChi(); + MeStmt *base = defchi.GetBase(); if (base->GetOp() == OP_maydassign) { cmpOpLocal = static_cast(base)->GetRHS(); } else { @@ -95,6 +95,36 @@ MeExpr *MeExpr::ResolveMeExprValue() { return cmpOpLocal; } +bool VarMeExpr::IsSameVariableValue(const VarMeExpr &expr) const { + if (&expr == this) { + return true; + } + + if (GetMeOp() == kMeOpVar && GetDefBy() == kDefByStmt && GetDefStmt()->GetOp() == OP_dassign) { + auto *stmt = static_cast(GetDefStmt()); + if (stmt->GetRHS() == &expr) { + return true; + } + } + + return MeExpr::IsSameVariableValue(expr); +} + +bool RegMeExpr::IsSameVariableValue(const VarMeExpr &expr) const { + if (static_cast(&expr) == this) { + return true; + } + + if (GetMeOp() == kMeOpReg &&GetDefBy() == kDefByStmt && GetDefStmt()->GetOp() == OP_regassign) { + auto *stmt = static_cast(GetDefStmt()); + if (stmt->GetRHS() == &expr) { + return true; + } + } + + return MeExpr::IsSameVariableValue(expr); +} + // get the definition VarMeExpr of this // for expample: // v2 = v3 @@ -102,49 +132,33 @@ MeExpr *MeExpr::ResolveMeExprValue() { // this = v1 // this->ResolveVarMeValue() returns v3; // if no resolved VarMeExpr, return this -VarMeExpr *VarMeExpr::ResolveVarMeValue() { +VarMeExpr &VarMeExpr::ResolveVarMeValue() { VarMeExpr *cmpop0 = this; while (true) { - if (cmpop0->defBy == kDefByStmt) { - DassignMeStmt *defStmt = static_cast(cmpop0->def.defStmt); - if (defStmt->GetRHS()->GetMeOp() != kMeOpVar) { - break; - } - cmpop0 = static_cast(defStmt->GetRHS()); - } else { + if (cmpop0->defBy != kDefByStmt) { break; } + + auto *defStmt = static_cast(cmpop0->def.defStmt); + MeExpr *expr = defStmt->GetRHS(); + if (expr->GetMeOp() != kMeOpVar) { + break; + } + + cmpop0 = static_cast(expr); } - return cmpop0; + return *cmpop0; } // *this can be any node, but *v must be VarMeExpr -bool MeExpr::IsSameVariableValue(VarMeExpr *v) const { - if (v == this) { +bool MeExpr::IsSameVariableValue(const VarMeExpr &expr) const { + if (&expr == this) { return true; } - // look up x's value if it is variable or register - if (meOp == kMeOpVar) { - const VarMeExpr *xvar = static_cast(this); - if (xvar->GetDefBy() == kDefByStmt && xvar->GetDefStmt()->GetOp() == OP_dassign) { - DassignMeStmt *xdass = static_cast(xvar->GetDefStmt()); - if (xdass->GetRHS() == v) { - return true; - } - } - } else if (meOp == kMeOpReg) { - const RegMeExpr *xreg = static_cast(this); - if (xreg->GetDefBy() == kDefByStmt && xreg->GetDefStmt()->GetOp() == OP_regassign) { - RegassignMeStmt *xrass = static_cast(xreg->GetDefStmt()); - if (xrass->GetRHS() == v) { - return true; - } - } - } // look up v's value - if (v->GetDefBy() == kDefByStmt && v->GetDefStmt()->GetOp() == OP_dassign) { - DassignMeStmt *vdass = static_cast(v->GetDefStmt()); - if (vdass->GetRHS() == this) { + if (expr.GetDefBy() == kDefByStmt && expr.GetDefStmt()->GetOp() == OP_dassign) { + auto *stmt = static_cast(expr.GetDefStmt()); + if (stmt->GetRHS() == this) { return true; } } @@ -176,17 +190,17 @@ bool MeExpr::CouldThrowException() const { // search through the SSA graph to find a version with GetDefBy() == DefBYy_stmt // visited is for avoiding processing a node more than once -RegMeExpr *RegMeExpr::FindDefByStmt(std::set *visited) { - if (visited->find(this) != visited->end()) { +RegMeExpr *RegMeExpr::FindDefByStmt(std::set &visited) { + if (visited.find(this) != visited.end()) { return nullptr; } - visited->insert(this); + visited.insert(this); if (GetDefBy() == kDefByStmt) { return this; } if (GetDefBy() == kDefByPhi) { - MeRegPhiNode *phireg = GetDefPhi(); - for (RegMeExpr *phiOpnd : phireg->GetOpnds()) { + MeRegPhiNode &phireg = GetDefPhi(); + for (RegMeExpr *phiOpnd : phireg.GetOpnds()) { RegMeExpr *res = phiOpnd->FindDefByStmt(visited); if (res != nullptr) { return res; @@ -196,31 +210,31 @@ RegMeExpr *RegMeExpr::FindDefByStmt(std::set *visited) { return nullptr; } -MeExpr *MeExpr::GetAddrExprBase() { +MeExpr &MeExpr::GetAddrExprBase() { switch (meOp) { case kMeOpAddrof: case kMeOpVar: - return this; + return *this; case kMeOpOp: if (op == OP_add || op == OP_sub) { - OpMeExpr *opMeExpr = static_cast(this); + auto *opMeExpr = static_cast(this); return opMeExpr->GetOpnd(0)->GetAddrExprBase(); } - return this; + return *this; case kMeOpNary: if (op == OP_array) { - NaryMeExpr *naryExpr = static_cast(this); + auto *naryExpr = static_cast(this); ASSERT(naryExpr->GetOpnd(0) != nullptr, ""); return naryExpr->GetOpnd(0)->GetAddrExprBase(); } - return this; + return *this; case kMeOpReg: { - RegMeExpr *baseVar = static_cast(this); + auto *baseVar = static_cast(this); std::set visited; - baseVar = baseVar->FindDefByStmt(&visited); + baseVar = baseVar->FindDefByStmt(visited); if (baseVar != nullptr && baseVar->GetDefBy() == kDefByStmt) { MeStmt *baseDefStmt = baseVar->GetDefStmt(); - RegassignMeStmt *regAssign = static_cast(baseDefStmt); + auto *regAssign = static_cast(baseDefStmt); MeExpr *rhs = regAssign->GetRHS(); // Following we only consider array, add and sub // Prevent the following situation for reg %1 @@ -229,70 +243,70 @@ MeExpr *MeExpr::GetAddrExprBase() { return rhs->GetAddrExprBase(); } } - return this; + return *this; } default: - return this; + return *this; } } -bool NaryMeExpr::IsUseSameSymbol(MeExpr *meexpr) const { - NaryMeExpr *naryMeExpr = dynamic_cast(meexpr); +bool NaryMeExpr::IsUseSameSymbol(const MeExpr &expr) const { + auto *naryMeExpr = dynamic_cast(&expr); if (naryMeExpr == nullptr) { return false; } - if (meexpr->GetOp() != GetOp() || naryMeExpr->GetIntrinsic() != intrinsic || naryMeExpr->tyIdx != tyIdx) { + if (expr.GetOp() != GetOp() || naryMeExpr->GetIntrinsic() != intrinsic || naryMeExpr->tyIdx != tyIdx) { return false; } if (opnds.size() != naryMeExpr->GetOpnds().size()) { return false; } for (size_t i = 0; i < opnds.size(); i++) { - if (!opnds[i]->IsUseSameSymbol(naryMeExpr->GetOpnd(i))) { + if (!opnds[i]->IsUseSameSymbol(*naryMeExpr->GetOpnd(i))) { return false; } } return true; } -bool OpMeExpr::IsIdentical(const OpMeExpr *meexpr) { - if (meexpr->GetOp() != GetOp()) { +bool OpMeExpr::IsIdentical(const OpMeExpr &meexpr) { + if (meexpr.GetOp() != GetOp()) { return false; } - if (meexpr->GetPrimType() != GetPrimType() || meexpr->opndType != opndType || meexpr->bitsOffset != bitsOffset || - meexpr->bitsSize != bitsSize || meexpr->tyIdx != tyIdx || meexpr->fieldID != fieldID) { + if (meexpr.GetPrimType() != GetPrimType() || meexpr.opndType != opndType || meexpr.bitsOffset != bitsOffset || + meexpr.bitsSize != bitsSize || meexpr.tyIdx != tyIdx || meexpr.fieldID != fieldID) { return false; } - CHECK_FATAL(meexpr->opnds[0], "at least opnds[0] shouldn't be empty"); + CHECK_FATAL(meexpr.opnds[0], "at least opnds[0] shouldn't be empty"); CHECK_FATAL(opnds[0], "at least opnds[0] shouldn't be empty"); - if (meexpr->opnds[0]->GetExprID() != opnds[0]->GetExprID()) { + if (meexpr.opnds[0]->GetExprID() != opnds[0]->GetExprID()) { return false; } - if ((meexpr->opnds[1] && !opnds[1]) || (!meexpr->opnds[1] && opnds[1])) { + if ((meexpr.opnds[1] && !opnds[1]) || (!meexpr.opnds[1] && opnds[1])) { return false; } - if ((meexpr->opnds[1] && opnds[1] && meexpr->opnds[1]->GetExprID() != opnds[1]->GetExprID())) { + if ((meexpr.opnds[1] && opnds[1] && meexpr.opnds[1]->GetExprID() != opnds[1]->GetExprID())) { return false; } - if ((meexpr->opnds[2] && !opnds[2]) || (!meexpr->opnds[2] && opnds[2])) { + if ((meexpr.opnds[2] && !opnds[2]) || (!meexpr.opnds[2] && opnds[2])) { return false; } - if ((meexpr->opnds[2] && opnds[2] && meexpr->opnds[2]->GetExprID() != opnds[2]->GetExprID())) { + if ((meexpr.opnds[2] && opnds[2] && meexpr.opnds[2]->GetExprID() != opnds[2]->GetExprID())) { return false; } return true; } -bool NaryMeExpr::IsIdentical(NaryMeExpr *meexpr) const { - if (meexpr->GetOp() != GetOp() || meexpr->tyIdx != tyIdx || meexpr->GetIntrinsic() != intrinsic || - meexpr->boundCheck != boundCheck) { +bool NaryMeExpr::IsIdentical(NaryMeExpr &meexpr) const { + if (meexpr.GetOp() != GetOp() || meexpr.tyIdx != tyIdx || meexpr.GetIntrinsic() != intrinsic || + meexpr.boundCheck != boundCheck) { return false; } - if (meexpr->GetNumOpnds() != GetNumOpnds()) { + if (meexpr.GetNumOpnds() != GetNumOpnds()) { return false; } for (uint8 i = 0; i < GetNumOpnds(); i++) { - if (opnds[i]->GetExprID() != meexpr->GetOpnd(i)->GetExprID()) { + if (opnds[i]->GetExprID() != meexpr.GetOpnd(i)->GetExprID()) { // expression comparison return false; } @@ -300,15 +314,15 @@ bool NaryMeExpr::IsIdentical(NaryMeExpr *meexpr) const { return true; } -bool IvarMeExpr::IsUseSameSymbol(MeExpr *meexpr) const { - if (meexpr->GetExprID() == GetExprID()) { +bool IvarMeExpr::IsUseSameSymbol(const MeExpr &expr) const { + if (expr.GetExprID() == GetExprID()) { return true; } - IvarMeExpr *ivarMeExpr = dynamic_cast(meexpr); + auto *ivarMeExpr = dynamic_cast(&expr); if (ivarMeExpr == nullptr) { return false; } - if (base->IsUseSameSymbol(ivarMeExpr->base) && fieldID == ivarMeExpr->fieldID) { + if (base->IsUseSameSymbol(*ivarMeExpr->base) && fieldID == ivarMeExpr->fieldID) { return true; } return false; @@ -346,62 +360,47 @@ bool IvarMeExpr::IsRCWeak() { return false; } -BB *VarMeExpr::GetDefByBBMeStmt(Dominance *dominance, MeStmtPtr &defMeStmt) { - BB *bbx = nullptr; +BB *VarMeExpr::GetDefByBBMeStmt(Dominance &dominance, MeStmtPtr &defMeStmt) { switch (defBy) { - case kDefByNo: { - bbx = dominance->GetCommonEntryBB(); - break; - } - case kDefByStmt: { + case kDefByNo: + return &dominance.GetCommonEntryBB(); + case kDefByStmt: defMeStmt = def.defStmt; - bbx = defMeStmt->GetBB(); - break; - } - case kDefByMustDef: { - MustDefMeNode *defMustDef = def.defMustDef; - defMeStmt = defMustDef->GetBase(); - bbx = defMeStmt->GetBB(); - break; - } - case kDefByChi: { - ChiMeNode *defchi = def.defChi; - defMeStmt = defchi->GetBase(); - bbx = defMeStmt->GetBB(); - break; - } - case kDefByPhi: { - MeVarPhiNode *defphi = def.defPhi; - bbx = defphi->GetDefBB(); - break; - } + return defMeStmt->GetBB(); + case kDefByMustDef: + defMeStmt = def.defMustDef->GetBase(); + return defMeStmt->GetBB(); + case kDefByChi: + defMeStmt = def.defChi->GetBase(); + return defMeStmt->GetBB(); + case kDefByPhi: + return def.defPhi->GetDefBB(); default: - break; + return nullptr; } - return bbx; } -bool VarMeExpr::IsUseSameSymbol(MeExpr *meexpr) const { - VarMeExpr *varMeExpr = dynamic_cast(meexpr); +bool VarMeExpr::IsUseSameSymbol(const MeExpr &expr) const { + auto *varMeExpr = dynamic_cast(&expr); if (varMeExpr == nullptr) { return false; } return ostIdx == varMeExpr->ostIdx; } -bool VarMeExpr::IsPureLocal(SSATab *ssatab, const MIRFunction *mirfunc) const { - MIRSymbol *st = ssatab->GetMIRSymbolFromID(ostIdx); - return st->IsLocal() && !mirfunc->IsAFormal(st); +bool VarMeExpr::IsPureLocal(SSATab &tab, const MIRFunction &irFunc) const { + MIRSymbol *st = tab.GetMIRSymbolFromID(ostIdx); + return st->IsLocal() && !irFunc.IsAFormal(st); } -bool VarMeExpr::IsZeroVersion(SSATab *ssatab) const { +bool VarMeExpr::IsZeroVersion(SSATab &ssatab) const { ASSERT(vstIdx != 0, "VarMeExpr::IsZeroVersion: cannot determine because vstIdx is 0"); - OriginalSt *ost = ssatab->GetOriginalStFromID(ostIdx); + const OriginalSt *ost = ssatab.GetOriginalStFromID(ostIdx); return ost->GetZeroVersionIndex() == vstIdx; } -bool RegMeExpr::IsUseSameSymbol(MeExpr *meExpr) const { - RegMeExpr *regMeExpr = dynamic_cast(meExpr); +bool RegMeExpr::IsUseSameSymbol(const MeExpr &expr) const { + auto *regMeExpr = dynamic_cast(&expr); if (regMeExpr == nullptr) { return false; } @@ -428,19 +427,19 @@ BB *RegMeExpr::DefByBB() { } } -bool AddrofMeExpr::IsUseSameSymbol(MeExpr *meexpr) const { - AddrofMeExpr *varMeExpr = dynamic_cast(meexpr); - if (!varMeExpr) { +bool AddrofMeExpr::IsUseSameSymbol(const MeExpr &expr) const { + auto *varMeExpr = dynamic_cast(&expr); + if (varMeExpr == nullptr) { return false; } return ostIdx == varMeExpr->ostIdx; } -bool OpMeExpr::IsUseSameSymbol(MeExpr *meexpr) const { - if (meexpr->GetOp() != GetOp()) { +bool OpMeExpr::IsUseSameSymbol(const MeExpr &expr) const { + if (expr.GetOp() != GetOp()) { return false; } - OpMeExpr *opmeexpr = dynamic_cast(meexpr); + auto *opmeexpr = dynamic_cast(&expr); if (opmeexpr == nullptr) { return false; } @@ -449,7 +448,7 @@ bool OpMeExpr::IsUseSameSymbol(MeExpr *meexpr) const { if (!opmeexpr->opnds[i]) { return false; } - if (!opnds[i]->IsUseSameSymbol(opmeexpr->opnds[i])) { + if (!opnds[i]->IsUseSameSymbol(*opmeexpr->opnds[i])) { return false; } } else { @@ -467,11 +466,10 @@ bool ConstMeExpr::GeZero() const { } bool ConstMeExpr::GtZero() const { - MIRIntConst *mirConst = dynamic_cast(constVal); - if (mirConst == nullptr) { + if (constVal->GetKind() != kConstInt) { return false; } - return (mirConst->GetValue() > 0); + return (static_cast(constVal)->GetValue() > 0); } bool ConstMeExpr::IsZero() const { @@ -479,17 +477,15 @@ bool ConstMeExpr::IsZero() const { } bool ConstMeExpr::IsOne() const { - MIRIntConst *mirConst = dynamic_cast(constVal); - if (mirConst == nullptr) { + if (constVal->GetKind() != kConstInt) { return false; } - return (mirConst->GetValue() == 1); + return (static_cast(constVal)->GetValue() == 1); } int64 ConstMeExpr::GetIntValue() const { - MIRIntConst *mirConst = dynamic_cast(constVal); - ASSERT(mirConst, "expect int const"); - return mirConst->GetValue(); + CHECK_FATAL(constVal->GetKind() == kConstInt, "expect int const"); + return static_cast(constVal)->GetValue(); } void MeVarPhiNode::Dump(IRMap *irMap) const { @@ -534,7 +530,7 @@ void VarMeExpr::Dump(IRMap *irMap, int32 indent) const { irMap->GetSSATab()->GetOriginalStFromID(ostIdx)->Dump(); LogInfo::MapleLogger() << " (field)" << fieldID; LogInfo::MapleLogger() << " mx" << GetExprID(); - if (IsZeroVersion(irMap->GetSSATab())) { + if (IsZeroVersion(*irMap->GetSSATab())) { LogInfo::MapleLogger() << ""; } } @@ -673,13 +669,13 @@ void NaryMeExpr::Dump(IRMap *irMap, int32 indent) const { } } -MeExpr *DassignMeStmt::GetLHSRef(SSATab *ssatab, bool excludelocalrefvar) { +MeExpr *DassignMeStmt::GetLHSRef(SSATab &ssatab, bool excludelocalrefvar) { VarMeExpr *l = GetVarLHS(); ASSERT(l != nullptr, "null ptr check"); if (l->GetPrimType() != PTY_ref) { return nullptr; } - OriginalSt *ost = ssatab->GetOriginalStFromID(lhs->GetOStIdx()); + const OriginalSt *ost = ssatab.GetOriginalStFromID(lhs->GetOStIdx()); if (ost->IsIgnoreRC()) { return nullptr; } @@ -689,13 +685,13 @@ MeExpr *DassignMeStmt::GetLHSRef(SSATab *ssatab, bool excludelocalrefvar) { return l; } -MeExpr *MaydassignMeStmt::GetLHSRef(SSATab *ssatab, bool excludelocalrefvar) { +MeExpr *MaydassignMeStmt::GetLHSRef(SSATab &ssatab, bool excludelocalrefvar) { VarMeExpr *l = GetVarLHS(); ASSERT(l != nullptr, "null ptr check"); if (l->GetPrimType() != PTY_ref) { return nullptr; } - OriginalSt *ost = ssatab->GetOriginalStFromID(l->GetOStIdx()); + const OriginalSt *ost = ssatab.GetOriginalStFromID(l->GetOStIdx()); if (ost->IsIgnoreRC()) { return nullptr; } @@ -705,7 +701,7 @@ MeExpr *MaydassignMeStmt::GetLHSRef(SSATab *ssatab, bool excludelocalrefvar) { return l; } -MeExpr *IassignMeStmt::GetLHSRef(SSATab *ssatab, bool excludelocalrefvar) { +MeExpr *IassignMeStmt::GetLHSRef(SSATab &ssatab, bool excludelocalrefvar) { MIRType *baseType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(lhsVar->GetTyIdx()); ASSERT(baseType != nullptr, "null ptr check"); MIRType *ptype = static_cast(baseType)->GetPointedType(); @@ -742,19 +738,19 @@ MeExpr *IassignMeStmt::GetLHSRef(SSATab *ssatab, bool excludelocalrefvar) { return lhsVar; } -VarMeExpr *AssignedPart::GetAssignedPartLHSRef(SSATab *ssatab, bool excludelocalrefvar) { +VarMeExpr *AssignedPart::GetAssignedPartLHSRef(SSATab &ssatab, bool excludelocalrefvar) { if (mustDefList.empty()) { return nullptr; } MeExpr *assignedLHS = mustDefList.front().GetLHS(); - VarMeExpr *theLHS = dynamic_cast(assignedLHS); + auto *theLHS = dynamic_cast(assignedLHS); if (theLHS == nullptr) { return nullptr; } if (theLHS->GetPrimType() != PTY_ref) { return nullptr; } - OriginalSt *ost = ssatab->GetOriginalStFromID(theLHS->GetOStIdx()); + const OriginalSt *ost = ssatab.GetOriginalStFromID(theLHS->GetOStIdx()); if (ost->IsIgnoreRC()) { return nullptr; } @@ -827,8 +823,8 @@ void MaydassignMeStmt::Dump(IRMap *irMap) const { } void ChiMeNode::Dump(IRMap *irMap) const { - VarMeExpr *melhs = static_cast(lhs); - VarMeExpr *merhs = static_cast(rhs); + auto *melhs = static_cast(lhs); + auto *merhs = static_cast(rhs); CHECK_FATAL(melhs != nullptr, "Node doesn't have lhs?"); CHECK_FATAL(merhs != nullptr, "Node doesn't have rhs?"); if (!DumpOptions::GetSimpleDump()) { @@ -1026,35 +1022,35 @@ void SyncMeStmt::Dump(IRMap *irMap) const { DumpChiList(irMap, chiList); } -bool MeStmt::IsTheSameWorkcand(MeStmt *mestmt) const { - if (op != mestmt->op) { +bool MeStmt::IsTheSameWorkcand(MeStmt &mestmt) const { + if (op != mestmt.op) { return false; } if (op == OP_dassign) { - if (this->GetVarLHS()->GetOStIdx() != mestmt->GetVarLHS()->GetOStIdx()) { + if (this->GetVarLHS()->GetOStIdx() != mestmt.GetVarLHS()->GetOStIdx()) { return false; } } else if (op == OP_intrinsiccallwithtype) { if (static_cast(this)->GetTyIdx() != - static_cast(mestmt)->GetTyIdx()) { + static_cast(mestmt).GetTyIdx()) { return false; } if (static_cast(this)->GetIntrinsic() != - static_cast(mestmt)->GetIntrinsic()) { + static_cast(mestmt).GetIntrinsic()) { return false; } } else if (op == OP_callassigned) { - const CallMeStmt *thisCass = static_cast(this); - CallMeStmt *cass = static_cast(mestmt); - if (thisCass->GetPUIdx() != cass->GetPUIdx()) { + auto *thisCass = static_cast(this); + auto &cass = static_cast(mestmt); + if (thisCass->GetPUIdx() != cass.GetPUIdx()) { return false; } - if (thisCass->MustDefListSize() != cass->MustDefListSize()) { + if (thisCass->MustDefListSize() != cass.MustDefListSize()) { return false; } if (thisCass->MustDefListSize() > 0) { - const VarMeExpr *thisVarMeExpr = static_cast(thisCass->GetAssignedLHS()); - const VarMeExpr *varMeExpr = static_cast(cass->GetAssignedLHS()); + auto *thisVarMeExpr = static_cast(thisCass->GetAssignedLHS()); + auto *varMeExpr = static_cast(cass.GetAssignedLHS()); if (thisVarMeExpr->GetOStIdx() != varMeExpr->GetOStIdx()) { return false; } @@ -1063,7 +1059,7 @@ bool MeStmt::IsTheSameWorkcand(MeStmt *mestmt) const { // check the operands for (size_t i = 0; i < NumMeStmtOpnds(); ++i) { ASSERT(GetOpnd(i) != nullptr, "null ptr check"); - if (!GetOpnd(i)->IsUseSameSymbol(mestmt->GetOpnd(i))) { + if (!GetOpnd(i)->IsUseSameSymbol(*mestmt.GetOpnd(i))) { return false; } } @@ -1108,8 +1104,8 @@ BB *VarMeExpr::DefByBB() { } } -bool VarMeExpr::IsVolatile(SSATab *ssatab) { - OriginalSt *ost = ssatab->GetOriginalStFromID(ostIdx); +bool VarMeExpr::IsVolatile(SSATab &ssatab) { + const OriginalSt *ost = ssatab.GetOriginalStFromID(ostIdx); if (!ost->IsSymbolOst()) { return false; } @@ -1121,7 +1117,7 @@ bool VarMeExpr::IsVolatile(SSATab *ssatab) { if (fieldID == 0) { return (ty->HasVolatileField()); } - MIRStructType *structType = static_cast(ty); + auto *structType = static_cast(ty); return structType->IsFieldVolatile(fieldID); } @@ -1165,7 +1161,21 @@ bool MeExpr::PointsToSomethingThatNeedsIncRef() { if (op == OP_retype) { return true; } - if (meOp == kMeOpVar || meOp == kMeOpIvar) { + if (meOp == kMeOpIvar) { + return true; + } + if (meOp == kMeOpVar) { + VarMeExpr *var = static_cast(this); + if (var->GetDefBy() == kDefByMustDef) { + MeStmt *baseStmt = var->GetDefMustDef().GetBase(); + if (baseStmt->GetOp() == OP_callassigned) { + CallMeStmt *call = static_cast(baseStmt); + MIRFunction *callFunc = GlobalTables::GetFunctionTable().GetFunctionFromPuidx(call->GetPUIdx()); + if (callFunc->GetName() == "MCC_GetOrInsertLiteral") { + return false; + } + } + } return true; } if (meOp == kMeOpReg) { @@ -1176,14 +1186,14 @@ bool MeExpr::PointsToSomethingThatNeedsIncRef() { } MapleMap *GenericGetChiListFromVarMeExprInner(VarMeExpr *expr, - std::unordered_set &visited) { + std::unordered_set &visited) { if (expr == nullptr || expr->GetDefBy() == kDefByNo || visited.find(expr) != visited.end()) { return nullptr; } visited.insert(expr); if (expr->GetDefBy() == kDefByPhi) { - MeVarPhiNode *phime = expr->GetDefPhi(); - MapleVector &phiopnds = phime->GetOpnds(); + MeVarPhiNode &phime = expr->GetDefPhi(); + MapleVector &phiopnds = phime.GetOpnds(); for (auto it = phiopnds.begin(); it != phiopnds.end(); it++) { VarMeExpr *meexpr = *it; MapleMap *chiList = GenericGetChiListFromVarMeExprInner(meexpr, visited); @@ -1192,7 +1202,7 @@ MapleMap *GenericGetChiListFromVarMeExprInner(VarMeExpr *exp } } } else if (expr->GetDefBy() == kDefByChi) { - return expr->GetDefChi()->GetBase()->GetChiList(); + return expr->GetDefChi().GetBase()->GetChiList(); } else { // NYI return nullptr; @@ -1205,7 +1215,7 @@ MapleMap *GenericGetChiListFromVarMeExpr(VarMeExpr *expr) { return GenericGetChiListFromVarMeExprInner(expr, visited); } -void MeStmt::SetCallReturn(MeExpr *curexpr) { +void MeStmt::SetCallReturn(MeExpr &curexpr) { ASSERT(GetMustDefList() != nullptr, "null ptr check"); MustDefMeNode &mustDefMeNode = GetMustDefList()->front(); mustDefMeNode.UpdateLHS(curexpr); diff --git a/src/maple_me/src/me_irmap.cpp b/src/maple_me/src/me_irmap.cpp index fd4f0d451d6dbd39736f65a3da975cd817323a57..fcd68f63576e0f438be9e7f051c98bc6b47a0591 100644 --- a/src/maple_me/src/me_irmap.cpp +++ b/src/maple_me/src/me_irmap.cpp @@ -17,9 +17,9 @@ #include "mir_builder.h" namespace maple { -void MeIRMap::DumpBB(BB *bb) { +void MeIRMap::DumpBB(BB &bb) { int i = 0; - for (auto &mestmt : bb->GetMeStmts()) { + for (auto &mestmt : bb.GetMeStmts()) { if (GetDumpStmtNum()) { LogInfo::MapleLogger() << "(" << i++ << ") "; } @@ -30,12 +30,12 @@ void MeIRMap::DumpBB(BB *bb) { void MeIRMap::Dump() { // back up mempool and use a new mempool every time // we dump IRMap, restore the mempool afterwards - MIRFunction *mirFunction = func->GetMirFunc(); + MIRFunction *mirFunction = func.GetMirFunc(); MemPool *backup = mirFunction->GetCodeMempool(); mirFunction->SetMemPool(mempoolctrler.NewMemPool("IR Dump")); LogInfo::MapleLogger() << "===================Me IR dump==================\n"; - auto eIt = func->valid_end(); - for (auto bIt = func->valid_begin(); bIt != eIt; ++bIt) { + auto eIt = func.valid_end(); + for (auto bIt = func.valid_begin(); bIt != eIt; ++bIt) { auto *bb = *bIt; bb->DumpHeader(GetMIRModule()); LogInfo::MapleLogger() << "frequency : " << bb->GetFrequency() << "\n"; @@ -46,7 +46,7 @@ void MeIRMap::Dump() { if (GetDumpStmtNum()) { LogInfo::MapleLogger() << "(" << i++ << ") "; } - mestmt.EmitStmt(GetSSATab())->Dump(GetMIRModule(), 0); + mestmt.EmitStmt(*GetSSATab()).Dump(GetMIRModule(), 0); mestmt.Dump(this); } } @@ -55,9 +55,8 @@ void MeIRMap::Dump() { } // this function only emits statement -void MeIRMap::EmitBBStmts(BB *bb, BlockNode *curblk) { - ASSERT(curblk != nullptr, "null ptr check"); - auto &meStmts = bb->GetMeStmts(); +void MeIRMap::EmitBBStmts(BB &bb, BlockNode &curblk) { + auto &meStmts = bb.GetMeStmts(); for (auto &mestmt : meStmts) { if (!GetNeedAnotherPass()) { if (mestmt.GetOp() == OP_interfaceicall || mestmt.GetOp() == OP_virtualicall) { @@ -66,27 +65,25 @@ void MeIRMap::EmitBBStmts(BB *bb, BlockNode *curblk) { mestmt.SetOp(OP_icallassigned); } } - StmtNode *stmt = mestmt.EmitStmt(GetSSATab()); - ASSERT(stmt != nullptr, "null ptr check"); - curblk->AddStatement(stmt); + StmtNode &stmt = mestmt.EmitStmt(*GetSSATab()); + curblk.AddStatement(&stmt); } } -void MeIRMap::EmitBB(BB *bb, BlockNode *curblk) { - ASSERT(curblk != nullptr, "null ptr check"); +void MeIRMap::EmitBB(BB &bb, BlockNode &curblk) { // emit head. label - LabelIdx labidx = bb->GetBBLabel(); + LabelIdx labidx = bb.GetBBLabel(); if (labidx != 0) { // not a empty bb - LabelNode *lbnode = GetSSATab()->mirModule.CurFunction()->GetCodeMempool()->New(); + LabelNode *lbnode = GetSSATab()->GetModule().CurFunction()->GetCodeMempool()->New(); lbnode->SetLabelIdx(labidx); - curblk->AddStatement(lbnode); + curblk.AddStatement(lbnode); } EmitBBStmts(bb, curblk); - if (bb->GetAttributes(kBBAttrIsTryEnd)) { + if (bb.GetAttributes(kBBAttrIsTryEnd)) { /* generate op_endtry */ - StmtNode *endtry = GetSSATab()->mirModule.CurFunction()->GetCodeMempool()->New(OP_endtry); - curblk->AddStatement(endtry); + StmtNode *endtry = GetSSATab()->GetModule().CurFunction()->GetCodeMempool()->New(OP_endtry); + curblk.AddStatement(endtry); } } @@ -94,13 +91,13 @@ AnalysisResult *MeDoIRMap::Run(MeFunction *func, MeFuncResultMgr *m, ModuleResul Dominance *dom = static_cast(m->GetAnalysisResult(MeFuncPhase_DOMINANCE, func)); ASSERT(dom, "dominance phase has problem"); MemPool *irMapMemPool = NewMemPool(); - MeIRMap *irmap = irMapMemPool->New(func, dom, irMapMemPool, NewMemPool()); + MeIRMap *irmap = irMapMemPool->New(*func, *dom, *irMapMemPool, *NewMemPool()); func->SetIRMap(irmap); #if DEBUG g_irmap = irmap; #endif std::vector bbIRMapProcessed(func->NumBBs(), false); - irmap->BuildBB(func->GetCommonEntryBB(), bbIRMapProcessed); + irmap->BuildBB(*func->GetCommonEntryBB(), bbIRMapProcessed); if (DEBUGFUNC(func)) { irmap->Dump(); } @@ -127,5 +124,4 @@ AnalysisResult *MeDoIRMap::Run(MeFunction *func, MeFuncResultMgr *m, ModuleResul mempoolctrler.DeleteMemPool(func->GetMeSSATab()->GetVersionStTable().GetVSTAlloc().GetMemPool()); return irmap; } - } // namespace maple diff --git a/src/maple_me/src/me_option.cpp b/src/maple_me/src/me_option.cpp index c6a74eb220269912e15a07eaaa9f96904e8c801b..48fc7924044b9820a7ea8fafdeea6c73717f4ab7 100644 --- a/src/maple_me/src/me_option.cpp +++ b/src/maple_me/src/me_option.cpp @@ -22,25 +22,25 @@ using namespace maple; using namespace mapleOption; -std::unordered_set MeOptions::dumpPhases = {}; -bool MeOptions::dumpAfter = false; -std::string MeOptions::dumpFunc = "*"; -unsigned long MeOptions::range[2] = { 0, 0 }; -bool MeOptions::useRange = false; -bool MeOptions::quiet = false; -bool MeOptions::setCalleeHasSideEffect = false; -bool MeOptions::noSteensgaard = false; -bool MeOptions::noTBAA = false; -uint8 MeOptions::aliasAnalysisLevel = 3; -bool MeOptions::noDot = false; -bool MeOptions::stmtNum = false; -uint8 MeOptions::optLevel = 0; -bool MeOptions::ignoreIPA = true; -bool MeOptions::lessThrowAlias = true; -bool MeOptions::finalFieldAlias = false; -bool MeOptions::regreadAtReturn = true; +std::unordered_set MeOption::dumpPhases = {}; +bool MeOption::dumpAfter = false; +std::string MeOption::dumpFunc = "*"; +unsigned long MeOption::range[kRangeArrayLen] = { 0, 0 }; +bool MeOption::useRange = false; +bool MeOption::quiet = false; +bool MeOption::setCalleeHasSideEffect = false; +bool MeOption::noSteensgaard = false; +bool MeOption::noTBAA = false; +uint8 MeOption::aliasAnalysisLevel = 3; +bool MeOption::noDot = false; +bool MeOption::stmtNum = false; +uint8 MeOption::optLevel = 0; +bool MeOption::ignoreIPA = true; +bool MeOption::lessThrowAlias = true; +bool MeOption::finalFieldAlias = false; +bool MeOption::regreadAtReturn = true; -void MeOptions::SplitPhases(const char *str, std::unordered_set &set) { +void MeOption::SplitPhases(const std::string &str, std::unordered_set &set) { std::string s{str}; if (s.compare("*") == 0) { @@ -50,8 +50,8 @@ void MeOptions::SplitPhases(const char *str, std::unordered_set &se StringUtils::Split(s, set, ','); } -void MeOptions::GetRange(const char *str) { - std::string s = str; +void MeOption::GetRange(const std::string &str) { + std::string s{str}; size_t comma = s.find_first_of(",", 0); if (comma != std::string::npos) { range[0] = std::stoul(s.substr(0, comma), nullptr); @@ -63,7 +63,7 @@ void MeOptions::GetRange(const char *str) { } } -bool MeOptions::DumpPhase(const std::string &phase) { +bool MeOption::DumpPhase(const std::string &phase) { if (phase == "") { return false; } diff --git a/src/maple_me/src/me_phase_manager.cpp b/src/maple_me/src/me_phase_manager.cpp index 2391a1540c8d637152dec028b286653ec82f879c..428be32823e7d5af4a530b932452e3f107b17691 100644 --- a/src/maple_me/src/me_phase_manager.cpp +++ b/src/maple_me/src/me_phase_manager.cpp @@ -36,7 +36,7 @@ void MeFuncPhaseManager::RunFuncPhase(MeFunction *func, MeFuncPhase *phase) { { // 1. check options.enable(phase.id()) // 2. options.tracebeforePhase(phase.id()) dumpIR before - if (!MeOptions::quiet) { + if (!MeOption::quiet) { LogInfo::MapleLogger() << "---Run Phase [ " << phase->PhaseName() << " ]---\n"; } // 3. tracetime(phase.id()) @@ -107,7 +107,7 @@ bool MeFuncPhaseManager::FuncFilter(const std::string &filter, const std::string } void MeFuncPhaseManager::Run(MIRFunction *mirfunc, uint64 rangenum, const std::string &meinput) { - if (!MeOptions::quiet) + if (!MeOption::quiet) LogInfo::MapleLogger() << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>> Optimizing Function < " << mirfunc->GetName() << " id=" << mirfunc->GetPuidxOrigin() << " >---\n"; MemPool *funcMP = mempoolctrler.NewMemPool("maple_me per-function mempool"); @@ -122,15 +122,14 @@ void MeFuncPhaseManager::Run(MIRFunction *mirfunc, uint64 rangenum, const std::s std::string phaseName = ""; MeFuncPhase *changeCFGPhase = nullptr; /* each function level phase */ - bool dumpFunc = FuncFilter(MeOptions::dumpFunc, func.GetName()); + bool dumpFunc = FuncFilter(MeOption::dumpFunc, func.GetName()); size_t phaseIndex = 0; for (auto it = PhaseSequenceBegin(); it != PhaseSequenceEnd(); it++, ++phaseIndex) { PhaseID id = GetPhaseId(it); MeFuncPhase *p = static_cast(GetPhase(id)); - ASSERT(p, "null ptr check "); p->SetPreviousPhaseName(phaseName); /* prev phase name is for filename used in emission after phase */ phaseName = p->PhaseName(); // new phase name - bool dumpPhase = MeOptions::DumpPhase(phaseName); + bool dumpPhase = MeOption::DumpPhase(phaseName); MPLTimer timer; timer.Start(); RunFuncPhase(&func, p); @@ -138,7 +137,7 @@ void MeFuncPhaseManager::Run(MIRFunction *mirfunc, uint64 rangenum, const std::s timer.Stop(); phaseTimers[phaseIndex] += timer.ElapsedMicroseconds(); } - if ((MeOptions::dumpAfter || dumpPhase) && dumpFunc) { + if ((MeOption::dumpAfter || dumpPhase) && dumpFunc) { LogInfo::MapleLogger() << ">>>>> Dump after " << phaseName << " <<<<<\n"; if (phaseName != "emit") { func.Dump(false); @@ -161,15 +160,14 @@ void MeFuncPhaseManager::Run(MIRFunction *mirfunc, uint64 rangenum, const std::s for (auto it = PhaseSequenceBegin(); it != PhaseSequenceEnd(); it++) { PhaseID id = GetPhaseId(it); MeFuncPhase *p = static_cast(GetPhase(id)); - ASSERT(p, "null ptr check "); if (p == changeCFGPhase) { continue; } p->SetPreviousPhaseName(phaseName); /* prev phase name is for filename used in emission after phase */ phaseName = p->PhaseName(); // new phase name - bool dumpPhase = MeOptions::DumpPhase(phaseName); + bool dumpPhase = MeOption::DumpPhase(phaseName); RunFuncPhase(&function, p); - if ((MeOptions::dumpAfter || dumpPhase) && dumpFunc) { + if ((MeOption::dumpAfter || dumpPhase) && dumpFunc) { LogInfo::MapleLogger() << ">>>>>Second time Dump after " << phaseName << " <<<<<\n"; if (phaseName != "emit") { function.Dump(false); @@ -181,5 +179,4 @@ void MeFuncPhaseManager::Run(MIRFunction *mirfunc, uint64 rangenum, const std::s } mempoolctrler.DeleteMemPool(funcMP); } - } // namespace maple diff --git a/src/maple_me/src/me_rc_lowering.cpp b/src/maple_me/src/me_rc_lowering.cpp index ac9573d9bd6b2636fb303f162d55b2378149a5ba..a064b67d94c3b45a7f38e13ad76654027be4294d 100644 --- a/src/maple_me/src/me_rc_lowering.cpp +++ b/src/maple_me/src/me_rc_lowering.cpp @@ -14,13 +14,15 @@ */ #include "me_rc_lowering.h" #include -#include "class_hierarchy.h" /* * RCLowering phase generate RC intrinsic for reference assignment * based on previous analyze results. RC intrinsic will later be lowered * in Code Generation */ +namespace { +} + namespace maple { static inline bool CheckOp(const MeStmt *stmt, const Opcode op) { return stmt != nullptr && stmt->GetOp() == op; @@ -33,26 +35,26 @@ static inline void CheckRemove(MeStmt *stmt, const Opcode op) { } void RCLowering::Prepare() { - MIRFunction *mirfunction = func->GetMirFunc(); + MIRFunction *mirfunction = func.GetMirFunc(); ASSERT(mirfunction->GetModule()->CurFunction() == mirfunction, "unexpected CurFunction"); - if (DEBUGFUNC(func)) { + if (DEBUGFUNC((&func))) { LogInfo::MapleLogger() << "Handling function " << mirfunction->GetName() << std::endl; } } void RCLowering::PreRCLower() { // preparation steps before going through basicblocks - MIRFunction *mirfunction = func->GetMirFunc(); + MIRFunction *mirfunction = func.GetMirFunc(); size_t bsize = mirfunction->GetSymTab()->GetSymbolTableSize(); for (size_t i = 0; i < bsize; ++i) { MIRSymbol *sym = mirfunction->GetSymTab()->GetSymbolFromStIdx(i); - if (sym && sym->GetStorageClass() == kScAuto && !sym->IgnoreRC()) { + if (sym != nullptr && sym->GetStorageClass() == kScAuto && !sym->IgnoreRC()) { sym->SetLocalRefVar(); } } - auto eIt = func->valid_end(); - for (auto bIt = func->valid_begin(); bIt != eIt; ++bIt) { + auto eIt = func.valid_end(); + for (auto bIt = func.valid_begin(); bIt != eIt; ++bIt) { for (auto &stmt : (*bIt)->GetMeStmts()) { MeExpr *lhsRef = stmt.GetLHSRef(ssaTab, false); if (lhsRef == nullptr) { @@ -61,7 +63,7 @@ void RCLowering::PreRCLower() { if (lhsRef->GetMeOp() == kMeOpVar) { VarMeExpr *var = static_cast(lhsRef); cleanUpVars[var->GetOStIdx()] = var; - varOstMap[var->GetOStIdx()] = ssaTab->GetSymbolOriginalStFromID(var->GetOStIdx()); + ssaTab.UpdateVarOstMap(var->GetOStIdx(), varOstMap); } stmt.EnableNeedDecref(); MeExpr *rhs = stmt.GetRHS(); @@ -79,7 +81,7 @@ void RCLowering::PreRCLower() { } void RCLowering::CreateCleanupIntrinsics() { - for (BB *bb : func->GetCommonExitBB()->GetPred()) { + for (BB *bb : func.GetCommonExitBB()->GetPred()) { MeStmt *lastMeStmt = to_ptr(bb->GetMeStmts().rbegin()); if (!CheckOp(lastMeStmt, OP_return)) { continue; @@ -91,46 +93,45 @@ void RCLowering::CreateCleanupIntrinsics() { } opnds.push_back(item.second); } - IntrinsiccallMeStmt *intrn = irMap->CreateIntrinsicCallMeStmt(INTRN_MPL_CLEANUP_LOCALREFVARS, opnds); + IntrinsiccallMeStmt *intrn = irMap.CreateIntrinsicCallMeStmt(INTRN_MPL_CLEANUP_LOCALREFVARS, opnds); bb->InsertMeStmtBefore(to_ptr(bb->GetMeStmts().rbegin()), intrn); } } // move to MeFunction::CreateVarMeExprFromSym as func has ssaTab and irMap -VarMeExpr *RCLowering::CreateVarMeExprFromSym(MIRSymbol *sym) const { - OriginalSt *ost = ssaTab->FindOrCreateSymbolOriginalSt(sym, func->GetMirFunc()->GetPuidx(), 0); - return irMap->GetOrCreateZeroVersionVarMeExpr(ost); +VarMeExpr *RCLowering::CreateVarMeExprFromSym(MIRSymbol &sym) const { + OriginalSt *ost = ssaTab.FindOrCreateSymbolOriginalSt(&sym, func.GetMirFunc()->GetPuidx(), 0); + return irMap.GetOrCreateZeroVersionVarMeExpr(*ost); } // note that RCInstrinsic creation will check the ref assignment and reuse lhs if possible -IntrinsiccallMeStmt *RCLowering::CreateRCIntrinsic(MIRIntrinsicID intrnID, MeStmt *stmt, std::vector opnds, +IntrinsiccallMeStmt *RCLowering::CreateRCIntrinsic(MIRIntrinsicID intrnID, MeStmt &stmt, std::vector opnds, bool assigned) { - CHECK_FATAL(stmt != nullptr, "stmt null check"); IntrinsiccallMeStmt *intrn = nullptr; if (assigned) { - MeExpr *ret = stmt->GetOp() == OP_regassign ? stmt->GetLHS() : irMap->CreateRegMeExpr(PTY_ptr); - intrn = irMap->CreateIntrinsicCallAssignedMeStmt(intrnID, opnds, ret); + MeExpr *ret = stmt.GetOp() == OP_regassign ? stmt.GetLHS() : irMap.CreateRegMeExpr(PTY_ref); + intrn = irMap.CreateIntrinsicCallAssignedMeStmt(intrnID, opnds, ret); } else { - intrn = irMap->CreateIntrinsicCallMeStmt(intrnID, opnds); + intrn = irMap.CreateIntrinsicCallMeStmt(intrnID, opnds); } - intrn->SetSrcPos(stmt->GetSrcPosition()); + intrn->SetSrcPos(stmt.GetSrcPosition()); return intrn; } -MIRIntrinsicID RCLowering::PrepareVolatileCall(MeStmt *stmt, MIRIntrinsicID intrnId) { +MIRIntrinsicID RCLowering::PrepareVolatileCall(MeStmt &stmt, MIRIntrinsicID intrnId) { bool isLoad = (intrnId == INTRN_MCCLoadRefSVol || intrnId == INTRN_MCCLoadWeakVol || intrnId == INTRN_MCCLoadRefVol); if (isLoad) { - CheckRemove(stmt->GetNext(), OP_membaracquire); + CheckRemove(stmt.GetNext(), OP_membaracquire); } else { // volatile store case - CheckRemove(stmt->GetPrev(), OP_membarrelease); - CheckRemove(stmt->GetNext(), OP_membarstoreload); + CheckRemove(stmt.GetPrev(), OP_membarrelease); + CheckRemove(stmt.GetNext(), OP_membarstoreload); } return intrnId; } -IntrinsiccallMeStmt *RCLowering::GetVarRHSHandleStmt(MeStmt *stmt) { - VarMeExpr *var = static_cast(stmt->GetRHS()); - MIRSymbol *sym = ssaTab->GetMIRSymbolFromID(var->GetOStIdx()); +IntrinsiccallMeStmt *RCLowering::GetVarRHSHandleStmt(MeStmt &stmt) { + VarMeExpr *var = static_cast(stmt.GetRHS()); + MIRSymbol *sym = ssaTab.GetMIRSymbolFromID(var->GetOStIdx()); if (!sym->IsGlobal() || sym->IsFinal()) { return nullptr; } @@ -139,7 +140,7 @@ IntrinsiccallMeStmt *RCLowering::GetVarRHSHandleStmt(MeStmt *stmt) { MIRIntrinsicID rcCallID = INTRN_UNDEFINED; bool isVolatile = var->IsVolatile(ssaTab); rcCallID = isVolatile ? PrepareVolatileCall(stmt, INTRN_MCCLoadRefSVol) : INTRN_MCCLoadRefS; - opnds.push_back(irMap->CreateAddrofMeExpr(var)); + opnds.push_back(irMap.CreateAddrofMeExpr(*var)); // rhs is not special, skip if (rcCallID == INTRN_UNDEFINED) { return nullptr; @@ -148,8 +149,8 @@ IntrinsiccallMeStmt *RCLowering::GetVarRHSHandleStmt(MeStmt *stmt) { return CreateRCIntrinsic(rcCallID, stmt, opnds, true); } -IntrinsiccallMeStmt *RCLowering::GetIvarRHSHandleStmt(MeStmt *stmt) { - IvarMeExpr *ivar = static_cast(stmt->GetRHS()); +IntrinsiccallMeStmt *RCLowering::GetIvarRHSHandleStmt(MeStmt &stmt) { + IvarMeExpr *ivar = static_cast(stmt.GetRHS()); if (ivar->IsFinal()) { return nullptr; } @@ -157,8 +158,8 @@ IntrinsiccallMeStmt *RCLowering::GetIvarRHSHandleStmt(MeStmt *stmt) { std::vector opnds; MIRIntrinsicID rcCallId = INTRN_UNDEFINED; rcCallId = ivar->IsVolatile() ? PrepareVolatileCall(stmt, INTRN_MCCLoadRefVol) : INTRN_MCCLoadRef; - opnds.push_back(ivar->GetBase()->GetAddrExprBase()); - opnds.push_back(irMap->CreateAddrofMeExpr(ivar)); + opnds.push_back(&ivar->GetBase()->GetAddrExprBase()); + opnds.push_back(irMap.CreateAddrofMeExpr(*ivar)); // rhs is not special, skip if (rcCallId == INTRN_UNDEFINED) { return nullptr; @@ -168,11 +169,11 @@ IntrinsiccallMeStmt *RCLowering::GetIvarRHSHandleStmt(MeStmt *stmt) { } // this function returns true if we generated new MRT calls and replaced rhs -void RCLowering::HandleAssignMeStmtRHS(MeStmt *stmt) { - if (!stmt->NeedIncref()) { +void RCLowering::HandleAssignMeStmtRHS(MeStmt &stmt) { + if (!stmt.NeedIncref()) { return; } - MeExpr *rhs = stmt->GetRHS(); + MeExpr *rhs = stmt.GetRHS(); ASSERT(rhs != nullptr, "rhs is nullptr in RCLowering::HandleAssignMeStmtRHS"); IntrinsiccallMeStmt *loadCall = nullptr; std::vector opnds; @@ -185,30 +186,30 @@ void RCLowering::HandleAssignMeStmtRHS(MeStmt *stmt) { if (loadCall == nullptr) { return; } - if (stmt->GetOp() == OP_regassign) { - stmt->GetBB()->ReplaceMeStmt(stmt, loadCall); + if (stmt.GetOp() == OP_regassign) { + stmt.GetBB()->ReplaceMeStmt(&stmt, loadCall); if (rhs->IsVolatile(ssaTab)) { - stmt->SetOpnd(1, loadCall->GetMustDefList()->front().GetLHS()); + stmt.SetOpnd(1, loadCall->GetMustDefList()->front().GetLHS()); } } else { - stmt->GetBB()->InsertMeStmtBefore(stmt, loadCall); - stmt->SetOpnd(1, loadCall->GetMustDefList()->front().GetLHS()); + stmt.GetBB()->InsertMeStmtBefore(&stmt, loadCall); + stmt.SetOpnd(1, loadCall->GetMustDefList()->front().GetLHS()); } - stmt->DisableNeedIncref(); + stmt.DisableNeedIncref(); } -void RCLowering::HandleCallAssignedMeStmt(MeStmt *stmt, MeExpr *pendingDec) { - MapleVector *mustDefs = stmt->GetMustDefList(); +void RCLowering::HandleCallAssignedMeStmt(MeStmt &stmt, MeExpr *pendingDec) { + MapleVector *mustDefs = stmt.GetMustDefList(); ASSERT(mustDefs != nullptr, "null ptr check"); - BB *bb = stmt->GetBB(); + BB *bb = stmt.GetBB(); CHECK_FATAL(bb != nullptr, "bb null ptr check"); if (mustDefs->empty()) { // introduce a ret and decref on it as callee has +1 return ref - RegMeExpr *curTmp = irMap->CreateRegMeExpr(PTY_ptr); - stmt->GetMustDefList()->push_back(MustDefMeNode(curTmp, stmt)); + RegMeExpr *curTmp = irMap.CreateRegMeExpr(PTY_ref); + stmt.GetMustDefList()->push_back(MustDefMeNode(curTmp, &stmt)); MeStmt *decrefCall = CreateRCIntrinsic(INTRN_MCCDecRef, stmt, std::vector({ curTmp })); - bb->InsertMeStmtAfter(stmt, decrefCall); + bb->InsertMeStmtAfter(&stmt, decrefCall); return; } @@ -217,7 +218,7 @@ void RCLowering::HandleCallAssignedMeStmt(MeStmt *stmt, MeExpr *pendingDec) { if (lhs->GetMeOp() != kMeOpVar) { return; } - OriginalSt *ost = ssaTab->GetOriginalStFromID(static_cast(lhs)->GetOStIdx()); + const OriginalSt *ost = ssaTab.GetOriginalStFromID(static_cast(lhs)->GetOStIdx()); if (!ost->IsSymbolOst()) { return; } @@ -226,43 +227,43 @@ void RCLowering::HandleCallAssignedMeStmt(MeStmt *stmt, MeExpr *pendingDec) { return; } assignedPtrSym.insert(retSym); - if (!stmt->NeedDecref()) { + if (!stmt.NeedDecref()) { return; } - MeStmt *backup = irMap->CreateRegassignMeStmt(irMap->CreateRegMeExpr(PTY_ptr), pendingDec, bb); + MeStmt *backup = irMap.CreateRegassignMeStmt(*irMap.CreateRegMeExpr(PTY_ref), *pendingDec, *bb); MeStmt *decrefCall = CreateRCIntrinsic( INTRN_MCCDecRef, stmt, std::vector({ static_cast(backup)->GetRegLHS() })); - if (!dynamic_cast(stmt)) { - bb->InsertMeStmtBefore(stmt, backup); - bb->InsertMeStmtAfter(stmt, decrefCall); + if (!dynamic_cast(&stmt)) { + bb->InsertMeStmtBefore(&stmt, backup); + bb->InsertMeStmtAfter(&stmt, decrefCall); } else { /** * simple optimization for callassign * instead of change callassign {dassign} to backup; callassign {dassign}; decref * callassign {regassign}; backup; dassign (regread); decref */ - CallMeStmt *callStmt = static_cast(stmt); - RegMeExpr *curTmp = irMap->CreateRegMeExpr(PTY_ptr); - MeStmt *regToVar = irMap->CreateDassignMeStmt(lhs, curTmp, bb); - ASSERT(!callStmt->GetMustDefList()->empty(), "container check"); - callStmt->GetMustDefList()->front().UpdateLHS(curTmp); - bb->InsertMeStmtAfter(stmt, decrefCall); - bb->InsertMeStmtAfter(stmt, regToVar); - bb->InsertMeStmtAfter(stmt, backup); + CallMeStmt &callStmt = static_cast(stmt); + RegMeExpr *curTmp = irMap.CreateRegMeExpr(PTY_ref); + MeStmt *regToVar = irMap.CreateDassignMeStmt(*lhs, *curTmp, *bb); + ASSERT(!callStmt.GetMustDefList()->empty(), "container check"); + callStmt.GetMustDefList()->front().UpdateLHS(*curTmp); + bb->InsertMeStmtAfter(&stmt, decrefCall); + bb->InsertMeStmtAfter(&stmt, regToVar); + bb->InsertMeStmtAfter(&stmt, backup); } } -bool RCLowering::RCFirst(MeExpr *rhs) { +bool RCLowering::RCFirst(MeExpr &rhs) { // null, local var/reg read - if (rhs->GetMeOp() == kMeOpConst) { - return static_cast(rhs)->IsZero(); - } else if (rhs->GetMeOp() == kMeOpVar) { - VarMeExpr *rhsVar = static_cast(rhs); - MIRSymbol *sym = ssaTab->GetMIRSymbolFromID(rhsVar->GetOStIdx()); + if (rhs.GetMeOp() == kMeOpConst) { + return static_cast(rhs).IsZero(); + } else if (rhs.GetMeOp() == kMeOpVar) { + VarMeExpr &rhsVar = static_cast(rhs); + MIRSymbol *sym = ssaTab.GetMIRSymbolFromID(rhsVar.GetOStIdx()); return sym->IsLocal(); } - return rhs->GetMeOp() == kMeOpReg; + return rhs.GetMeOp() == kMeOpReg; } void RCLowering::PreprocessAssignMeStmt(MeStmt &stmt) { @@ -279,7 +280,7 @@ void RCLowering::PreprocessAssignMeStmt(MeStmt &stmt) { if (lhs->GetMeOp() != kMeOpVar) { return; } - MIRSymbol *lsym = ssaTab->GetMIRSymbolFromID(stmt.GetVarLHS()->GetOStIdx()); + MIRSymbol *lsym = ssaTab.GetMIRSymbolFromID(stmt.GetVarLHS()->GetOStIdx()); if (stmt.GetOp() == OP_dassign && (lsym->GetStorageClass() == kScAuto || lsym->GetStorageClass() == kScFormal)) { assignedPtrSym.insert(lsym); } @@ -293,7 +294,7 @@ void RCLowering::PreprocessAssignMeStmt(MeStmt &stmt) { * to decref at exit * introduce new localrefvar = lhs after current stmt */ - MeStmt *backup = irMap->CreateDassignMeStmt(CreateNewTmpVarMeExpr(true), lhs, bb); + MeStmt *backup = irMap.CreateDassignMeStmt(*CreateNewTmpVarMeExpr(true), *lhs, *bb); // backup will not have any incref/decref bb->InsertMeStmtAfter(&stmt, backup); } @@ -303,69 +304,67 @@ void RCLowering::HandleAssignMeStmtRegLHS(MeStmt &stmt) { if (!stmt.NeedIncref()) { return; } - MeStmt *incCall = CreateRCIntrinsic(INTRN_MCCIncRef, &stmt, std::vector({ stmt.GetLHS() })); + MeStmt *incCall = CreateRCIntrinsic(INTRN_MCCIncRef, stmt, std::vector({ stmt.GetLHS() })); stmt.GetBB()->InsertMeStmtAfter(&stmt, incCall); } void RCLowering::HandleAssignMeStmtVarLHS(MeStmt &stmt, MeExpr *pendingDec) { - MIRSymbol *lsym = ssaTab->GetMIRSymbolFromID(stmt.GetVarLHS()->GetOStIdx()); + MIRSymbol *lsym = ssaTab.GetMIRSymbolFromID(stmt.GetVarLHS()->GetOStIdx()); MeExpr *lhs = stmt.GetLHS(); CHECK_FATAL(lhs != nullptr, "null ptr check"); MeExpr *rhs = stmt.GetRHS(); CHECK_FATAL(rhs != nullptr, "null ptr check"); bool incWithLHS = stmt.NeedIncref(); bool decWithLHS = stmt.NeedDecref(); - bool incDecFirst = RCFirst(rhs); + bool incDecFirst = RCFirst(*rhs); BB *bb = stmt.GetBB(); if (lsym->IsGlobal()) { // decref could be optimized away after if null check - ASSERT(!decWithLHS || pendingDec, "no pendingDec"); - MeStmt *writeRefCall = CreateRCIntrinsic(SelectWriteBarrier(stmt), &stmt, - std::vector({ irMap->CreateAddrofMeExpr(lhs), rhs })); + MeStmt *writeRefCall = CreateRCIntrinsic(SelectWriteBarrier(stmt), stmt, + std::vector({irMap.CreateAddrofMeExpr(*lhs), rhs})); bb->ReplaceMeStmt(&stmt, writeRefCall); } else { // local assign, backup old value and insert Inc and Dec after if (decWithLHS) { - ASSERT(pendingDec, "no pendingDec"); if (incDecFirst) { // temp is not needed if (incWithLHS) { - MeStmt *incCall = CreateRCIntrinsic(INTRN_MCCIncRef, &stmt, std::vector({ rhs })); + MeStmt *incCall = CreateRCIntrinsic(INTRN_MCCIncRef, stmt, std::vector({ rhs })); bb->InsertMeStmtBefore(&stmt, incCall); incWithLHS = false; } - MeStmt *decCall = CreateRCIntrinsic(INTRN_MCCDecRef, &stmt, std::vector({ pendingDec })); + MeStmt *decCall = CreateRCIntrinsic(INTRN_MCCDecRef, stmt, std::vector({ pendingDec })); bb->InsertMeStmtBefore(&stmt, decCall); } else { - MeStmt *backup = irMap->CreateRegassignMeStmt(irMap->CreateRegMeExpr(PTY_ptr), pendingDec, bb); + MeStmt *backup = irMap.CreateRegassignMeStmt(*irMap.CreateRegMeExpr(PTY_ref), *pendingDec, *bb); bb->InsertMeStmtBefore(&stmt, backup); - MeStmt *decCall = CreateRCIntrinsic(INTRN_MCCDecRef, &stmt, + MeStmt *decCall = CreateRCIntrinsic(INTRN_MCCDecRef, stmt, std::vector({ static_cast(backup)->GetLHS() })); bb->InsertMeStmtAfter(&stmt, decCall); } } if (incWithLHS) { - MeStmt *incCall = CreateRCIntrinsic(INTRN_MCCIncRef, &stmt, std::vector({ lhs })); + MeStmt *incCall = CreateRCIntrinsic(INTRN_MCCIncRef, stmt, std::vector({ lhs })); bb->InsertMeStmtAfter(&stmt, incCall); } } assignedPtrSym.insert(lsym); } -bool RCLowering::IsInitialized(IvarMeExpr *ivar) { - MeExpr *base = ivar->GetBase(); +bool RCLowering::IsInitialized(IvarMeExpr &ivar) { + MeExpr *base = ivar.GetBase(); if (base->GetMeOp() != kMeOpVar) { return true; } if (gcMallocObjects.find(base) == gcMallocObjects.end()) { return true; } - FieldID fieldID = ivar->GetFieldID(); + FieldID fieldID = ivar.GetFieldID(); MapleSet *fieldSet = initializedFields[base]; if (fieldSet != nullptr && (fieldSet->count(fieldID) > 0 || fieldSet->count(0) > 0)) { return true; } - MIRType *baseType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ivar->GetTyIdx()); + MIRType *baseType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ivar.GetTyIdx()); ASSERT(dynamic_cast(baseType), "unexpected type"); MIRType *ptype = static_cast(baseType)->GetPointedType(); MIRClassType *classType = dynamic_cast(ptype); @@ -384,20 +383,20 @@ void RCLowering::HandleAssignMeStmtIvarLHS(MeStmt &stmt) { if (classType != nullptr && classType->IsFieldRCUnownedRef(fieldID)) { return; } - if (!IsInitialized(lhsInner)) { + if (!IsInitialized(*lhsInner)) { stmt.DisableNeedDecref(); MapleSet *fieldSet = initializedFields[lhsInner->GetBase()]; if (fieldSet == nullptr) { fieldSet = - mirModule->GetMemPool()->New>(std::less(), mirModule->GetMPAllocator().Adapter()); + mirModule.GetMemPool()->New>(std::less(), mirModule.GetMPAllocator().Adapter()); } fieldSet->insert(fieldID); } MeExpr *rhsInner = stmt.GetRHS(); MIRIntrinsicID intrinsicID = SelectWriteBarrier(stmt); MeStmt *writeRefCall = CreateRCIntrinsic( - intrinsicID, &stmt, - std::vector({ lhsInner->GetBase()->GetAddrExprBase(), irMap->CreateAddrofMeExpr(lhsInner), rhsInner })); + intrinsicID, stmt, + std::vector({ &lhsInner->GetBase()->GetAddrExprBase(), irMap.CreateAddrofMeExpr(*lhsInner), rhsInner })); stmt.GetBB()->ReplaceMeStmt(&stmt, writeRefCall); } @@ -406,7 +405,7 @@ void RCLowering::HandleAssignMeStmt(MeStmt &stmt, MeExpr *pendingDec) { if (!stmt.NeedIncref() && !stmt.NeedDecref()) { return; } - HandleAssignMeStmtRHS(&stmt); + HandleAssignMeStmtRHS(stmt); MeExpr *lhs = stmt.GetLHS(); CHECK_FATAL(lhs != nullptr, "null ptr check"); if (lhs->GetMeOp() == kMeOpReg) { @@ -432,13 +431,13 @@ MIRIntrinsicID RCLowering::SelectWriteBarrier(MeStmt &stmt) { CHECK_FATAL((meOp == kMeOpVar || meOp == kMeOpIvar), "Not Expected meOp"); if (lhs->IsVolatile(ssaTab)) { if (meOp == kMeOpVar) { - return PrepareVolatileCall(&stmt, incWithLHS ? (decWithLHS ? INTRN_MCCWriteSVol : INTRN_MCCWriteSVolNoDec) + return PrepareVolatileCall(stmt, incWithLHS ? (decWithLHS ? INTRN_MCCWriteSVol : INTRN_MCCWriteSVolNoDec) : (decWithLHS ? INTRN_MCCWriteSVolNoInc : INTRN_MCCWriteSVolNoRC)); } else { if (static_cast(lhs)->IsRCWeak()) { - return PrepareVolatileCall(&stmt, INTRN_MCCWriteVolWeak); + return PrepareVolatileCall(stmt, INTRN_MCCWriteVolWeak); } - return PrepareVolatileCall(&stmt, incWithLHS ? INTRN_MCCWriteVol : INTRN_MCCWriteVolNoInc); + return PrepareVolatileCall(stmt, incWithLHS ? INTRN_MCCWriteVol : INTRN_MCCWriteVolNoInc); } } else { if (meOp == kMeOpVar) { @@ -455,9 +454,9 @@ MIRIntrinsicID RCLowering::SelectWriteBarrier(MeStmt &stmt) { } void RCLowering::RCLower() { - auto eIt = func->valid_end(); - for (auto bIt = func->valid_begin(); bIt != eIt; ++bIt) { - if (bIt == func->common_entry() || bIt == func->common_exit()) { + auto eIt = func.valid_end(); + for (auto bIt = func.valid_begin(); bIt != eIt; ++bIt) { + if (bIt == func.common_entry() || bIt == func.common_exit()) { continue; } BBLower(*bIt); @@ -482,9 +481,9 @@ void RCLowering::InitializedObjectFields(MeStmt &stmt) { bool isNew = gcMallocObjects.find(firstOpnd) != gcMallocObjects.end(); bool hasNotInitialized = initializedFields.find(firstOpnd) == initializedFields.end(); bool inInitializedMap = - mirModule->GetPuIdxFieldInitializedMap().find(call.GetPUIdx()) != mirModule->GetPuIdxFieldInitializedMap().end(); + mirModule.GetPuIdxFieldInitializedMap().find(call.GetPUIdx()) != mirModule.GetPuIdxFieldInitializedMap().end(); if (callee->IsConstructor() && isNew && hasNotInitialized && inInitializedMap) { - initializedFields[firstOpnd] = mirModule->GetPUIdxFieldInitializedMapItem(call.GetPUIdx()); + initializedFields[firstOpnd] = mirModule.GetPUIdxFieldInitializedMapItem(call.GetPUIdx()); } else { for (auto iter : call.GetOpnds()) { gcMallocObjects.erase(iter); @@ -505,7 +504,7 @@ void RCLowering::BBLower(BB *bb) { } else if (kOpcodeInfo.IsCallAssigned(opcode)) { MIRType *retType = stmt.GetReturnType(); if (retType != nullptr && retType->GetPrimType() == PTY_ref) { - HandleCallAssignedMeStmt(&stmt, pendingDec); + HandleCallAssignedMeStmt(stmt, pendingDec); } InitializedObjectFields(stmt); } else if (stmt.IsAssign()) { @@ -518,18 +517,18 @@ void RCLowering::BBLower(BB *bb) { if (needSpecialHandleException) { // create throw value OriginalSt *ost = - ssaTab->GetOriginalStTable().FindOrCreatePregOriginalSt(-kSregThrownval, func->GetMirFunc()->GetPuidx()); - ost->SetTyIdx(GlobalTables::GetTypeTable().GetPrimType(PTY_ptr)->GetTypeIndex()); - RegMeExpr *regreadExpr = irMap->CreateRegMeExprVersion(ost); - regreadExpr->SetPtyp(PTY_ptr); + ssaTab.GetOriginalStTable().FindOrCreatePregOriginalSt(-kSregThrownval, func.GetMirFunc()->GetPuidx()); + ost->SetTyIdx(GlobalTables::GetTypeTable().GetPrimType(PTY_ref)->GetTypeIndex()); + RegMeExpr *regreadExpr = irMap.CreateRegMeExprVersion(*ost); + regreadExpr->SetPtyp(PTY_ref); MeStmt *firstMeStmt = to_ptr(bb->GetMeStmts().begin()); - MeStmt *decRefcall = CreateRCIntrinsic(INTRN_MCCDecRef, firstMeStmt, std::vector({ regreadExpr })); + MeStmt *decRefcall = CreateRCIntrinsic(INTRN_MCCDecRef, *firstMeStmt, std::vector({ regreadExpr })); bb->InsertMeStmtAfter(firstMeStmt, decRefcall); } } -IntrinsiccallMeStmt *FindCleanupIntrinsic(MeStmt *ret) { - auto &meStmts = ret->GetBB()->GetMeStmts(); +IntrinsiccallMeStmt *FindCleanupIntrinsic(MeStmt &ret) { + auto &meStmts = ret.GetBB()->GetMeStmts(); for (auto iter = meStmts.rbegin(); iter != meStmts.rend(); ++iter) { if (CheckOp(to_ptr(iter), OP_intrinsiccall)) { IntrinsiccallMeStmt *intrinsicCall = static_cast(to_ptr(iter)); @@ -541,19 +540,18 @@ IntrinsiccallMeStmt *FindCleanupIntrinsic(MeStmt *ret) { return nullptr; } -void RCLowering::HandleReturnVar(RetMeStmt *ret) { - CHECK_FATAL(ret != nullptr, "ret null ptr check"); - VarMeExpr *retVar = static_cast(ret->GetOpnd(0)); +void RCLowering::HandleReturnVar(RetMeStmt &ret) { + VarMeExpr *retVar = static_cast(ret.GetOpnd(0)); CHECK_FATAL(retVar != nullptr, "retVal null ptr check"); - MIRSymbol *sym = ssaTab->GetMIRSymbolFromID(retVar->GetOStIdx()); + MIRSymbol *sym = ssaTab.GetMIRSymbolFromID(retVar->GetOStIdx()); if (sym != nullptr && sym->IgnoreRC()) { return; } if (sym != nullptr && sym->IsGlobal() && !sym->IsFinal()) { IntrinsiccallMeStmt *loadCall = - CreateRCIntrinsic(INTRN_MCCLoadRefS, ret, std::vector({ irMap->CreateAddrofMeExpr(retVar) }), true); - ret->GetBB()->InsertMeStmtBefore(ret, loadCall); - ret->SetOpnd(0, loadCall->GetMustDefList()->front().GetLHS()); + CreateRCIntrinsic(INTRN_MCCLoadRefS, ret, std::vector({ irMap.CreateAddrofMeExpr(*retVar) }), true); + ret.GetBB()->InsertMeStmtBefore(&ret, loadCall); + ret.SetOpnd(0, loadCall->GetMustDefList()->front().GetLHS()); } else if (assignedPtrSym.count(sym) > 0 && sym->GetStorageClass() == kScAuto && sym->GetAttr(ATTR_localrefvar)) { /** * must be regreadAtReturn @@ -561,7 +559,7 @@ void RCLowering::HandleReturnVar(RetMeStmt *ret) { */ IntrinsiccallMeStmt *cleanup = FindCleanupIntrinsic(ret); if (cleanup == nullptr) { - ret->GetBB()->InsertMeStmtBefore(ret, CreateRCIntrinsic(INTRN_MCCIncRef, ret, std::vector({ retVar }))); + ret.GetBB()->InsertMeStmtBefore(&ret, CreateRCIntrinsic(INTRN_MCCIncRef, ret, std::vector({ retVar }))); } else { // remove argument from intrinsiccall MPL_CLEANUP_LOCALREFVARS (dread ref %Reg1_R5678, ... MapleVector *opnds = &cleanup->GetOpnds(); @@ -577,40 +575,40 @@ void RCLowering::HandleReturnVar(RetMeStmt *ret) { } else { // if returning formal, incref unless placementRC is used and formal is NOT reassigned IntrinsiccallMeStmt *increfStmt = CreateRCIntrinsic(INTRN_MCCIncRef, ret, std::vector({ retVar }), true); - ret->SetOpnd(0, increfStmt->GetMustDefList()->front().GetLHS()); + ret.SetOpnd(0, increfStmt->GetMustDefList()->front().GetLHS()); IntrinsiccallMeStmt *cleanup = FindCleanupIntrinsic(ret); if (cleanup == nullptr) { - ret->GetBB()->InsertMeStmtBefore(ret, increfStmt); + ret.GetBB()->InsertMeStmtBefore(&ret, increfStmt); } else { - ret->GetBB()->InsertMeStmtAfter(cleanup, increfStmt); + ret.GetBB()->InsertMeStmtAfter(cleanup, increfStmt); } } } -void RCLowering::HandleReturnIvar(RetMeStmt *ret) { +void RCLowering::HandleReturnIvar(RetMeStmt &ret) { // insert calls - IvarMeExpr *retIvar = static_cast(ret->GetOpnd(0)); + IvarMeExpr *retIvar = static_cast(ret.GetOpnd(0)); if (retIvar->IsVolatile()) { IntrinsiccallMeStmt *loadCall = CreateRCIntrinsic( PrepareVolatileCall(ret, INTRN_MCCLoadRefVol), ret, - std::vector({ retIvar->GetBase()->GetAddrExprBase(), irMap->CreateAddrofMeExpr(retIvar) }), true); - ret->GetBB()->InsertMeStmtBefore(ret, loadCall); - ret->SetOpnd(0, loadCall->GetMustDefList()->front().GetLHS()); + std::vector({ &retIvar->GetBase()->GetAddrExprBase(), irMap.CreateAddrofMeExpr(*retIvar) }), true); + ret.GetBB()->InsertMeStmtBefore(&ret, loadCall); + ret.SetOpnd(0, loadCall->GetMustDefList()->front().GetLHS()); } else { MeStmt *loadCall = CreateRCIntrinsic( INTRN_MCCLoadRef, ret, - std::vector({ retIvar->GetBase()->GetAddrExprBase(), irMap->CreateAddrofMeExpr(retIvar) }), true); - ret->GetBB()->InsertMeStmtBefore(ret, loadCall); - ret->SetOpnd(0, loadCall->GetMustDefList()->front().GetLHS()); + std::vector({ &retIvar->GetBase()->GetAddrExprBase(), irMap.CreateAddrofMeExpr(*retIvar) }), true); + ret.GetBB()->InsertMeStmtBefore(&ret, loadCall); + ret.SetOpnd(0, loadCall->GetMustDefList()->front().GetLHS()); } } -void RCLowering::HandleReturnReg(RetMeStmt *ret) { +void RCLowering::HandleReturnReg(RetMeStmt &ret) { /** * if the register with ref value is defined by callassigned or gcmalloc * return incref should have been delegated and not needed. */ - RegMeExpr *retreg = static_cast(ret->GetOpnd(0)); + RegMeExpr *retreg = static_cast(ret.GetOpnd(0)); if (retreg->GetDefBy() == kDefByMustDef) { return; } @@ -622,14 +620,14 @@ void RCLowering::HandleReturnReg(RetMeStmt *ret) { } } MeStmt *incCall = CreateRCIntrinsic(INTRN_MCCIncRef, ret, std::vector({ retreg }), true); - ret->SetOpnd(0, incCall->GetMustDefList()->front().GetLHS()); - ret->GetBB()->InsertMeStmtBefore(ret, incCall); + ret.SetOpnd(0, incCall->GetMustDefList()->front().GetLHS()); + ret.GetBB()->InsertMeStmtBefore(&ret, incCall); } void RCLowering::HandleReturnWithCleanup() { - for (auto stmt : rets) { + for (auto *stmt : rets) { RetMeStmt *ret = static_cast(stmt); - IntrinsiccallMeStmt *cleanup = FindCleanupIntrinsic(ret); + IntrinsiccallMeStmt *cleanup = FindCleanupIntrinsic(*ret); if (cleanup != nullptr && !tmpLocalRefVars.empty()) { // new localrefvar introduced in this phase for (auto tmpVar : tmpLocalRefVars) { cleanup->GetOpnds().push_back(tmpVar); @@ -644,18 +642,18 @@ void RCLowering::HandleReturnWithCleanup() { continue; } if (retVal->GetMeOp() == kMeOpVar) { - HandleReturnVar(ret); + HandleReturnVar(*ret); } else if (retVal->GetMeOp() == kMeOpIvar) { - HandleReturnIvar(ret); + HandleReturnIvar(*ret); } else if (retVal->GetMeOp() == kMeOpReg) { - HandleReturnReg(ret); + HandleReturnReg(*ret); } else { // incref by default - RegMeExpr *tmpReg = irMap->CreateRegMeExpr(PTY_ptr); - MeStmt *temp = irMap->CreateRegassignMeStmt(tmpReg, retVal, stmt->GetBB()); + RegMeExpr *tmpReg = irMap.CreateRegMeExpr(PTY_ref); + MeStmt *temp = irMap.CreateRegassignMeStmt(*tmpReg, *retVal, *stmt->GetBB()); stmt->GetBB()->InsertMeStmtBefore(stmt, temp); stmt->GetBB()->InsertMeStmtBefore(stmt, - CreateRCIntrinsic(INTRN_MCCIncRef, stmt, std::vector({ tmpReg }))); + CreateRCIntrinsic(INTRN_MCCIncRef, *stmt, std::vector({ tmpReg }))); ret->SetOpnd(0, tmpReg); } } @@ -666,7 +664,7 @@ void RCLowering::HandleReturnNeedBackup() { * any return value expression containing ivar has to be saved in a * temp with the temp being returned */ - for (auto stmt : rets) { + for (auto *stmt : rets) { RetMeStmt *ret = static_cast(stmt); if (ret->NumMeStmtOpnds() == 0) { continue; @@ -675,15 +673,15 @@ void RCLowering::HandleReturnNeedBackup() { if (!retVal->HasIvar()) { continue; } - RegMeExpr *curTmp = irMap->CreateRegMeExpr(retVal->GetPrimType()); - MeStmt *regass = irMap->CreateRegassignMeStmt(curTmp, retVal, ret->GetBB()); + RegMeExpr *curTmp = irMap.CreateRegMeExpr(retVal->GetPrimType()); + MeStmt *regass = irMap.CreateRegassignMeStmt(*curTmp, *retVal, *ret->GetBB()); ret->GetBB()->InsertMeStmtBefore(ret, regass); ret->SetOpnd(0, curTmp); } } void RCLowering::HandleReturnStmt() { - bool returnRef = (func->GetMirFunc()->GetReturnType()->GetPrimType() == PTY_ref); + bool returnRef = (func.GetMirFunc()->GetReturnType()->GetPrimType() == PTY_ref); bool updateCleanup = !tmpLocalRefVars.empty(); if (returnRef || updateCleanup) { HandleReturnWithCleanup(); @@ -697,32 +695,28 @@ void RCLowering::HandleArguments() { * handle arguments, if the formal gets modified * insert incref at entry and decref before all returns */ - MIRFunction *mirFunc = func->GetMirFunc(); - BB *firstBB = func->GetFirstBB(); + MIRFunction *mirFunc = func.GetMirFunc(); + BB *firstBB = func.GetFirstBB(); MeStmt *firstMestmt = to_ptr(firstBB->GetMeStmts().begin()); for (size_t i = (mirFunc->IsStatic() ? 0 : 1); i < mirFunc->GetFormalCount(); ++i) { MIRSymbol *sym = mirFunc->GetFormal(i); if (sym == nullptr || sym->IgnoreRC() || (!sym->IsGlobal() && assignedPtrSym.count(sym) == 0)) { continue; } - VarMeExpr *argVar = CreateVarMeExprFromSym(sym); + VarMeExpr *argVar = CreateVarMeExprFromSym(*sym); CHECK_FATAL(argVar != nullptr, "null ptr check"); if (firstMestmt != nullptr) { firstBB->InsertMeStmtBefore(firstMestmt, - CreateRCIntrinsic(INTRN_MCCIncRef, firstMestmt, std::vector({ argVar }))); - } else { - // first bb is empty - firstBB->PrependMeStmt(CreateRCIntrinsic(INTRN_MCCIncRef, firstMestmt, std::vector({ argVar }))); - firstMestmt = to_ptr(firstBB->GetMeStmts().begin()); + CreateRCIntrinsic(INTRN_MCCIncRef, *firstMestmt, std::vector({ argVar }))); } TypeAttrs typeAttr = mirFunc->GetNthParamAttr(i); typeAttr.SetAttr(ATTR_localrefvar); mirFunc->SetNthParamAttr(i, typeAttr); sym->SetLocalRefVar(); - for (auto iter = rets.begin(); iter != rets.end(); ++iter) { - MeStmt *decrefCall = CreateRCIntrinsic(INTRN_MCCDecRef, *iter, std::vector({ argVar })); - (*iter)->GetBB()->InsertMeStmtBefore(*iter, decrefCall); + for (auto *stmt : rets) { + MeStmt *decrefCall = CreateRCIntrinsic(INTRN_MCCDecRef, *stmt, std::vector({ argVar })); + stmt->GetBB()->InsertMeStmtBefore(stmt, decrefCall); } } } @@ -734,38 +728,38 @@ void RCLowering::PostRCLower() { } void RCLowering::Finish() { - if (DEBUGFUNC(func)) { + if (DEBUGFUNC((&func))) { LogInfo::MapleLogger() << "\n============== After RC LOWERING =============" << std::endl; - func->Dump(false); + func.Dump(false); } } -OriginalSt *RCLowering::RetrieveOSt(const char *name, bool isLocalrefvar) const { - MIRSymbol *backupSym = mirModule->GetMIRBuilder()->GetOrCreateLocalDecl( +OriginalSt *RCLowering::RetrieveOSt(const std::string &name, bool isLocalrefvar) const { + MIRSymbol *backupSym = mirModule.GetMIRBuilder()->GetOrCreateLocalDecl( name, GlobalTables::GetTypeTable().GetTypeFromTyIdx(TyIdx(PTY_ptr))); // use PTY_ptr for temp backupSym->SetIsTmp(true); if (isLocalrefvar) { backupSym->SetLocalRefVar(); } - OriginalSt *ost = ssaTab->FindOrCreateSymbolOriginalSt(backupSym, func->GetMirFunc()->GetPuidx(), 0); + OriginalSt *ost = ssaTab.FindOrCreateSymbolOriginalSt(backupSym, func.GetMirFunc()->GetPuidx(), 0); return ost; } // function for creating short-lived temp VarMeExpr *RCLowering::CreateNewTmpVarMeExpr(bool isLocalrefvar) { std::string name = std::string("__RCTemp__").append(std::to_string(++tmpCount)); - OriginalSt *ost = RetrieveOSt(name.c_str(), isLocalrefvar); + OriginalSt *ost = RetrieveOSt(name, isLocalrefvar); if (ost->GetZeroVersionIndex() == 0) { - ost->SetZeroVersionIndex(irMap->GetVerst2MeExprTableSize()); - irMap->PushBackVerst2MeExprTable(nullptr); + ost->SetZeroVersionIndex(irMap.GetVerst2MeExprTableSize()); + irMap.PushBackVerst2MeExprTable(nullptr); ost->GetVersionsIndex().push_back(ost->GetZeroVersionIndex()); } - irMap->SetExprID(irMap->GetExprID() + 1); - VarMeExpr *varMeExpr = irMap->New(&irMap->GetIRMapAlloc(), irMap->GetExprID(), ost->GetIndex(), - irMap->GetVerst2MeExprTableSize()); - varMeExpr->InitBase(OP_dread, PTY_ptr, 0); + irMap.SetExprID(irMap.GetExprID() + 1); + VarMeExpr *varMeExpr = irMap.New(&irMap.GetIRMapAlloc(), irMap.GetExprID(), ost->GetIndex(), + irMap.GetVerst2MeExprTableSize()); + varMeExpr->InitBase(OP_dread, PTY_ref, 0); varMeExpr->SetFieldID(0); - irMap->PushBackVerst2MeExprTable(varMeExpr); + irMap.PushBackVerst2MeExprTable(varMeExpr); ost->GetVersionsIndex().push_back(varMeExpr->GetVstIdx()); if (isLocalrefvar) { tmpLocalRefVars.insert(varMeExpr); @@ -778,10 +772,11 @@ AnalysisResult *MeDoRCLowering::Run(MeFunction *func, MeFuncResultMgr *m, Module ASSERT(kh != nullptr, "KlassHierarchy has problem"); if (func->GetIRMap() == nullptr) { MeIRMap *hmap = static_cast(m->GetAnalysisResult(MeFuncPhase_IRMAP, func)); - ASSERT(hmap != nullptr, "hssamap has problem"); + CHECK_FATAL(hmap != nullptr, "hssamap has problem"); func->SetIRMap(hmap); } - RCLowering rcLowering(func, kh); + CHECK_FATAL(func->GetMeSSATab() != nullptr, "ssatab has problem"); + RCLowering rcLowering(*func, *kh); rcLowering.Prepare(); rcLowering.PreRCLower(); @@ -791,5 +786,4 @@ AnalysisResult *MeDoRCLowering::Run(MeFunction *func, MeFuncResultMgr *m, Module rcLowering.Finish(); return nullptr; } - } // namespace maple diff --git a/src/maple_me/src/me_ssa.cpp b/src/maple_me/src/me_ssa.cpp index 228209707da47de0feebe6c2298911c9c711ca75..e56fed09a60b66f8ac6004fc83f593926d5d08ca 100644 --- a/src/maple_me/src/me_ssa.cpp +++ b/src/maple_me/src/me_ssa.cpp @@ -46,7 +46,6 @@ returns from those recursive calls, we restores the stack of current SSA names to the state that existed before the current block was visited. */ - namespace maple { void MeSSA::BuildSSA() { InsertPhiNode(); @@ -68,7 +67,7 @@ void MeSSA::CollectDefBBs(std::map> &ostDefBBs) { MapleMap *mayDefs = SSAGenericGetMayDefNodes(&stmt, &GetSSATab()->GetStmtsSSAPart()); MapleMap::iterator iter; for (iter = mayDefs->begin(); iter != mayDefs->end(); ++iter) { - OriginalSt *ost = func->GetMeSSATab()->GetOriginalStFromID(iter->first); + const OriginalSt *ost = func->GetMeSSATab()->GetOriginalStFromID(iter->first); if (ost && (!ost->IsFinal() || func->GetMirFunc()->IsConstructor())) { ostDefBBs[iter->first].insert(bb->GetBBId()); } else if (stmt.GetOpCode() == OP_intrinsiccallwithtype) { @@ -105,7 +104,7 @@ void MeSSA::InsertPhiNode() { CollectDefBBs(ost2DefBBs); OriginalStTable *otable = &func->GetMeSSATab()->GetOriginalStTable(); for (size_t i = 1; i < otable->Size(); i++) { - OriginalSt *ost = otable->GetOriginalStFromID(OStIdx(i)); + const OriginalSt *ost = otable->GetOriginalStFromID(OStIdx(i)); VersionSt *vst = func->GetMeSSATab()->GetVersionStTable().GetVersionStFromID(ost->GetZeroVersionIndex(), true); ASSERT(vst != nullptr, "null ptr check"); if (ost2DefBBs[ost->GetIndex()].empty()) { @@ -129,6 +128,7 @@ void MeSSA::InsertPhiNode() { MapleSet &dfs = dom->GetDomFrontier(defBB->GetBBId().idx); for (auto &bbID : dfs) { BB *dfBB = func->GetBBFromID(bbID); + CHECK_FATAL(dfBB != nullptr, "null ptr check"); if (!dfBB->PhiofVerStInserted(vst)) { workList->push_back(dfBB); dfBB->InsertPhi(&func->GetAlloc(), vst); @@ -214,7 +214,7 @@ bool MeSSA::VerifySSA() { opcode = stmt.GetOpCode(); if (opcode == OP_dassign || opcode == OP_regassign) { VersionSt *verSt = func->GetMeSSATab()->GetStmtsSSAPart().SSAPartOf(&stmt)->GetSSAVar(); - CHECK_FATAL(verSt->GetIndex() < vtableSize, "runtime check error"); + CHECK_FATAL(verSt != nullptr && verSt->GetIndex() < vtableSize, "runtime check error"); } for (size_t i = 0; i < stmt.NumOpnds(); i++) { CHECK_FATAL(VerifySSAOpnd(stmt.Opnd(i)), "runtime check error"); @@ -234,9 +234,8 @@ AnalysisResult *MeDoSSA::Run(MeFunction *func, MeFuncResultMgr *m, ModuleResultM ssa->BuildSSA(); ssa->VerifySSA(); if (DEBUGFUNC(func)) { - ssatab->GetVersionStTable().Dump(&ssatab->mirModule); + ssatab->GetVersionStTable().Dump(&ssatab->GetModule()); } return ssa; } - } // namespace maple diff --git a/src/maple_me/src/me_ssa_tab.cpp b/src/maple_me/src/me_ssa_tab.cpp index 92229f916592e043edbabce9f06d0f904f7bf7c1..08795ad6cdfe022f8d1711486267f37736d0b7fb 100644 --- a/src/maple_me/src/me_ssa_tab.cpp +++ b/src/maple_me/src/me_ssa_tab.cpp @@ -17,7 +17,6 @@ #include "mpl_timer.h" // allocate the data structure to store SSA information - namespace maple { AnalysisResult *MeDoSSATab::Run(MeFunction *func, MeFuncResultMgr *m, ModuleResultMgr *mrm) { MPLTimer timer; @@ -46,5 +45,4 @@ AnalysisResult *MeDoSSATab::Run(MeFunction *func, MeFuncResultMgr *m, ModuleResu } return ssaTab; } - } // namespace maple diff --git a/src/maple_me/src/me_ssa_update.cpp b/src/maple_me/src/me_ssa_update.cpp index 3c1d46c74741201788fcf3f66c55a3e5d7c0e7a4..bce0a759901f51943b8fae630715528c28d0c403 100644 --- a/src/maple_me/src/me_ssa_update.cpp +++ b/src/maple_me/src/me_ssa_update.cpp @@ -20,70 +20,69 @@ // If some assignments have been deleted, the current implementation does not // delete useless phi's, and these useless phi's may end up hving identical // phi operands. - namespace maple { // accumulate the BBs that are in the iterated dominance frontiers of bb in // the set dfset, visiting each BB only once -void SSAUpdate::GetIterDomFrontier(const BB *bb, MapleSet *dfset, std::vector &visitedMap) { - CHECK_FATAL(bb->GetBBId().idx < visitedMap.size(), "index out of range in SSAUpdate::GetIterDomFrontier"); - if (visitedMap[bb->GetBBId().idx]) { +void MeSSAUpdate::GetIterDomFrontier(const BB &bb, MapleSet &dfset, std::vector &visitedMap) { + CHECK_FATAL(bb.GetBBId().idx < visitedMap.size(), "index out of range in MeSSAUpdate::GetIterDomFrontier"); + if (visitedMap[bb.GetBBId().idx]) { return; } - visitedMap[bb->GetBBId().idx] = true; - for (BBId frontierbbid : dom->GetDomFrontier(bb->GetBBId().idx)) { - dfset->insert(frontierbbid); - BB *frontierbb = func->GetBBFromID(frontierbbid); - GetIterDomFrontier(frontierbb, dfset, visitedMap); + visitedMap[bb.GetBBId().idx] = true; + for (BBId frontierbbid : dom.GetDomFrontier(bb.GetBBId().idx)) { + dfset.insert(frontierbbid); + BB *frontierbb = func.GetBBFromID(frontierbbid); + GetIterDomFrontier(*frontierbb, dfset, visitedMap); } } -void SSAUpdate::InsertPhis() { - MapleMap*>::iterator it = updateCands->begin(); +void MeSSAUpdate::InsertPhis() { + MapleMap*>::iterator it = updateCands.begin(); MapleSet dfSet(std::less(), ssaUpdateAlloc.Adapter()); - for (; it != updateCands->end(); it++) { - std::vector visitedMap(func->GetAllBBs().size(), false); + for (; it != updateCands.end(); it++) { + std::vector visitedMap(func.GetAllBBs().size(), false); dfSet.clear(); for (BBId bbid : *it->second) { - GetIterDomFrontier(func->GetBBFromID(bbid), &dfSet, visitedMap); + GetIterDomFrontier(*func.GetBBFromID(bbid), dfSet, visitedMap); } for (BBId bbid : dfSet) { // insert a phi node - BB *bb = func->GetBBFromID(bbid); + BB *bb = func.GetBBFromID(bbid); ASSERT(bb != nullptr, "null ptr check"); MapleMap::iterator phiListIt = bb->GetMevarPhiList().find(it->first); if (phiListIt != bb->GetMevarPhiList().end()) { phiListIt->second->SetIsLive(true); continue; } - MeVarPhiNode *phiMeNode = irMap->NewInPool(); + MeVarPhiNode *phiMeNode = irMap.NewInPool(); phiMeNode->SetDefBB(bb); phiMeNode->GetOpnds().resize(bb->GetPred().size()); bb->GetMevarPhiList().insert(std::make_pair(it->first, phiMeNode)); } // initialize its rename stack - renameStacks[it->first] = ssaUpdateMp->New>(ssaUpdateAlloc.Adapter()); + renameStacks[it->first] = ssaUpdateMp.New>(ssaUpdateAlloc.Adapter()); } } -void SSAUpdate::RenamePhi(BB *bb) { +void MeSSAUpdate::RenamePhi(BB &bb) { MapleMap*>::iterator it1 = renameStacks.begin(); for (; it1 != renameStacks.end(); it1++) { - MapleMap::iterator it2 = bb->GetMevarPhiList().find(it1->first); - if (it2 != bb->GetMevarPhiList().end()) { + MapleMap::iterator it2 = bb.GetMevarPhiList().find(it1->first); + if (it2 != bb.GetMevarPhiList().end()) { // if there is existing phi result node MeVarPhiNode *phi = it2->second; phi->SetIsLive(true); // always make it live, for correctness if (phi->GetLHS() == nullptr) { // create a new VarMeExpr defined by this phi - irMap->SetExprID(irMap->GetExprID() + 1); - VarMeExpr *newvar = irMap->New(&irMap->GetIRMapAlloc(), irMap->GetExprID(), it2->first, - irMap->GetVerst2MeExprTableSize()); + irMap.SetExprID(irMap.GetExprID() + 1); + VarMeExpr *newvar = irMap.New(&irMap.GetIRMapAlloc(), irMap.GetExprID(), it2->first, + irMap.GetVerst2MeExprTableSize()); newvar->InitBase(OP_dread, PTY_ref, 0); newvar->SetFieldID(0); - irMap->PushBackVerst2MeExprTable(newvar); - CHECK_FATAL(newvar->GetVstIdx() == irMap->GetVerst2MeExprTableSize() - 1, + irMap.PushBackVerst2MeExprTable(newvar); + CHECK_FATAL(newvar->GetVstIdx() == irMap.GetVerst2MeExprTableSize() - 1, "RenamePhi: vstIdx wrongly initialized"); - phi->UpdateLHS(newvar); + phi->UpdateLHS(*newvar); it1->second->push(newvar); // push the stack } else { it1->second->push(phi->GetLHS()); // push the stack @@ -93,84 +92,84 @@ void SSAUpdate::RenamePhi(BB *bb) { } // changed has been initialized to false by caller -MeExpr *SSAUpdate::RenameExpr(MeExpr *meexpr, bool &changed) { +MeExpr *MeSSAUpdate::RenameExpr(MeExpr &meexpr, bool &changed) { bool needRehash = false; - switch (meexpr->GetMeOp()) { + switch (meexpr.GetMeOp()) { case kMeOpVar: { - VarMeExpr *varExpr = static_cast(meexpr); - MapleMap*>::iterator it1 = renameStacks.find(varExpr->GetOStIdx()); + VarMeExpr &varExpr = static_cast(meexpr); + MapleMap*>::iterator it1 = renameStacks.find(varExpr.GetOStIdx()); if (it1 == renameStacks.end()) { - return meexpr; + return &meexpr; } MapleStack *renameStack = it1->second; VarMeExpr *curvar = renameStack->top(); - if (varExpr == curvar) { - return meexpr; + if (&varExpr == curvar) { + return &meexpr; } changed = true; return curvar; } case kMeOpIvar: { - IvarMeExpr *ivarMeExpr = static_cast(meexpr); + IvarMeExpr &ivarMeExpr = static_cast(meexpr); IvarMeExpr newMeExpr(kInvalidExprID); - newMeExpr.SetBase(RenameExpr(ivarMeExpr->GetBase(), needRehash)); + newMeExpr.SetBase(RenameExpr(*ivarMeExpr.GetBase(), needRehash)); if (needRehash) { changed = true; - newMeExpr.SetFieldID(ivarMeExpr->GetFieldID()); - newMeExpr.SetTyIdx(ivarMeExpr->GetTyIdx()); - newMeExpr.InitBase(ivarMeExpr->GetOp(), ivarMeExpr->GetPrimType(), ivarMeExpr->GetNumOpnds()); - newMeExpr.SetMuVal(ivarMeExpr->GetMu()); - return irMap->HashMeExpr(&newMeExpr); + newMeExpr.SetFieldID(ivarMeExpr.GetFieldID()); + newMeExpr.SetTyIdx(ivarMeExpr.GetTyIdx()); + newMeExpr.InitBase(ivarMeExpr.GetOp(), ivarMeExpr.GetPrimType(), ivarMeExpr.GetNumOpnds()); + newMeExpr.SetMuVal(ivarMeExpr.GetMu()); + return irMap.HashMeExpr(newMeExpr); } - return meexpr; + return &meexpr; } case kMeOpOp: { - OpMeExpr *meOpExpr = static_cast(meexpr); + OpMeExpr &meOpExpr = static_cast(meexpr); OpMeExpr newMeExpr(kInvalidExprID); - newMeExpr.SetOpnd(0, RenameExpr(meOpExpr->GetOpnd(0), needRehash)); - if (meOpExpr->GetOpnd(1)) { - newMeExpr.SetOpnd(1, RenameExpr(meOpExpr->GetOpnd(1), needRehash)); - if (meOpExpr->GetOpnd(2)) { - newMeExpr.SetOpnd(2, RenameExpr(meOpExpr->GetOpnd(2), needRehash)); + newMeExpr.SetOpnd(0, RenameExpr(*meOpExpr.GetOpnd(0), needRehash)); + if (meOpExpr.GetOpnd(1)) { + newMeExpr.SetOpnd(1, RenameExpr(*meOpExpr.GetOpnd(1), needRehash)); + if (meOpExpr.GetOpnd(2)) { + newMeExpr.SetOpnd(2, RenameExpr(*meOpExpr.GetOpnd(2), needRehash)); } } if (needRehash) { changed = true; - newMeExpr.SetOpndType(meOpExpr->GetOpndType()); - newMeExpr.SetBitsOffSet(meOpExpr->GetBitsOffSet()); - newMeExpr.SetBitsSize(meOpExpr->GetBitsSize()); - newMeExpr.SetTyIdx(meOpExpr->GetTyIdx()); - newMeExpr.SetFieldID(meOpExpr->GetFieldID()); - newMeExpr.InitBase(meOpExpr->GetOp(), meOpExpr->GetPrimType(), meOpExpr->GetNumOpnds()); - return irMap->HashMeExpr(&newMeExpr); + newMeExpr.SetOpndType(meOpExpr.GetOpndType()); + newMeExpr.SetBitsOffSet(meOpExpr.GetBitsOffSet()); + newMeExpr.SetBitsSize(meOpExpr.GetBitsSize()); + newMeExpr.SetTyIdx(meOpExpr.GetTyIdx()); + newMeExpr.SetFieldID(meOpExpr.GetFieldID()); + newMeExpr.InitBase(meOpExpr.GetOp(), meOpExpr.GetPrimType(), meOpExpr.GetNumOpnds()); + return irMap.HashMeExpr(newMeExpr); } - return meexpr; + return &meexpr; } case kMeOpNary: { - NaryMeExpr *naryMeExpr = static_cast(meexpr); - NaryMeExpr newMeExpr(&irMap->GetIRMapAlloc(), kInvalidExprID, naryMeExpr->GetTyIdx(), naryMeExpr->GetIntrinsic(), - naryMeExpr->GetBoundCheck()); - for (size_t i = 0; i < naryMeExpr->GetOpnds().size(); i++) { - newMeExpr.GetOpnds().push_back(RenameExpr(naryMeExpr->GetOpnd(i), needRehash)); + NaryMeExpr &naryMeExpr = static_cast(meexpr); + NaryMeExpr newMeExpr(&irMap.GetIRMapAlloc(), kInvalidExprID, naryMeExpr.GetTyIdx(), naryMeExpr.GetIntrinsic(), + naryMeExpr.GetBoundCheck()); + for (size_t i = 0; i < naryMeExpr.GetOpnds().size(); i++) { + newMeExpr.GetOpnds().push_back(RenameExpr(*naryMeExpr.GetOpnd(i), needRehash)); } if (needRehash) { changed = true; - newMeExpr.InitBase(meexpr->GetOp(), meexpr->GetPrimType(), meexpr->GetNumOpnds()); - return irMap->HashMeExpr(&newMeExpr); + newMeExpr.InitBase(meexpr.GetOp(), meexpr.GetPrimType(), meexpr.GetNumOpnds()); + return irMap.HashMeExpr(newMeExpr); } - return meexpr; + return &meexpr; } default: - return meexpr; + return &meexpr; } } -void SSAUpdate::RenameStmts(BB *bb) { - for (auto &stmt : bb->GetMeStmts()) { +void MeSSAUpdate::RenameStmts(BB &bb) { + for (auto &stmt : bb.GetMeStmts()) { // rename the expressions bool changed = false; for (size_t i = 0; i < stmt.NumMeStmtOpnds(); i++) { - stmt.SetOpnd(i, RenameExpr(stmt.GetOpnd(i), changed /* dummy */)); + stmt.SetOpnd(i, RenameExpr(*stmt.GetOpnd(i), changed /* dummy */)); } // process mayDef MapleMap *chiList = stmt.GetChiList(); @@ -208,12 +207,12 @@ void SSAUpdate::RenameStmts(BB *bb) { } } -void SSAUpdate::RenamePhiOpndsInSucc(BB *bb) { - for (BB *succ : bb->GetSucc()) { +void MeSSAUpdate::RenamePhiOpndsInSucc(BB &bb) { + for (BB *succ : bb.GetSucc()) { // find index of bb in succ_bb->pred_[] size_t index = 0; while (index < succ->GetPred().size()) { - if (succ->GetPred(index) == bb) { + if (succ->GetPred(index) == &bb) { break; } index++; @@ -235,7 +234,7 @@ void SSAUpdate::RenamePhiOpndsInSucc(BB *bb) { } } -void SSAUpdate::RenameBB(BB *bb) { +void MeSSAUpdate::RenameBB(BB &bb) { // for recording stack height on entering this BB, to pop back to same height // when backing up the dominator tree std::map origStackSize((std::less())); @@ -247,9 +246,9 @@ void SSAUpdate::RenameBB(BB *bb) { RenameStmts(bb); RenamePhiOpndsInSucc(bb); // recurse down dominator tree in pre-order traversal - const MapleSet &children = dom->GetDomChildren(bb->GetBBId().idx); + const MapleSet &children = dom.GetDomChildren(bb.GetBBId().idx); for (const BBId &child : children) { - RenameBB(func->GetBBFromID(child)); + RenameBB(*func.GetBBFromID(child)); } // pop stacks back to where they were at entry to this BB it = renameStacks.begin(); @@ -260,21 +259,20 @@ void SSAUpdate::RenameBB(BB *bb) { } } -void SSAUpdate::Run() { +void MeSSAUpdate::Run() { InsertPhis(); // push zero-version varmeexpr nodes to rename stacks MapleMap*>::iterator it = renameStacks.begin(); for (; it != renameStacks.end(); it++) { - OriginalSt *ost = ssaTab->GetSymbolOriginalStFromID(it->first); - VarMeExpr *zeroVersVar = irMap->GetOrCreateZeroVersionVarMeExpr(ost); + const OriginalSt *ost = ssaTab.GetSymbolOriginalStFromID(it->first); + VarMeExpr *zeroVersVar = irMap.GetOrCreateZeroVersionVarMeExpr(*ost); MapleStack *renameStack = it->second; renameStack->push(zeroVersVar); } // recurse down dominator tree in pre-order traversal - const MapleSet &children = dom->GetDomChildren(func->GetCommonEntryBB()->GetBBId().idx); + const MapleSet &children = dom.GetDomChildren(func.GetCommonEntryBB()->GetBBId().idx); for (const BBId &child : children) { - RenameBB(func->GetBBFromID(child)); + RenameBB(*func.GetBBFromID(child)); } } - } // namespace maple diff --git a/src/maple_me/src/orig_symbol.cpp b/src/maple_me/src/orig_symbol.cpp index c9f098fa262c353f3bbf746ecf39ded21197000b..a3ee02515ec69d2b54e044f7367076cf95697bc8 100644 --- a/src/maple_me/src/orig_symbol.cpp +++ b/src/maple_me/src/orig_symbol.cpp @@ -15,12 +15,12 @@ #include "orig_symbol.h" namespace maple { -bool OriginalSt::Equal(const OriginalSt *ost) const { +bool OriginalSt::Equal(const OriginalSt &ost) const { if (IsSymbolOst()) { - return (ost && symOrPreg.mirSt == ost->symOrPreg.mirSt && fieldID == ost->GetFieldID() && - GetIndirectLev() == ost->GetIndirectLev()); + return (symOrPreg.mirSt == ost.symOrPreg.mirSt && fieldID == ost.GetFieldID() && + GetIndirectLev() == ost.GetIndirectLev()); } else if (IsPregOst()) { - return (ost && symOrPreg.pregIdx == ost->symOrPreg.pregIdx && GetIndirectLev() == ost->GetIndirectLev()); + return (symOrPreg.pregIdx == ost.symOrPreg.pregIdx && GetIndirectLev() == ost.GetIndirectLev()); } return false; } @@ -43,8 +43,8 @@ void OriginalSt::Dump() const { } } -OriginalStTable::OriginalStTable(MemPool *memPool, MIRModule *mod) - : alloc(memPool), +OriginalStTable::OriginalStTable(MemPool &memPool, MIRModule &mod) + : alloc(&memPool), mirModule(mod), originalStVector(alloc.Adapter()), mirSt2Ost(alloc.Adapter()), @@ -58,16 +58,16 @@ OriginalStTable::OriginalStTable(MemPool *memPool, MIRModule *mod) } void OriginalStTable::Dump() { - mirModule->GetOut() << "==========original st table===========\n"; + mirModule.GetOut() << "==========original st table===========\n"; for (size_t i = 1; i < Size(); i++) { - OriginalSt *verst = GetOriginalStFromID(OStIdx(i)); + const OriginalSt *verst = GetOriginalStFromID(OStIdx(i)); verst->Dump(); } - mirModule->GetOut() << "\n=======end original st table===========\n"; + mirModule.GetOut() << "\n=======end original st table===========\n"; } -OriginalSt *OriginalStTable::FindOrCreateSymbolOriginalSt(MIRSymbol *mirst, PUIdx pidx, FieldID fld) { - MapleUnorderedMap::iterator it = mirSt2Ost.find(mirst); +OriginalSt *OriginalStTable::FindOrCreateSymbolOriginalSt(MIRSymbol &mirst, PUIdx pidx, FieldID fld) { + MapleUnorderedMap::iterator it = mirSt2Ost.find(&mirst); if (it == mirSt2Ost.end()) { // create a new OriginalSt return CreateSymbolOriginalSt(mirst, pidx, fld); @@ -82,28 +82,28 @@ OriginalSt *OriginalStTable::FindOrCreatePregOriginalSt(PregIdx regidx, PUIdx pi return (it == preg2Ost.end()) ? CreatePregOriginalSt(regidx, pidx) : originalStVector.at(it->second.idx); } -OriginalSt *OriginalStTable::CreateSymbolOriginalSt(MIRSymbol *mirst, PUIdx pidx, FieldID fld) { - OriginalSt *ost = alloc.GetMemPool()->New(originalStVector.size(), mirst, pidx, fld, &alloc); +OriginalSt *OriginalStTable::CreateSymbolOriginalSt(MIRSymbol &mirst, PUIdx pidx, FieldID fld) { + OriginalSt *ost = alloc.GetMemPool()->New(originalStVector.size(), mirst, pidx, fld, alloc); if (fld == 0) { - ost->SetTyIdx(mirst->GetTyIdx()); - ost->SetIsFinal(mirst->IsFinal()); - ost->SetIsPrivate(mirst->IsPrivate()); + ost->SetTyIdx(mirst.GetTyIdx()); + ost->SetIsFinal(mirst.IsFinal()); + ost->SetIsPrivate(mirst.IsPrivate()); } else { MIRStructType *structType = - dynamic_cast(GlobalTables::GetTypeTable().GetTypeFromTyIdx(mirst->GetTyIdx())); + static_cast(GlobalTables::GetTypeTable().GetTypeFromTyIdx(mirst.GetTyIdx())); ASSERT(structType, "CreateSymbolOriginalSt: non-zero fieldID for non-structure"); ost->SetTyIdx(structType->GetFieldTyIdx(fld)); FieldAttrs fattrs = structType->GetFieldAttrs(fld); - ost->SetIsFinal(fattrs.GetAttr(FLDATTR_final) && !mirModule->CurFunction()->IsConstructor()); + ost->SetIsFinal(fattrs.GetAttr(FLDATTR_final) && !mirModule.CurFunction()->IsConstructor()); ost->SetIsPrivate(fattrs.GetAttr(FLDATTR_private)); } originalStVector.push_back(ost); - mirSt2Ost[mirst] = ost->GetIndex(); + mirSt2Ost[&mirst] = ost->GetIndex(); return ost; } OriginalSt *OriginalStTable::CreatePregOriginalSt(PregIdx regidx, PUIdx pidx) { - OriginalSt *ost = alloc.GetMemPool()->New(originalStVector.size(), regidx, pidx, &alloc); + OriginalSt *ost = alloc.GetMemPool()->New(originalStVector.size(), regidx, pidx, alloc); ost->SetTyIdx((regidx < 0) ? TyIdx(PTY_unknown) : GlobalTables::GetTypeTable().GetPrimType(ost->GetMIRPreg()->GetPrimType())->GetTypeIndex()); @@ -112,8 +112,8 @@ OriginalSt *OriginalStTable::CreatePregOriginalSt(PregIdx regidx, PUIdx pidx) { return ost; } -OriginalSt *OriginalStTable::FindSymbolOriginalSt(MIRSymbol *mirst) { - MapleUnorderedMap::iterator it = mirSt2Ost.find(mirst); +OriginalSt *OriginalStTable::FindSymbolOriginalSt(MIRSymbol &mirst) { + MapleUnorderedMap::iterator it = mirSt2Ost.find(&mirst); if (it == mirSt2Ost.end()) { return nullptr; } else { @@ -122,5 +122,4 @@ OriginalSt *OriginalStTable::FindSymbolOriginalSt(MIRSymbol *mirst) { return originalStVector[it->second.idx]; } } - } // namespace maple diff --git a/src/maple_me/src/ssa.cpp b/src/maple_me/src/ssa.cpp index ca1efb347caf7eee8a14ba5ff597c724e2227c52..0bfb21b77d332364b4d72e395644f978023b7848 100644 --- a/src/maple_me/src/ssa.cpp +++ b/src/maple_me/src/ssa.cpp @@ -25,13 +25,12 @@ void SSA::InitRenameStack(OriginalStTable *otable, size_t bbsize, VersionStTable bbRenamed.resize(bbsize, false); for (size_t i = 1; i < otable->Size(); i++) { MapleStack *vstack = ssaAlloc.GetMemPool()->New>(ssaAlloc.Adapter()); - OriginalSt *ost = otable->GetOriginalStFromID(OStIdx(i)); + const OriginalSt *ost = otable->GetOriginalStFromID(OStIdx(i)); VersionSt *temp = (ost->GetIndirectLev() >= 0) ? versttab.GetVersionStFromID(ost->GetZeroVersionIndex(), true) : &versttab.GetDummyVersionSt(); vstack->push(temp); vstStacks[i] = vstack; } - } VersionSt *SSA::CreateNewVersion(VersionSt *vsym, BB *defBB) { @@ -347,5 +346,4 @@ void PhiNode::Dump(const MIRModule *mod) { } LogInfo::MapleLogger() << ")" << std::endl; } - } // namespace maple diff --git a/src/maple_me/src/ssa_mir_nodes.cpp b/src/maple_me/src/ssa_mir_nodes.cpp index 25fc1934106699c656a1d66d24aec8cc01ba55bd..63d56d85afa47c4698e333d7cf0e0665dc173b14 100644 --- a/src/maple_me/src/ssa_mir_nodes.cpp +++ b/src/maple_me/src/ssa_mir_nodes.cpp @@ -163,5 +163,4 @@ bool HasMayDef(const StmtNode *stmtNode, SSATab *func) { } return false; } - -} // namespace maple +} // namespace maple \ No newline at end of file diff --git a/src/maple_me/src/ssa_tab.cpp b/src/maple_me/src/ssa_tab.cpp index 0255842e3dc7bb507fa0abd9e01e8ebf7cdd60f6..bff26a3558de7861320f4b810ff4c368e324c74c 100644 --- a/src/maple_me/src/ssa_tab.cpp +++ b/src/maple_me/src/ssa_tab.cpp @@ -24,7 +24,6 @@ // by allocating the larger SSANodes. Statement nodes' SSA information is // stored in class SSATab's StmtsSSAPart, which has an array of pointers indexed // by the stmtID field of each statement node. - namespace maple { BaseNode *SSATab::CreateSSAExpr(BaseNode *expr) { if (expr->GetOpCode() == OP_addrof || expr->GetOpCode() == OP_dread) { @@ -76,7 +75,7 @@ void SSATab::CreateSSAStmt(StmtNode *stmt, const BB *curbb, bool ignoreCallassig MayDefPartWithVersionSt *theSSAPart = stmtsSSAPart.GetSSAPartMp()->New(&stmtsSSAPart.GetSSAPartAlloc()); stmtsSSAPart.SetSSAPartOf(stmt, theSSAPart); - DassignNode *dnode = dynamic_cast(stmt); + DassignNode *dnode = static_cast(stmt); MIRSymbol *st = mirModule.CurFunction()->GetLocalOrGlobalSymbol(dnode->GetStIdx()); CHECK_FATAL(st != nullptr, "null ptr check"); @@ -118,7 +117,7 @@ void SSATab::CreateSSAStmt(StmtNode *stmt, const BB *curbb, bool ignoreCallassig stmtsSSAPart.SetSSAPartOf(stmt, theSSAPart); // insert the mustdefs CallReturnVector *nrets = static_cast(stmt)->GetCallReturnVector(); - ASSERT(nrets != nullptr, "CreateSSAStmt: failed to retrieve call return vector"); + CHECK_FATAL(nrets != nullptr, "CreateSSAStmt: failed to retrieve call return vector"); if (nrets->empty()) { return; } @@ -145,5 +144,4 @@ void SSATab::CreateSSAStmt(StmtNode *stmt, const BB *curbb, bool ignoreCallassig } return; } - } // namespace maple diff --git a/src/maple_me/src/ver_symbol.cpp b/src/maple_me/src/ver_symbol.cpp index d51d2d08a4127fcd748bc8778daf4be1e03fbb09..042b7692f875fa4e3e60b5c50b39eecb20a3db64 100644 --- a/src/maple_me/src/ver_symbol.cpp +++ b/src/maple_me/src/ver_symbol.cpp @@ -76,5 +76,4 @@ void VersionStTable::Dump(MIRModule *mod) { } mod->GetOut() << "=======end version st table===========\n"; } - } // namespace maple diff --git a/src/maple_phase/include/phase_manager.h b/src/maple_phase/include/phase_manager.h index 47d1c9bb3aea2fa4a563ef1f12da598d23f045f0..a5b4a10ea30da637843ffd18126dfa06dc32c23d 100644 --- a/src/maple_phase/include/phase_manager.h +++ b/src/maple_phase/include/phase_manager.h @@ -48,7 +48,7 @@ class PhaseManager { if (registeredPhases.find(id) != registeredPhases.end()) { return registeredPhases[id]; } - MIR_WARNING("not a valid phase"); + CHECK_FATAL(false, "not a valid phase"); return nullptr; } diff --git a/src/mpl2mpl/include/class_hierarchy.h b/src/mpl2mpl/include/class_hierarchy.h index 8d52534d298d5f00c8b6f12d59347f4567498232..3c6cf85426bc253dc92dc516617579872028362e 100644 --- a/src/mpl2mpl/include/class_hierarchy.h +++ b/src/mpl2mpl/include/class_hierarchy.h @@ -342,6 +342,7 @@ class KlassHierarchy : public AnalysisResult { bool IsSuperKlass(const Klass *super, const Klass *base) const; bool IsSuperKlassForInterface(const Klass *super, Klass *base) const; bool IsInterfaceImplemented(Klass *interface, const Klass *base) const; + bool UpdateFieldID(TyIdx baseTypeIdx, TyIdx targetTypeIdx, FieldID &fldID) const; // return true if class, its super or interfaces have at least one clinit function bool NeedClinitCheckRecursively(Klass *kl); void TopologicalSortKlasses(); @@ -381,6 +382,7 @@ class KlassHierarchy : public AnalysisResult { void GetChildKlasses(const Klass *klass, std::vector &childKlasses) const; void ExceptionFlagProp(Klass *klass); Klass *AddClassFlag(const char *name, uint32 flag); + int GetFieldIDOffsetBetweenClasses(const Klass &super, const Klass &base) const; }; } // namespace maple diff --git a/src/mpl2mpl/include/reflection_analysis.h b/src/mpl2mpl/include/reflection_analysis.h index 1e53f40974068d01d63566c39e8d68b8567e286d..09bae3239978f86e641c42d461f52f47fda24302 100644 --- a/src/mpl2mpl/include/reflection_analysis.h +++ b/src/mpl2mpl/include/reflection_analysis.h @@ -309,7 +309,7 @@ class ReflectionAnalysis : public AnalysisResult { void GeneAnnotation(std::map &idxNumMap, std::string &annoArr, MIRClassType *classType, PragmaKind paragKind, const std::string ¶gName, TyIdx fieldTypeIdx, std::map *paramNumArray = nullptr, int *paramIndex = nullptr); - void SetAnnoFieldConst(const MIRStructType *metadataRoType, MIRAggConst *newConst, uint32 fieldID, + void SetAnnoFieldConst(const MIRStructType *metadataRoType, MIRAggConst &newConst, uint32 fieldID, std::map &idxNumMap, const std::string &annoArr); bool IsAnonymousClass(const std::string &annotationString); bool IsPrivateClass(MIRClassType *classType); diff --git a/src/mpl2mpl/src/class_hierarchy.cpp b/src/mpl2mpl/src/class_hierarchy.cpp index a77cf06fe0fe3b6fa5ecee208611576b205550e3..6e66da4fa8cb8a3fe1dda8438a22b2777200c7f7 100644 --- a/src/mpl2mpl/src/class_hierarchy.cpp +++ b/src/mpl2mpl/src/class_hierarchy.cpp @@ -378,6 +378,42 @@ bool KlassHierarchy::IsInterfaceImplemented(Klass *interface, const Klass *base) return (base->GetImplInterfaces().find(interface) != base->GetImplInterfaces().end()); } +int KlassHierarchy::GetFieldIDOffsetBetweenClasses(const Klass &super, const Klass &base) const { + int offset = 0; + const Klass *superPtr = &super; + const Klass *basePtr = &base; + while (basePtr != superPtr) { + basePtr = basePtr->GetSuperKlass(); + ASSERT(basePtr != nullptr, "null ptr check"); + offset++; + } + return offset; +} + +bool KlassHierarchy::UpdateFieldID(TyIdx baseTypeIdx, TyIdx targetTypeIdx, FieldID &fldID) const { + MIRType *baseType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(baseTypeIdx); + MIRType *targetType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(targetTypeIdx); + if (baseType->GetKind() == kTypePointer && targetType->GetKind() == kTypePointer) { + baseType = static_cast(baseType)->GetPointedType(); + targetType = static_cast(targetType)->GetPointedType(); + } + if (baseType->GetKind() != kTypeClass || targetType->GetKind() != kTypeClass) { + return false; + } + Klass *baseKlass = GetKlassFromTyIdx(baseType->GetTypeIndex()); + ASSERT(baseKlass != nullptr, "null ptr check"); + Klass *targetKlass = GetKlassFromTyIdx(targetType->GetTypeIndex()); + ASSERT(targetKlass != nullptr, "null ptr check"); + if (IsSuperKlass(baseKlass, targetKlass)) { + fldID += GetFieldIDOffsetBetweenClasses(*baseKlass, *targetKlass); + return true; + } else if (IsSuperKlass(targetKlass, baseKlass)) { + fldID -= GetFieldIDOffsetBetweenClasses(*targetKlass, *baseKlass); + return true; + } + return false; +} + bool KlassHierarchy::NeedClinitCheckRecursively(Klass *kl) { Klass *klass = kl; if (klass->IsClass()) { diff --git a/src/mpl2mpl/src/muid_replacement.cpp b/src/mpl2mpl/src/muid_replacement.cpp index 29686fffaab1d7be8e7d7346d2b9d5bec15be52a..cdadbb18981fedfcd1ca4479b1ab20e88cfdb9a7 100644 --- a/src/mpl2mpl/src/muid_replacement.cpp +++ b/src/mpl2mpl/src/muid_replacement.cpp @@ -340,15 +340,15 @@ void MUIDReplacement::GenericFuncDefTable() { MIRAggConst *muidEntryConst = GetModule()->GetMemPool()->New(GetModule(), funcDefMuidTabEntryType); uint32 muidFieldID = 1; // To be processed by runtime - builder->AddAddroffuncFieldConst(funcDefTabEntryType, entryConst, fieldID++, funcSymbol); + builder->AddAddroffuncFieldConst(*funcDefTabEntryType, *entryConst, fieldID++, *funcSymbol); funcDefTabConst->GetConstVec().push_back(entryConst); // To be emitted as method size by CG - builder->AddAddroffuncFieldConst(funcInfTabEntryType, funcInfEntryConst, funcInfFieldID++, funcSymbol); + builder->AddAddroffuncFieldConst(*funcInfTabEntryType, *funcInfEntryConst, funcInfFieldID++, *funcSymbol); // To be emitted as method name by CG - builder->AddAddroffuncFieldConst(funcInfTabEntryType, funcInfEntryConst, funcInfFieldID++, funcSymbol); + builder->AddAddroffuncFieldConst(*funcInfTabEntryType, *funcInfEntryConst, funcInfFieldID++, *funcSymbol); funcInfTabConst->GetConstVec().push_back(funcInfEntryConst); - builder->AddIntFieldConst(funcDefMuidTabEntryType, muidEntryConst, muidFieldID++, muid.data.words[0]); - builder->AddIntFieldConst(funcDefMuidTabEntryType, muidEntryConst, muidFieldID++, muid.data.words[1]); + builder->AddIntFieldConst(*funcDefMuidTabEntryType, *muidEntryConst, muidFieldID++, muid.data.words[0]); + builder->AddIntFieldConst(*funcDefMuidTabEntryType, *muidEntryConst, muidFieldID++, muid.data.words[1]); funcDefMuidTabConst->GetConstVec().push_back(muidEntryConst); mplMuidStr += muid.ToStr(); } @@ -424,10 +424,10 @@ void MUIDReplacement::GenericDataDefTable() { MIRAggConst *muidEntryConst = GetModule()->GetMemPool()->New(GetModule(), dataDefMuidTabEntryType); uint32 muidFieldID = 1; // Will be emitted as 0 and processed by runtime - builder->AddAddrofFieldConst(dataDefTabEntryType, entryConst, fieldID++, mirSymbol); + builder->AddAddrofFieldConst(*dataDefTabEntryType, *entryConst, fieldID++, *mirSymbol); dataDefTabConst->GetConstVec().push_back(entryConst); - builder->AddIntFieldConst(dataDefMuidTabEntryType, muidEntryConst, muidFieldID++, muid.data.words[0]); - builder->AddIntFieldConst(dataDefMuidTabEntryType, muidEntryConst, muidFieldID++, muid.data.words[1]); + builder->AddIntFieldConst(*dataDefMuidTabEntryType, *muidEntryConst, muidFieldID++, muid.data.words[0]); + builder->AddIntFieldConst(*dataDefMuidTabEntryType, *muidEntryConst, muidFieldID++, muid.data.words[1]); dataDefMuidTabConst->GetConstVec().push_back(muidEntryConst); mplMuidStr += muid.ToStr(); if (trace) { @@ -512,10 +512,10 @@ void MUIDReplacement::GenericUnifiedUndefTable() { GetModule()->GetMemPool()->New(GetModule(), unifiedUndefMuidTabEntryType); uint32 muidFieldID = 1; // to be filled by runtime - builder->AddIntFieldConst(unifiedUndefTabEntryType, entryConst, fieldID++, 0); + builder->AddIntFieldConst(*unifiedUndefTabEntryType, *entryConst, fieldID++, 0); funcUndefTabConst->GetConstVec().push_back(entryConst); - builder->AddIntFieldConst(unifiedUndefMuidTabEntryType, muidEntryConst, muidFieldID++, muid.data.words[0]); - builder->AddIntFieldConst(unifiedUndefMuidTabEntryType, muidEntryConst, muidFieldID++, muid.data.words[1]); + builder->AddIntFieldConst(*unifiedUndefMuidTabEntryType, *muidEntryConst, muidFieldID++, muid.data.words[0]); + builder->AddIntFieldConst(*unifiedUndefMuidTabEntryType, *muidEntryConst, muidFieldID++, muid.data.words[1]); funcUndefMuidTabConst->GetConstVec().push_back(muidEntryConst); } if (!funcUndefTabConst->GetConstVec().empty()) { @@ -547,10 +547,10 @@ void MUIDReplacement::GenericUnifiedUndefTable() { GetModule()->GetMemPool()->New(GetModule(), unifiedUndefMuidTabEntryType); uint32 muidFieldID = 1; // Will be emitted as 0 and filled by runtime - builder->AddAddrofFieldConst(unifiedUndefTabEntryType, entryConst, fieldID++, mirSymbol); + builder->AddAddrofFieldConst(*unifiedUndefTabEntryType, *entryConst, fieldID++, *mirSymbol); dataUndefTabConst->GetConstVec().push_back(entryConst); - builder->AddIntFieldConst(unifiedUndefMuidTabEntryType, muidEntryConst, muidFieldID++, muid.data.words[0]); - builder->AddIntFieldConst(unifiedUndefMuidTabEntryType, muidEntryConst, muidFieldID++, muid.data.words[1]); + builder->AddIntFieldConst(*unifiedUndefMuidTabEntryType, *muidEntryConst, muidFieldID++, muid.data.words[0]); + builder->AddIntFieldConst(*unifiedUndefMuidTabEntryType, *muidEntryConst, muidFieldID++, muid.data.words[1]); dataUndefMuidTabConst->GetConstVec().push_back(muidEntryConst); mplMuidStr += muid.ToStr(); if (trace) { @@ -591,8 +591,8 @@ void MUIDReplacement::GenericRangeTable() { uint32 fieldID = 1; MIRAggConst *entryConst = GetModule()->GetMemPool()->New(GetModule(), rangeTabEntryType); MUID mplMd5 = GetMUID(item); - builder->AddIntFieldConst(rangeTabEntryType, entryConst, fieldID++, mplMd5.data.words[0]); - builder->AddIntFieldConst(rangeTabEntryType, entryConst, fieldID++, mplMd5.data.words[1]); + builder->AddIntFieldConst(*rangeTabEntryType, *entryConst, fieldID++, mplMd5.data.words[0]); + builder->AddIntFieldConst(*rangeTabEntryType, *entryConst, fieldID++, mplMd5.data.words[1]); rangeTabConst->GetConstVec().push_back(entryConst); } for (uint32 i = RangeIdx::kVtab; i < RangeIdx::kMaxNum; i++) { @@ -602,14 +602,14 @@ void MUIDReplacement::GenericRangeTable() { if (i == RangeIdx::kGlobalRootlist) { MIRSymbol *st = GetSymbolFromName(NameMangler::kGcRootList); if (st == nullptr) { - builder->AddIntFieldConst(rangeTabEntryType, entryConst, fieldID++, 0); - builder->AddIntFieldConst(rangeTabEntryType, entryConst, fieldID++, 0); + builder->AddIntFieldConst(*rangeTabEntryType, *entryConst, fieldID++, 0); + builder->AddIntFieldConst(*rangeTabEntryType, *entryConst, fieldID++, 0); rangeTabConst->GetConstVec().push_back(entryConst); continue; } } - builder->AddIntFieldConst(rangeTabEntryType, entryConst, fieldID++, i); - builder->AddIntFieldConst(rangeTabEntryType, entryConst, fieldID++, i); + builder->AddIntFieldConst(*rangeTabEntryType, *entryConst, fieldID++, i); + builder->AddIntFieldConst(*rangeTabEntryType, *entryConst, fieldID++, i); rangeTabConst->GetConstVec().push_back(entryConst); } // Please refer to mrt/compiler-rt/include/mpl_linker.h for the layout @@ -621,11 +621,11 @@ void MUIDReplacement::GenericRangeTable() { MIRAggConst *entryConst = GetModule()->GetMemPool()->New(GetModule(), rangeTabEntryType); uint32 fieldID = 1; if (mirSymbol != nullptr) { - builder->AddAddrofFieldConst(rangeTabEntryType, entryConst, fieldID++, mirSymbol); - builder->AddAddrofFieldConst(rangeTabEntryType, entryConst, fieldID++, mirSymbol); + builder->AddAddrofFieldConst(*rangeTabEntryType, *entryConst, fieldID++, *mirSymbol); + builder->AddAddrofFieldConst(*rangeTabEntryType, *entryConst, fieldID++, *mirSymbol); } else { - builder->AddIntFieldConst(rangeTabEntryType, entryConst, fieldID++, 0); - builder->AddIntFieldConst(rangeTabEntryType, entryConst, fieldID++, 0); + builder->AddIntFieldConst(*rangeTabEntryType, *entryConst, fieldID++, 0); + builder->AddIntFieldConst(*rangeTabEntryType, *entryConst, fieldID++, 0); } rangeTabConst->GetConstVec().push_back(entryConst); } @@ -671,11 +671,11 @@ void MUIDReplacement::ClearVtabItab(const std::string &name) { if (tabSym == nullptr) { return; } - MIRAggConst *oldConst = dynamic_cast(tabSym->GetKonst()); - if (oldConst == nullptr) { + auto *oldConst = tabSym->GetKonst(); + if (oldConst == nullptr || oldConst->GetKind() != kConstAggConst) { return; } - oldConst->GetConstVec().clear(); + static_cast(oldConst)->GetConstVec().clear(); return; } @@ -684,15 +684,15 @@ void MUIDReplacement::ReplaceFuncTable(const std::string &name) { if (tabSym == nullptr) { return; } - MIRAggConst *oldConst = dynamic_cast(tabSym->GetKonst()); - if (oldConst == nullptr) { + auto *oldConst = tabSym->GetKonst(); + if (oldConst == nullptr || oldConst->GetKind() != kConstAggConst) { return; } bool isVtab = false; if (tabSym->GetName().find(VTAB_PREFIX_STR) == 0) { isVtab = true; } - for (MIRConst *&oldTabEntry : oldConst->GetConstVec()) { + for (MIRConst *&oldTabEntry : static_cast(oldConst)->GetConstVec()) { if (oldTabEntry->GetKind() == kConstAggConst) { MIRAggConst *aggrC = static_cast(oldTabEntry); for (size_t i = 0; i < aggrC->GetConstVec().size(); i++) { @@ -862,7 +862,7 @@ void MUIDReplacement::ReplaceDirectInvokeOrAddroffunc(MIRFunction *currentFunc, icallNode->GetNopnd().resize(icallNode->GetNumOpnds()); icallNode->SetNOpndAt(0, readFuncPtr); for (size_t i = 1; i < icallNode->GetNopndSize(); i++) { - icallNode->SetNOpndAt(i, callNode->GetNopnd()[i - 1]->CloneTree(GetModule()->CurFuncCodeMemPoolAllocator())); + icallNode->SetNOpndAt(i, callNode->GetNopnd()[i - 1]->CloneTree(GetModule()->GetCurFuncCodeMPAllocator())); } icallNode->SetRetTyIdx(calleeFunc->GetReturnTyIdx()); if (callNode->GetOpCode() == OP_callassigned) { @@ -1089,11 +1089,11 @@ void MUIDReplacement::GenericGlobalRootList() { continue; } // It is a pointer/ref type. Check its pointed type. - MIRPtrType *pointType = dynamic_cast(type); if (pty == PTY_ptr) { - if (pointType == nullptr) { + if (type->GetKind() != kTypePointer) { continue; } + MIRPtrType *pointType = static_cast(type); MIRType *pointedType = pointType->GetPointedType(); if (!(pointedType->GetKind() == kTypeClass)) { continue; diff --git a/src/mpl2mpl/src/native_stub_func.cpp b/src/mpl2mpl/src/native_stub_func.cpp index 4983b3dc254dddd6c366ff351bd4893d3f46b36c..d1e1d392bd52eaab96c72e11fa3e5db46c333077 100644 --- a/src/mpl2mpl/src/native_stub_func.cpp +++ b/src/mpl2mpl/src/native_stub_func.cpp @@ -482,7 +482,7 @@ void GenericNativeStubFunc::GenericRegisteredNativeFuncCall(MIRFunction *func, c icall->GetNopnd().resize(icall->GetNumOpnds()); icall->SetReturnVec(nrets); for (size_t i = 1; i < icall->GetNopndSize(); i++) { - icall->SetNOpndAt(i, args[i - 1]->CloneTree(GetModule()->CurFuncCodeMemPoolAllocator())); + icall->SetNOpndAt(i, args[i - 1]->CloneTree(GetModule()->GetCurFuncCodeMPAllocator())); } icall->SetNOpndAt(0, readFuncPtr); icall->SetRetTyIdx(nativeFunc->GetReturnTyIdx()); @@ -526,7 +526,7 @@ StmtNode *GenericNativeStubFunc::CreateNativeWrapperCallNode(MIRFunction *func, icall->GetNopnd().resize(icall->GetNumOpnds()); icall->SetReturnVec(nrets); for (size_t i = 1; i < icall->GetNopndSize(); i++) { - icall->SetNOpndAt(i, args[i - 1]->CloneTree(GetModule()->CurFuncCodeMemPoolAllocator())); + icall->SetNOpndAt(i, args[i - 1]->CloneTree(GetModule()->GetCurFuncCodeMPAllocator())); } icall->SetNOpndAt(0, funcPtr); icall->SetRetTyIdx(func->GetReturnTyIdx()); diff --git a/src/mpl2mpl/src/reflection_analysis.cpp b/src/mpl2mpl/src/reflection_analysis.cpp index 64a50a95f04b0cbc9d0b30cd974f137caf32d686..2d527acc5eae349baa3af32b5c7ebebd4be1c2ec 100644 --- a/src/mpl2mpl/src/reflection_analysis.cpp +++ b/src/mpl2mpl/src/reflection_analysis.cpp @@ -689,13 +689,13 @@ MIRSymbol *ReflectionAnalysis::GenMethodsMetaData(const Klass *klass) { // @method_in_vtable_index uint32 methodInVtabIndex = static_cast(static_cast(GetMethodInVtabIndex(klass, func))); methodInVtabIndex &= 0xFFFF; - mirBuilder.AddIntFieldConst(methodsInfoType, newconst, fieldID++, methodInVtabIndex); + mirBuilder.AddIntFieldConst(*methodsInfoType, *newconst, fieldID++, methodInVtabIndex); // @declaringclass MIRSymbol *dklassSt = GetOrCreateSymbol(CLASSINFO_PREFIX_STR + func->GetBaseClassName(), classMetadataTyIdx); - mirBuilder.AddAddrofFieldConst(methodsInfoType, newconst, fieldID++, dklassSt); + mirBuilder.AddAddrofFieldConst(*methodsInfoType, *newconst, fieldID++, *dklassSt); // @addr : Function address - mirBuilder.AddAddroffuncFieldConst(methodsInfoType, newconst, fieldID++, funcSym); + mirBuilder.AddAddroffuncFieldConst(*methodsInfoType, *newconst, fieldID++, *funcSym); // @modifier uint32 mod = GetMethodModifier(func->GetFuncAttrs()); @@ -703,11 +703,11 @@ MIRSymbol *ReflectionAnalysis::GenMethodsMetaData(const Klass *klass) { if (klass->IsInterface() && !func->GetAttr(FUNCATTR_abstract) && !func->GetAttr(FUNCATTR_static)) { mod |= (1 << (kModDefault)); } - mirBuilder.AddIntFieldConst(methodsInfoType, newconst, fieldID++, mod); + mirBuilder.AddIntFieldConst(*methodsInfoType, *newconst, fieldID++, mod); // @methodname std::string baseName = basenameMp[func->GetBaseFuncNameStrIdx().GetIdx()]; uint32 methodnameIdx = FindOrInsertReflectString(baseName); - mirBuilder.AddIntFieldConst(methodsInfoType, newconst, fieldID++, methodnameIdx); + mirBuilder.AddIntFieldConst(*methodsInfoType, *newconst, fieldID++, methodnameIdx); // @methodsignature std::string fullname = fullnameMp[func->GetBaseFuncNameWithTypeStrIdx().GetIdx()]; std::string signature = GetSignatureFromFullName(fullname); @@ -716,17 +716,17 @@ MIRSymbol *ReflectionAnalysis::GenMethodsMetaData(const Klass *klass) { GetSignatureTypeNames(signature.c_str(), typeNames); uint32 signatureIdx = 0; signatureIdx = FindOrInsertReflectString(signature); - mirBuilder.AddIntFieldConst(methodsInfoType, newconst, fieldID++, signatureIdx); + mirBuilder.AddIntFieldConst(*methodsInfoType, *newconst, fieldID++, signatureIdx); // @annotation int annotationIdx = SolveAnnotation(classType, func); - mirBuilder.AddIntFieldConst(methodsInfoType, newconst, fieldID++, annotationIdx); - mirBuilder.AddIntFieldConst(methodsInfoType, newconst, fieldID++, flag); + mirBuilder.AddIntFieldConst(*methodsInfoType, *newconst, fieldID++, annotationIdx); + mirBuilder.AddIntFieldConst(*methodsInfoType, *newconst, fieldID++, flag); // @argsize: Number of arguments. size_t argsSize = func->GetParamSize(); - mirBuilder.AddIntFieldConst(methodsInfoType, newconst, fieldID++, argsSize); + mirBuilder.AddIntFieldConst(*methodsInfoType, *newconst, fieldID++, argsSize); #ifndef USE_32BIT_REF // @padding - mirBuilder.AddIntFieldConst(methodsInfoType, newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(*methodsInfoType, *newconst, fieldID++, 0); #endif aggconst->GetConstVec().push_back(newconst); } @@ -746,7 +746,7 @@ MIRSymbol *ReflectionAnalysis::GenSuperClassMetaData(const Klass *klass, std::li for (auto it = superClassList.begin(); it != superClassList.end(); ++it) { MIRSymbol *dklassSt = GetOrCreateSymbol(CLASSINFO_PREFIX_STR + (*it)->GetKlassName(), classMetadataTyIdx); MIRAggConst *newconst = mirModule->GetMemPool()->New(mirModule, superclassMetadataType); - mirBuilder.AddAddrofFieldConst(superclassMetadataType, newconst, 1, dklassSt); + mirBuilder.AddAddrofFieldConst(*superclassMetadataType, *newconst, 1, *dklassSt); aggconst->GetConstVec().push_back(newconst); } MIRSymbol *superclassArraySt = @@ -850,40 +850,40 @@ MIRSymbol *ReflectionAnalysis::GenFieldsMetaData(const Klass *klass) { gvarSt->SetAttr(ATTR_weak); gvarSt->SetAttr(ATTR_static); } - mirBuilder.AddAddrofFieldConst(fieldsInfoType, newconst, fieldID++, gvarSt); + mirBuilder.AddAddrofFieldConst(*fieldsInfoType, *newconst, fieldID++, *gvarSt); } else { // Offset of the instance field, we fill the index of fields here and let CG to fill in. FieldID fldID = mirBuilder.GetStructFieldIDFromNameAndTypeParentFirstFoundInChild( klass->GetMIRClassType(), originFieldname.c_str(), fieldP.second.first); - mirBuilder.AddIntFieldConst(fieldsInfoType, newconst, fieldID++, fldID); + mirBuilder.AddIntFieldConst(*fieldsInfoType, *newconst, fieldID++, fldID); } // @modifier FieldAttrs fa = fieldP.second.second; - mirBuilder.AddIntFieldConst(fieldsInfoType, newconst, fieldID++, GetFieldModifier(fa)); + mirBuilder.AddIntFieldConst(*fieldsInfoType, *newconst, fieldID++, GetFieldModifier(fa)); ConvertFieldName(fieldname, staticfield); uint32 fieldname32Idx = FindOrInsertReflectString(fieldname); uint32 typeNameIdx = GetTypeNameIdxFromType(ty, klass, fieldname); // @flag uint16 hash = GetFieldHash(fieldHashvec, fieldP); uint16 flag = (hash << 6); // Hash 10 bit. - mirBuilder.AddIntFieldConst(fieldsInfoType, newconst, fieldID++, flag); + mirBuilder.AddIntFieldConst(*fieldsInfoType, *newconst, fieldID++, flag); // @index - mirBuilder.AddIntFieldConst(fieldsInfoType, newconst, fieldID++, idx); + mirBuilder.AddIntFieldConst(*fieldsInfoType, *newconst, fieldID++, idx); // @type : Klass for type. // It's stored as type name, it's stored as a MIRIntConst. - mirBuilder.AddIntFieldConst(fieldsInfoType, newconst, fieldID++, typeNameIdx); + mirBuilder.AddIntFieldConst(*fieldsInfoType, *newconst, fieldID++, typeNameIdx); // @fieldname : Offset of the name in *local* strTab. // In CG, we need to fill the offset as (__reflection_strtab___$file + offset of name). - mirBuilder.AddIntFieldConst(fieldsInfoType, newconst, fieldID++, fieldname32Idx); + mirBuilder.AddIntFieldConst(*fieldsInfoType, *newconst, fieldID++, fieldname32Idx); // @annotation std::string annoArr; std::map idxNumMap; GeneAnnotation(idxNumMap, annoArr, classType, kPragmaVar, fieldname, ty->GetTypeIndex()); uint32 annotationIdx = GetAnnoCstrIndex(idxNumMap, annoArr); - mirBuilder.AddIntFieldConst(fieldsInfoType, newconst, fieldID++, annotationIdx); + mirBuilder.AddIntFieldConst(*fieldsInfoType, *newconst, fieldID++, annotationIdx); // @declaring class MIRSymbol *dklassSt = GetOrCreateSymbol(CLASSINFO_PREFIX_STR + klass->GetKlassName(), classMetadataTyIdx); - mirBuilder.AddAddrofFieldConst(fieldsInfoType, newconst, fieldID++, dklassSt); + mirBuilder.AddAddrofFieldConst(*fieldsInfoType, *newconst, fieldID++, *dklassSt); aggconst->GetConstVec().push_back(newconst); idx++; } @@ -1140,7 +1140,7 @@ void ReflectionAnalysis::GenClassMetaData(Klass *klass) { uint32 fieldID = 1; // @classname uint32 nameIdx = FindOrInsertReflectString(klassJavaDescriptor); - mirBuilder.AddIntFieldConst(classMetadataROType, newconst, fieldID++, nameIdx); + mirBuilder.AddIntFieldConst(*classMetadataROType, *newconst, fieldID++, nameIdx); // @iFields: All instance fields. int numOfFields = 0; bool hasAdded = false; @@ -1149,7 +1149,7 @@ void ReflectionAnalysis::GenClassMetaData(Klass *klass) { kFieldsInfoPrefixStr + NameMangler::GetInternalNameLiteral(kJavaLangObjectStr)); MIRSymbol *fieldsSt = GlobalTables::GetGsymTable().GetSymbolFromStrIdx(stridx); if (fieldsSt != nullptr) { - mirBuilder.AddAddrofFieldConst(classMetadataROType, newconst, fieldID++, fieldsSt); + mirBuilder.AddAddrofFieldConst(*classMetadataROType, *newconst, fieldID++, *fieldsSt); hasAdded = true; } } @@ -1158,9 +1158,9 @@ void ReflectionAnalysis::GenClassMetaData(Klass *klass) { if (fieldsSt != nullptr) { numOfFields = static_cast(fieldsSt->GetKonst())->GetConstVec().size(); // All meta data will be weak if dummy constructors. - mirBuilder.AddAddrofFieldConst(classMetadataROType, newconst, fieldID++, fieldsSt); + mirBuilder.AddAddrofFieldConst(*classMetadataROType, *newconst, fieldID++, *fieldsSt); } else { - mirBuilder.AddIntFieldConst(classMetadataROType, newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(*classMetadataROType, *newconst, fieldID++, 0); } } // @methods: All methods. @@ -1169,9 +1169,9 @@ void ReflectionAnalysis::GenClassMetaData(Klass *klass) { methodsSt = GenMethodsMetaData(klass); if (methodsSt != nullptr) { numOfMethods = static_cast(methodsSt->GetKonst())->GetConstVec().size(); - mirBuilder.AddAddrofFieldConst(classMetadataROType, newconst, fieldID++, methodsSt); + mirBuilder.AddAddrofFieldConst(*classMetadataROType, *newconst, fieldID++, *methodsSt); } else { - mirBuilder.AddIntFieldConst(classMetadataROType, newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(*classMetadataROType, *newconst, fieldID++, 0); } // @superclass: Super class and a list of implemented interfaces. std::list superClassList; @@ -1199,16 +1199,16 @@ void ReflectionAnalysis::GenClassMetaData(Klass *klass) { size_t superClassSize = superClassList.size(); if (superClassSize >= 1) { MIRSymbol *superClassSymbolType = GenSuperClassMetaData(klass, superClassList); - mirBuilder.AddAddrofFieldConst(classMetadataROType, newconst, fieldID++, superClassSymbolType); + mirBuilder.AddAddrofFieldConst(*classMetadataROType, *newconst, fieldID++, *superClassSymbolType); } else { - mirBuilder.AddIntFieldConst(classMetadataROType, newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(*classMetadataROType, *newconst, fieldID++, 0); } // @numoffields: Num of fields (own). CHECK_FATAL(numOfFields <= 0xffff, "Error:the num of fields is too large"); - mirBuilder.AddIntFieldConst(classMetadataROType, newconst, fieldID++, numOfFields); + mirBuilder.AddIntFieldConst(*classMetadataROType, *newconst, fieldID++, numOfFields); // @numofmethods: Num of methods in vtable. CHECK_FATAL(numOfMethods <= 0xffff, "Error:the num of methods is too large"); - mirBuilder.AddIntFieldConst(classMetadataROType, newconst, fieldID++, numOfMethods); + mirBuilder.AddIntFieldConst(*classMetadataROType, *newconst, fieldID++, numOfMethods); // Do annotation. std::string annoArray; std::map idxNumMap; @@ -1221,24 +1221,24 @@ void ReflectionAnalysis::GenClassMetaData(Klass *klass) { // Array class and primitive class is not generated by compiler. uint32 flag = klass->GetFlag(kClassHasFinalizer | CLASS_REFERENCE | kClassFinalizerreferenceSentinel); flag = isAnonymous ? (flag | kClassIsanonymousclass) : flag; - mirBuilder.AddIntFieldConst(classMetadataROType, newconst, fieldID++, flag); + mirBuilder.AddIntFieldConst(*classMetadataROType, *newconst, fieldID++, flag); // @numofsuperclasses CHECK_FATAL(superClassSize <= 0xffff, "Error:the size of superClass is too big"); - mirBuilder.AddIntFieldConst(classMetadataROType, newconst, fieldID++, superClassSize); + mirBuilder.AddIntFieldConst(*classMetadataROType, *newconst, fieldID++, superClassSize); // @padding - mirBuilder.AddIntFieldConst(classMetadataROType, newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(*classMetadataROType, *newconst, fieldID++, 0); #endif // USE_32BIT_REF // @modifier: For class fill ClassAccessFlags. uint32 modifier = GetClassAccessFlags(classType); - mirBuilder.AddIntFieldConst(classMetadataROType, newconst, fieldID++, modifier); + mirBuilder.AddIntFieldConst(*classMetadataROType, *newconst, fieldID++, modifier); // @annotation: Set annotation field. - SetAnnoFieldConst(classMetadataROType, newconst, fieldID++, idxNumMap, annoArray); + SetAnnoFieldConst(classMetadataROType, *newconst, fieldID++, idxNumMap, annoArray); // @ClinitFuncAddr MIRSymbol *clinitFuncSym = GetClinitFuncSymbol(klass); if (clinitFuncSym != nullptr) { - mirBuilder.AddAddroffuncFieldConst(classMetadataROType, newconst, fieldID++, clinitFuncSym); + mirBuilder.AddAddroffuncFieldConst(*classMetadataROType, *newconst, fieldID++, *clinitFuncSym); } else { - mirBuilder.AddIntFieldConst(classMetadataROType, newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(*classMetadataROType, *newconst, fieldID++, 0); } MIRSymbol *classMetadataROSymbolType = GetOrCreateSymbol(CLASSINFO_RO_PREFIX_STR + klass->GetKlassName(), classMetadataRoTyIdx, true); @@ -1250,38 +1250,38 @@ void ReflectionAnalysis::GenClassMetaData(Klass *klass) { newconst = mirModule->GetMemPool()->New(mirModule, classMetadataType); fieldID = 1; // @shadow: multiplex used for def index. - mirBuilder.AddIntFieldConst(classMetadataType, newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(*classMetadataType, *newconst, fieldID++, 0); // @monitor: multiplex used for class hash. - mirBuilder.AddIntFieldConst(classMetadataType, newconst, fieldID++, hashIndex); + mirBuilder.AddIntFieldConst(*classMetadataType, *newconst, fieldID++, hashIndex); // @class loader: Use maximum value unsigned(-1) as non-initialized flag. - mirBuilder.AddIntFieldConst(classMetadataType, newconst, fieldID++, static_cast(-1)); + mirBuilder.AddIntFieldConst(*classMetadataType, *newconst, fieldID++, static_cast(-1)); // @objsize: Fill this in the CG. - mirBuilder.AddIntFieldConst(classMetadataType, newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(*classMetadataType, *newconst, fieldID++, 0); #ifdef USE_32BIT_REF // @flag // Array class and primitive class is not generated by compiler. uint32 flag = klass->GetFlag(kClassHasFinalizer | CLASS_REFERENCE | kClassFinalizerreferenceSentinel); flag = isAnonymous ? (flag | kClassIsanonymousclass) : flag; - mirBuilder.AddIntFieldConst(classMetadataType, newconst, fieldID++, flag); + mirBuilder.AddIntFieldConst(*classMetadataType, *newconst, fieldID++, flag); // @numofsuperclasses CHECK_FATAL(superClassSize <= 0xffff, "Error:the size of superClass is too big"); - mirBuilder.AddIntFieldConst(classMetadataType, newconst, fieldID++, superClassSize); + mirBuilder.AddIntFieldConst(*classMetadataType, *newconst, fieldID++, superClassSize); #endif // USE_32BIT_REF // @itab GStrIdx strIdx = GlobalTables::GetStrTable().GetStrIdxFromName(ITAB_PREFIX_STR + klass->GetKlassName()); if (strIdx != 0) { MIRSymbol *itableSymbolType = GlobalTables::GetGsymTable().GetSymbolFromStrIdx(strIdx); - mirBuilder.AddAddrofFieldConst(classMetadataType, newconst, fieldID++, itableSymbolType); + mirBuilder.AddAddrofFieldConst(*classMetadataType, *newconst, fieldID++, *itableSymbolType); } else { - mirBuilder.AddIntFieldConst(classMetadataType, newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(*classMetadataType, *newconst, fieldID++, 0); } // @vtab strIdx = GlobalTables::GetStrTable().GetStrIdxFromName(VTAB_PREFIX_STR + klass->GetKlassName()); if (strIdx != 0) { MIRSymbol *vtableSymbolType = GlobalTables::GetGsymTable().GetSymbolFromStrIdx(strIdx); - mirBuilder.AddAddrofFieldConst(classMetadataType, newconst, fieldID++, vtableSymbolType); + mirBuilder.AddAddrofFieldConst(*classMetadataType, *newconst, fieldID++, *vtableSymbolType); } else { - mirBuilder.AddIntFieldConst(classMetadataType, newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(*classMetadataType, *newconst, fieldID++, 0); } // @gctib MIRSymbol *gctibSt = GetOrCreateSymbol(GCTIB_PREFIX_STR + klass->GetKlassName(), @@ -1290,9 +1290,9 @@ void ReflectionAnalysis::GenClassMetaData(Klass *klass) { // Direct access to gctib is only possible within a .so, for most classes. gctibSt->SetStorageClass(kScFstatic); } - mirBuilder.AddAddrofFieldConst(classMetadataType, newconst, fieldID++, gctibSt); + mirBuilder.AddAddrofFieldConst(*classMetadataType, *newconst, fieldID++, *gctibSt); // @classinfo ro. - mirBuilder.AddAddrofFieldConst(classMetadataType, newconst, fieldID++, classMetadataROSymbolType); + mirBuilder.AddAddrofFieldConst(*classMetadataType, *newconst, fieldID++, *classMetadataROSymbolType); // Set default value to class initialization state. // If this class and its parents do not have clinit, we do not clinit-check for this class. if (klassh->NeedClinitCheckRecursively(klass)) { @@ -1300,12 +1300,12 @@ void ReflectionAnalysis::GenClassMetaData(Klass *klass) { MIRSymbol *classInitProtectRegion = mirBuilder.GetOrCreateSymbol( ptrType->GetTypeIndex(), kClassInitProtectRegionStr, kStVar, kScExtern, nullptr, kScopeGlobal, true); classInitProtectRegion->SetAttr(ATTR_extern); - mirBuilder.AddAddrofFieldConst(classMetadataType, newconst, fieldID++, classInitProtectRegion); + mirBuilder.AddAddrofFieldConst(*classMetadataType, *newconst, fieldID++, *classInitProtectRegion); } else { MIRType *clinitState = GlobalTables::GetTypeTable().GetUInt64(); // The class initialization state is modified to classStateInitialized. MIRSymbol *classInfo = mirBuilder.GetOrCreateGlobalDecl(kClassStateInitializedStr, clinitState); - mirBuilder.AddAddrofFieldConst(classMetadataType, newconst, fieldID++, classInfo); + mirBuilder.AddAddrofFieldConst(*classMetadataType, *newconst, fieldID++, *classInfo); } // Finally generate class metadata here. MIRSymbol *classSt = GetOrCreateSymbol(CLASSINFO_PREFIX_STR + klass->GetKlassName(), classMetadataTyIdx, true); @@ -1313,13 +1313,13 @@ void ReflectionAnalysis::GenClassMetaData(Klass *klass) { classTab.push_back(classSt); } -void ReflectionAnalysis::SetAnnoFieldConst(const MIRStructType *metadataRoType, MIRAggConst *newconst, uint32 fieldid, +void ReflectionAnalysis::SetAnnoFieldConst(const MIRStructType *metadataRoType, MIRAggConst &newconst, uint32 fieldid, std::map &idxNumMap, const std::string &annoArr) { size_t annoNum = idxNumMap.size(); if (annoNum == 0) { std::string subStr = "0!0"; uint32 signatureIdx = FindOrInsertReflectString(subStr); - mirBuilder.AddIntFieldConst(metadataRoType, newconst, fieldid, signatureIdx); + mirBuilder.AddIntFieldConst(*metadataRoType, newconst, fieldid, signatureIdx); } else { std::string subStr = std::to_string(annoNum); subStr += "!"; @@ -1329,7 +1329,7 @@ void ReflectionAnalysis::SetAnnoFieldConst(const MIRStructType *metadataRoType, }); subStr += annoArr; uint32 signatureIdx = GetDeflateStringIdx(subStr); - mirBuilder.AddIntFieldConst(metadataRoType, newconst, fieldid, signatureIdx); + mirBuilder.AddIntFieldConst(*metadataRoType, newconst, fieldid, signatureIdx); } } diff --git a/src/mpl2mpl/src/vtable_impl.cpp b/src/mpl2mpl/src/vtable_impl.cpp index c3a2793bf7a58094b27071f4358b85d7f6dcd9ec..0695e03689f2f16f7f962d92c76882c834e46b3b 100644 --- a/src/mpl2mpl/src/vtable_impl.cpp +++ b/src/mpl2mpl/src/vtable_impl.cpp @@ -59,7 +59,7 @@ void VtableImpl::ProcessFunc(MIRFunction *func) { icallNode->GetNopnd().resize(callNode->GetNopndSize()); icallNode->SetNumOpnds(icallNode->GetNopndSize()); for (size_t i = 0; i < callNode->GetNopndSize(); i++) { - icallNode->SetOpnd(callNode->GetNopndAt(i)->CloneTree(builder->GetCurrentFuncCodeMpAllocator()), i); + icallNode->SetOpnd(callNode->GetNopndAt(i)->CloneTree(mirModule->GetCurFuncCodeMPAllocator()), i); } currFunc->GetBody()->ReplaceStmt1WithStmt2(stmt, icallNode); stmt = icallNode;