//===- VPlanValue.h - Represent Values in Vectorizer Plan -----------------===// // // 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 contains the declarations of the entities induced by Vectorization /// Plans, e.g. the instructions the VPlan intends to generate if executed. /// VPlan models the following entities: /// VPValue VPUser VPDef /// | | /// VPInstruction /// These are documented in docs/VectorizationPlan.rst. /// //===----------------------------------------------------------------------===// #ifndef LLVM_TRANSFORMS_VECTORIZE_VPLAN_VALUE_H #define LLVM_TRANSFORMS_VECTORIZE_VPLAN_VALUE_H #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/TinyPtrVector.h" #include "llvm/ADT/iterator_range.h" namespace llvm { // Forward declarations. class raw_ostream; class Value; class VPDef; class VPSlotTracker; class VPUser; class VPRecipeBase; // This is the base class of the VPlan Def/Use graph, used for modeling the data // flow into, within and out of the VPlan. VPValues can stand for live-ins // coming from the input IR, instructions which VPlan will generate if executed // and live-outs which the VPlan will need to fix accordingly. class VPValue { … }; Value2VPValueTy; VPValue2ValueTy; raw_ostream &operator<<(raw_ostream &OS, const VPValue &V); /// This class augments VPValue with operands which provide the inverse def-use /// edges from VPValue's users to their defs. class VPUser { … }; /// This class augments a recipe with a set of VPValues defined by the recipe. /// It allows recipes to define zero, one or multiple VPValues. A VPDef owns /// the VPValues it defines and is responsible for deleting its defined values. /// Single-value VPDefs that also inherit from VPValue must make sure to inherit /// from VPDef before VPValue. class VPDef { … }; class VPlan; class VPBasicBlock; /// This class can be used to assign names to VPValues. For VPValues without /// underlying value, assign consecutive numbers and use those as names (wrapped /// in vp<>). Otherwise, use the name from the underlying value (wrapped in /// ir<>), appending a .V version number if there are multiple uses of the same /// name. Allows querying names for VPValues for printing, similar to the /// ModuleSlotTracker for IR values. class VPSlotTracker { … }; } // namespace llvm #endif // LLVM_TRANSFORMS_VECTORIZE_VPLAN_VALUE_H