123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===---- llvm/Support/Discriminator.h -- Discriminator Utils ---*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // This file defines the constants and utility functions for discriminators.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_SUPPORT_DISCRIMINATOR_H
- #define LLVM_SUPPORT_DISCRIMINATOR_H
- #include "llvm/Support/Error.h"
- #include <assert.h>
- // Utility functions for encoding / decoding discriminators.
- /// With a given unsigned int \p U, use up to 13 bits to represent it.
- /// old_bit 1~5 --> new_bit 1~5
- /// old_bit 6~12 --> new_bit 7~13
- /// new_bit_6 is 0 if higher bits (7~13) are all 0
- static inline unsigned getPrefixEncodingFromUnsigned(unsigned U) {
- U &= 0xfff;
- return U > 0x1f ? (((U & 0xfe0) << 1) | (U & 0x1f) | 0x20) : U;
- }
- /// Reverse transformation as getPrefixEncodingFromUnsigned.
- static inline unsigned getUnsignedFromPrefixEncoding(unsigned U) {
- if (U & 1)
- return 0;
- U >>= 1;
- return (U & 0x20) ? (((U >> 1) & 0xfe0) | (U & 0x1f)) : (U & 0x1f);
- }
- /// Returns the next component stored in discriminator.
- static inline unsigned getNextComponentInDiscriminator(unsigned D) {
- if ((D & 1) == 0)
- return D >> ((D & 0x40) ? 14 : 7);
- else
- return D >> 1;
- }
- static inline unsigned encodeComponent(unsigned C) {
- return (C == 0) ? 1U : (getPrefixEncodingFromUnsigned(C) << 1);
- }
- static inline unsigned encodingBits(unsigned C) {
- return (C == 0) ? 1 : (C > 0x1f ? 14 : 7);
- }
- // Some constants used in FS Discriminators.
- //
- namespace llvm {
- namespace sampleprof {
- enum FSDiscriminatorPass {
- Base = 0,
- Pass0 = 0,
- Pass1 = 1,
- Pass2 = 2,
- Pass3 = 3,
- Pass4 = 4,
- PassLast = 4,
- };
- } // namespace sampleprof
- using namespace sampleprof;
- // The number of bits reserved for the base discrimininator. The base
- // discriminaitor starts from bit 0.
- static const unsigned BaseDiscriminatorBitWidth = 8;
- // The number of bits reserved for each FS discriminator pass.
- static const unsigned FSDiscriminatorBitWidth = 6;
- // Return the number of FS passes, excluding the pass adding the base
- // discriminators.
- // The number of passes for FS discriminators. Note that the total
- // number of discriminaitor bits, i.e.
- // BaseDiscriminatorBitWidth
- // + FSDiscriminatorBitWidth * getNumFSPasses()
- // needs to fit in an unsigned int type.
- static inline unsigned getNumFSPasses() {
- return static_cast<unsigned>(FSDiscriminatorPass::PassLast);
- }
- // Return the ending bit for FSPass P.
- static inline unsigned getFSPassBitEnd(FSDiscriminatorPass P) {
- unsigned I = static_cast<unsigned>(P);
- assert(I <= getNumFSPasses() && "Invalid FS discriminator pass number.");
- return BaseDiscriminatorBitWidth + I * FSDiscriminatorBitWidth - 1;
- }
- // Return the begining bit for FSPass P.
- static inline unsigned getFSPassBitBegin(FSDiscriminatorPass P) {
- if (P == FSDiscriminatorPass::Base)
- return 0;
- unsigned I = static_cast<unsigned>(P);
- assert(I <= getNumFSPasses() && "Invalid FS discriminator pass number.");
- return getFSPassBitEnd(static_cast<FSDiscriminatorPass>(I - 1)) + 1;
- }
- // Return the beginning bit for the last FSPass.
- static inline int getLastFSPassBitBegin() {
- return getFSPassBitBegin(static_cast<FSDiscriminatorPass>(getNumFSPasses()));
- }
- // Return the ending bit for the last FSPass.
- static inline unsigned getLastFSPassBitEnd() {
- return getFSPassBitEnd(static_cast<FSDiscriminatorPass>(getNumFSPasses()));
- }
- // Return the beginning bit for the base (first) FSPass.
- static inline unsigned getBaseFSBitBegin() { return 0; }
- // Return the ending bit for the base (first) FSPass.
- static inline unsigned getBaseFSBitEnd() {
- return BaseDiscriminatorBitWidth - 1;
- }
- // Set bits in range of [0 .. n] to 1. Used in FS Discriminators.
- static inline unsigned getN1Bits(int N) {
- // Work around the g++ bug that folding "(1U << (N + 1)) - 1" to 0.
- if (N == 31)
- return 0xFFFFFFFF;
- assert((N < 32) && "N is invalid");
- return (1U << (N + 1)) - 1;
- }
- } // namespace llvm
- #endif /* LLVM_SUPPORT_DISCRIMINATOR_H */
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|