1
0
Fork 0
mirror of https://github.com/VSadov/Satori.git synced 2025-06-09 17:44:48 +09:00

Don't use ZR as target in LSE atomics (#105854)

* Don't use ZR as target in LSE atomics

* Update codegenarm64.cpp

* Update lsraarm64.cpp

* Update lsraarm64.cpp
This commit is contained in:
Egor Bogatov 2024-08-05 18:09:40 +02:00 committed by GitHub
parent ab03e0ffc0
commit 53a500edf1
Signed by: github
GPG key ID: B5690EEEBB952194
2 changed files with 16 additions and 8 deletions

View file

@ -3878,19 +3878,21 @@ void CodeGen::genLockedInstructions(GenTreeOp* treeNode)
{
assert(!data->isContainedIntOrIImmed());
// These instructions change semantics when targetReg is ZR (the memory ordering becomes weaker).
// See atomicBarrierDroppedOnZero in LLVM
assert((targetReg != REG_NA) && (targetReg != REG_ZR));
switch (treeNode->gtOper)
{
case GT_XORR:
GetEmitter()->emitIns_R_R_R(INS_ldsetal, dataSize, dataReg, (targetReg == REG_NA) ? REG_ZR : targetReg,
addrReg);
GetEmitter()->emitIns_R_R_R(INS_ldsetal, dataSize, dataReg, targetReg, addrReg);
break;
case GT_XAND:
{
// Grab a temp reg to perform `MVN` for dataReg first.
regNumber tempReg = internalRegisters.GetSingle(treeNode);
GetEmitter()->emitIns_R_R(INS_mvn, dataSize, tempReg, dataReg);
GetEmitter()->emitIns_R_R_R(INS_ldclral, dataSize, tempReg, (targetReg == REG_NA) ? REG_ZR : targetReg,
addrReg);
GetEmitter()->emitIns_R_R_R(INS_ldclral, dataSize, tempReg, targetReg, addrReg);
break;
}
case GT_XCHG:
@ -3908,8 +3910,7 @@ void CodeGen::genLockedInstructions(GenTreeOp* treeNode)
break;
}
case GT_XADD:
GetEmitter()->emitIns_R_R_R(INS_ldaddal, dataSize, dataReg, (targetReg == REG_NA) ? REG_ZR : targetReg,
addrReg);
GetEmitter()->emitIns_R_R_R(INS_ldaddal, dataSize, dataReg, targetReg, addrReg);
break;
default:
assert(!"Unexpected treeNode->gtOper");

View file

@ -1086,10 +1086,17 @@ int LinearScan::BuildNode(GenTree* tree)
}
setInternalRegsDelayFree = true;
}
buildInternalRegisterUses();
if (dstCount == 1)
{
BuildDef(tree);
}
}
buildInternalRegisterUses();
if (dstCount == 1)
else
{
// We always need the target reg for LSE, even if
// return value is unused, see genLockedInstructions
buildInternalRegisterUses();
BuildDef(tree);
}
}