@@ -14402,7 +14402,8 @@ GlobOpt::OptArraySrc(IR::Instr * *const instrRef)
1440214402 currentBlock->next,
1440314403 hoistBlock,
1440414404 hoistInfo.IndexSym(),
14405- hoistInfo.IndexValueNumber());
14405+ hoistInfo.IndexValueNumber(),
14406+ true);
1440614407 it.IsValid();
1440714408 it.MoveNext())
1440814409 {
@@ -14670,7 +14671,7 @@ GlobOpt::OptArraySrc(IR::Instr * *const instrRef)
1467014671 Assert(!hoistInfo.Loop() || hoistBlock != currentBlock);
1467114672 if(hoistBlock != currentBlock)
1467214673 {
14673- for(InvariantBlockBackwardIterator it(this, currentBlock->next, hoistBlock, nullptr);
14674+ for(InvariantBlockBackwardIterator it(this, currentBlock->next, hoistBlock, nullptr, InvalidValueNumber, true );
1467414675 it.IsValid();
1467514676 it.MoveNext())
1467614677 {
@@ -17116,12 +17117,15 @@ InvariantBlockBackwardIterator::InvariantBlockBackwardIterator(
1711617117 BasicBlock *const exclusiveBeginBlock,
1711717118 BasicBlock *const inclusiveEndBlock,
1711817119 StackSym *const invariantSym,
17119- const ValueNumber invariantSymValueNumber)
17120+ const ValueNumber invariantSymValueNumber,
17121+ bool followFlow)
1712017122 : globOpt(globOpt),
1712117123 exclusiveEndBlock(inclusiveEndBlock->prev),
1712217124 invariantSym(invariantSym),
1712317125 invariantSymValueNumber(invariantSymValueNumber),
17124- block(exclusiveBeginBlock)
17126+ block(exclusiveBeginBlock),
17127+ blockBV(globOpt->tempAlloc),
17128+ followFlow(followFlow)
1712517129#if DBG
1712617130 ,
1712717131 inclusiveEndBlock(inclusiveEndBlock)
@@ -17159,6 +17163,11 @@ InvariantBlockBackwardIterator::MoveNext()
1715917163 break;
1716017164 }
1716117165
17166+ if (!this->UpdatePredBlockBV())
17167+ {
17168+ continue;
17169+ }
17170+
1716217171 if(block->isDeleted)
1716317172 {
1716417173 continue;
@@ -17186,6 +17195,28 @@ InvariantBlockBackwardIterator::MoveNext()
1718617195 }
1718717196}
1718817197
17198+ bool
17199+ InvariantBlockBackwardIterator::UpdatePredBlockBV()
17200+ {
17201+ if (!this->followFlow)
17202+ {
17203+ return true;
17204+ }
17205+
17206+ // Track blocks we've visited to ensure that we only iterate over predecessor blocks
17207+ if (!this->blockBV.IsEmpty() && !this->blockBV.Test(this->block->GetBlockNum()))
17208+ {
17209+ return false;
17210+ }
17211+
17212+ FOREACH_SLISTBASECOUNTED_ENTRY(FlowEdge*, edge, this->block->GetPredList())
17213+ {
17214+ this->blockBV.Set(edge->GetPred()->GetBlockNum());
17215+ } NEXT_SLISTBASECOUNTED_ENTRY;
17216+
17217+ return true;
17218+ }
17219+
1718917220BasicBlock *
1719017221InvariantBlockBackwardIterator::Block() const
1719117222{
0 commit comments