@@ -16452,14 +16452,16 @@ void
16452
16452
GlobOpt::OptHoistUpdateValueType(
16453
16453
Loop* loop,
16454
16454
IR::Instr* instr,
16455
- IR::Opnd* srcOpnd ,
16455
+ IR::Opnd** srcOpndPtr /* All code paths that change src, should update srcOpndPtr*/ ,
16456
16456
Value* opndVal)
16457
16457
{
16458
- if (opndVal == nullptr || instr->m_opcode == Js::OpCode::FromVar)
16458
+ if (opndVal == nullptr || instr->m_opcode == Js::OpCode::FromVar || srcOpndPtr == nullptr || *srcOpndPtr == nullptr )
16459
16459
{
16460
16460
return;
16461
16461
}
16462
16462
16463
+ IR::Opnd* srcOpnd = *srcOpndPtr;
16464
+
16463
16465
Sym* opndSym = srcOpnd->GetSym();;
16464
16466
16465
16467
if (opndSym)
@@ -16472,8 +16474,11 @@ GlobOpt::OptHoistUpdateValueType(
16472
16474
16473
16475
if (srcOpnd->GetValueType() != opndValueTypeInLandingPad)
16474
16476
{
16477
+ srcOpnd->SetValueType(opndValueTypeInLandingPad);
16478
+
16475
16479
if (instr->m_opcode == Js::OpCode::SetConcatStrMultiItemBE)
16476
16480
{
16481
+ Assert(!opndSym->IsPropertySym());
16477
16482
Assert(!opndValueTypeInLandingPad.IsString());
16478
16483
Assert(instr->GetDst());
16479
16484
@@ -16484,6 +16489,9 @@ GlobOpt::OptHoistUpdateValueType(
16484
16489
IR::Instr::New(Js::OpCode::Conv_PrimStr, strOpnd, srcOpnd->Use(instr->m_func), instr->m_func);
16485
16490
instr->ReplaceSrc(srcOpnd, strOpnd);
16486
16491
16492
+ // Replace above will free srcOpnd, so reassign it
16493
+ *srcOpndPtr = srcOpnd = reinterpret_cast<IR::Opnd *>(strOpnd);
16494
+
16487
16495
if (loop->bailOutInfo->bailOutInstr)
16488
16496
{
16489
16497
loop->bailOutInfo->bailOutInstr->InsertBefore(convPrimStrInstr);
@@ -16492,9 +16500,10 @@ GlobOpt::OptHoistUpdateValueType(
16492
16500
{
16493
16501
landingPad->InsertAfter(convPrimStrInstr);
16494
16502
}
16495
- }
16496
16503
16497
- srcOpnd->SetValueType(opndValueTypeInLandingPad);
16504
+ // If we came here opndSym can't be PropertySym
16505
+ return;
16506
+ }
16498
16507
}
16499
16508
16500
16509
@@ -16528,7 +16537,7 @@ GlobOpt::OptHoistInvariant(
16528
16537
if (src1)
16529
16538
{
16530
16539
// We are hoisting this instruction possibly past other uses, which might invalidate the last use info. Clear it.
16531
- OptHoistUpdateValueType(loop, instr, src1, src1Val);
16540
+ OptHoistUpdateValueType(loop, instr, & src1, src1Val);
16532
16541
16533
16542
if (src1->IsRegOpnd())
16534
16543
{
@@ -16538,7 +16547,7 @@ GlobOpt::OptHoistInvariant(
16538
16547
IR::Opnd* src2 = instr->GetSrc2();
16539
16548
if (src2)
16540
16549
{
16541
- OptHoistUpdateValueType(loop, instr, src2, src2Val);
16550
+ OptHoistUpdateValueType(loop, instr, & src2, src2Val);
16542
16551
16543
16552
if (src2->IsRegOpnd())
16544
16553
{
0 commit comments