@@ -14544,8 +14544,10 @@ void Compiler::fgExpandQmarkStmt(BasicBlock* block, Statement* stmt)
14544
14544
// if they are going to be cleared by fgSplitBlockAfterStatement(). We currently only do this only
14545
14545
// for the GC safe point bit, the logic being that if 'block' was marked gcsafe, then surely
14546
14546
// remainderBlock will still be GC safe.
14547
- BasicBlockFlags propagateFlags = block->bbFlags & BBF_GC_SAFE_POINT;
14548
- BasicBlock* remainderBlock = fgSplitBlockAfterStatement(block, stmt);
14547
+ BasicBlockFlags propagateFlagsToRemainder = block->bbFlags & BBF_GC_SAFE_POINT;
14548
+ // Conservatively propagate BBF_COPY_PROPAGATE flags to all blocks
14549
+ BasicBlockFlags propagateFlagsToAll = block->bbFlags & BBF_COPY_PROPAGATE;
14550
+ BasicBlock* remainderBlock = fgSplitBlockAfterStatement(block, stmt);
14549
14551
fgRemoveRefPred(remainderBlock, block); // We're going to put more blocks between block and remainderBlock.
14550
14552
14551
14553
BasicBlock* condBlock = fgNewBBafter(BBJ_COND, block, true);
@@ -14561,14 +14563,17 @@ void Compiler::fgExpandQmarkStmt(BasicBlock* block, Statement* stmt)
14561
14563
elseBlock->bbFlags |= BBF_IMPORTED;
14562
14564
}
14563
14565
14564
- remainderBlock->bbFlags |= propagateFlags ;
14566
+ remainderBlock->bbFlags |= (propagateFlagsToRemainder | propagateFlagsToAll) ;
14565
14567
14566
14568
condBlock->inheritWeight(block);
14567
14569
14568
14570
fgAddRefPred(condBlock, block);
14569
14571
fgAddRefPred(elseBlock, condBlock);
14570
14572
fgAddRefPred(remainderBlock, elseBlock);
14571
14573
14574
+ condBlock->bbFlags |= propagateFlagsToAll;
14575
+ elseBlock->bbFlags |= propagateFlagsToAll;
14576
+
14572
14577
BasicBlock* thenBlock = nullptr;
14573
14578
if (hasTrueExpr && hasFalseExpr)
14574
14579
{
@@ -14585,6 +14590,7 @@ void Compiler::fgExpandQmarkStmt(BasicBlock* block, Statement* stmt)
14585
14590
14586
14591
thenBlock = fgNewBBafter(BBJ_ALWAYS, condBlock, true);
14587
14592
thenBlock->bbJumpDest = remainderBlock;
14593
+ thenBlock->bbFlags |= propagateFlagsToAll;
14588
14594
if ((block->bbFlags & BBF_INTERNAL) == 0)
14589
14595
{
14590
14596
thenBlock->bbFlags &= ~BBF_INTERNAL;
0 commit comments