Skip to content

Commit 6ff9466

Browse files
committed
[MERGE #3264 @Cellule] Extend return register lifetime
Merge pull request #3264 from Cellule:users/micfer/ret Keep the `Ret` instruction to extend the lifetime of the return register(s) then remove it in FinalLower. Fixing a bug in wasm int64 returns on x86 where edx is reused to reload a spilled value for eax. Fixes [OSG 12195427](https://microsoft.visualstudio.com/os/_workitems?id=12195427)
2 parents 106bb9d + bf376ec commit 6ff9466

File tree

5 files changed

+25
-9
lines changed

5 files changed

+25
-9
lines changed

lib/Backend/Lower.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23589,6 +23589,7 @@ Lowerer::ValidOpcodeAfterLower(IR::Instr* instr, Func * func)
2358923589
}
2359023590
switch (opcode)
2359123591
{
23592+
case Js::OpCode::Ret:
2359223593
case Js::OpCode::Label:
2359323594
case Js::OpCode::StatementBoundary:
2359423595
case Js::OpCode::DeletedNonHelperBranch:

lib/Backend/LowerMDShared.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -863,8 +863,10 @@ LowererMD::LowerRet(IR::Instr * retInstr)
863863
retInstr->SetSrc1(lowOpnd);
864864

865865
// Mov high bits to edx
866-
IR::RegOpnd* regEdx = IR::RegOpnd::New(nullptr, RegEDX, regType, this->m_func);
866+
IR::RegOpnd* regEdx = IR::RegOpnd::New(regType, this->m_func);
867+
regEdx->SetReg(RegEDX);
867868
Lowerer::InsertMove(regEdx, highOpnd, retInstr);
869+
retInstr->SetSrc2(regEdx);
868870
}
869871
#endif
870872
break;
@@ -910,17 +912,19 @@ LowererMD::LowerRet(IR::Instr * retInstr)
910912
Assert(UNREACHED);
911913
}
912914

913-
retReg = IR::RegOpnd::New(nullptr, lowererMDArch.GetRegReturnAsmJs(regType), regType, m_func);
915+
retReg = IR::RegOpnd::New(regType, m_func);
916+
retReg->SetReg(lowererMDArch.GetRegReturnAsmJs(regType));
914917
}
915918
else
916919
#endif
917920
{
918-
retReg = IR::RegOpnd::New(nullptr, lowererMDArch.GetRegReturn(TyMachReg), TyMachReg, m_func);
921+
retReg = IR::RegOpnd::New(TyMachReg, m_func);
922+
retReg->SetReg(lowererMDArch.GetRegReturn(TyMachReg));
919923
}
920924

921-
retInstr->SetDst(retReg);
922-
923-
return this->ChangeToAssign(retInstr);
925+
Lowerer::InsertMove(retReg, retInstr->UnlinkSrc1(), retInstr);
926+
retInstr->SetSrc1(retReg);
927+
return retInstr;
924928
}
925929

926930
///----------------------------------------------------------------------------

lib/Backend/amd64/LowererMDArch.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3030,6 +3030,9 @@ LowererMDArch::FinalLower()
30303030
{
30313031
switch (instr->m_opcode)
30323032
{
3033+
case Js::OpCode::Ret:
3034+
instr->Remove();
3035+
break;
30333036
case Js::OpCode::LdArgSize:
30343037
Assert(this->m_func->HasTry());
30353038
instr->m_opcode = Js::OpCode::MOV;

lib/Backend/arm/LowerMD.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2424,11 +2424,13 @@ LowererMD::CreateAssign(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsertPt,
24242424
IR::Instr *
24252425
LowererMD::LowerRet(IR::Instr * retInstr)
24262426
{
2427-
IR::RegOpnd *retReg = IR::RegOpnd::New(nullptr, RETURN_REG, TyMachReg, m_func);
2427+
IR::RegOpnd *retReg = IR::RegOpnd::New(TyMachReg, m_func);
2428+
retReg->SetReg(RETURN_REG);
2429+
Lowerer::InsertMove(retReg, retInstr->UnlinkSrc1(), retInstr);
24282430

2429-
retInstr->SetDst(retReg);
2431+
retInstr->SetSrc1(retReg);
24302432

2431-
return this->ChangeToAssign(retInstr);
2433+
return retInstr;
24322434
}
24332435

24342436

@@ -8675,6 +8677,9 @@ LowererMD::FinalLower()
86758677

86768678
switch (instr->m_opcode)
86778679
{
8680+
case Js::OpCode::Ret:
8681+
instr->Remove();
8682+
break;
86788683
case Js::OpCode::Leave:
86798684
Assert(this->m_func->DoOptimizeTry() && !this->m_func->IsLoopBodyInTry());
86808685
instrPrev = this->LowerLeave(instr, instr->AsBranchInstr()->GetTarget(), true /*fromFinalLower*/);

lib/Backend/i386/LowererMDArch.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3970,6 +3970,9 @@ LowererMDArch::FinalLower()
39703970
{
39713971
switch (instr->m_opcode)
39723972
{
3973+
case Js::OpCode::Ret:
3974+
instr->Remove();
3975+
break;
39733976
case Js::OpCode::Leave:
39743977
Assert(this->m_func->DoOptimizeTry() && !this->m_func->IsLoopBodyInTry());
39753978
this->lowererMD->LowerLeave(instr, instr->AsBranchInstr()->GetTarget(), true /*fromFinalLower*/);

0 commit comments

Comments
 (0)