[PATCH] D27602: [PGO] Fix insane counts due to nonreturn calls
Rong Xu via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 9 04:00:06 PST 2016
xur created this revision.
xur added a reviewer: davidxl.
xur added subscribers: llvm-commits, eraman, xur.
Since we don't break BBs for function calls. We might get some insane counts
(wrap of unsigned) in the presence of noreturn calls.
This patch sets these counts to zero instead of the wrapped number.
https://reviews.llvm.org/D27602
Files:
lib/Transforms/Instrumentation/PGOInstrumentation.cpp
test/Transforms/PGOProfile/Inputs/noreturncall.proftext
test/Transforms/PGOProfile/noreturncall.ll
Index: test/Transforms/PGOProfile/noreturncall.ll
===================================================================
--- /dev/null
+++ test/Transforms/PGOProfile/noreturncall.ll
@@ -0,0 +1,47 @@
+; RUN: llvm-profdata merge %S/Inputs/noreturncall.proftext -o %t.profdata
+; RUN: opt < %s -pgo-instr-use -pgo-test-profile-file=%t.profdata -S -debug-only=pgo-instrumentation 2>&1 | FileCheck %s --check-prefix=USE
+; RUN: opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S -debug-only=pgo-instrumentation 2>&1 | FileCheck %s --check-prefix=USE
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+declare i32 @bar0(i32)
+declare void @exit(i32)
+
+define i32 @bar2(i32 %i) {
+entry:
+ unreachable
+}
+
+define i32 @foo(i32 %i, i32 %j, i32 %k) {
+entry:
+ %cmp = icmp slt i32 %i, 999
+ br i1 %cmp, label %if.then, label %if.end
+
+if.then:
+ %call = call i32 @bar0(i32 %i)
+ br label %if.end
+
+if.end:
+ %ret.0 = phi i32 [ %call, %if.then ], [ 0, %entry ]
+ %cmp1 = icmp sgt i32 %j, 1000
+ %cmp3 = icmp sgt i32 %k, 99
+ %or.cond = and i1 %cmp1, %cmp3
+ br i1 %or.cond, label %if.then4, label %if.end7
+
+if.then4:
+ %call5 = call i32 @bar2(i32 undef)
+ br label %if.end7
+
+if.end7:
+ %mul = mul nsw i32 %ret.0, %ret.0
+ ret i32 %mul
+}
+; USE: Edge 0: 1-->3 c W=8000 Count=0
+; USE: Edge 1: 3-->5 c W=8000 Count=20
+; USE: Edge 2: 0-->1 W=16 Count=21
+; USE: Edge 3: 5-->0 * W=16 Count=20
+; USE: Edge 4: 1-->2 W=8 Count=21
+; USE: Edge 5: 2-->3 * W=8 Count=21
+; USE: Edge 6: 3-->4 W=8 Count=0
+; USE: Edge 7: 4-->5 * W=8 Count=0
Index: test/Transforms/PGOProfile/Inputs/noreturncall.proftext
===================================================================
--- /dev/null
+++ test/Transforms/PGOProfile/Inputs/noreturncall.proftext
@@ -0,0 +1,11 @@
+# IR level Instrumentation Flag
+:ir
+foo
+# Func Hash:
+36496524737
+# Num Counters:
+3
+# Counter Values:
+20
+21
+0
Index: lib/Transforms/Instrumentation/PGOInstrumentation.cpp
===================================================================
--- lib/Transforms/Instrumentation/PGOInstrumentation.cpp
+++ lib/Transforms/Instrumentation/PGOInstrumentation.cpp
@@ -884,12 +884,18 @@
}
if (Count->CountValid) {
if (Count->UnknownCountOutEdge == 1) {
- uint64_t Total = Count->CountValue - sumEdgeCount(Count->OutEdges);
+ uint64_t Total = 0;
+ uint64_t OutSum = sumEdgeCount(Count->OutEdges);
+ if (Count->CountValue > OutSum)
+ Total = Count->CountValue - OutSum;
setEdgeCount(Count->OutEdges, Total);
Changes = true;
}
if (Count->UnknownCountInEdge == 1) {
- uint64_t Total = Count->CountValue - sumEdgeCount(Count->InEdges);
+ uint64_t Total = 0;
+ uint64_t InSum = sumEdgeCount(Count->InEdges);
+ if (Count->CountValue > InSum)
+ Total = Count->CountValue - InSum;
setEdgeCount(Count->InEdges, Total);
Changes = true;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D27602.80848.patch
Type: text/x-patch
Size: 3094 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161209/a540a879/attachment.bin>
More information about the llvm-commits
mailing list