[clang] [llvm] [MC/DC][Coverage] Loosen the limit of NumConds from 6 (PR #82448)
Hana Dusíková via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 20 22:38:03 PST 2024
================
@@ -223,9 +223,130 @@ Expected<int64_t> CounterMappingContext::evaluate(const Counter &C) const {
return LastPoppedValue;
}
+mcdc::TVIdxBuilder::TVIdxBuilder(const SmallVectorImpl<ConditionIDs> &NextIDs,
+ int Offset)
+ : Indices(NextIDs.size()) {
+ // Construct Nodes and set up each InCount
+ auto N = NextIDs.size();
+ SmallVector<MCDCNode> Nodes(N);
+ for (unsigned ID = 0; ID < N; ++ID) {
+ for (unsigned C = 0; C < 2; ++C) {
+#ifndef NDEBUG
+ Indices[ID][C] = INT_MIN;
+#endif
+ auto NextID = NextIDs[ID][C];
+ Nodes[ID].NextIDs[C] = NextID;
+ if (NextID >= 0)
+ ++Nodes[NextID].InCount;
+ }
+ }
+
+ // Sort key ordered by <-Width, Ord>
+ SmallVector<std::tuple<int, /// -Width
+ unsigned, /// Ord
+ int, /// ID
+ unsigned /// Cond (0 or 1)
+ >>
+ Decisions;
+
+ // Traverse Nodes to assign Idx
+ SmallVector<int> Q;
+ assert(Nodes[0].InCount == 0);
+ Nodes[0].Width = 1;
+ Q.push_back(0);
+
+ unsigned Ord = 0;
+ while (!Q.empty()) {
+ auto IID = Q.begin();
+ int ID = *IID;
+ Q.erase(IID);
+ auto &Node = Nodes[ID];
+ assert(Node.Width > 0);
+
+ for (unsigned I = 0; I < 2; ++I) {
+ auto NextID = Node.NextIDs[I];
+ assert(NextID != 0 && "NextID should not point to the top");
+ if (NextID < 0) {
+ // Decision
+ Decisions.emplace_back(-Node.Width, Ord++, ID, I);
+ assert(Ord == Decisions.size());
+ continue;
+ }
+
+ // Inter Node
+ auto &NextNode = Nodes[NextID];
+ assert(NextNode.InCount > 0);
+
+ // Assign Idx
+ assert(Indices[ID][I] == INT_MIN);
+ Indices[ID][I] = NextNode.Width;
+ auto NextWidth = int64_t(NextNode.Width) + Node.Width;
+ if (NextWidth > HardMaxTVs) {
+ NumTestVectors = HardMaxTVs; // Overflow
+ return;
+ }
+ NextNode.Width = NextWidth;
+
+ // Ready if all incomings are processed.
+ // Or NextNode.Width hasn't been confirmed yet.
+ if (--NextNode.InCount == 0)
+ Q.push_back(NextID);
+ }
+ }
+
+ std::sort(Decisions.begin(), Decisions.end());
+
+ // Assign TestVector Indices in Decision Nodes
+ int64_t CurIdx = 0;
+ for (auto [NegWidth, Ord, ID, C] : Decisions) {
+ int Width = -NegWidth;
----------------
hanickadot wrote:
change it also here if you change Decision to a smallvector of defined struct
https://github.com/llvm/llvm-project/pull/82448
More information about the cfe-commits
mailing list