Skip to content

Commit

Permalink
[Instrumentation] Fix EdgeCounts vector size in SetBranchWeights
Browse files Browse the repository at this point in the history
SetBranchWeights() calculates the size of the EdgeCounts vector
using OutEdges.Size(), but this is an under-estimate with coroutines.

Use the number of successors, as the vector will be indexed by
the result of the GetSuccessorNumber() function.

Rename the Size local, to make it clear what it refers to.

A unit test, provided by @ellishg, is included.

Fixes llvm#97962

(regression from ffd337b)
  • Loading branch information
avikivity committed Aug 18, 2024
1 parent deb6b45 commit 82ed77d
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 4 deletions.
14 changes: 10 additions & 4 deletions llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1648,11 +1648,17 @@ void PGOUseFunc::setBranchWeights() {
continue;

// We have a non-zero Branch BB.
unsigned Size = BBCountInfo.OutEdges.size();
SmallVector<uint64_t, 2> EdgeCounts(Size, 0);

// SuccessorCount can be greater than OutEdgesCount, because
// removed edges don't appear in OutEdges.
unsigned OutEdgesCount = BBCountInfo.OutEdges.size();
unsigned SuccessorCount = BB.getTerminator()->getNumSuccessors();
assert(OutEdgesCount <= SuccessorCount);

SmallVector<uint64_t, 2> EdgeCounts(SuccessorCount, 0);
uint64_t MaxCount = 0;
for (unsigned s = 0; s < Size; s++) {
const PGOUseEdge *E = BBCountInfo.OutEdges[s];
for (unsigned It = 0; It < OutEdgesCount; It++) {
const PGOUseEdge *E = BBCountInfo.OutEdges[It];
const BasicBlock *SrcBB = E->SrcBB;
const BasicBlock *DestBB = E->DestBB;
if (DestBB == nullptr)
Expand Down
42 changes: 42 additions & 0 deletions llvm/test/Transforms/Coroutines/coro-pgo-setbranchweights.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
; RUN: rm -rf %t && split-file %s %t

; RUN: llvm-profdata merge %t/a.proftext -o %t/a.profdata
; RUN: opt < %t/a.ll --passes=pgo-instr-use -pgo-test-profile-file=%t/a.profdata

;--- a.ll
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-redhat-linux-gnu"

define void @_bar() presplitcoroutine personality ptr null {
%1 = call token @llvm.coro.save(ptr null)
%2 = call i8 @llvm.coro.suspend(token none, i1 false)
switch i8 %2, label %5 [
i8 0, label %3
i8 1, label %4
]

3: ; preds = %0
ret void

4: ; preds = %0
ret void

5: ; preds = %0
ret void
}

declare token @llvm.coro.save(ptr)

declare i8 @llvm.coro.suspend(token, i1)

;--- a.proftext
# IR level Instrumentation Flag
:ir

_bar
# Func Hash:
1063705160175073211
# Num Counters:
2
1
0

0 comments on commit 82ed77d

Please sign in to comment.