@@ -3674,30 +3674,7 @@ void Compiler::optPerformHoistExpr(GenTree* origExpr, BasicBlock* exprBb, FlowGr
36743674
36753675 preheader->CopyFlags (exprBb, BBF_COPY_PROPAGATE);
36763676
3677- Statement* hoistStmt = gtNewStmt (hoist);
3678-
3679- // Simply append the statement at the end of the preHead's list.
3680- Statement* firstStmt = preheader->firstStmt ();
3681- if (firstStmt != nullptr )
3682- {
3683- /* append after last statement */
3684-
3685- Statement* lastStmt = preheader->lastStmt ();
3686- assert (lastStmt->GetNextStmt () == nullptr );
3687-
3688- lastStmt->SetNextStmt (hoistStmt);
3689- hoistStmt->SetPrevStmt (lastStmt);
3690- firstStmt->SetPrevStmt (hoistStmt);
3691- }
3692- else
3693- {
3694- /* Empty pre-header - store the single statement in the block */
3695-
3696- preheader->bbStmtList = hoistStmt;
3697- hoistStmt->SetPrevStmt (hoistStmt);
3698- }
3699-
3700- hoistStmt->SetNextStmt (nullptr );
3677+ fgInsertStmtAtEnd (preheader, fgNewStmtFromTree (hoist));
37013678
37023679#ifdef DEBUG
37033680 if (verbose)
@@ -3708,12 +3685,6 @@ void Compiler::optPerformHoistExpr(GenTree* origExpr, BasicBlock* exprBb, FlowGr
37083685 }
37093686#endif
37103687
3711- if (fgNodeThreading == NodeThreading::AllTrees)
3712- {
3713- gtSetStmtInfo (hoistStmt);
3714- fgSetStmtSeq (hoistStmt);
3715- }
3716-
37173688#ifdef DEBUG
37183689 if (m_nodeTestData != nullptr )
37193690 {
@@ -4304,22 +4275,41 @@ void Compiler::optRecordLoopMemoryDependence(GenTree* tree, BasicBlock* block, V
43044275}
43054276
43064277// ------------------------------------------------------------------------
4307- // optCopyLoopMemoryDependence: record that tree's loop memory dependence
4278+ // optCopyLoopMemoryDependence: Recursively record that tree's loop memory dependence
43084279// is the same as some other tree.
43094280//
43104281// Arguments:
43114282// fromTree -- tree to copy dependence from
43124283// toTree -- tree in question
43134284//
4285+ // Remarks:
4286+ // This requires 'toTree' to be in its own statement
4287+ //
43144288void Compiler::optCopyLoopMemoryDependence (GenTree* fromTree, GenTree* toTree)
43154289{
4290+ assert (fromTree->OperGet () == toTree->OperGet ());
4291+
43164292 NodeToLoopMemoryBlockMap* const map = GetNodeToLoopMemoryBlockMap ();
43174293 BasicBlock* mapBlock = nullptr ;
43184294
43194295 if (map->Lookup (fromTree, &mapBlock))
43204296 {
43214297 map->Set (toTree, mapBlock);
43224298 }
4299+
4300+ GenTreeOperandIterator fromIterCur = fromTree->OperandsBegin ();
4301+ GenTreeOperandIterator fromIterEnd = fromTree->OperandsEnd ();
4302+ GenTreeOperandIterator toIterCur = toTree->OperandsBegin ();
4303+ GenTreeOperandIterator toIterEnd = toTree->OperandsEnd ();
4304+
4305+ while (fromIterCur != fromIterEnd)
4306+ {
4307+ optCopyLoopMemoryDependence (*fromIterCur, *toIterCur);
4308+ ++fromIterCur;
4309+ ++toIterCur;
4310+ }
4311+
4312+ assert (toIterCur == toIterEnd);
43234313}
43244314
43254315// ------------------------------------------------------------------------
0 commit comments