LLVM 17.0.0git
PseudoProbe.cpp
Go to the documentation of this file.
1//===- PseudoProbe.cpp - Pseudo Probe Helpers -----------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the helpers to manipulate pseudo probe IR intrinsic
10// calls.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/IR/PseudoProbe.h"
16#include "llvm/IR/IRBuilder.h"
17#include "llvm/IR/Instruction.h"
19
20using namespace llvm;
21
22namespace llvm {
23
24std::optional<PseudoProbe>
26 if (DIL) {
27 auto Discriminator = DIL->getDiscriminator();
28 if (DILocation::isPseudoProbeDiscriminator(Discriminator)) {
29 PseudoProbe Probe;
30 Probe.Id =
32 Probe.Type =
34 Probe.Attr =
36 Probe.Factor =
39 Probe.Discriminator = 0;
40 return Probe;
41 }
42 }
43 return std::nullopt;
44}
45
46std::optional<PseudoProbe>
48 assert(isa<CallBase>(&Inst) && !isa<IntrinsicInst>(&Inst) &&
49 "Only call instructions should have pseudo probe encodes as their "
50 "Dwarf discriminators");
51 if (const DebugLoc &DLoc = Inst.getDebugLoc())
53 return std::nullopt;
54}
55
56std::optional<PseudoProbe> extractProbe(const Instruction &Inst) {
57 if (const auto *II = dyn_cast<PseudoProbeInst>(&Inst)) {
58 PseudoProbe Probe;
59 Probe.Id = II->getIndex()->getZExtValue();
61 Probe.Attr = II->getAttributes()->getZExtValue();
62 Probe.Factor = II->getFactor()->getZExtValue() /
64 Probe.Discriminator = 0;
65 if (const DebugLoc &DLoc = Inst.getDebugLoc())
66 Probe.Discriminator = DLoc->getDiscriminator();
67 assert(Probe.Discriminator == 0 &&
68 "Unexpected non-zero FS-discriminator for IR pseudo probes");
69 return Probe;
70 }
71
72 if (isa<CallBase>(&Inst) && !isa<IntrinsicInst>(&Inst))
74
75 return std::nullopt;
76}
77
78void setProbeDistributionFactor(Instruction &Inst, float Factor) {
79 assert(Factor >= 0 && Factor <= 1 &&
80 "Distribution factor must be in [0, 1.0]");
81 if (auto *II = dyn_cast<PseudoProbeInst>(&Inst)) {
82 IRBuilder<> Builder(&Inst);
84 if (Factor < 1)
85 IntFactor *= Factor;
86 auto OrigFactor = II->getFactor()->getZExtValue();
87 if (IntFactor != OrigFactor)
88 II->replaceUsesOfWith(II->getFactor(), Builder.getInt64(IntFactor));
89 } else if (isa<CallBase>(&Inst) && !isa<IntrinsicInst>(&Inst)) {
90 if (const DebugLoc &DLoc = Inst.getDebugLoc()) {
91 const DILocation *DIL = DLoc;
92 auto Discriminator = DIL->getDiscriminator();
93 if (DILocation::isPseudoProbeDiscriminator(Discriminator)) {
94 auto Index =
96 auto Type =
99 Discriminator);
100 // Round small factors to 0 to avoid over-counting.
101 uint32_t IntFactor =
103 if (Factor < 1)
104 IntFactor *= Factor;
106 Index, Type, Attr, IntFactor);
107 DIL = DIL->cloneWithDiscriminator(V);
108 Inst.setDebugLoc(DIL);
109 }
110 }
111 }
112}
113
114} // namespace llvm
assume Assume Builder
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
Debug location.
static bool isPseudoProbeDiscriminator(unsigned Discriminator)
const DILocation * cloneWithDiscriminator(unsigned Discriminator) const
Returns a new DILocation with updated Discriminator.
A debug info location.
Definition: DebugLoc.h:33
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition: IRBuilder.h:2564
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
Definition: Instruction.h:365
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
Definition: Instruction.h:362
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
static constexpr uint64_t PseudoProbeFullDistributionFactor
Definition: PseudoProbe.h:39
std::optional< PseudoProbe > extractProbeFromDiscriminator(const DILocation *DIL)
Definition: PseudoProbe.cpp:25
void setProbeDistributionFactor(Instruction &Inst, float Factor)
Definition: PseudoProbe.cpp:78
std::optional< PseudoProbe > extractProbe(const Instruction &Inst)
Definition: PseudoProbe.cpp:56
static uint32_t extractProbeFactor(uint32_t Value)
Definition: PseudoProbe.h:74
static constexpr uint8_t FullDistributionFactor
Definition: PseudoProbe.h:79
static uint32_t packProbeData(uint32_t Index, uint32_t Type, uint32_t Flags, uint32_t Factor)
Definition: PseudoProbe.h:52
static uint32_t extractProbeIndex(uint32_t Value)
Definition: PseudoProbe.h:62
static uint32_t extractProbeAttributes(uint32_t Value)
Definition: PseudoProbe.h:70
static uint32_t extractProbeType(uint32_t Value)
Definition: PseudoProbe.h:66
uint32_t Discriminator
Definition: PseudoProbe.h:97