//===------ VirtualInstruction.cpp ------------------------------*- 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 // //===----------------------------------------------------------------------===// // // Tools for determining which instructions are within a statement and the // nature of their operands. // //===----------------------------------------------------------------------===// #ifndef POLLY_SUPPORT_VIRTUALINSTRUCTION_H #define POLLY_SUPPORT_VIRTUALINSTRUCTION_H #include "polly/ScopInfo.h" namespace polly { User; /// Determine the nature of a value's use within a statement. /// /// These are not always representable by llvm::Use. For instance, scalar write /// MemoryAccesses do use a value, but are not associated with an instruction's /// argument. /// /// Despite its name it is not tied to virtual instructions (although it works /// fine with them), but to promote consistent handling of values used in /// statements. class VirtualUse final { … }; /// An iterator for virtual operands. class VirtualOperandIterator final { … }; /// This class represents a "virtual instruction", an instruction in a ScopStmt, /// effectively a ScopStmt/Instruction-pair. /// /// An instructions can be moved between statements (e.g. to avoid a scalar /// dependency) and even can be contained in multiple statements (for instance, /// to recompute a value instead of transferring it), hence 'virtual'. This /// class is required to represent such instructions that are not in their /// 'physical' location anymore. /// /// A statement can currently not contain the same instructions multiple times /// (that is, from different loop iterations). Therefore, a /// ScopStmt/Instruction-pair uniquely identifies a virtual instructions. /// ScopStmt::getInstruction() can contain the same instruction multiple times, /// but they necessarily compute the same value. class VirtualInstruction final { … }; static inline bool operator==(VirtualInstruction LHS, VirtualInstruction RHS) { … } /// Find all reachable instructions and accesses. /// /// @param S The SCoP to find everything reachable in. /// @param LI LoopInfo required for analysis. /// @param UsedInsts[out] Receives all reachable instructions. /// @param UsedAccs[out] Receives all reachable accesses. /// @param OnlyLocal If non-nullptr, activates local mode: The SCoP is /// assumed to consist only of this statement and is /// conservatively correct. Does not require walking the /// whole SCoP. void markReachable(Scop *S, LoopInfo *LI, DenseSet<VirtualInstruction> &UsedInsts, DenseSet<MemoryAccess *> &UsedAccs, ScopStmt *OnlyLocal = nullptr); } // namespace polly namespace llvm { /// Support VirtualInstructions in llvm::DenseMaps. template <> struct DenseMapInfo<polly::VirtualInstruction> { … }; } // namespace llvm #endif /* POLLY_SUPPORT_VIRTUALINSTRUCTION_H */