From c9f71e7ca60860344eea2256deb7d1624db05a59 Mon Sep 17 00:00:00 2001 From: Xinliang David Li Date: Thu, 30 Nov 2017 19:16:25 +0000 Subject: [PATCH] [PGO] Skip counter promotion for infinite loops Differential Revision: http://reviews.llvm.org/D40662 llvm-svn: 319462 --- .../Instrumentation/InstrProfiling.cpp | 3 +++ test/Transforms/PGOProfile/infinite_loop.ll | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 test/Transforms/PGOProfile/infinite_loop.ll diff --git a/lib/Transforms/Instrumentation/InstrProfiling.cpp b/lib/Transforms/Instrumentation/InstrProfiling.cpp index db8fa897794..787afc32dfb 100644 --- a/lib/Transforms/Instrumentation/InstrProfiling.cpp +++ b/lib/Transforms/Instrumentation/InstrProfiling.cpp @@ -245,6 +245,9 @@ public: } bool run(int64_t *NumPromoted) { + // Skip 'infinite' loops: + if (ExitBlocks.size() == 0) + return false; unsigned MaxProm = getMaxNumOfPromotionsInLoop(&L); if (MaxProm == 0) return false; diff --git a/test/Transforms/PGOProfile/infinite_loop.ll b/test/Transforms/PGOProfile/infinite_loop.ll new file mode 100644 index 00000000000..68e9873f092 --- /dev/null +++ b/test/Transforms/PGOProfile/infinite_loop.ll @@ -0,0 +1,21 @@ +; RUN: opt < %s -instrprof -S -o - -do-counter-promotion=1 | FileCheck %s +; CHECK: store + +@__profn_foo = private constant [3 x i8] c"foo" + +define void @foo() { +entry: + br label %while.body + + while.body: ; preds = %entry, %while.body + call void @llvm.instrprof.increment(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @__profn_foo, i32 0, i32 0), i64 14813359968, i32 1, i32 0) + call void (...) @bar() #2 + br label %while.body +} + +declare void @bar(...) + +declare void @llvm.instrprof.increment(i8*, i64, i32, i32) #0 + +attributes #0 = { nounwind } +