GenTreePtr argNode = list->Current();
- fgArgTabEntryPtr curArgTabEntry = compiler->gtArgEntryByNode(call, argNode->gtSkipReloadOrCopy());
+ fgArgTabEntryPtr curArgTabEntry = compiler->gtArgEntryByNode(call, argNode);
assert(curArgTabEntry);
+ // GT_RELOAD/GT_COPY use the child node
+ argNode = argNode->gtSkipReloadOrCopy();
+
if (curArgTabEntry->regNum == REG_STK)
continue;
assert(removed);
assert(!operandDefs.IsEmpty());
+#ifdef _TARGET_ARM_
+ regMaskTP currCandidates = RBM_NONE;
+#endif // _TARGET_ARM_
+
LocationInfoListNode* const operandDefsEnd = operandDefs.End();
for (LocationInfoListNode* operandDefsIterator = operandDefs.Begin(); operandDefsIterator != operandDefsEnd;
operandDefsIterator = operandDefsIterator->Next())
#endif // DEBUG
regMaskTP candidates = getUseCandidates(useNode);
+#ifdef _TARGET_ARM_
+ // If oper is GT_PUTARG_SPLIT, set bits in useCandidates must be in sequential order.
+ if (useNode->OperIsPutArgSplit())
+ {
+ // get i-th candidate
+ candidates = genFindLowestReg(candidates & ~currCandidates);
+ currCandidates |= candidates;
+ }
#ifdef ARM_SOFTFP
// If oper is GT_PUTARG_REG, set bits in useCandidates must be in sequential order.
if (useNode->OperIsMultiRegOp())
candidates = candidate;
}
#endif // ARM_SOFTFP
+#endif // _TARGET_ARM_
+
assert((candidates & allRegs(i->registerType)) != 0);
// For non-localVar uses we record nothing, as nothing needs to be written back to the tree.
argMask |= genRegMask((regNumber)((unsigned)argReg + i));
}
argNode->gtLsraInfo.setDstCandidates(m_lsra, argMask);
+ argNode->gtLsraInfo.setSrcCandidates(m_lsra, argMask);
if (putArgChild->OperGet() == GT_FIELD_LIST)
{