Skip to content

Commit 9516741

Browse files
authored
Merge pull request #876 from jacob-baines/opt_inf_loop
Fix infinite loops in copy propagation optimizer
2 parents fab0eb8 + a6cd165 commit 9516741

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

src/llvmir2hll/optimizer/optimizers/copy_propagation_optimizer.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -841,14 +841,14 @@ void CopyPropagationOptimizer::handleCaseInductionVariable(
841841

842842
// Other value is undefined before the other definition.
843843
bool ok = false;
844-
auto prev = commonOtherDef->getUniquePredecessor();
845-
while (prev) {
844+
std::set<ShPtr<Statement>> visited;
845+
for (auto prev = commonOtherDef->getUniquePredecessor(); prev && visited.insert(prev).second;
846+
prev = prev->getUniquePredecessor()) {
846847
auto vds = cast<VarDefStmt>(prev);
847848
if (vds && vds->getVar() == otherValue && vds->getInitializer() == nullptr) {
848849
ok = true;
849850
break;
850851
}
851-
prev = prev->getUniquePredecessor();
852852
}
853853
// Other value may be in another BB.
854854
// In such a case, check for very specific and restrictive pattern.
@@ -1043,8 +1043,9 @@ void CopyPropagationOptimizer::handleCaseInductionVariable2(
10431043
// y is undefined before xZero.
10441044
// y = undef
10451045
bool ok = false;
1046-
auto prev = xZero->getUniquePredecessor();
1047-
while (prev) {
1046+
std::set<ShPtr<Statement>> visited;
1047+
for (auto prev = xZero->getUniquePredecessor(); prev && visited.insert(prev).second;
1048+
prev = prev->getUniquePredecessor()) {
10481049
auto vds = cast<VarDefStmt>(prev);
10491050
if (vds && vds->getVar() == y) {
10501051
ok = (vds->getInitializer() == nullptr);
@@ -1054,7 +1055,6 @@ void CopyPropagationOptimizer::handleCaseInductionVariable2(
10541055
if (as && as->getLhs() == y) {
10551056
break;
10561057
}
1057-
prev = prev->getUniquePredecessor();
10581058
}
10591059
if (!ok) {
10601060
LOG << "\t" << "end 10" << std::endl;

0 commit comments

Comments
 (0)