| //===--------------------- Support.h ----------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| /// \file |
| /// |
| /// Helper functions used by various pipeline components. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_TOOLS_LLVM_MCA_SUPPORT_H |
| #define LLVM_TOOLS_LLVM_MCA_SUPPORT_H |
| |
| #include "llvm/ADT/ArrayRef.h" |
| #include "llvm/ADT/SmallVector.h" |
| #include "llvm/MC/MCSchedule.h" |
| |
| namespace mca { |
| |
| /// Populates vector Masks with processor resource masks. |
| /// |
| /// The number of bits set in a mask depends on the processor resource type. |
| /// Each processor resource mask has at least one bit set. For groups, the |
| /// number of bits set in the mask is equal to the cardinality of the group plus |
| /// one. Excluding the most significant bit, the remaining bits in the mask |
| /// identify processor resources that are part of the group. |
| /// |
| /// Example: |
| /// |
| /// ResourceA -- Mask: 0b001 |
| /// ResourceB -- Mask: 0b010 |
| /// ResourceAB -- Mask: 0b100 U (ResourceA::Mask | ResourceB::Mask) == 0b111 |
| /// |
| /// ResourceAB is a processor resource group containing ResourceA and ResourceB. |
| /// Each resource mask uniquely identifies a resource; both ResourceA and |
| /// ResourceB only have one bit set. |
| /// ResourceAB is a group; excluding the most significant bit in the mask, the |
| /// remaining bits identify the composition of the group. |
| /// |
| /// Resource masks are used by the ResourceManager to solve set membership |
| /// problems with simple bit manipulation operations. |
| void computeProcResourceMasks(const llvm::MCSchedModel &SM, |
| llvm::SmallVectorImpl<uint64_t> &Masks); |
| |
| /// Compute the reciprocal block throughput from a set of processor resource |
| /// cycles. The reciprocal block throughput is computed as the MAX between: |
| /// - NumMicroOps / DispatchWidth |
| /// - ProcResourceCycles / #ProcResourceUnits (for every consumed resource). |
| double computeBlockRThroughput(const llvm::MCSchedModel &SM, |
| unsigned DispatchWidth, unsigned NumMicroOps, |
| llvm::ArrayRef<unsigned> ProcResourceUsage); |
| } // namespace mca |
| |
| #endif |