@@ -14544,8 +14544,10 @@ void Compiler::fgExpandQmarkStmt(BasicBlock* block, Statement* stmt)
1454414544 // if they are going to be cleared by fgSplitBlockAfterStatement(). We currently only do this only
1454514545 // for the GC safe point bit, the logic being that if 'block' was marked gcsafe, then surely
1454614546 // 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);
1454914551 fgRemoveRefPred(remainderBlock, block); // We're going to put more blocks between block and remainderBlock.
1455014552
1455114553 BasicBlock* condBlock = fgNewBBafter(BBJ_COND, block, true);
@@ -14561,14 +14563,17 @@ void Compiler::fgExpandQmarkStmt(BasicBlock* block, Statement* stmt)
1456114563 elseBlock->bbFlags |= BBF_IMPORTED;
1456214564 }
1456314565
14564- remainderBlock->bbFlags |= propagateFlags ;
14566+ remainderBlock->bbFlags |= (propagateFlagsToRemainder | propagateFlagsToAll) ;
1456514567
1456614568 condBlock->inheritWeight(block);
1456714569
1456814570 fgAddRefPred(condBlock, block);
1456914571 fgAddRefPred(elseBlock, condBlock);
1457014572 fgAddRefPred(remainderBlock, elseBlock);
1457114573
14574+ condBlock->bbFlags |= propagateFlagsToAll;
14575+ elseBlock->bbFlags |= propagateFlagsToAll;
14576+
1457214577 BasicBlock* thenBlock = nullptr;
1457314578 if (hasTrueExpr && hasFalseExpr)
1457414579 {
@@ -14585,6 +14590,7 @@ void Compiler::fgExpandQmarkStmt(BasicBlock* block, Statement* stmt)
1458514590
1458614591 thenBlock = fgNewBBafter(BBJ_ALWAYS, condBlock, true);
1458714592 thenBlock->bbJumpDest = remainderBlock;
14593+ thenBlock->bbFlags |= propagateFlagsToAll;
1458814594 if ((block->bbFlags & BBF_INTERNAL) == 0)
1458914595 {
1459014596 thenBlock->bbFlags &= ~BBF_INTERNAL;
0 commit comments