//===- MemoryModelRelaxationAnnotations.h -----------------------*- 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 // //===----------------------------------------------------------------------===// // /// \file /// This file provides utility for Memory Model Relaxation Annotations (MMRAs). /// Those annotations are represented using Metadata. The MMRATagSet class /// offers a simple API to parse the metadata and perform common operations on /// it. The MMRAMetadata class is a simple tuple of MDNode that provides easy /// access to all MMRA annotations on an instruction. // //===----------------------------------------------------------------------===// #ifndef LLVM_IR_MEMORYMODELRELAXATIONANNOTATIONS_H #define LLVM_IR_MEMORYMODELRELAXATIONANNOTATIONS_H #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/StringRef.h" #include <tuple> // for std::pair namespace llvm { template <typename T> class ArrayRef; class MDNode; class MDTuple; class Metadata; class raw_ostream; class LLVMContext; class Instruction; /// Helper class to manipulate `!mmra` metadata nodes. /// /// This can be visualized as a set of "tags", with each tag /// representing a particular property of an instruction, as /// explained in the MemoryModelRelaxationAnnotations docs. /// /// This class (and the optimizer in general) does not reason /// about the exact nature of the tags and the properties they /// imply. It just sees the metadata as a collection of tags, which /// are a prefix/suffix pair of strings. class MMRAMetadata { … }; /// \returns true if \p I can have !mmra metadata. bool canInstructionHaveMMRAs(const Instruction &I); } // namespace llvm #endif