//===- llvm/Analysis/LoopInfo.h - Natural Loop Calculator -------*- 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 declares a GenericLoopInfo instantiation for LLVM IR. // //===----------------------------------------------------------------------===// #ifndef LLVM_ANALYSIS_LOOPINFO_H #define LLVM_ANALYSIS_LOOPINFO_H #include "llvm/ADT/GraphTraits.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/PassManager.h" #include "llvm/Pass.h" #include "llvm/Support/GenericLoopInfo.h" #include <optional> #include <utility> namespace llvm { class DominatorTree; class InductionDescriptor; class LoopInfo; class Loop; class MemorySSAUpdater; class ScalarEvolution; class raw_ostream; // Implementation in Support/GenericLoopInfoImpl.h extern template class LoopBase<BasicBlock, Loop>; /// Represents a single loop in the control flow graph. Note that not all SCCs /// in the CFG are necessarily loops. class LLVM_ABI Loop : public LoopBase<BasicBlock, Loop> { … }; // Implementation in Support/GenericLoopInfoImpl.h extern template class LoopInfoBase<BasicBlock, Loop>; class LoopInfo : public LoopInfoBase<BasicBlock, Loop> { … }; /// Enable verification of loop info. /// /// The flag enables checks which are expensive and are disabled by default /// unless the `EXPENSIVE_CHECKS` macro is defined. The `-verify-loop-info` /// flag allows the checks to be enabled selectively without re-compilation. extern bool VerifyLoopInfo; // Allow clients to walk the list of nested loops... template <> struct GraphTraits<const Loop *> { … }; template <> struct GraphTraits<Loop *> { … }; /// Analysis pass that exposes the \c LoopInfo for a function. class LoopAnalysis : public AnalysisInfoMixin<LoopAnalysis> { … }; /// Printer pass for the \c LoopAnalysis results. class LoopPrinterPass : public PassInfoMixin<LoopPrinterPass> { … }; /// Verifier pass for the \c LoopAnalysis results. struct LoopVerifierPass : public PassInfoMixin<LoopVerifierPass> { … }; /// The legacy pass manager's analysis pass to compute loop information. class LoopInfoWrapperPass : public FunctionPass { … }; /// Function to print a loop's contents as LLVM's text IR assembly. void printLoop(Loop &L, raw_ostream &OS, const std::string &Banner = ""); /// Find and return the loop attribute node for the attribute @p Name in /// @p LoopID. Return nullptr if there is no such attribute. MDNode *findOptionMDForLoopID(MDNode *LoopID, StringRef Name); /// Find string metadata for a loop. /// /// Returns the MDNode where the first operand is the metadata's name. The /// following operands are the metadata's values. If no metadata with @p Name is /// found, return nullptr. MDNode *findOptionMDForLoop(const Loop *TheLoop, StringRef Name); std::optional<bool> getOptionalBoolLoopAttribute(const Loop *TheLoop, StringRef Name); /// Returns true if Name is applied to TheLoop and enabled. bool getBooleanLoopAttribute(const Loop *TheLoop, StringRef Name); /// Find named metadata for a loop with an integer value. std::optional<int> getOptionalIntLoopAttribute(const Loop *TheLoop, StringRef Name); /// Find named metadata for a loop with an integer value. Return \p Default if /// not set. int getIntLoopAttribute(const Loop *TheLoop, StringRef Name, int Default = 0); /// Find string metadata for loop /// /// If it has a value (e.g. {"llvm.distribute", 1} return the value as an /// operand or null otherwise. If the string metadata is not found return /// Optional's not-a-value. std::optional<const MDOperand *> findStringMetadataForLoop(const Loop *TheLoop, StringRef Name); /// Find the convergence heart of the loop. CallBase *getLoopConvergenceHeart(const Loop *TheLoop); /// Look for the loop attribute that requires progress within the loop. /// Note: Most consumers probably want "isMustProgress" which checks /// the containing function attribute too. bool hasMustProgress(const Loop *L); /// Return true if this loop can be assumed to make progress. (i.e. can't /// be infinite without side effects without also being undefined) bool isMustProgress(const Loop *L); /// Return true if this loop can be assumed to run for a finite number of /// iterations. bool isFinite(const Loop *L); /// Return whether an MDNode might represent an access group. /// /// Access group metadata nodes have to be distinct and empty. Being /// always-empty ensures that it never needs to be changed (which -- because /// MDNodes are designed immutable -- would require creating a new MDNode). Note /// that this is not a sufficient condition: not every distinct and empty NDNode /// is representing an access group. bool isValidAsAccessGroup(MDNode *AccGroup); /// Create a new LoopID after the loop has been transformed. /// /// This can be used when no follow-up loop attributes are defined /// (llvm::makeFollowupLoopID returning None) to stop transformations to be /// applied again. /// /// @param Context The LLVMContext in which to create the new LoopID. /// @param OrigLoopID The original LoopID; can be nullptr if the original /// loop has no LoopID. /// @param RemovePrefixes Remove all loop attributes that have these prefixes. /// Use to remove metadata of the transformation that has /// been applied. /// @param AddAttrs Add these loop attributes to the new LoopID. /// /// @return A new LoopID that can be applied using Loop::setLoopID(). llvm::MDNode * makePostTransformationMetadata(llvm::LLVMContext &Context, MDNode *OrigLoopID, llvm::ArrayRef<llvm::StringRef> RemovePrefixes, llvm::ArrayRef<llvm::MDNode *> AddAttrs); } // namespace llvm #endif