llvm-project/llvm/test/Transforms/PGOProfile/instrprof_simple_sampling.ll
Michael O'Farrell b4fcaa137f
[PGO][SampledInstr] Correct off by 1s and allow 100% sampling (#113350)
This corrects a couple off by ones related to the sampling of
**instrumented** counters, and enables setting 100% rates for burst
sampling (burst duration = period).

Off by ones:
Prior to this change it was impossible to set a period of 65535 because
this was converted to fast sampling which rollsover at USHRT_MAX + 1
(65536). Similarly the burst durations would collect burst duration + 1
counts as they used an ULE comparison.

100% sampling:
Although this is not useful for a productionized use case, it does allow
for more deterministic testing with the sampling checks in place. After
all the off by ones are fixed, allowing for 100% sampling is a matter of
letting burst duration = period.
2024-10-22 16:01:13 -07:00

61 lines
2.9 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt < %s --passes=instrprof --sampled-instrumentation --sampled-instr-burst-duration=1 --sampled-instr-period=1009 -S | FileCheck %s --check-prefix=PERIOD1009
; RUN: opt < %s --passes=instrprof --sampled-instrumentation --sampled-instr-burst-duration=1 -S | FileCheck %s --check-prefix=DEFAULTPERIOD
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
$__llvm_profile_raw_version = comdat any
@__llvm_profile_raw_version = constant i64 72057594037927940, comdat
@__profn_f = private constant [1 x i8] c"f"
define void @f() {
; PERIOD1009-LABEL: define void @f() {
; PERIOD1009-NEXT: [[ENTRY:.*:]]
; PERIOD1009-NEXT: [[TMP0:%.*]] = load i16, ptr @__llvm_profile_sampling, align 2
; PERIOD1009-NEXT: [[TMP1:%.*]] = add i16 [[TMP0]], 1
; PERIOD1009-NEXT: [[TMP2:%.*]] = icmp uge i16 [[TMP1]], 1009
; PERIOD1009-NEXT: br i1 [[TMP2]], label %[[BB3:.*]], label %[[BB5:.*]], !prof [[PROF0:![0-9]+]]
; PERIOD1009: [[BB3]]:
; PERIOD1009-NEXT: [[PGOCOUNT:%.*]] = load i64, ptr @__profc_f, align 8
; PERIOD1009-NEXT: [[TMP4:%.*]] = add i64 [[PGOCOUNT]], 1
; PERIOD1009-NEXT: store i64 [[TMP4]], ptr @__profc_f, align 8
; PERIOD1009-NEXT: store i16 0, ptr @__llvm_profile_sampling, align 2
; PERIOD1009-NEXT: br label %[[BB6:.*]]
; PERIOD1009: [[BB5]]:
; PERIOD1009-NEXT: store i16 [[TMP1]], ptr @__llvm_profile_sampling, align 2
; PERIOD1009-NEXT: br label %[[BB6]]
; PERIOD1009: [[BB6]]:
; PERIOD1009-NEXT: ret void
;
; DEFAULTPERIOD-LABEL: define void @f() {
; DEFAULTPERIOD-NEXT: [[ENTRY:.*:]]
; DEFAULTPERIOD-NEXT: [[TMP0:%.*]] = load i32, ptr @__llvm_profile_sampling, align 4
; DEFAULTPERIOD-NEXT: [[TMP1:%.*]] = add i32 [[TMP0]], 1
; DEFAULTPERIOD-NEXT: [[TMP2:%.*]] = icmp uge i32 [[TMP1]], 65536
; DEFAULTPERIOD-NEXT: br i1 [[TMP2]], label %[[BB3:.*]], label %[[BB5:.*]], !prof [[PROF0:![0-9]+]]
; DEFAULTPERIOD: [[BB3]]:
; DEFAULTPERIOD-NEXT: [[PGOCOUNT:%.*]] = load i64, ptr @__profc_f, align 8
; DEFAULTPERIOD-NEXT: [[TMP4:%.*]] = add i64 [[PGOCOUNT]], 1
; DEFAULTPERIOD-NEXT: store i64 [[TMP4]], ptr @__profc_f, align 8
; DEFAULTPERIOD-NEXT: store i32 0, ptr @__llvm_profile_sampling, align 4
; DEFAULTPERIOD-NEXT: br label %[[BB6:.*]]
; DEFAULTPERIOD: [[BB5]]:
; DEFAULTPERIOD-NEXT: store i32 [[TMP1]], ptr @__llvm_profile_sampling, align 4
; DEFAULTPERIOD-NEXT: br label %[[BB6]]
; DEFAULTPERIOD: [[BB6]]:
; DEFAULTPERIOD-NEXT: ret void
;
entry:
call void @llvm.instrprof.increment(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @__profn_f, i32 0, i32 0), i64 12884901887, i32 1, i32 0)
ret void
}
declare void @llvm.instrprof.increment(i8*, i64, i32, i32)
;.
; PERIOD1009: [[PROF0]] = !{!"branch_weights", i32 1, i32 1008}
;.
; DEFAULTPERIOD: [[PROF0]] = !{!"branch_weights", i32 1, i32 65535}
;.