/usr/lib/llvm-3.7/include/polly/DependenceInfo.h is in libclang-common-3.7-dev 1:3.7.1-2ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | //===--- polly/DependenceInfo.h - Polyhedral dependency analysis *- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Calculate the data dependency relations for a Scop using ISL.
//
// The integer set library (ISL) from Sven, has a integrated dependency analysis
// to calculate data dependences. This pass takes advantage of this and
// calculate those dependences a Scop.
//
// The dependences in this pass are exact in terms that for a specific read
// statement instance only the last write statement instance is returned. In
// case of may writes a set of possible write instances is returned. This
// analysis will never produce redundant dependences.
//
//===----------------------------------------------------------------------===//
#ifndef POLLY_DEPENDENCE_INFO_H
#define POLLY_DEPENDENCE_INFO_H
#include "polly/ScopPass.h"
#include "isl/ctx.h"
struct isl_pw_aff;
struct isl_union_map;
struct isl_union_set;
struct isl_map;
struct isl_set;
struct clast_for;
using namespace llvm;
namespace polly {
class Scop;
class ScopStmt;
class MemoryAccess;
/// @brief The accumulated dependence information for a SCoP.
///
/// The dependences struct holds all dependence information we collect and
/// compute for one SCoP. It also offers an interface that allows users to
/// query only specific parts.
struct Dependences {
/// @brief Map type for reduction dependences.
using ReductionDependencesMapTy = DenseMap<MemoryAccess *, isl_map *>;
/// @brief Map type to associate statements with schedules.
using StatementToIslMapTy = DenseMap<ScopStmt *, isl_map *>;
/// @brief The type of the dependences.
///
/// Reduction dependences are separated from RAW/WAW/WAR dependences because
/// we can ignore them during the scheduling. This is the case since the order
/// in which the reduction statements are executed does not matter. However,
/// if they are executed in parallel we need to take additional measures
/// (e.g, privatization) to ensure a correct result. The (reverse) transitive
/// closure of the reduction dependences are used to check for parallel
/// executed reduction statements during code generation. These dependences
/// connect all instances of a reduction with each other, they are therefor
/// cyclic and possibly "reversed".
enum Type {
// Write after read
TYPE_WAR = 1 << 0,
// Read after write
TYPE_RAW = 1 << 1,
// Write after write
TYPE_WAW = 1 << 2,
// Reduction dependences
TYPE_RED = 1 << 3,
// Transitive closure of the reduction dependences (& the reverse)
TYPE_TC_RED = 1 << 4,
};
/// @brief Get the dependences of type @p Kinds.
///
/// @param Kinds This integer defines the different kinds of dependences
/// that will be returned. To return more than one kind, the
/// different kinds are 'ored' together.
__isl_give isl_union_map *getDependences(int Kinds) const;
/// @brief Report if valid dependences are available.
bool hasValidDependences() const;
/// @brief Return the reduction dependences caused by @p MA.
///
/// @return The reduction dependences caused by @p MA or nullptr if none.
__isl_give isl_map *getReductionDependences(MemoryAccess *MA) const;
/// @brief Return all reduction dependences.
const ReductionDependencesMapTy &getReductionDependences() const {
return ReductionDependences;
}
/// @brief Check if a partial schedule is parallel wrt to @p Deps.
///
/// @param Schedule The subset of the schedule space that we want to
/// check.
/// @param Deps The dependences @p Schedule needs to respect.
/// @param MinDistancePtr If not nullptr, the minimal dependence distance will
/// be returned at the address of that pointer
///
/// @return Returns true, if executing parallel the outermost dimension of
/// @p Schedule is valid according to the dependences @p Deps.
bool isParallel(__isl_keep isl_union_map *Schedule,
__isl_take isl_union_map *Deps,
__isl_give isl_pw_aff **MinDistancePtr = nullptr) const;
/// @brief Check if a new schedule is valid.
///
/// @param S The current SCoP.
/// @param NewSchedules The new schedules
///
/// @return bool True if the new schedule is valid, false it it reverses
/// dependences.
bool isValidSchedule(Scop &S, StatementToIslMapTy *NewSchedules) const;
/// @brief Print the dependence information stored.
void print(llvm::raw_ostream &OS) const;
/// @brief Dump the dependence information stored to the dbgs stream.
void dump() const;
/// @brief Allow the DependenceInfo access to private members and methods.
///
/// To restict access to the internal state only the DependenceInfo class
/// is able to call or modify a dependences struct.
friend class DependenceInfo;
private:
/// @brief Create an empty dependences struct.
Dependences()
: RAW(nullptr), WAR(nullptr), WAW(nullptr), RED(nullptr),
TC_RED(nullptr) {}
/// @brief Destructor that will free internal objects.
~Dependences() { releaseMemory(); }
/// @brief Calculate and add at the privatization dependences.
void addPrivatizationDependences();
/// @brief Calculate the dependences for a certain SCoP @p S.
void calculateDependences(Scop &S);
/// @brief Set the reduction dependences for @p MA to @p Deps.
void setReductionDependences(MemoryAccess *MA, __isl_take isl_map *Deps);
/// @brief Free the objects associated with this dependences struct.
///
/// The dependences struct will again be "empty" afterwards.
void releaseMemory();
/// @brief The different basic kinds of dependences we calculate.
isl_union_map *RAW;
isl_union_map *WAR;
isl_union_map *WAW;
/// @brief The special reduction dependences.
isl_union_map *RED;
/// @brief The (reverse) transitive closure of reduction dependences.
isl_union_map *TC_RED;
/// @brief Mapping from memory accesses to their reduction dependences.
ReductionDependencesMapTy ReductionDependences;
};
class DependenceInfo : public ScopPass {
public:
static char ID;
/// @brief Construct a new DependenceInfo pass.
DependenceInfo() : ScopPass(ID) {}
/// @brief Return the dependence information for the current SCoP.
const Dependences &getDependences() { return D; }
/// @brief Recompute dependences from schedule and memory accesses.
void recomputeDependences();
bool runOnScop(Scop &S) override;
void printScop(raw_ostream &OS, Scop &) const override { D.print(OS); }
void releaseMemory() override { D.releaseMemory(); }
void getAnalysisUsage(AnalysisUsage &AU) const override;
private:
Scop *S;
/// @brief Dependences struct for the current SCoP.
Dependences D;
};
} // End polly namespace.
namespace llvm {
class PassRegistry;
void initializeDependenceInfoPass(llvm::PassRegistry &);
}
#endif
|