summaryrefslogtreecommitdiff
path: root/src/jit/lsra.h
diff options
context:
space:
mode:
authorBruce Forstall <brucefo@microsoft.com>2016-03-24 09:24:38 -0700
committerBruce Forstall <brucefo@microsoft.com>2016-03-24 09:24:38 -0700
commit2dafeec08a02c86fc016f9fd803835fa60332347 (patch)
tree1ab5410085fa6a3b4c8f9eb8f0f8ff34c140add2 /src/jit/lsra.h
parentefa8f178e631be51bdee5204da230544ebb91da3 (diff)
parent8e94c48f4e51e2eae5777e3686e6b21160410765 (diff)
downloadcoreclr-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.h51
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