for (auto &LS : reverse(ValuesAtScopes[V]))
if (LS.first == L) {
LS.second = C;
+ if (!isa<SCEVConstant>(C))
+ ValuesAtScopesUsers[C].push_back({L, V});
break;
}
-
- if (!isa<SCEVConstant>(C))
- ValuesAtScopesUsers[C].push_back({L, V});
return C;
}
is_contained(It->second, std::make_pair(L, Value)))
continue;
dbgs() << "Value: " << *Value << ", Loop: " << *L << ", ValueAtScope: "
- << ValueAtScope << " missing in ValuesAtScopesUsers\n";
+ << *ValueAtScope << " missing in ValuesAtScopesUsers\n";
std::abort();
}
}
is_contained(It->second, std::make_pair(L, ValueAtScope)))
continue;
dbgs() << "Value: " << *Value << ", Loop: " << *L << ", ValueAtScope: "
- << ValueAtScope << " missing in ValuesAtScopes\n";
+ << *ValueAtScope << " missing in ValuesAtScopes\n";
std::abort();
}
}
--- /dev/null
+; RUN: opt -S -passes='verify<scalar-evolution>' < %s
+
+; Make sure this does not fail ValuesAtScopes consistency verification.
+; This used to register a ValuesAtScopes user, even though nothing was
+; added to ValuesAtScope due to a prior invalidation.
+
+define void @main(i8* %p) {
+entry:
+ br label %loop1
+
+loop1:
+ br label %loop2
+
+loop2:
+ %i = phi i64 [ 0, %loop1 ], [ %i.next, %loop2.latch ]
+ %i.next = add nuw nsw i64 %i, 1
+ %gep = getelementptr i8, i8* %p, i64 %i
+ %val = load i8, i8* %gep
+ %c = icmp eq i8 %val, 0
+ br i1 %c, label %loop2.latch, label %exit
+
+loop2.latch:
+ br i1 false, label %loop2, label %loop1.latch
+
+loop1.latch:
+ br label %loop1
+
+exit:
+ ret void
+}