diff options
author | Bruce Forstall <brucefo@microsoft.com> | 2016-03-24 09:24:38 -0700 |
---|---|---|
committer | Bruce Forstall <brucefo@microsoft.com> | 2016-03-24 09:24:38 -0700 |
commit | 2dafeec08a02c86fc016f9fd803835fa60332347 (patch) | |
tree | 1ab5410085fa6a3b4c8f9eb8f0f8ff34c140add2 /src/jit/lsra.h | |
parent | efa8f178e631be51bdee5204da230544ebb91da3 (diff) | |
parent | 8e94c48f4e51e2eae5777e3686e6b21160410765 (diff) | |
download | coreclr-2dafeec08a02c86fc016f9fd803835fa60332347.tar.gz coreclr-2dafeec08a02c86fc016f9fd803835fa60332347.tar.bz2 coreclr-2dafeec08a02c86fc016f9fd803835fa60332347.zip |
Merge pull request #3682 from mikedn/emplace
Avoid Interval and RefPosition unnecessary initialization and copying
Diffstat (limited to 'src/jit/lsra.h')
-rw-r--r-- | src/jit/lsra.h | 51 |
1 files changed, 45 insertions, 6 deletions
diff --git a/src/jit/lsra.h b/src/jit/lsra.h index 27939d7422..9f3f2b3697 100644 --- a/src/jit/lsra.h +++ b/src/jit/lsra.h @@ -720,7 +720,7 @@ private: } RegRecord * getRegisterRecord(regNumber regNum); - RefPosition * newRefPositionRaw(); + RefPosition * newRefPositionRaw(LsraLocation nodeLocation, GenTree* treeNode, RefType refType); RefPosition * newRefPosition(Interval * theInterval, LsraLocation theLocation, RefType theRefType, GenTree * theTreeNode, @@ -1050,11 +1050,28 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX class Interval : public Referenceable { public: - // Initialize the interval - void init() + Interval(RegisterType registerType, regMaskTP registerPreferences) + : registerPreferences(registerPreferences) + , relatedInterval(nullptr) + , assignedReg(nullptr) + , registerType(registerType) + , isLocalVar(false) + , isSplit(false) + , isSpilled(false) + , isInternal(false) + , isStructField(false) + , isPromotedStruct(false) + , hasConflictingDefUse(false) + , hasNonCommutativeRMWDef(false) + , isSpecialPutArg(false) + , preferCalleeSave(false) + , isConstant(false) + , physReg(REG_COUNT) +#ifdef DEBUG + , intervalIndex(0) +#endif + , varNum(0) { - memset(this, 0, sizeof(Interval)); - physReg = REG_COUNT; } #ifdef DEBUG @@ -1248,8 +1265,30 @@ public: class RefPosition { - public: + RefPosition(unsigned int bbNum, LsraLocation nodeLocation, GenTree* treeNode, RefType refType) + : referent(nullptr) + , nextRefPosition(nullptr) + , treeNode(treeNode) + , bbNum(bbNum) + , nodeLocation(nodeLocation) + , registerAssignment(RBM_NONE) + , refType(refType) + , lastUse(false) + , reload(false) + , spillAfter(false) + , copyReg(false) + , moveReg(false) + , isPhysRegRef(false) + , isFixedRegRef(false) + , isLocalDefUse(false) + , delayRegFree(false) + , outOfOrder(false) +#ifdef DEBUG + , rpNum(0) +#endif + { + } // A RefPosition refers to either an Interval or a RegRecord. 'referent' points to one // of these types. If it refers to a RegRecord, then 'isPhysRegRef' is true. If it |