
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.
61 lines
2.9 KiB
LLVM
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}
|
|
;.
|