Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 14 | pmbaty | 1 | //===---- llvm/Support/Discriminator.h -- Discriminator Utils ---*- C++ -*-===// | 
| 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 defines the constants and utility functions for discriminators. | ||
| 10 | // | ||
| 11 | //===----------------------------------------------------------------------===// | ||
| 12 | |||
| 13 | #ifndef LLVM_SUPPORT_DISCRIMINATOR_H | ||
| 14 | #define LLVM_SUPPORT_DISCRIMINATOR_H | ||
| 15 | |||
| 16 | #include "llvm/Support/Error.h" | ||
| 17 | #include <assert.h> | ||
| 18 | |||
| 19 | // Utility functions for encoding / decoding discriminators. | ||
| 20 | /// With a given unsigned int \p U, use up to 13 bits to represent it. | ||
| 21 | /// old_bit 1~5  --> new_bit 1~5 | ||
| 22 | /// old_bit 6~12 --> new_bit 7~13 | ||
| 23 | /// new_bit_6 is 0 if higher bits (7~13) are all 0 | ||
| 24 | static inline unsigned getPrefixEncodingFromUnsigned(unsigned U) { | ||
| 25 | U &= 0xfff; | ||
| 26 | return U > 0x1f ? (((U & 0xfe0) << 1) | (U & 0x1f) | 0x20) : U; | ||
| 27 | } | ||
| 28 | |||
| 29 | /// Reverse transformation as getPrefixEncodingFromUnsigned. | ||
| 30 | static inline unsigned getUnsignedFromPrefixEncoding(unsigned U) { | ||
| 31 | if (U & 1) | ||
| 32 | return 0; | ||
| 33 | U >>= 1; | ||
| 34 | return (U & 0x20) ? (((U >> 1) & 0xfe0) | (U & 0x1f)) : (U & 0x1f); | ||
| 35 | } | ||
| 36 | |||
| 37 | /// Returns the next component stored in discriminator. | ||
| 38 | static inline unsigned getNextComponentInDiscriminator(unsigned D) { | ||
| 39 | if ((D & 1) == 0) | ||
| 40 | return D >> ((D & 0x40) ? 14 : 7); | ||
| 41 |   else | ||
| 42 | return D >> 1; | ||
| 43 | } | ||
| 44 | |||
| 45 | static inline unsigned encodeComponent(unsigned C) { | ||
| 46 | return (C == 0) ? 1U : (getPrefixEncodingFromUnsigned(C) << 1); | ||
| 47 | } | ||
| 48 | |||
| 49 | static inline unsigned encodingBits(unsigned C) { | ||
| 50 | return (C == 0) ? 1 : (C > 0x1f ? 14 : 7); | ||
| 51 | } | ||
| 52 | |||
| 53 | // Some constants used in FS Discriminators. | ||
| 54 | // | ||
| 55 | namespace llvm { | ||
| 56 | namespace sampleprof { | ||
| 57 | enum FSDiscriminatorPass { | ||
| 58 | Base = 0, | ||
| 59 | Pass0 = 0, | ||
| 60 | Pass1 = 1, | ||
| 61 | Pass2 = 2, | ||
| 62 | Pass3 = 3, | ||
| 63 | Pass4 = 4, | ||
| 64 | PassLast = 4, | ||
| 65 | }; | ||
| 66 | } // namespace sampleprof | ||
| 67 | |||
| 68 | using namespace sampleprof; | ||
| 69 | |||
| 70 | // The number of bits reserved for the base discrimininator. The base | ||
| 71 | // discriminaitor starts from bit 0. | ||
| 72 | static const unsigned BaseDiscriminatorBitWidth = 8; | ||
| 73 | |||
| 74 | // The number of bits reserved for each FS discriminator pass. | ||
| 75 | static const unsigned FSDiscriminatorBitWidth = 6; | ||
| 76 | |||
| 77 | // Return the number of FS passes, excluding the pass adding the base | ||
| 78 | // discriminators. | ||
| 79 | // The number of passes for FS discriminators. Note that the total | ||
| 80 | // number of discriminaitor bits, i.e. | ||
| 81 | // BaseDiscriminatorBitWidth | ||
| 82 | //  + FSDiscriminatorBitWidth * getNumFSPasses() | ||
| 83 | // needs to fit in an unsigned int type. | ||
| 84 | static inline unsigned getNumFSPasses() { | ||
| 85 | return static_cast<unsigned>(FSDiscriminatorPass::PassLast); | ||
| 86 | } | ||
| 87 | |||
| 88 | // Return the ending bit for FSPass P. | ||
| 89 | static inline unsigned getFSPassBitEnd(FSDiscriminatorPass P) { | ||
| 90 | unsigned I = static_cast<unsigned>(P); | ||
| 91 | assert(I <= getNumFSPasses() && "Invalid FS discriminator pass number."); | ||
| 92 | return BaseDiscriminatorBitWidth + I * FSDiscriminatorBitWidth - 1; | ||
| 93 | } | ||
| 94 | |||
| 95 | // Return the begining bit for FSPass P. | ||
| 96 | static inline unsigned getFSPassBitBegin(FSDiscriminatorPass P) { | ||
| 97 | if (P == FSDiscriminatorPass::Base) | ||
| 98 | return 0; | ||
| 99 | unsigned I = static_cast<unsigned>(P); | ||
| 100 | assert(I <= getNumFSPasses() && "Invalid FS discriminator pass number."); | ||
| 101 | return getFSPassBitEnd(static_cast<FSDiscriminatorPass>(I - 1)) + 1; | ||
| 102 | } | ||
| 103 | |||
| 104 | // Return the beginning bit for the last FSPass. | ||
| 105 | static inline int getLastFSPassBitBegin() { | ||
| 106 | return getFSPassBitBegin(static_cast<FSDiscriminatorPass>(getNumFSPasses())); | ||
| 107 | } | ||
| 108 | |||
| 109 | // Return the ending bit for the last FSPass. | ||
| 110 | static inline unsigned getLastFSPassBitEnd() { | ||
| 111 | return getFSPassBitEnd(static_cast<FSDiscriminatorPass>(getNumFSPasses())); | ||
| 112 | } | ||
| 113 | |||
| 114 | // Return the beginning bit for the base (first) FSPass. | ||
| 115 | static inline unsigned getBaseFSBitBegin() { return 0; } | ||
| 116 | |||
| 117 | // Return the ending bit for the base (first) FSPass. | ||
| 118 | static inline unsigned getBaseFSBitEnd() { | ||
| 119 | return BaseDiscriminatorBitWidth - 1; | ||
| 120 | } | ||
| 121 | |||
| 122 | // Set bits in range of [0 .. n] to 1. Used in FS Discriminators. | ||
| 123 | static inline unsigned getN1Bits(int N) { | ||
| 124 |   // Work around the g++ bug that folding "(1U << (N + 1)) - 1" to 0. | ||
| 125 | if (N == 31) | ||
| 126 | return 0xFFFFFFFF; | ||
| 127 | assert((N < 32) && "N is invalid"); | ||
| 128 | return (1U << (N + 1)) - 1; | ||
| 129 | } | ||
| 130 | |||
| 131 | } // namespace llvm | ||
| 132 | |||
| 133 | #endif /* LLVM_SUPPORT_DISCRIMINATOR_H */ |