diff --git a/.clang-format b/.clang-format deleted file mode 100644 index 5fcec57be..000000000 --- a/.clang-format +++ /dev/null @@ -1,178 +0,0 @@ ---- -Language: Cpp -# BasedOnStyle: LLVM -AccessModifierOffset: -2 -AlignAfterOpenBracket: Align -AlignArrayOfStructures: None -AlignConsecutiveMacros: None -AlignConsecutiveAssignments: None -AlignConsecutiveBitFields: None -AlignConsecutiveDeclarations: None -AlignEscapedNewlines: Right -AlignOperands: Align -AlignTrailingComments: true -AllowAllArgumentsOnNextLine: true -AllowAllConstructorInitializersOnNextLine: true -AllowAllParametersOfDeclarationOnNextLine: true -AllowShortEnumsOnASingleLine: true -AllowShortBlocksOnASingleLine: Never -AllowShortCaseLabelsOnASingleLine: false -AllowShortFunctionsOnASingleLine: All -AllowShortLambdasOnASingleLine: All -AllowShortIfStatementsOnASingleLine: Never -AllowShortLoopsOnASingleLine: false -AlwaysBreakAfterDefinitionReturnType: None -AlwaysBreakAfterReturnType: None -AlwaysBreakBeforeMultilineStrings: false -AlwaysBreakTemplateDeclarations: MultiLine -AttributeMacros: - - __capability -BinPackArguments: true -BinPackParameters: true -BraceWrapping: - AfterCaseLabel: false - AfterClass: false - AfterControlStatement: Never - AfterEnum: false - AfterFunction: false - AfterNamespace: false - AfterObjCDeclaration: false - AfterStruct: false - AfterUnion: false - AfterExternBlock: false - BeforeCatch: false - BeforeElse: false - BeforeLambdaBody: false - BeforeWhile: false - IndentBraces: false - SplitEmptyFunction: true - SplitEmptyRecord: true - SplitEmptyNamespace: true -BreakBeforeBinaryOperators: None -BreakBeforeConceptDeclarations: true -BreakBeforeBraces: Attach -BreakBeforeInheritanceComma: false -BreakInheritanceList: BeforeColon -BreakBeforeTernaryOperators: true -BreakConstructorInitializersBeforeComma: false -BreakConstructorInitializers: BeforeColon -BreakAfterJavaFieldAnnotations: false -BreakStringLiterals: true -ColumnLimit: 80 -CommentPragmas: '^ IWYU pragma:' -CompactNamespaces: false -ConstructorInitializerAllOnOneLineOrOnePerLine: false -ConstructorInitializerIndentWidth: 4 -ContinuationIndentWidth: 4 -Cpp11BracedListStyle: true -DeriveLineEnding: true -DerivePointerAlignment: false -DisableFormat: false -EmptyLineAfterAccessModifier: Never -EmptyLineBeforeAccessModifier: LogicalBlock -ExperimentalAutoDetectBinPacking: false -FixNamespaceComments: true -ForEachMacros: - - foreach - - Q_FOREACH - - BOOST_FOREACH -IfMacros: - - KJ_IF_MAYBE -IncludeBlocks: Preserve -IncludeCategories: - - Regex: '^"(llvm|llvm-c|clang|clang-c)/' - Priority: 2 - SortPriority: 0 - CaseSensitive: false - - Regex: '^(<|"(gtest|gmock|isl|json)/)' - Priority: 3 - SortPriority: 0 - CaseSensitive: false - - Regex: '.*' - Priority: 1 - SortPriority: 0 - CaseSensitive: false -IncludeIsMainRegex: '(Test)?$' -IncludeIsMainSourceRegex: '' -IndentAccessModifiers: false -IndentCaseLabels: false -IndentCaseBlocks: false -IndentGotoLabels: true -IndentPPDirectives: None -IndentExternBlock: AfterExternBlock -IndentRequires: false -IndentWidth: 4 -IndentWrappedFunctionNames: false -InsertTrailingCommas: None -JavaScriptQuotes: Leave -JavaScriptWrapImports: true -KeepEmptyLinesAtTheStartOfBlocks: true -LambdaBodyIndentation: Signature -MacroBlockBegin: '' -MacroBlockEnd: '' -MaxEmptyLinesToKeep: 1 -NamespaceIndentation: None -ObjCBinPackProtocolList: Auto -ObjCBlockIndentWidth: 2 -ObjCBreakBeforeNestedBlockParam: true -ObjCSpaceAfterProperty: false -ObjCSpaceBeforeProtocolList: true -PenaltyBreakAssignment: 2 -PenaltyBreakBeforeFirstCallParameter: 19 -PenaltyBreakComment: 300 -PenaltyBreakFirstLessLess: 120 -PenaltyBreakString: 1000 -PenaltyBreakTemplateDeclaration: 10 -PenaltyExcessCharacter: 1000000 -PenaltyReturnTypeOnItsOwnLine: 60 -PenaltyIndentedWhitespace: 0 -PointerAlignment: Right -PPIndentWidth: -1 -ReferenceAlignment: Pointer -ReflowComments: true -ShortNamespaceLines: 1 -SortIncludes: CaseSensitive -SortJavaStaticImport: Before -SortUsingDeclarations: true -SpaceAfterCStyleCast: false -SpaceAfterLogicalNot: false -SpaceAfterTemplateKeyword: true -SpaceBeforeAssignmentOperators: true -SpaceBeforeCaseColon: false -SpaceBeforeCpp11BracedList: false -SpaceBeforeCtorInitializerColon: true -SpaceBeforeInheritanceColon: true -SpaceBeforeParens: ControlStatements -SpaceAroundPointerQualifiers: Default -SpaceBeforeRangeBasedForLoopColon: true -SpaceInEmptyBlock: false -SpaceInEmptyParentheses: false -SpacesBeforeTrailingComments: 1 -SpacesInAngles: Never -SpacesInConditionalStatement: false -SpacesInContainerLiterals: true -SpacesInCStyleCastParentheses: false -SpacesInLineCommentPrefix: - Minimum: 1 - Maximum: -1 -SpacesInParentheses: false -SpacesInSquareBrackets: false -SpaceBeforeSquareBrackets: false -BitFieldColonSpacing: Both -Standard: Latest -StatementAttributeLikeMacros: - - Q_EMIT -StatementMacros: - - Q_UNUSED - - QT_REQUIRE_VERSION -TabWidth: 8 -UseCRLF: false -UseTab: Never -WhitespaceSensitiveMacros: - - STRINGIZE - - PP_STRINGIZE - - BOOST_PP_STRINGIZE - - NS_SWIFT_NAME - - CF_SWIFT_NAME -... - diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 72fec133e..000000000 --- a/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -build/ -release_build*/ -*#* -*~ -.cache -benchmark/mybenchmark -.gdb_history -builddir/ -.vscode/ \ No newline at end of file diff --git a/Address_8cxx_source.html b/Address_8cxx_source.html new file mode 100644 index 000000000..85924a261 --- /dev/null +++ b/Address_8cxx_source.html @@ -0,0 +1,873 @@ + + +
+ + + + +
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
►Nbuilder | |
►Ncomparator | |
►NCostModeling | |
►Ndict | |
►Ngraph | |
►NIR | |
►Nlp | |
►Nmath | |
►Npoly | |
►Nprettyprinters | |
►Nstd | |
►Ntarget | |
►Nutils | |
CMockGraph | |
CMockVertex | |
CTestLoopFunction | |
CTrieWrap | |
CTurboLoop | |
CTurboLoopPass |
+ LoopModels
+
+ |
+
This is the complete list of members for CostModeling::Hard::LoopTreeCostFn, including all inherited members.
+LoopTreeCostFn(alloc::Arena<> *alloc, IR::Loop *root, target::Machine< TTI > target, int loop_count) (defined in CostModeling::Hard::LoopTreeCostFn) | CostModeling::Hard::LoopTreeCostFn | inline |
optimize() -> OptResult (defined in CostModeling::Hard::LoopTreeCostFn) | CostModeling::Hard::LoopTreeCostFn | inline |
size() const -> ptrdiff_t (defined in CostModeling::Hard::LoopTreeCostFn) | CostModeling::Hard::LoopTreeCostFn | inline |
+ LoopModels
+
+ |
+
+Classes | |
struct | OptResult |
+Public Member Functions | |
+auto | optimize () -> OptResult |
+template<bool TTI> | |
LoopTreeCostFn (alloc::Arena<> *alloc, IR::Loop *root, target::Machine< TTI > target, int loop_count) | |
+constexpr auto | size () const -> ptrdiff_t |
memcost = I*J*(Ui*Uj*C_{Al} + Uj*C_{yl}) / (Ui*Uj) + I*(C_{xl}*Ui + C_{xs}*Ui) / Ui cthroughput = I*J*(Ui*Uj*C_{t,fma}) / (Ui*Uj) + I*(Ui*C_{t,add}*(Uj-1)) / Ui Ui clatency = I*J*C_{l,fma}/smin(Ui*Uj, C_{l,fma}/C_{t,fma}) + I*C_{l,add}*log2(Uj)
+Here, we define a cost fn that can be optimized to produce
+vectorization and unrolling factors. We assemble all addrs into a vector, sorted by depth first traversal order of the loop tree, e.g. A(0) --> B(1) --> C(2) --> D(3) -> E(5) --> F(6) -> G(4) -> H(7) --> I(8) --> J(9) Focusing only on memory addresses initially... The cost of a particular read/write can be looked up from LLVM as a function of scalar/gather/scatter/broadcast/contiguous. Then this can be adjusted by the product of all unroll factors of loops it depends on, divided by the product of all unroll factors of all containing loops. To optimize, we can branch and bound. Unrolling factors lead to a natural relaxation that plays well, but less so for binary variables like which loop is vectorized. Additionally, patterns such as replacing gather/scatters with shuffle sequences need special handling, that restricts the branch and bound to powers of 2. To be able to build such a cost model, we need to estimate the number of live variables as a result of unroll factors, in order to impose constraints.
+We use soft constraints for register pressuring, representing the store/reload pair of a spill.
+Furthermore, we also need to consider the possibility of dependency chains. Consider, for example
for (ptrdiff_t i = 0; i < I; ++i){ + eltype_t<A> xi = x[i]; + for (ptrdiff_t j = 0; j < J; ++j) + xi += A[i][j] * y[j]; + x[i] = xi; +} +
The j
loop itself has a dependency chain. Two options for addressing this:
j
, cloning the accumulation registers, and reducing at the end.i
loop. The second option is better, but may not be possible, e.g. if there is no i
loop or it carries some dependency. Thus, we want our model to unroll i
when legal, and unroll j
otherwise. Assuming a throughput of 2 fma/cycle and a latency of 4 cycles, an estimate of the cost as a function of I, J, Ui, and Uj is (ignoring vectorization): 4*I*J/min(Ui*Uj, 2*4) + 4*I*log2(Uj) The first term is latency per fma (because of the dependency chain) * the number of iterations, divided by however many unrolling allows us to have inflight. The second term is for the reduction of the cloned Uj
accumulators. Each step in the reduction has a latency of 4 cycles, and we need to do log2(Uj)
steps.Note, y-softplus(l*(y-x))/l
is a good smooth minimum function, monotonic in x
and differentiable everywhere. l
controls sharpness. Likewise, y+softplus(l*(x-y))/l
for max
.
Thus, a cost function for the above gemv could be something like memcost = I*J*(Ui*Uj*C_{Al} + Uj*C_{yl}) / (Ui*Uj) + I*(C_{xl}*Ui + C_{xs}*Ui) / Ui cthroughput = I*J*(Ui*Uj*C_{t,fma}) / (Ui*Uj) + I*(C_{t,add}*(Uj-1)) / Ui clatency = I*J*C_{l,fma}/smin(Ui*Uj, C_{l,fma}/C_{t,fma}) + I*C_{l,add}*log2(Uj) cost = memcost + std::max(cthroughput, clatency) or, if the it is easier to solve: cost = memcost + cthroughput + clatency
+We may initially want to add a small cost for loop increment and cmp/branch, to encourage unrolling more generally, plus a cost for unrolling to discourse any excess unrolling when it doesn't provide meaningful benefits (representing the general cost of code size/ filling uop cache – we definitely want loops to fit in the uop cache of any CPU sporting one!!! ).
+Note that if we had
for (ptrdiff_t i = 0; i < I; ++i){ + eltype_t<A> yi = y[i]; + for (ptrdiff_t j = 0; j < J; ++j) + x[j] += A[i][j] * yi; +} +
then unrolling the i
loop doesn't increase OOO (Out Of Order execution), but we can assume that as successive j
iterations are independent/do not have a dependency chain, this isn't an issue. That is, we only consider reductions across the inner-most loop as requiring cloning of accumulators.
On throughput modeling, LLVM seems to generally give a recip throughput of 1 for pipelined instructions, regardless of number of ports. This is actually what we want, as this allows RTs to be additive (e.g., we may have a fma that is able to run on 2 ports (e.g. p0 or p5) and a permute that can only execute on one (e.g. p5); when mixing these instructions, they have the same effective cost – they use a port – and the more limited port choices of one isn't a problem so long as others can use what remains. For our purposes, it isn't worth getting too fancy here. It is worth noting that the baseline model presented here https://arxiv.org/pdf/2107.14210.pdf performed respectively well when compared to vastly more sophisticated tools; for example, it performed similarly well as llvm-mca on most tested architectures! The baseline model used above for loops was max(1, (n-1)/i, m_r/m, m_w/w) where n - the number of instructions in the benchmark (-1 because of assumption that the cmp and branch are macro-fused, meaning the last two instructions count as 1) m_r - number of memory reads m_w - number of memory writes i - the issue width, e.g. 4 for Intel Skylake CPUs. m - number of reads the CPU can do per cycle (2 for all in the article) w - number of writes the CPU can do per cycle (e.g. 2 for Ice Lake and newer, 1 for older) Unfortunately, we cannot get the CPU-specific information (i
,m
,orw
) from LLVM. However, these are largely a matter of scale, and are generally correlated. E.g., Intel's Alderlake's values would be 6, 3, and 2, vs the older Skylake's 4, 2, and 1. While not all the ratios are equal (w
's is 2 instead of 1.5), it is unlikely that many optimization decisions are going to be made differently between them. A possible exception is that we may wish to unroll more for CPUs with more out of order execution abilities. getMaxInterleaveFactor
is an indicator of whether the pipeline might be very narrow.
Given x[a*i + b*j]
, where neither i
or j
are vectorized (and a
and b
are compile time constants), we use: (a_g*U_i + b_g*U_j - a_g*b_g) / (U_i*U_j) = a_g/U_j + b_g/U_i - a_g*b_g / (U_i*U_j) = 1 - (1 - a_g/U_j ) * (1 - b_g/U_i) as the cost, where a_g = abs(a/gcd(a,b))
and b_g = abs(b/gcd(a,b))
.
For more, we generalize this pattern = 1 - \prod_{d}^{D}\left(1 - \frac{coef_{g,d}U_d}{\prod_{i}^{D}U_i}\right)
+In the D=3
case, this expands to 1 - (1 - a_g/(U_j*U_k))(1 - b_g/(U_i*U_k))(1 - c_g/(U_i*U_j)) = 1 - (1 - c_g/(U_i*U_j))* (1 - a_g/(U_j*U_k) - b_g/(U_i*U_k)) + a_g*b_g/(U_i*U_j*U_k^2)) = a_g/(U_j*U_k) + b_g/(U_i*U_k)) + c_g/(U_i*U_j) - a_g*b_g/(U_i*U_j*U_k^2))
TODO: check the degree of correctness... I kind of just made something up that looks sort of right.
+For register consumption, we
Loads from inner unrolls that don't depend on any outer-unrolls must have lifetimes spanning all outer-unrolls, if they're re-used by an op depending on that outer. Our heuristic for ordering unrolls is based on the twin observations:
As the ordering of unrolls influences register pressure, we sort them first by register cost per unroll (placing those with the highest register cost outside), and then by memory op cost within these categories, placing the highest costs innermost (higher memory cost means lower unroll relative to the lower cost, so that we get more reuse on the higher cost operations; lower unroll means we place inside, reducing the cost of these unrolls).
+So, how do we define register cost per unroll in an unroll-order independent manner, so that we can use this for determining the order?
for (int m=0; m<M; ++m){ + for (int n=0; n<N; ++n){ + auto Cmn = C[m,n]; + for (int k=0; k<K; ++k) + Cmn += A[m,k]*B[k,n]; + C[m,n] = Cmn; + } +} +
In this example, we have 4 ops in the inner loop A[m,k] —>*--> (Cmn +=) B[k,n] -/
+Register Costs: Amk_rc = U_m * U_k // live until use Bkn_rc = U_k * U_n // live until use Cmn_rc = U_m * U_n // live until end of loop Memory Op Costs, m-vectorized (assuming column-major): Amk_rc = L_c * U_m * U_k Bkn_rc = L_b * U_k * U_n Cmn_rc = 0 * U_m * U_n L_c > L_b, so A-contiguous load should be interior to B-broadcast load.
+As the cost function is evaluated many times, we try and move as much work to the setup as possible. Loop cost is thus divided into some structured components, and much of the interpreting work hoisted to a step defining a parameterization. Ideally, we would avoid repeating this work for different vectorization decisions. However, vectorization decisions may impact unroll ordering decisions.
+The purpose of this object is to choose unroll factors and loops to vectorize. To this end, we evaluate loop trees from outside->in. All data structures representing loop information must thus be subsettable to represent a branch of the loop tree.
+Register costs are tricky, and spills result in non-locality but we can easily place upper and lower bounds on spill costs, i.e. assume all/none get spilled and thus all/none must be reloaded. Thus, early-stopping is still feasible. The lower bound cost is max(0, live_register_count - reg_count)
. The upper bound cost is live_register_count
.
We have both intrablock and interblock spill costs. Spill costs are by BB Costs are organized as follows: LoopHeader, contains:
+ LoopModels
+
+ |
+
This is the complete list of members for CostModeling::IROptimizer, including all inherited members.
+optimize(Arena<> salloc, poly::Dependencies &deps, IR::Cache &inst, dict::set< llvm::BasicBlock * > &loopBBs, dict::set< llvm::CallBase * > &eraseCandidates, lp::LoopBlock::OptimizationResult res) -> containers::Tuple< IR::Loop *, LoopDepSatisfaction, int > (defined in CostModeling::IROptimizer) | CostModeling::IROptimizer | inlinestatic |
+ LoopModels
+
+ |
+
+Static Public Member Functions | |
+static auto | optimize (Arena<> salloc, poly::Dependencies &deps, IR::Cache &inst, dict::set< llvm::BasicBlock * > &loopBBs, dict::set< llvm::CallBase * > &eraseCandidates, lp::LoopBlock::OptimizationResult res) -> containers::Tuple< IR::Loop *, LoopDepSatisfaction, int > |
+ LoopModels
+
+ |
+
This is the complete list of members for CostModeling::IntraBlockRegisterUse, including all inherited members.
+ephemeralUse(const Unrolls &unrolls) const -> double (defined in CostModeling::IntraBlockRegisterUse) | CostModeling::IntraBlockRegisterUse | inline |
IntraBlockRegisterUse(alloc::Arena<> *alloc, const dict::Linear< uint16_t, uint16_t > &ephemeral_mask_coefs, const dict::Linear< uint16_t, uint16_t > &perennial_mask_coefs, int16_t depth1) (defined in CostModeling::IntraBlockRegisterUse) | CostModeling::IntraBlockRegisterUse | inline |
IntraBlockRegisterUse()=default (defined in CostModeling::IntraBlockRegisterUse) | CostModeling::IntraBlockRegisterUse | |
IntraBlockRegisterUse(const IntraBlockRegisterUse &)=default (defined in CostModeling::IntraBlockRegisterUse) | CostModeling::IntraBlockRegisterUse | |
operator=(const IntraBlockRegisterUse &) -> IntraBlockRegisterUse &=default (defined in CostModeling::IntraBlockRegisterUse) | CostModeling::IntraBlockRegisterUse | |
perennialUse(const Unrolls &unrolls) const -> double (defined in CostModeling::IntraBlockRegisterUse) | CostModeling::IntraBlockRegisterUse | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+constexpr auto | ephemeralUse (const Unrolls &unrolls) const -> double |
+constexpr auto | perennialUse (const Unrolls &unrolls) const -> double |
+ | IntraBlockRegisterUse (alloc::Arena<> *alloc, const dict::Linear< uint16_t, uint16_t > &ephemeral_mask_coefs, const dict::Linear< uint16_t, uint16_t > &perennial_mask_coefs, int16_t depth1) |
+constexpr | IntraBlockRegisterUse (const IntraBlockRegisterUse &)=default |
+constexpr auto | operator= (const IntraBlockRegisterUse &) -> IntraBlockRegisterUse &=default |
+ LoopModels
+
+ |
+
This is the complete list of members for CostModeling::LoopTree, including all inherited members.
+buildGraph(Arena<> salloc, IR::Cache &inst, poly::Dependencies &deps, lp::ScheduledNode *nodes) -> Pair< IR::Loop *, MutPtrVector< int32_t > > (defined in CostModeling::LoopTree) | CostModeling::LoopTree | inlinestatic |
LoopTree(Arena<> *lalloc) (defined in CostModeling::LoopTree) | CostModeling::LoopTree | inline |
LoopTree(Arena<> *lalloc, LoopTree *parent_) (defined in CostModeling::LoopTree) | CostModeling::LoopTree | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+constexpr | LoopTree (Arena<> *lalloc) |
+constexpr | LoopTree (Arena<> *lalloc, LoopTree *parent_) |
+Static Public Member Functions | |
+static auto | buildGraph (Arena<> salloc, IR::Cache &inst, poly::Dependencies &deps, lp::ScheduledNode *nodes) -> Pair< IR::Loop *, MutPtrVector< int32_t > > |
LoopTree A tree of loops, with an indexable vector of IR::Loop*s, to facilitate construction of the IR::Loop graph, from the fusion omegas
+
+ LoopModels
+
+ |
+
This is the complete list of members for CostModeling::Register::BBState, including all inherited members.
+
+ LoopModels
+
+ |
+
+Public Member Functions | |
+ | BBState (int numBlk) |
+void | checkpoint () |
+void | free (IR::Instruction *lastuse) |
+void | defPerennialVar (uint16_t m) |
+void | defEphemeralVar (uint16_t m) |
+void | usePerennial (uint16_t m, int uidx) |
+void | usePerennialConst (bool is_accum_phi) |
adds to additional BBs, not added by useInterBlock | |
+constexpr auto | getBlkIdx () const -> int |
+constexpr void | incBB () |
+auto | perennial () -> math::Vector< LiveRegisters, 2 > & |
+auto | ephemeral () -> math::Vector< LiveRegisters, 2 > & |
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Addr, including all inherited members.
+Addr(Array array, llvm::Instruction *user, unsigned numLoops) | IR::Addr | inlineexplicit |
Addr(const Addr &)=delete (defined in IR::Addr) | IR::Addr | |
addUser(Arena<> *alloc, Instruction *I) noexcept (defined in IR::Value) | IR::Value | inline |
blkidx_ (defined in IR::Instruction) | IR::Instruction | protected |
calcCostContigDiscontig(target::Machine< TTI > target, int vector_width, int cacheline_bits) -> Costs (defined in IR::Addr) | IR::Addr | inline |
calcLoopDepMask(PtrMatrix< int64_t > inds) -> int (defined in IR::Addr) | IR::Addr | inlinestatic |
calcLoopMask() -> uint16_t (defined in IR::Node) | IR::Node | |
calcOrthAxes(ptrdiff_t depth1) -> OrthogonalAxes | IR::Addr | inline |
calculateCostContiguousLoadStore(target::Machine< TTI > target, unsigned vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > (defined in IR::Addr) | IR::Addr | inline |
checkDependsOnLoop(int depth) -> bool (defined in IR::Node) | IR::Node | |
checkUsedByInner() const -> bool (defined in IR::Node) | IR::Node | inline |
classof(const Node *v) -> bool (defined in IR::Addr) | IR::Addr | inlinestatic |
clearPrevNext() (defined in IR::Node) | IR::Node | inline |
clearVisited0() (defined in IR::Node) | IR::Node | inline |
clearVisited1() (defined in IR::Node) | IR::Node | inline |
construct(Arena<> *alloc, Array array, llvm::Instruction *user, PtrMatrix< int64_t > indMat, unsigned nOff, PtrVector< int64_t > constOffsets, int64_t *dynOffsetPtr, unsigned maxNumLoops, poly::Loop *pl=nullptr) -> Valid< Addr > | IR::Addr | inlinestatic |
construct(Arena<> *alloc, Array array, llvm::Type *elt, PtrMatrix< int64_t > indMat, unsigned nOff, PtrVector< int64_t > constOffsets, int64_t *dynOffsetPtr, unsigned maxNumLoops, bool isStow, poly::Loop *pl=nullptr) -> Valid< Addr > (defined in IR::Addr) | IR::Addr | inlinestatic |
CostKind typedef (defined in IR::Instruction) | IR::Instruction | |
currentDepth1 | IR::Node | protected |
dependsOnIndVars(size_t d) -> bool (defined in IR::Addr) | IR::Addr | inline |
eachAddr() (defined in IR::Addr) | IR::Addr | inline |
forEach(const auto &f) (defined in IR::Node) | IR::Node | inline |
fromBehind() -> bool (defined in IR::Addr) | IR::Addr | inline |
fromFront() -> bool (defined in IR::Addr) | IR::Addr | inline |
getAffineLoop() -> Valid< poly::Loop > (defined in IR::Addr) | IR::Addr | inline |
getAffLoop() const -> Valid< poly::Loop > (defined in IR::Addr) | IR::Addr | inline |
getAlign(llvm::Instruction *instr) -> llvm::Align (defined in IR::Addr) | IR::Addr | inlinestatic |
getAlign() const -> llvm::Align (defined in IR::Addr) | IR::Addr | inline |
getArray() const -> Array (defined in IR::Addr) | IR::Addr | inline |
getArrayPointer() const -> Valid< Value > (defined in IR::Addr) | IR::Addr | inline |
getBasicBlock() -> llvm::BasicBlock * (defined in IR::Addr) | IR::Addr | inline |
getBlkIdx() const -> int | IR::Instruction | inline |
getChild() const -> Node * (defined in IR::Node) | IR::Node | inline |
getCurrentDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getDenominator() -> int64_t & (defined in IR::Addr) | IR::Addr | inline |
getDenominator() const -> int64_t (defined in IR::Addr) | IR::Addr | inline |
getEdgeIn() const -> int32_t (defined in IR::Addr) | IR::Addr | inline |
getEdgeOut() const -> int32_t (defined in IR::Addr) | IR::Addr | inline |
getFusionOmega() -> MutPtrVector< int64_t > | IR::Addr | inline |
getFusionOmega() const -> PtrVector< int64_t > | IR::Addr | inline |
getHoistFlag() -> numbers::Flag8 | IR::Addr | inline |
getInstKind(llvm::Instruction *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getInstruction() -> llvm::Instruction * (defined in IR::Addr) | IR::Addr | inline |
getInstruction() const -> const llvm::Instruction * (defined in IR::Addr) | IR::Addr | inline |
getKind() const -> ValKind (defined in IR::Node) | IR::Node | inline |
getKind(llvm::Value *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getL2Align(llvm::Instruction *I) -> u8 (defined in IR::Addr) | IR::Addr | inlinestatic |
getL2Align(llvm::Align a) -> u8 (defined in IR::Addr) | IR::Addr | inlinestatic |
getL2Align(llvm::Type *T) -> u8 (defined in IR::Addr) | IR::Addr | inlinestatic |
getLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getMaxDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNaturalDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNext() const -> Node * (defined in IR::Node) | IR::Node | inline |
getNextAddr() -> Addr * (defined in IR::Addr) | IR::Addr | inline |
getNextAddr() const -> const Addr * (defined in IR::Addr) | IR::Addr | inline |
getNode() -> lp::ScheduledNode * (defined in IR::Addr) | IR::Addr | inline |
getNode() const -> const lp::ScheduledNode * (defined in IR::Addr) | IR::Addr | inline |
getNumScalarBits() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getNumScalarBytes() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getOffsetOmega() -> MutPtrVector< int64_t > (defined in IR::Addr) | IR::Addr | inline |
getOffsetOmega() const -> PtrVector< int64_t > (defined in IR::Addr) | IR::Addr | inline |
getOrthAxes() const -> OrthogonalAxes (defined in IR::Addr) | IR::Addr | inline |
getParent() const -> Node * (defined in IR::Node) | IR::Node | inline |
getPredicate() const -> Value * (defined in IR::Addr) | IR::Addr | inline |
getPrev() const -> Node * (defined in IR::Node) | IR::Node | inline |
getReductionDst() const -> Instruction * | IR::Value | inline |
getSizes() const -> PtrVector< Value * > (defined in IR::Addr) | IR::Addr | inline |
getStoredVal() const -> Value * | IR::Addr | inline |
getStoredValPtr() -> Value ** (defined in IR::Addr) | IR::Addr | inline |
getSubLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getSymbolicOffsets() const -> PtrVector< Value * > (defined in IR::Addr) | IR::Addr | inline |
getSymbolicOffsets() -> MutPtrVector< Value * > (defined in IR::Addr) | IR::Addr | inline |
getTopIdx() const -> int | IR::Instruction | inline |
getTopPosition() const -> int32_t (defined in IR::Addr) | IR::Addr | inline |
getType() const -> llvm::Type * | IR::Value | inline |
getType(unsigned width) const -> llvm::Type * (defined in IR::Value) | IR::Value | inline |
getUsers() -> Users & | IR::Addr | inline |
getUsers() const noexcept -> const Users & (defined in IR::Value) | IR::Value | inline |
getVisitDepth0() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
getVisitDepth1() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
hoist(IR::Loop *P, int depth, IR::Loop *S) (defined in IR::Node) | IR::Node | |
hoistedBehind() (defined in IR::Addr) | IR::Addr | inline |
hoistedInFront() (defined in IR::Addr) | IR::Addr | inline |
incrementNumDynSym(ptrdiff_t numToPeel) (defined in IR::Addr) | IR::Addr | inline |
indexedByInnermostLoop() -> bool (defined in IR::Addr) | IR::Addr | inline |
indexMatrix() -> MutDensePtrMatrix< int64_t > | IR::Addr | inline |
indexMatrix() const -> DensePtrMatrix< int64_t > | IR::Addr | inline |
indMatPtr() const -> int64_t * (defined in IR::Addr) | IR::Addr | inline |
insertAfter(Node *n) | IR::Node | inline |
insertAhead(Node *n) | IR::Node | inline |
insertChild(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
insertNextAddr(Addr *a) -> Addr * | IR::Addr | inline |
insertParent(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
Instruction(ValKind kind_, llvm::Type *t) | IR::Instruction | inlineprotected |
Instruction(ValKind kind_, unsigned depth, llvm::Type *t) (defined in IR::Instruction) | IR::Instruction | inlineprotected |
Instruction(ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) (defined in IR::Instruction) | IR::Instruction | inlineprotected |
Instruction(ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) (defined in IR::Instruction) | IR::Instruction | inlineprotected |
intMemNeeded(size_t numLoops, size_t dim) -> size_t (defined in IR::Addr) | IR::Addr | inlinestatic |
intMemNeededFuseFree(size_t numLoops, size_t dim) -> size_t (defined in IR::Addr) | IR::Addr | inlinestatic |
isDropped() const -> bool (defined in IR::Addr) | IR::Addr | inline |
isLoad() const -> bool (defined in IR::Value) | IR::Value | inline |
isStore() const -> bool | IR::Value | inline |
kind (defined in IR::Node) | IR::Node | protected |
linkReductionDst(Instruction *op) | IR::Value | inline |
loopdeps | IR::Node | protected |
loopMask() -> int | IR::Addr | inline |
loopMask() const -> int (defined in IR::Node) | IR::Node | inline |
maxDepth (defined in IR::Node) | IR::Node | protected |
mergeHoistFlag(IR::Addr *other) (defined in IR::Addr) | IR::Addr | inline |
Node(ValKind kind_) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned depth) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) (defined in IR::Node) | IR::Node | inlineprotected |
nodes() noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > | IR::Node | inline |
nodes() const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > (defined in IR::Node) | IR::Node | inline |
numDim() const -> ptrdiff_t (defined in IR::Addr) | IR::Addr | inline |
offsetMatrix() -> MutDensePtrMatrix< int64_t > (defined in IR::Addr) | IR::Addr | inline |
offsetMatrix() const -> DensePtrMatrix< int64_t > (defined in IR::Addr) | IR::Addr | inline |
peelLoops(ptrdiff_t numToPeel) -> ptrdiff_t (defined in IR::Node) | IR::Node | inline |
prependOrigAddr(Addr *a) -> Addr * (defined in IR::Addr) | IR::Addr | inline |
printName(std::ostream &os) const -> std::ostream & (defined in IR::Instruction) | IR::Instruction | inline |
reduction_dst_ (defined in IR::Value) | IR::Value | protected |
reload(Arena<> *alloc) -> Valid< Addr > (defined in IR::Addr) | IR::Addr | inline |
removeFromList() -> Node * (defined in IR::Node) | IR::Node | inline |
removeFromUsers(Instruction *I) (defined in IR::Value) | IR::Value | inline |
rotate(Arena<> alloc, Valid< poly::Loop > explicitLoop, SquarePtrMatrix< int64_t > Pinv, int64_t denom, PtrVector< int64_t > omega, int64_t *offsets) | IR::Addr | inline |
sameBlock(const Node *other) const -> bool (defined in IR::Node) | IR::Node | inline |
setChild(Node *n) -> Node * | IR::Node | inline |
setCurrentDepth(int d) (defined in IR::Node) | IR::Node | inline |
setEdgeIn(int32_t id) (defined in IR::Addr) | IR::Addr | inline |
setEdgeOut(int32_t id) (defined in IR::Addr) | IR::Addr | inline |
setFusionOmega(MutPtrVector< int > o) | IR::Addr | inline |
setL2Alignment(u8 l2_align_) (defined in IR::Addr) | IR::Addr | inline |
setLoopNest(poly::Loop *L) (defined in IR::Addr) | IR::Addr | inline |
setNext(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setNextAddr(Addr *a) -> Addr * | IR::Addr | inline |
setNode(lp::ScheduledNode *n) (defined in IR::Addr) | IR::Addr | inline |
setOffSym(int64_t *off_sym) (defined in IR::Addr) | IR::Addr | inline |
setParent(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParentLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setPosition(std::array< int, 2 > newidx) -> std::array< int, 2 > (defined in IR::Instruction) | IR::Instruction | inline |
setPredicate(Node *n) (defined in IR::Addr) | IR::Addr | inline |
setPrev(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setSubLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setTopPosition(int32_t pos) (defined in IR::Addr) | IR::Addr | inline |
setUsedByInner() (defined in IR::Node) | IR::Node | inline |
setUsers(const Users &other) noexcept (defined in IR::Value) | IR::Value | inline |
setVal(Arena<> *alloc, Value *n) (defined in IR::Addr) | IR::Addr | inline |
sizesMatch(Valid< const Addr > x) const -> bool (defined in IR::Addr) | IR::Addr | inline |
topidx_ (defined in IR::Instruction) | IR::Instruction | protected |
usedByLoop | IR::Node | protected |
users (defined in IR::Value) | IR::Value | protected |
ValKind enum name (defined in IR::Node) | IR::Node | |
Value(ValKind kind_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned depth, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
verify() (defined in IR::Node) | IR::Node | inline |
visit0(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visit1(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visitDepth0 (defined in IR::Node) | IR::Node | protected |
visitDepth1 (defined in IR::Node) | IR::Node | protected |
visited0(uint8_t d) const -> bool | IR::Node | inline |
visited1(uint8_t d) const -> bool | IR::Node | inline |
VK_Bflt enum value (defined in IR::Node) | IR::Node | |
VK_Bint enum value (defined in IR::Node) | IR::Node | |
VK_Call enum value (defined in IR::Node) | IR::Node | |
VK_Cflt enum value (defined in IR::Node) | IR::Node | |
VK_Cint enum value (defined in IR::Node) | IR::Node | |
VK_CVal enum value (defined in IR::Node) | IR::Node | |
VK_Exit enum value (defined in IR::Node) | IR::Node | |
VK_FArg enum value (defined in IR::Node) | IR::Node | |
VK_Func enum value (defined in IR::Node) | IR::Node | |
VK_Load enum value (defined in IR::Node) | IR::Node | |
VK_Loop enum value (defined in IR::Node) | IR::Node | |
VK_Oprn enum value (defined in IR::Node) | IR::Node | |
VK_PhiN enum value (defined in IR::Node) | IR::Node | |
VK_Stow enum value (defined in IR::Node) | IR::Node | |
wasDropped() const -> bool (defined in IR::Node) | IR::Node | inline |
zeroDim(Arena<> *alloc, Array array, llvm::Instruction *loadOrStore, unsigned numLoops) (defined in IR::Addr) | IR::Addr | inlinestatic |
+ LoopModels
+
+ |
+
+Classes | |
struct | Costs |
+Public Member Functions | |
+constexpr auto | indMatPtr () const -> int64_t * |
+constexpr auto | offsetMatrix () -> MutDensePtrMatrix< int64_t > |
+constexpr auto | getOrthAxes () const -> OrthogonalAxes |
+constexpr void | hoistedInFront () |
+constexpr void | hoistedBehind () |
constexpr auto | getHoistFlag () -> numbers::Flag8 |
+constexpr auto | fromBehind () -> bool |
+constexpr auto | fromFront () -> bool |
+constexpr void | mergeHoistFlag (IR::Addr *other) |
constexpr auto | calcOrthAxes (ptrdiff_t depth1) -> OrthogonalAxes |
+constexpr auto | isDropped () const -> bool |
+constexpr void | setTopPosition (int32_t pos) |
+constexpr auto | getTopPosition () const -> int32_t |
Addr (Array array, llvm::Instruction *user, unsigned numLoops) | |
constexpr void | rotate (Arena<> alloc, Valid< poly::Loop > explicitLoop, SquarePtrMatrix< int64_t > Pinv, int64_t denom, PtrVector< int64_t > omega, int64_t *offsets) |
+constexpr auto | indexedByInnermostLoop () -> bool |
+constexpr auto | eachAddr () |
+constexpr auto | getNextAddr () -> Addr * |
+constexpr auto | getNextAddr () const -> const Addr * |
+constexpr auto | prependOrigAddr (Addr *a) -> Addr * |
constexpr auto | insertNextAddr (Addr *a) -> Addr * |
constexpr auto | setNextAddr (Addr *a) -> Addr * |
+ | Addr (const Addr &)=delete |
+constexpr void | setEdgeIn (int32_t id) |
+constexpr void | setEdgeOut (int32_t id) |
+constexpr auto | getEdgeIn () const -> int32_t |
+constexpr auto | getEdgeOut () const -> int32_t |
+constexpr void | setLoopNest (poly::Loop *L) |
+constexpr auto | getNode () -> lp::ScheduledNode * |
+constexpr auto | getNode () const -> const lp::ScheduledNode * |
+constexpr void | setNode (lp::ScheduledNode *n) |
constexpr void | setFusionOmega (MutPtrVector< int > o) |
+auto | reload (Arena<> *alloc) -> Valid< Addr > |
+constexpr auto | getSizes () const -> PtrVector< Value * > |
+constexpr auto | getSymbolicOffsets () const -> PtrVector< Value * > |
+constexpr auto | getSymbolicOffsets () -> MutPtrVector< Value * > |
+constexpr auto | getArrayPointer () const -> Valid< Value > |
+constexpr auto | dependsOnIndVars (size_t d) -> bool |
+constexpr auto | getAffLoop () const -> Valid< poly::Loop > |
constexpr auto | loopMask () -> int |
constexpr auto | getStoredVal () const -> Value * |
+constexpr auto | getStoredValPtr () -> Value ** |
+constexpr void | setVal (Arena<> *alloc, Value *n) |
+constexpr auto | getPredicate () const -> Value * |
+constexpr void | setPredicate (Node *n) |
constexpr auto | getUsers () -> Users & |
+constexpr auto | getArray () const -> Array |
+constexpr auto | numDim () const -> ptrdiff_t |
+auto | getInstruction () -> llvm::Instruction * |
+auto | getBasicBlock () -> llvm::BasicBlock * |
+auto | getInstruction () const -> const llvm::Instruction * |
+auto | getAlign () const -> llvm::Align |
+constexpr void | setL2Alignment (u8 l2_align_) |
+constexpr auto | getDenominator () -> int64_t & |
+constexpr auto | getDenominator () const -> int64_t |
+constexpr auto | getOffsetOmega () -> MutPtrVector< int64_t > |
+constexpr auto | getOffsetOmega () const -> PtrVector< int64_t > |
constexpr auto | indexMatrix () -> MutDensePtrMatrix< int64_t > |
constexpr auto | indexMatrix () const -> DensePtrMatrix< int64_t > |
constexpr auto | getFusionOmega () -> MutPtrVector< int64_t > |
constexpr auto | getFusionOmega () const -> PtrVector< int64_t > |
+constexpr auto | offsetMatrix () const -> DensePtrMatrix< int64_t > |
+constexpr auto | getAffineLoop () -> Valid< poly::Loop > |
+constexpr auto | sizesMatch (Valid< const Addr > x) const -> bool |
+template<size_t N, bool TTI> | |
auto | calculateCostContiguousLoadStore (target::Machine< TTI > target, unsigned vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > |
+template<bool TTI> | |
auto | calcCostContigDiscontig (target::Machine< TTI > target, int vector_width, int cacheline_bits) -> Costs |
+constexpr void | incrementNumDynSym (ptrdiff_t numToPeel) |
+constexpr void | setOffSym (int64_t *off_sym) |
![]() | |
+auto | printName (std::ostream &os) const -> std::ostream & |
+constexpr auto | getTopIdx () const -> int |
Gives position within the loop nest; starts at 0 . | |
constexpr auto | getBlkIdx () const -> int |
+constexpr auto | setPosition (std::array< int, 2 > newidx) -> std::array< int, 2 > |
![]() | |
+auto | printName (std::ostream &) const -> std::ostream & |
+constexpr auto | getUsers () noexcept -> Users & |
+constexpr auto | getUsers () const noexcept -> const Users & |
+constexpr void | setUsers (const Users &other) noexcept |
+constexpr void | addUser (Arena<> *alloc, Instruction *I) noexcept |
+constexpr void | removeFromUsers (Instruction *I) |
constexpr auto | isStore () const -> bool |
+constexpr auto | isLoad () const -> bool |
constexpr auto | getReductionDst () const -> Instruction * |
+constexpr void | linkReductionDst (Instruction *op) |
this->reduction_dst_ = op; | |
+constexpr auto | getType () const -> llvm::Type * |
these methods are overloaded for specific subtypes | |
+auto | getType (unsigned width) const -> llvm::Type * |
+auto | getNumScalarBits () const -> unsigned |
+auto | getNumScalarBytes () const -> unsigned |
![]() | |
+constexpr void | setUsedByInner () |
+constexpr auto | checkUsedByInner () const -> bool |
+constexpr auto | loopMask () const -> int |
+constexpr auto | peelLoops (ptrdiff_t numToPeel) -> ptrdiff_t |
+constexpr auto | checkDependsOnLoop (int depth) -> bool |
+constexpr void | visit0 (uint8_t d) |
+constexpr auto | getVisitDepth0 () const -> uint8_t |
+constexpr void | clearVisited0 () |
+constexpr auto | visited0 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr void | visit1 (uint8_t d) |
+constexpr auto | getVisitDepth1 () const -> uint8_t |
+constexpr void | clearVisited1 () |
+constexpr auto | visited1 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr auto | sameBlock (const Node *other) const -> bool |
+constexpr auto | getKind () const -> ValKind |
+constexpr auto | getCurrentDepth () const -> int |
+constexpr auto | getMaxDepth () const -> int |
+constexpr auto | getNaturalDepth () const -> int |
+constexpr auto | getParent () const -> Node * |
+constexpr auto | getChild () const -> Node * |
+constexpr auto | getPrev () const -> Node * |
+constexpr auto | getNext () const -> Node * |
+void | verify () |
+constexpr auto | setNext (Node *n) -> Node * |
+constexpr auto | setPrev (Node *n) -> Node * |
constexpr auto | setChild (Node *n) -> Node * |
+constexpr auto | setParent (Node *n) -> Node * |
+constexpr void | setParentLoop (IR::Node *L) |
+constexpr void | setSubLoop (IR::Node *L) |
+constexpr void | setCurrentDepth (int d) |
constexpr void | insertAhead (Node *n) |
constexpr void | insertAfter (Node *n) |
+constexpr void | clearPrevNext () |
+constexpr auto | wasDropped () const -> bool |
+constexpr auto | removeFromList () -> Node * |
+constexpr void | insertChild (Valid< Node > n) |
+constexpr void | insertParent (Valid< Node > n) |
+constexpr void | forEach (const auto &f) |
+constexpr auto | nodes () noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > |
Iterate through all instructions. | |
+constexpr auto | nodes () const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > |
+constexpr auto | getLoop () const noexcept -> Loop * |
+constexpr auto | calcLoopMask () -> uint16_t |
+constexpr auto | getSubLoop () const noexcept -> Loop * |
+constexpr void | hoist (IR::Loop *P, int depth, IR::Loop *S) |
+Static Public Member Functions | |
+static constexpr auto | intMemNeeded (size_t numLoops, size_t dim) -> size_t |
+static constexpr auto | intMemNeededFuseFree (size_t numLoops, size_t dim) -> size_t |
+static auto | zeroDim (Arena<> *alloc, Array array, llvm::Instruction *loadOrStore, unsigned numLoops) |
static auto | construct (Arena<> *alloc, Array array, llvm::Instruction *user, PtrMatrix< int64_t > indMat, unsigned nOff, PtrVector< int64_t > constOffsets, int64_t *dynOffsetPtr, unsigned maxNumLoops, poly::Loop *pl=nullptr) -> Valid< Addr > |
+static auto | construct (Arena<> *alloc, Array array, llvm::Type *elt, PtrMatrix< int64_t > indMat, unsigned nOff, PtrVector< int64_t > constOffsets, int64_t *dynOffsetPtr, unsigned maxNumLoops, bool isStow, poly::Loop *pl=nullptr) -> Valid< Addr > |
+static constexpr auto | classof (const Node *v) -> bool |
+static constexpr auto | calcLoopDepMask (PtrMatrix< int64_t > inds) -> int |
+static auto | getAlign (llvm::Instruction *instr) -> llvm::Align |
+static auto | getL2Align (llvm::Instruction *I) -> u8 |
+static auto | getL2Align (llvm::Align a) -> u8 |
+static auto | getL2Align (llvm::Type *T) -> u8 |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static auto | getInstKind (llvm::Instruction *v) -> ValKind |
+static auto | getKind (llvm::Value *v) -> ValKind |
+Additional Inherited Members | |
![]() | |
+using | CostKind = llvm::TargetTransformInfo::TargetCostKind |
![]() | |
enum | ValKind : uint8_t { + VK_Load +, VK_Stow +, VK_Loop +, VK_Exit +, + VK_FArg +, VK_CVal +, VK_Cint +, VK_Bint +, + VK_Cflt +, VK_Bflt +, VK_PhiN +, VK_Func +, + VK_Call +, VK_Oprn + + } |
![]() | |
constexpr | Instruction (ValKind kind_, llvm::Type *t) |
+constexpr | Instruction (ValKind kind_, unsigned depth, llvm::Type *t) |
+constexpr | Instruction (ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) |
+constexpr | Instruction (ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) |
![]() | |
+constexpr | Value (ValKind kind_, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned depth, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) |
![]() | |
+constexpr | Node (ValKind kind_) |
+constexpr | Node (ValKind kind_, unsigned depth) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) |
![]() | |
+int | topidx_ {-1} |
+int | blkidx_ {-1} |
![]() | |
+Instruction * | reduction_dst_ {nullptr} |
+Users | users |
![]() | |
+const ValKind | kind |
+uint8_t | currentDepth1: 4 {0} |
The current position, 0 means top level, 1 inside a single loop. | |
+uint8_t | maxDepth: 4 {0} |
uint8_t | usedByLoop: 1 {0} |
+uint8_t | visitDepth0: 7 {127} |
+uint8_t | visitDepth1 {255} |
uint16_t | loopdeps {std::numeric_limits<uint16_t>::max()} |
Represents a memory access that has been rotated according to some affine transform. Return the memory accesses after applying the Schedule. Let
+
+
The rows of
+
Therefore, to update the memory accesses from the old induction variables $i$ to the new variables $j$, we must simply compute the updated oldLoop->rotate(PhiInv)
+
|
+ +inlineexplicit | +
Constructor for 0 dimensional memory access public for use with std::construct_at
Perhaps it should use a passkey?
+
|
+ +inlineconstexpr | +
indexMatrix() -> arrayDim() x getNumLoops()
+ +
+
|
+ +inlinestatic | +
Constructor for regular indexing indMat is dim x numLoops
+ +
+
|
+ +inlineconstexpr | +
there are getCurrentDepth() + 1
fusion omegas, representing the lexicographical position of the address within the loop nest.
+
|
+ +inlineconstexpr | +
there are getCurrentDepth() + 1
fusion omegas, representing the lexicographical position of the address within the loop nest.
+
|
+ +inlineconstexpr | +
The hoist flag indicates whether an Addr
was hoisted in front of and/or behind loop(s) to which it originally belonged. This is used for cache optimization, to assign an addr to the original DepSummary
s to which it belongs. If an Addr
in a valley doesn't have a set hoist flag, it is currently assigned to the preceding DepSummary
. 1
indicates hoisted in front 2
indicates hoisted behind
+
|
+ +inlineconstexpr | +
Get the value stored by this instruction. invariant: this instruction must only be called if Addr
is a store! For a load, use getUsers()
to get a range of the users. Returns the parent (other than predicates).
+
|
+ +inlineconstexpr | +
Get the users of this load. invariant: this instruction must only be called if Addr
is a load! For a store, use getStoredVal()
to get the stored value. Returns the children. Otherwise, like static_cast<Value*>(this)->getUsers()
+
|
+ +inlineconstexpr | +
indexMatrix() -> arrayDim() x getNumLoops() First dimension is contiguous
+ +
+
|
+ +inlineconstexpr | +
indexMatrix() -> arrayDim() x getNumLoops() First dimension is contiguous
+ +
+
|
+ +inlineconstexpr | +
This inserts origNext
! x -> b -> y -> z m -> a -> n -> o b->insertNextAddr(a); x-> b -> a -> y -> z
+
|
+ +inlineconstexpr | +
indexMatrix, and depth indexing, goes outer <-> inner The bits of the mask go [0,...,inner,...,outer] so the bits should be read from right to left, which is the natural way to iterate over them. This also keeps masks in alignment with one another.
+ +
+
|
+ +inlineconstexpr | +
This gets called to rotate so that we can make direct comparisons down the road without needing rotations.
+ +
+
|
+ +inlineconstexpr | +
copies o
and decrements the last element it decrements, as we iterate in reverse order
+
|
+ +inlineconstexpr | +
This sets origNext
! x -> b -> y -> z m -> a -> n -> o b->setNextAddr(a); x-> b -> a -> n -> o
+ LoopModels
+
+ |
+
This is the complete list of members for IR::AddrWrapper, including all inherited members.
+addr (defined in IR::AddrWrapper) | IR::AddrWrapper | protected |
AddrWrapper(Addr *a) (defined in IR::AddrWrapper) | IR::AddrWrapper | inlineprotected |
getChild() const -> Node * (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getCurrentDepth() const -> int (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getLoop() const -> poly::Loop * (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getNaturalDepth() const -> int (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getNext() const -> Node * (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getParent() const -> Node * (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getPrev() const -> Node * (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
insertAfter(Node *n) (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
insertAhead(Node *n) (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
insertChild(Node *n) (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
insertParent(Node *n) (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
operator Addr *() (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
operator bool() (defined in IR::AddrWrapper) | IR::AddrWrapper | inlineexplicit |
operator==(const AddrWrapper &other) const -> bool (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
setChild(Node *n) (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
setParent(Node *n) (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+constexpr | operator bool () |
+constexpr auto | getChild () const -> Node * |
+constexpr auto | getParent () const -> Node * |
+constexpr auto | getNext () const -> Node * |
+constexpr auto | getPrev () const -> Node * |
+constexpr void | setChild (Node *n) |
+constexpr void | setParent (Node *n) |
+constexpr void | insertChild (Node *n) |
+constexpr void | insertParent (Node *n) |
+constexpr void | insertAfter (Node *n) |
+constexpr void | insertAhead (Node *n) |
+constexpr auto | getCurrentDepth () const -> int |
+constexpr auto | getNaturalDepth () const -> int |
+constexpr auto | operator== (const AddrWrapper &other) const -> bool |
+constexpr auto | getLoop () const -> poly::Loop * |
+constexpr | operator Addr * () |
+Protected Member Functions | |
+constexpr | AddrWrapper (Addr *a) |
+Protected Attributes | |
+Addr * | addr |
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Arrays, including all inherited members.
+emplace_back(Value *base_pointer, MutPtrVector< Value * > sizes, u8 align_shift=u8{}) -> Pair< Array, bool > (defined in IR::Arrays) | IR::Arrays | inline |
get(ptrdiff_t i) -> Array (defined in IR::Arrays) | IR::Arrays | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+constexpr auto | get (ptrdiff_t i) -> Array |
+constexpr auto | emplace_back (Value *base_pointer, MutPtrVector< Value * > sizes, u8 align_shift=u8{}) -> Pair< Array, bool > |
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Bflt, including all inherited members.
+addUser(Arena<> *alloc, Instruction *I) noexcept (defined in IR::Value) | IR::Value | inline |
Bflt(llvm::ConstantFP *v, llvm::Type *t) (defined in IR::Bflt) | IR::Bflt | inline |
calcLoopMask() -> uint16_t (defined in IR::LoopInvariant) | IR::LoopInvariant | inlinestatic |
checkDependsOnLoop(int depth) -> bool (defined in IR::Node) | IR::Node | |
checkUsedByInner() const -> bool (defined in IR::Node) | IR::Node | inline |
classof(const Node *v) -> bool (defined in IR::Bflt) | IR::Bflt | inlinestatic |
clearPrevNext() (defined in IR::Node) | IR::Node | inline |
clearVisited0() (defined in IR::Node) | IR::Node | inline |
clearVisited1() (defined in IR::Node) | IR::Node | inline |
create(Arena<> *alloc, llvm::ConstantFP *v, llvm::Type *t) -> Bflt * (defined in IR::Bflt) | IR::Bflt | inlinestatic |
currentDepth1 | IR::Node | protected |
forEach(const auto &f) (defined in IR::Node) | IR::Node | inline |
getChild() const -> Node * (defined in IR::Node) | IR::Node | inline |
getCurrentDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getInstKind(llvm::Instruction *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getKind() const -> ValKind (defined in IR::Node) | IR::Node | inline |
getKind(llvm::Value *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getMaxDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNaturalDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNext() const -> Node * (defined in IR::Node) | IR::Node | inline |
getNumScalarBits() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getNumScalarBytes() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getParent() const -> Node * (defined in IR::Node) | IR::Node | inline |
getPrev() const -> Node * (defined in IR::Node) | IR::Node | inline |
getReductionDst() const -> Instruction * | IR::Value | inline |
getSubLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getType() const -> llvm::Type * | IR::Value | inline |
getType(unsigned width) const -> llvm::Type * (defined in IR::Value) | IR::Value | inline |
getUsers() noexcept -> Users & (defined in IR::Value) | IR::Value | inline |
getUsers() const noexcept -> const Users & (defined in IR::Value) | IR::Value | inline |
getVal() const -> const llvm::APFloat & (defined in IR::Bflt) | IR::Bflt | inline |
getVisitDepth0() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
getVisitDepth1() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
hoist(IR::Loop *P, int depth, IR::Loop *S) (defined in IR::Node) | IR::Node | |
insertAfter(Node *n) | IR::Node | inline |
insertAhead(Node *n) | IR::Node | inline |
insertChild(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
insertParent(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
isLoad() const -> bool (defined in IR::Value) | IR::Value | inline |
isStore() const -> bool | IR::Value | inline |
kind (defined in IR::Node) | IR::Node | protected |
linkReductionDst(Instruction *op) | IR::Value | inline |
loopdeps | IR::Node | protected |
LoopInvariant(ValKind knd, llvm::Type *t) (defined in IR::LoopInvariant) | IR::LoopInvariant | inlineprotected |
loopMask() -> uint16_t (defined in IR::LoopInvariant) | IR::LoopInvariant | inlinestatic |
loopMask() const -> int (defined in IR::Node) | IR::Node | inline |
maxDepth (defined in IR::Node) | IR::Node | protected |
Node(ValKind kind_) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned depth) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) (defined in IR::Node) | IR::Node | inlineprotected |
nodes() noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > | IR::Node | inline |
nodes() const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > (defined in IR::Node) | IR::Node | inline |
peelLoops(ptrdiff_t numToPeel) -> ptrdiff_t (defined in IR::Node) | IR::Node | inline |
printName(std::ostream &) const -> std::ostream & (defined in IR::Value) | IR::Value | inline |
reduction_dst_ (defined in IR::Value) | IR::Value | protected |
removeFromList() -> Node * (defined in IR::Node) | IR::Node | inline |
removeFromUsers(Instruction *I) (defined in IR::Value) | IR::Value | inline |
sameBlock(const Node *other) const -> bool (defined in IR::Node) | IR::Node | inline |
setChild(Node *n) -> Node * | IR::Node | inline |
setCurrentDepth(int d) (defined in IR::Node) | IR::Node | inline |
setNext(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParent(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParentLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setPrev(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setSubLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setUsedByInner() (defined in IR::Node) | IR::Node | inline |
setUsers(const Users &other) noexcept (defined in IR::Value) | IR::Value | inline |
usedByLoop | IR::Node | protected |
users (defined in IR::Value) | IR::Value | protected |
ValKind enum name (defined in IR::Node) | IR::Node | |
Value(ValKind kind_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned depth, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
verify() (defined in IR::Node) | IR::Node | inline |
visit0(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visit1(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visitDepth0 (defined in IR::Node) | IR::Node | protected |
visitDepth1 (defined in IR::Node) | IR::Node | protected |
visited0(uint8_t d) const -> bool | IR::Node | inline |
visited1(uint8_t d) const -> bool | IR::Node | inline |
VK_Bflt enum value (defined in IR::Node) | IR::Node | |
VK_Bint enum value (defined in IR::Node) | IR::Node | |
VK_Call enum value (defined in IR::Node) | IR::Node | |
VK_Cflt enum value (defined in IR::Node) | IR::Node | |
VK_Cint enum value (defined in IR::Node) | IR::Node | |
VK_CVal enum value (defined in IR::Node) | IR::Node | |
VK_Exit enum value (defined in IR::Node) | IR::Node | |
VK_FArg enum value (defined in IR::Node) | IR::Node | |
VK_Func enum value (defined in IR::Node) | IR::Node | |
VK_Load enum value (defined in IR::Node) | IR::Node | |
VK_Loop enum value (defined in IR::Node) | IR::Node | |
VK_Oprn enum value (defined in IR::Node) | IR::Node | |
VK_PhiN enum value (defined in IR::Node) | IR::Node | |
VK_Stow enum value (defined in IR::Node) | IR::Node | |
wasDropped() const -> bool (defined in IR::Node) | IR::Node | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+ | Bflt (llvm::ConstantFP *v, llvm::Type *t) |
+constexpr auto | getVal () const -> const llvm::APFloat & |
![]() | |
+auto | printName (std::ostream &) const -> std::ostream & |
+constexpr auto | getUsers () noexcept -> Users & |
+constexpr auto | getUsers () const noexcept -> const Users & |
+constexpr void | setUsers (const Users &other) noexcept |
+constexpr void | addUser (Arena<> *alloc, Instruction *I) noexcept |
+constexpr void | removeFromUsers (Instruction *I) |
constexpr auto | isStore () const -> bool |
+constexpr auto | isLoad () const -> bool |
constexpr auto | getReductionDst () const -> Instruction * |
+constexpr void | linkReductionDst (Instruction *op) |
this->reduction_dst_ = op; | |
+constexpr auto | getType () const -> llvm::Type * |
these methods are overloaded for specific subtypes | |
+auto | getType (unsigned width) const -> llvm::Type * |
+auto | getNumScalarBits () const -> unsigned |
+auto | getNumScalarBytes () const -> unsigned |
![]() | |
+constexpr void | setUsedByInner () |
+constexpr auto | checkUsedByInner () const -> bool |
+constexpr auto | loopMask () const -> int |
+constexpr auto | peelLoops (ptrdiff_t numToPeel) -> ptrdiff_t |
+constexpr auto | checkDependsOnLoop (int depth) -> bool |
+constexpr void | visit0 (uint8_t d) |
+constexpr auto | getVisitDepth0 () const -> uint8_t |
+constexpr void | clearVisited0 () |
+constexpr auto | visited0 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr void | visit1 (uint8_t d) |
+constexpr auto | getVisitDepth1 () const -> uint8_t |
+constexpr void | clearVisited1 () |
+constexpr auto | visited1 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr auto | sameBlock (const Node *other) const -> bool |
+constexpr auto | getKind () const -> ValKind |
+constexpr auto | getCurrentDepth () const -> int |
+constexpr auto | getMaxDepth () const -> int |
+constexpr auto | getNaturalDepth () const -> int |
+constexpr auto | getParent () const -> Node * |
+constexpr auto | getChild () const -> Node * |
+constexpr auto | getPrev () const -> Node * |
+constexpr auto | getNext () const -> Node * |
+void | verify () |
+constexpr auto | setNext (Node *n) -> Node * |
+constexpr auto | setPrev (Node *n) -> Node * |
constexpr auto | setChild (Node *n) -> Node * |
+constexpr auto | setParent (Node *n) -> Node * |
+constexpr void | setParentLoop (IR::Node *L) |
+constexpr void | setSubLoop (IR::Node *L) |
+constexpr void | setCurrentDepth (int d) |
constexpr void | insertAhead (Node *n) |
constexpr void | insertAfter (Node *n) |
+constexpr void | clearPrevNext () |
+constexpr auto | wasDropped () const -> bool |
+constexpr auto | removeFromList () -> Node * |
+constexpr void | insertChild (Valid< Node > n) |
+constexpr void | insertParent (Valid< Node > n) |
+constexpr void | forEach (const auto &f) |
+constexpr auto | nodes () noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > |
Iterate through all instructions. | |
+constexpr auto | nodes () const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > |
+constexpr auto | getLoop () const noexcept -> Loop * |
+constexpr auto | calcLoopMask () -> uint16_t |
+constexpr auto | getSubLoop () const noexcept -> Loop * |
+constexpr void | hoist (IR::Loop *P, int depth, IR::Loop *S) |
+Static Public Member Functions | |
+static constexpr auto | create (Arena<> *alloc, llvm::ConstantFP *v, llvm::Type *t) -> Bflt * |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
+static constexpr auto | loopMask () -> uint16_t |
+static constexpr auto | calcLoopMask () -> uint16_t |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static auto | getInstKind (llvm::Instruction *v) -> ValKind |
+static auto | getKind (llvm::Value *v) -> ValKind |
+Additional Inherited Members | |
![]() | |
enum | ValKind : uint8_t { + VK_Load +, VK_Stow +, VK_Loop +, VK_Exit +, + VK_FArg +, VK_CVal +, VK_Cint +, VK_Bint +, + VK_Cflt +, VK_Bflt +, VK_PhiN +, VK_Func +, + VK_Call +, VK_Oprn + + } |
![]() | |
+constexpr | LoopInvariant (ValKind knd, llvm::Type *t) |
![]() | |
+constexpr | Value (ValKind kind_, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned depth, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) |
![]() | |
+constexpr | Node (ValKind kind_) |
+constexpr | Node (ValKind kind_, unsigned depth) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) |
![]() | |
+Instruction * | reduction_dst_ {nullptr} |
+Users | users |
![]() | |
+const ValKind | kind |
+uint8_t | currentDepth1: 4 {0} |
The current position, 0 means top level, 1 inside a single loop. | |
+uint8_t | maxDepth: 4 {0} |
uint8_t | usedByLoop: 1 {0} |
+uint8_t | visitDepth0: 7 {127} |
+uint8_t | visitDepth1 {255} |
uint16_t | loopdeps {std::numeric_limits<uint16_t>::max()} |
Cnst A constant value w/ respect to the loopnest.
+
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Bint, including all inherited members.
+addUser(Arena<> *alloc, Instruction *I) noexcept (defined in IR::Value) | IR::Value | inline |
Bint(llvm::ConstantInt *v, llvm::Type *t) (defined in IR::Bint) | IR::Bint | inline |
calcLoopMask() -> uint16_t (defined in IR::LoopInvariant) | IR::LoopInvariant | inlinestatic |
checkDependsOnLoop(int depth) -> bool (defined in IR::Node) | IR::Node | |
checkUsedByInner() const -> bool (defined in IR::Node) | IR::Node | inline |
classof(const Node *v) -> bool (defined in IR::Bint) | IR::Bint | inlinestatic |
clearPrevNext() (defined in IR::Node) | IR::Node | inline |
clearVisited0() (defined in IR::Node) | IR::Node | inline |
clearVisited1() (defined in IR::Node) | IR::Node | inline |
create(Arena<> *alloc, llvm::ConstantInt *v, llvm::Type *t) -> Bint * (defined in IR::Bint) | IR::Bint | inlinestatic |
currentDepth1 | IR::Node | protected |
forEach(const auto &f) (defined in IR::Node) | IR::Node | inline |
getChild() const -> Node * (defined in IR::Node) | IR::Node | inline |
getCurrentDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getInstKind(llvm::Instruction *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getKind() const -> ValKind (defined in IR::Node) | IR::Node | inline |
getKind(llvm::Value *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getMaxDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNaturalDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNext() const -> Node * (defined in IR::Node) | IR::Node | inline |
getNumScalarBits() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getNumScalarBytes() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getParent() const -> Node * (defined in IR::Node) | IR::Node | inline |
getPrev() const -> Node * (defined in IR::Node) | IR::Node | inline |
getReductionDst() const -> Instruction * | IR::Value | inline |
getSubLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getType() const -> llvm::Type * | IR::Value | inline |
getType(unsigned width) const -> llvm::Type * (defined in IR::Value) | IR::Value | inline |
getUsers() noexcept -> Users & (defined in IR::Value) | IR::Value | inline |
getUsers() const noexcept -> const Users & (defined in IR::Value) | IR::Value | inline |
getVal() const -> const llvm::APInt & (defined in IR::Bint) | IR::Bint | inline |
getVisitDepth0() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
getVisitDepth1() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
hoist(IR::Loop *P, int depth, IR::Loop *S) (defined in IR::Node) | IR::Node | |
insertAfter(Node *n) | IR::Node | inline |
insertAhead(Node *n) | IR::Node | inline |
insertChild(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
insertParent(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
isLoad() const -> bool (defined in IR::Value) | IR::Value | inline |
isOne() const (defined in IR::Bint) | IR::Bint | inline |
isStore() const -> bool | IR::Value | inline |
kind (defined in IR::Node) | IR::Node | protected |
linkReductionDst(Instruction *op) | IR::Value | inline |
loopdeps | IR::Node | protected |
LoopInvariant(ValKind knd, llvm::Type *t) (defined in IR::LoopInvariant) | IR::LoopInvariant | inlineprotected |
loopMask() -> uint16_t (defined in IR::LoopInvariant) | IR::LoopInvariant | inlinestatic |
loopMask() const -> int (defined in IR::Node) | IR::Node | inline |
maxDepth (defined in IR::Node) | IR::Node | protected |
Node(ValKind kind_) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned depth) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) (defined in IR::Node) | IR::Node | inlineprotected |
nodes() noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > | IR::Node | inline |
nodes() const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > (defined in IR::Node) | IR::Node | inline |
peelLoops(ptrdiff_t numToPeel) -> ptrdiff_t (defined in IR::Node) | IR::Node | inline |
printName(std::ostream &) const -> std::ostream & (defined in IR::Value) | IR::Value | inline |
reduction_dst_ (defined in IR::Value) | IR::Value | protected |
removeFromList() -> Node * (defined in IR::Node) | IR::Node | inline |
removeFromUsers(Instruction *I) (defined in IR::Value) | IR::Value | inline |
sameBlock(const Node *other) const -> bool (defined in IR::Node) | IR::Node | inline |
setChild(Node *n) -> Node * | IR::Node | inline |
setCurrentDepth(int d) (defined in IR::Node) | IR::Node | inline |
setNext(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParent(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParentLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setPrev(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setSubLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setUsedByInner() (defined in IR::Node) | IR::Node | inline |
setUsers(const Users &other) noexcept (defined in IR::Value) | IR::Value | inline |
usedByLoop | IR::Node | protected |
users (defined in IR::Value) | IR::Value | protected |
ValKind enum name (defined in IR::Node) | IR::Node | |
Value(ValKind kind_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned depth, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
verify() (defined in IR::Node) | IR::Node | inline |
visit0(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visit1(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visitDepth0 (defined in IR::Node) | IR::Node | protected |
visitDepth1 (defined in IR::Node) | IR::Node | protected |
visited0(uint8_t d) const -> bool | IR::Node | inline |
visited1(uint8_t d) const -> bool | IR::Node | inline |
VK_Bflt enum value (defined in IR::Node) | IR::Node | |
VK_Bint enum value (defined in IR::Node) | IR::Node | |
VK_Call enum value (defined in IR::Node) | IR::Node | |
VK_Cflt enum value (defined in IR::Node) | IR::Node | |
VK_Cint enum value (defined in IR::Node) | IR::Node | |
VK_CVal enum value (defined in IR::Node) | IR::Node | |
VK_Exit enum value (defined in IR::Node) | IR::Node | |
VK_FArg enum value (defined in IR::Node) | IR::Node | |
VK_Func enum value (defined in IR::Node) | IR::Node | |
VK_Load enum value (defined in IR::Node) | IR::Node | |
VK_Loop enum value (defined in IR::Node) | IR::Node | |
VK_Oprn enum value (defined in IR::Node) | IR::Node | |
VK_PhiN enum value (defined in IR::Node) | IR::Node | |
VK_Stow enum value (defined in IR::Node) | IR::Node | |
wasDropped() const -> bool (defined in IR::Node) | IR::Node | inline |
+ LoopModels
+
+ |
+
A constant value w/ respect to the loopnest. + More...
++Public Member Functions | |
+ | Bint (llvm::ConstantInt *v, llvm::Type *t) |
+constexpr auto | getVal () const -> const llvm::APInt & |
+bool | isOne () const |
![]() | |
+auto | printName (std::ostream &) const -> std::ostream & |
+constexpr auto | getUsers () noexcept -> Users & |
+constexpr auto | getUsers () const noexcept -> const Users & |
+constexpr void | setUsers (const Users &other) noexcept |
+constexpr void | addUser (Arena<> *alloc, Instruction *I) noexcept |
+constexpr void | removeFromUsers (Instruction *I) |
constexpr auto | isStore () const -> bool |
+constexpr auto | isLoad () const -> bool |
constexpr auto | getReductionDst () const -> Instruction * |
+constexpr void | linkReductionDst (Instruction *op) |
this->reduction_dst_ = op; | |
+constexpr auto | getType () const -> llvm::Type * |
these methods are overloaded for specific subtypes | |
+auto | getType (unsigned width) const -> llvm::Type * |
+auto | getNumScalarBits () const -> unsigned |
+auto | getNumScalarBytes () const -> unsigned |
![]() | |
+constexpr void | setUsedByInner () |
+constexpr auto | checkUsedByInner () const -> bool |
+constexpr auto | loopMask () const -> int |
+constexpr auto | peelLoops (ptrdiff_t numToPeel) -> ptrdiff_t |
+constexpr auto | checkDependsOnLoop (int depth) -> bool |
+constexpr void | visit0 (uint8_t d) |
+constexpr auto | getVisitDepth0 () const -> uint8_t |
+constexpr void | clearVisited0 () |
+constexpr auto | visited0 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr void | visit1 (uint8_t d) |
+constexpr auto | getVisitDepth1 () const -> uint8_t |
+constexpr void | clearVisited1 () |
+constexpr auto | visited1 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr auto | sameBlock (const Node *other) const -> bool |
+constexpr auto | getKind () const -> ValKind |
+constexpr auto | getCurrentDepth () const -> int |
+constexpr auto | getMaxDepth () const -> int |
+constexpr auto | getNaturalDepth () const -> int |
+constexpr auto | getParent () const -> Node * |
+constexpr auto | getChild () const -> Node * |
+constexpr auto | getPrev () const -> Node * |
+constexpr auto | getNext () const -> Node * |
+void | verify () |
+constexpr auto | setNext (Node *n) -> Node * |
+constexpr auto | setPrev (Node *n) -> Node * |
constexpr auto | setChild (Node *n) -> Node * |
+constexpr auto | setParent (Node *n) -> Node * |
+constexpr void | setParentLoop (IR::Node *L) |
+constexpr void | setSubLoop (IR::Node *L) |
+constexpr void | setCurrentDepth (int d) |
constexpr void | insertAhead (Node *n) |
constexpr void | insertAfter (Node *n) |
+constexpr void | clearPrevNext () |
+constexpr auto | wasDropped () const -> bool |
+constexpr auto | removeFromList () -> Node * |
+constexpr void | insertChild (Valid< Node > n) |
+constexpr void | insertParent (Valid< Node > n) |
+constexpr void | forEach (const auto &f) |
+constexpr auto | nodes () noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > |
Iterate through all instructions. | |
+constexpr auto | nodes () const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > |
+constexpr auto | getLoop () const noexcept -> Loop * |
+constexpr auto | calcLoopMask () -> uint16_t |
+constexpr auto | getSubLoop () const noexcept -> Loop * |
+constexpr void | hoist (IR::Loop *P, int depth, IR::Loop *S) |
+Static Public Member Functions | |
+static constexpr auto | create (Arena<> *alloc, llvm::ConstantInt *v, llvm::Type *t) -> Bint * |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
+static constexpr auto | loopMask () -> uint16_t |
+static constexpr auto | calcLoopMask () -> uint16_t |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static auto | getInstKind (llvm::Instruction *v) -> ValKind |
+static auto | getKind (llvm::Value *v) -> ValKind |
+Additional Inherited Members | |
![]() | |
enum | ValKind : uint8_t { + VK_Load +, VK_Stow +, VK_Loop +, VK_Exit +, + VK_FArg +, VK_CVal +, VK_Cint +, VK_Bint +, + VK_Cflt +, VK_Bflt +, VK_PhiN +, VK_Func +, + VK_Call +, VK_Oprn + + } |
![]() | |
+constexpr | LoopInvariant (ValKind knd, llvm::Type *t) |
![]() | |
+constexpr | Value (ValKind kind_, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned depth, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) |
![]() | |
+constexpr | Node (ValKind kind_) |
+constexpr | Node (ValKind kind_, unsigned depth) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) |
![]() | |
+Instruction * | reduction_dst_ {nullptr} |
+Users | users |
![]() | |
+const ValKind | kind |
+uint8_t | currentDepth1: 4 {0} |
The current position, 0 means top level, 1 inside a single loop. | |
+uint8_t | maxDepth: 4 {0} |
uint8_t | usedByLoop: 1 {0} |
+uint8_t | visitDepth0: 7 {127} |
+uint8_t | visitDepth1 {255} |
uint16_t | loopdeps {std::numeric_limits<uint16_t>::max()} |
A constant value w/ respect to the loopnest.
+
+ LoopModels
+
+ |
+
This is the complete list of members for IR::CVal, including all inherited members.
+addUser(Arena<> *alloc, Instruction *I) noexcept (defined in IR::Value) | IR::Value | inline |
calcLoopMask() -> uint16_t (defined in IR::LoopInvariant) | IR::LoopInvariant | inlinestatic |
checkDependsOnLoop(int depth) -> bool (defined in IR::Node) | IR::Node | |
checkUsedByInner() const -> bool (defined in IR::Node) | IR::Node | inline |
classof(const Node *v) -> bool (defined in IR::CVal) | IR::CVal | inlinestatic |
clearPrevNext() (defined in IR::Node) | IR::Node | inline |
clearVisited0() (defined in IR::Node) | IR::Node | inline |
clearVisited1() (defined in IR::Node) | IR::Node | inline |
create(Arena<> *alloc, llvm::Value *v) -> CVal * (defined in IR::CVal) | IR::CVal | inlinestatic |
currentDepth1 | IR::Node | protected |
CVal(llvm::Value *v) (defined in IR::CVal) | IR::CVal | inline |
forEach(const auto &f) (defined in IR::Node) | IR::Node | inline |
getChild() const -> Node * (defined in IR::Node) | IR::Node | inline |
getCurrentDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getInstKind(llvm::Instruction *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getKind() const -> ValKind (defined in IR::Node) | IR::Node | inline |
getKind(llvm::Value *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getMaxDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNaturalDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNext() const -> Node * (defined in IR::Node) | IR::Node | inline |
getNumScalarBits() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getNumScalarBytes() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getParent() const -> Node * (defined in IR::Node) | IR::Node | inline |
getPrev() const -> Node * (defined in IR::Node) | IR::Node | inline |
getReductionDst() const -> Instruction * | IR::Value | inline |
getSubLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getType() const -> llvm::Type * | IR::Value | inline |
getType(unsigned width) const -> llvm::Type * (defined in IR::Value) | IR::Value | inline |
getUsers() noexcept -> Users & (defined in IR::Value) | IR::Value | inline |
getUsers() const noexcept -> const Users & (defined in IR::Value) | IR::Value | inline |
getVal() const -> llvm::Value * (defined in IR::CVal) | IR::CVal | inline |
getVisitDepth0() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
getVisitDepth1() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
hoist(IR::Loop *P, int depth, IR::Loop *S) (defined in IR::Node) | IR::Node | |
insertAfter(Node *n) | IR::Node | inline |
insertAhead(Node *n) | IR::Node | inline |
insertChild(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
insertParent(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
isLoad() const -> bool (defined in IR::Value) | IR::Value | inline |
isStore() const -> bool | IR::Value | inline |
kind (defined in IR::Node) | IR::Node | protected |
linkReductionDst(Instruction *op) | IR::Value | inline |
loopdeps | IR::Node | protected |
LoopInvariant(ValKind knd, llvm::Type *t) (defined in IR::LoopInvariant) | IR::LoopInvariant | inlineprotected |
loopMask() -> uint16_t (defined in IR::LoopInvariant) | IR::LoopInvariant | inlinestatic |
loopMask() const -> int (defined in IR::Node) | IR::Node | inline |
maxDepth (defined in IR::Node) | IR::Node | protected |
Node(ValKind kind_) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned depth) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) (defined in IR::Node) | IR::Node | inlineprotected |
nodes() noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > | IR::Node | inline |
nodes() const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > (defined in IR::Node) | IR::Node | inline |
peelLoops(ptrdiff_t numToPeel) -> ptrdiff_t (defined in IR::Node) | IR::Node | inline |
printName(std::ostream &) const -> std::ostream & (defined in IR::Value) | IR::Value | inline |
reduction_dst_ (defined in IR::Value) | IR::Value | protected |
removeFromList() -> Node * (defined in IR::Node) | IR::Node | inline |
removeFromUsers(Instruction *I) (defined in IR::Value) | IR::Value | inline |
sameBlock(const Node *other) const -> bool (defined in IR::Node) | IR::Node | inline |
setChild(Node *n) -> Node * | IR::Node | inline |
setCurrentDepth(int d) (defined in IR::Node) | IR::Node | inline |
setNext(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParent(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParentLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setPrev(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setSubLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setUsedByInner() (defined in IR::Node) | IR::Node | inline |
setUsers(const Users &other) noexcept (defined in IR::Value) | IR::Value | inline |
usedByLoop | IR::Node | protected |
users (defined in IR::Value) | IR::Value | protected |
ValKind enum name (defined in IR::Node) | IR::Node | |
Value(ValKind kind_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned depth, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
verify() (defined in IR::Node) | IR::Node | inline |
visit0(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visit1(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visitDepth0 (defined in IR::Node) | IR::Node | protected |
visitDepth1 (defined in IR::Node) | IR::Node | protected |
visited0(uint8_t d) const -> bool | IR::Node | inline |
visited1(uint8_t d) const -> bool | IR::Node | inline |
VK_Bflt enum value (defined in IR::Node) | IR::Node | |
VK_Bint enum value (defined in IR::Node) | IR::Node | |
VK_Call enum value (defined in IR::Node) | IR::Node | |
VK_Cflt enum value (defined in IR::Node) | IR::Node | |
VK_Cint enum value (defined in IR::Node) | IR::Node | |
VK_CVal enum value (defined in IR::Node) | IR::Node | |
VK_Exit enum value (defined in IR::Node) | IR::Node | |
VK_FArg enum value (defined in IR::Node) | IR::Node | |
VK_Func enum value (defined in IR::Node) | IR::Node | |
VK_Load enum value (defined in IR::Node) | IR::Node | |
VK_Loop enum value (defined in IR::Node) | IR::Node | |
VK_Oprn enum value (defined in IR::Node) | IR::Node | |
VK_PhiN enum value (defined in IR::Node) | IR::Node | |
VK_Stow enum value (defined in IR::Node) | IR::Node | |
wasDropped() const -> bool (defined in IR::Node) | IR::Node | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+constexpr | CVal (llvm::Value *v) |
+constexpr auto | getVal () const -> llvm::Value * |
![]() | |
+auto | printName (std::ostream &) const -> std::ostream & |
+constexpr auto | getUsers () noexcept -> Users & |
+constexpr auto | getUsers () const noexcept -> const Users & |
+constexpr void | setUsers (const Users &other) noexcept |
+constexpr void | addUser (Arena<> *alloc, Instruction *I) noexcept |
+constexpr void | removeFromUsers (Instruction *I) |
constexpr auto | isStore () const -> bool |
+constexpr auto | isLoad () const -> bool |
constexpr auto | getReductionDst () const -> Instruction * |
+constexpr void | linkReductionDst (Instruction *op) |
this->reduction_dst_ = op; | |
+constexpr auto | getType () const -> llvm::Type * |
these methods are overloaded for specific subtypes | |
+auto | getType (unsigned width) const -> llvm::Type * |
+auto | getNumScalarBits () const -> unsigned |
+auto | getNumScalarBytes () const -> unsigned |
![]() | |
+constexpr void | setUsedByInner () |
+constexpr auto | checkUsedByInner () const -> bool |
+constexpr auto | loopMask () const -> int |
+constexpr auto | peelLoops (ptrdiff_t numToPeel) -> ptrdiff_t |
+constexpr auto | checkDependsOnLoop (int depth) -> bool |
+constexpr void | visit0 (uint8_t d) |
+constexpr auto | getVisitDepth0 () const -> uint8_t |
+constexpr void | clearVisited0 () |
+constexpr auto | visited0 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr void | visit1 (uint8_t d) |
+constexpr auto | getVisitDepth1 () const -> uint8_t |
+constexpr void | clearVisited1 () |
+constexpr auto | visited1 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr auto | sameBlock (const Node *other) const -> bool |
+constexpr auto | getKind () const -> ValKind |
+constexpr auto | getCurrentDepth () const -> int |
+constexpr auto | getMaxDepth () const -> int |
+constexpr auto | getNaturalDepth () const -> int |
+constexpr auto | getParent () const -> Node * |
+constexpr auto | getChild () const -> Node * |
+constexpr auto | getPrev () const -> Node * |
+constexpr auto | getNext () const -> Node * |
+void | verify () |
+constexpr auto | setNext (Node *n) -> Node * |
+constexpr auto | setPrev (Node *n) -> Node * |
constexpr auto | setChild (Node *n) -> Node * |
+constexpr auto | setParent (Node *n) -> Node * |
+constexpr void | setParentLoop (IR::Node *L) |
+constexpr void | setSubLoop (IR::Node *L) |
+constexpr void | setCurrentDepth (int d) |
constexpr void | insertAhead (Node *n) |
constexpr void | insertAfter (Node *n) |
+constexpr void | clearPrevNext () |
+constexpr auto | wasDropped () const -> bool |
+constexpr auto | removeFromList () -> Node * |
+constexpr void | insertChild (Valid< Node > n) |
+constexpr void | insertParent (Valid< Node > n) |
+constexpr void | forEach (const auto &f) |
+constexpr auto | nodes () noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > |
Iterate through all instructions. | |
+constexpr auto | nodes () const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > |
+constexpr auto | getLoop () const noexcept -> Loop * |
+constexpr auto | calcLoopMask () -> uint16_t |
+constexpr auto | getSubLoop () const noexcept -> Loop * |
+constexpr void | hoist (IR::Loop *P, int depth, IR::Loop *S) |
+Static Public Member Functions | |
+static constexpr auto | create (Arena<> *alloc, llvm::Value *v) -> CVal * |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
+static constexpr auto | loopMask () -> uint16_t |
+static constexpr auto | calcLoopMask () -> uint16_t |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static auto | getInstKind (llvm::Instruction *v) -> ValKind |
+static auto | getKind (llvm::Value *v) -> ValKind |
+Additional Inherited Members | |
![]() | |
enum | ValKind : uint8_t { + VK_Load +, VK_Stow +, VK_Loop +, VK_Exit +, + VK_FArg +, VK_CVal +, VK_Cint +, VK_Bint +, + VK_Cflt +, VK_Bflt +, VK_PhiN +, VK_Func +, + VK_Call +, VK_Oprn + + } |
![]() | |
+constexpr | LoopInvariant (ValKind knd, llvm::Type *t) |
![]() | |
+constexpr | Value (ValKind kind_, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned depth, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) |
![]() | |
+constexpr | Node (ValKind kind_) |
+constexpr | Node (ValKind kind_, unsigned depth) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) |
![]() | |
+Instruction * | reduction_dst_ {nullptr} |
+Users | users |
![]() | |
+const ValKind | kind |
+uint8_t | currentDepth1: 4 {0} |
The current position, 0 means top level, 1 inside a single loop. | |
+uint8_t | maxDepth: 4 {0} |
uint8_t | usedByLoop: 1 {0} |
+uint8_t | visitDepth0: 7 {127} |
+uint8_t | visitDepth1 {255} |
uint16_t | loopdeps {std::numeric_limits<uint16_t>::max()} |
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Cache, including all inherited members.
+addPredicate(Addr *A, Predicate::Set P, Predicate::Map *M) (defined in IR::Cache) | IR::Cache | inline |
addPredicate(Arena<> *alloc, Predicate::Map *m, llvm::Value *value, LLVMIRBuilder LB, TreeResult &tr) -> ptrdiff_t (defined in IR::Cache) | IR::Cache | inline |
assertFloatingPoint(llvm::Type *T) (defined in IR::Cache) | IR::Cache | inlinestatic |
Cache(llvm::Module *m) (defined in IR::Cache) | IR::Cache | inline |
complete(Compute *I, Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr) -> containers::Pair< Compute *, TreeResult > | IR::Cache | inline |
completeInstructions(Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr) -> containers::Pair< Compute *, TreeResult > (defined in IR::Cache) | IR::Cache | inline |
copyCompute(Compute *A) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createAdd(Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createArrayRef(llvm::Instruction *loadOrStore, llvm::Value *ptr, Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr, Value *&t) -> containers::Pair< Value *, TreeResult > (defined in IR::Cache) | IR::Cache | inline |
createArrayRef(llvm::Instruction *loadOrStore, llvm::Loop *L, llvm::Value *ptr, Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr, Value *&t) -> containers::Pair< Value *, TreeResult > (defined in IR::Cache) | IR::Cache | inline |
createArrayRef(llvm::Instruction *loadOrStore, const llvm::SCEV *accessFn, int numLoops, const llvm::SCEV *elSz, Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr, Value *&t) -> containers::Pair< Value *, TreeResult > (defined in IR::Cache) | IR::Cache | inline |
createBinOp(llvm::Intrinsic::ID opid, Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createCompute(llvm::Instruction *I, Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr, Value *&t) -> containers::Pair< Compute *, TreeResult > (defined in IR::Cache) | IR::Cache | inline |
createCompute(llvm::Intrinsic::ID opId, Node::ValKind opk, std::array< Value *, N > ops, llvm::Type *typ, llvm::FastMathFlags fmf) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createCompute(llvm::Intrinsic::ID opId, Node::ValKind opk, PtrVector< Value * > ops, llvm::Type *typ, llvm::FastMathFlags fmf) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createCondition(Predicate::Relation rel, Compute *instr, bool swap=false) -> Value * (defined in IR::Cache) | IR::Cache | inline |
createCondition(Predicate::Intersection pred, UList< Value * > *predicates, bool swap) -> Value * (defined in IR::Cache) | IR::Cache | inline |
createConstant(llvm::ConstantInt *c, Value *&n) -> LoopInvariant * (defined in IR::Cache) | IR::Cache | inline |
createConstant(llvm::ConstantFP *f, Value *&n) -> LoopInvariant * (defined in IR::Cache) | IR::Cache | inline |
createConstant(llvm::ConstantFP *f) -> Bflt * (defined in IR::Cache) | IR::Cache | inline |
createConstant(map< llvm::Value *, Value * > *llvmToInternalMap, llvm::ConstantFP *f) -> Bflt * (defined in IR::Cache) | IR::Cache | inline |
createConstant(llvm::Type *typ, long long v) -> Cint * (defined in IR::Cache) | IR::Cache | inline |
createConstant(llvm::Type *typ, long v) -> Cint * (defined in IR::Cache) | IR::Cache | inline |
createConstant(llvm::Type *typ, int v) -> Cint * (defined in IR::Cache) | IR::Cache | inline |
createConstant(llvm::Type *typ, double v) -> Cflt * (defined in IR::Cache) | IR::Cache | inline |
createConstantVal(llvm::Value *val, Value *&n) -> CVal * (defined in IR::Cache) | IR::Cache | inline |
createFAdd(Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createFBinOp(llvm::Intrinsic::ID opid, Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createFDiv(Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createFMul(Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createFNeg(Value *a, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createFSub(Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createInstruction(llvm::Instruction *I, Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr, Value *&t) -> containers::Pair< Value *, TreeResult > (defined in IR::Cache) | IR::Cache | inline |
createMul(Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createOperation(llvm::Intrinsic::ID opId, std::array< Value *, N > ops, llvm::Type *typ, llvm::FastMathFlags fmf) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createOperation(llvm::Intrinsic::ID opId, PtrVector< Value * > ops, llvm::Type *typ, llvm::FastMathFlags fmf) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createPhiPair(Addr *a, Addr *b, Loop *L) | IR::Cache | inline |
createSDiv(Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createSelect(Predicate::Intersection P, Value *A, Value *B, UList< Value * > *pred) -> Compute * | IR::Cache | inline |
createSItoFP(Value *a, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createSItoFP(Value *a, llvm::Type *FP, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createSqrt(Value *a, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createSub(Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createUDiv(Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createUItoFP(Value *a, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
createUItoFP(Value *a, llvm::Type *FP, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
cse(Compute *I) -> Compute * | IR::Cache | inline |
dataLayout() const -> const llvm::DataLayout & (defined in IR::Cache) | IR::Cache | inline |
descend(Arena<> *alloc, llvm::BasicBlock *BBsrc, llvm::BasicBlock *BBdst, llvm::Loop *L, LLVMIRBuilder LB, TreeResult &tr) -> std::optional< Predicate::Map > | IR::Cache | inline |
getAllocator() -> Arena<> * | IR::Cache | inline |
getArgument(llvm::Type *typ, int64_t number) -> FunArg * (defined in IR::Cache) | IR::Cache | inline |
getArrayRef(llvm::Instruction *loadOrStore, llvm::Loop *L, llvm::Value *ptr, Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr) -> containers::Pair< Value *, TreeResult > (defined in IR::Cache) | IR::Cache | inline |
getContext() const -> llvm::LLVMContext & (defined in IR::Cache) | IR::Cache | inline |
getFastMathFlags(Value *V) -> llvm::FastMathFlags (defined in IR::Cache) | IR::Cache | inlinestatic |
getOperation(llvm::Intrinsic::ID opId, std::array< Value *, N > ops, llvm::Type *typ, llvm::FastMathFlags fmf) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
getValue(llvm::Value *v, Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr) -> containers::Pair< Value *, TreeResult > | IR::Cache | inline |
getValue(llvm::Instruction *I, Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr) -> containers::Pair< Instruction *, TreeResult > (defined in IR::Cache) | IR::Cache | inline |
getValueOutsideLoop(llvm::Value *v, LLVMIRBuilder LB) -> LoopInvariant * (defined in IR::Cache) | IR::Cache | inline |
negate(Value *V) -> Value * (defined in IR::Cache) | IR::Cache | inline |
push_array(IR::Value *base, PtrVector< IR::Value * > sizes) -> Array (defined in IR::Cache) | IR::Cache | inline |
replaceAllUsesWith(Instruction *oldNode, Value *newNode) | IR::Cache | inline |
replaceUsesByUsers(Value *oldNode, Value *newNode) -> bool | IR::Cache | inline |
similarCompute(Compute *A, PtrVector< Value * > ops) -> Compute * (defined in IR::Cache) | IR::Cache | inline |
zeroDimRef(llvm::Instruction *loadOrStore, llvm::SCEVUnknown const *arrayPtr, unsigned numLoops, LLVMIRBuilder LB) -> Addr * (defined in IR::Cache) | IR::Cache | inline |
zeroDimRef(llvm::Instruction *loadOrStore, LoopInvariant *ap, unsigned numLoops) -> Addr * (defined in IR::Cache) | IR::Cache | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
auto | descend (Arena<> *alloc, llvm::BasicBlock *BBsrc, llvm::BasicBlock *BBdst, llvm::Loop *L, LLVMIRBuilder LB, TreeResult &tr) -> std::optional< Predicate::Map > |
+ | Cache (llvm::Module *m) |
+auto | dataLayout () const -> const llvm::DataLayout & |
+auto | getContext () const -> llvm::LLVMContext & |
+auto | complete (Compute *I, Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr) -> containers::Pair< Compute *, TreeResult > |
complete the operands | |
+auto | completeInstructions (Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr) -> containers::Pair< Compute *, TreeResult > |
constexpr auto | getAllocator () -> Arena<> * |
auto | cse (Compute *I) -> Compute * |
constexpr auto | replaceUsesByUsers (Value *oldNode, Value *newNode) -> bool |
void | replaceAllUsesWith (Instruction *oldNode, Value *newNode) |
auto | getValue (llvm::Value *v, Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr) -> containers::Pair< Value *, TreeResult > |
+auto | getValue (llvm::Instruction *I, Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr) -> containers::Pair< Instruction *, TreeResult > |
+auto | getValueOutsideLoop (llvm::Value *v, LLVMIRBuilder LB) -> LoopInvariant * |
+auto | createInstruction (llvm::Instruction *I, Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr, Value *&t) -> containers::Pair< Value *, TreeResult > |
+auto | createCompute (llvm::Instruction *I, Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr, Value *&t) -> containers::Pair< Compute *, TreeResult > |
+auto | zeroDimRef (llvm::Instruction *loadOrStore, llvm::SCEVUnknown const *arrayPtr, unsigned numLoops, LLVMIRBuilder LB) -> Addr * |
+auto | zeroDimRef (llvm::Instruction *loadOrStore, LoopInvariant *ap, unsigned numLoops) -> Addr * |
+auto | getArrayRef (llvm::Instruction *loadOrStore, llvm::Loop *L, llvm::Value *ptr, Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr) -> containers::Pair< Value *, TreeResult > |
+auto | createArrayRef (llvm::Instruction *loadOrStore, llvm::Value *ptr, Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr, Value *&t) -> containers::Pair< Value *, TreeResult > |
+auto | createArrayRef (llvm::Instruction *loadOrStore, llvm::Loop *L, llvm::Value *ptr, Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr, Value *&t) -> containers::Pair< Value *, TreeResult > |
+auto | createArrayRef (llvm::Instruction *loadOrStore, const llvm::SCEV *accessFn, int numLoops, const llvm::SCEV *elSz, Predicate::Map *M, LLVMIRBuilder LB, TreeResult tr, Value *&t) -> containers::Pair< Value *, TreeResult > |
+template<size_t N> | |
auto | createCompute (llvm::Intrinsic::ID opId, Node::ValKind opk, std::array< Value *, N > ops, llvm::Type *typ, llvm::FastMathFlags fmf) -> Compute * |
+auto | createCompute (llvm::Intrinsic::ID opId, Node::ValKind opk, PtrVector< Value * > ops, llvm::Type *typ, llvm::FastMathFlags fmf) -> Compute * |
+template<size_t N> | |
auto | createOperation (llvm::Intrinsic::ID opId, std::array< Value *, N > ops, llvm::Type *typ, llvm::FastMathFlags fmf) -> Compute * |
+auto | createOperation (llvm::Intrinsic::ID opId, PtrVector< Value * > ops, llvm::Type *typ, llvm::FastMathFlags fmf) -> Compute * |
+auto | copyCompute (Compute *A) -> Compute * |
+auto | similarCompute (Compute *A, PtrVector< Value * > ops) -> Compute * |
+template<size_t N> | |
auto | getOperation (llvm::Intrinsic::ID opId, std::array< Value *, N > ops, llvm::Type *typ, llvm::FastMathFlags fmf) -> Compute * |
+auto | createFBinOp (llvm::Intrinsic::ID opid, Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * |
+auto | createFAdd (Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * |
+auto | createFSub (Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * |
+auto | createFMul (Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * |
+auto | createFDiv (Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * |
+auto | createFNeg (Value *a, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * |
+auto | createSItoFP (Value *a, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * |
+auto | createSItoFP (Value *a, llvm::Type *FP, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * |
+auto | createUItoFP (Value *a, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * |
+auto | createUItoFP (Value *a, llvm::Type *FP, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * |
+auto | createSqrt (Value *a, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * |
+auto | createBinOp (llvm::Intrinsic::ID opid, Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * |
+auto | createAdd (Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * |
+auto | createSub (Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * |
+auto | createMul (Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * |
+auto | createSDiv (Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * |
+auto | createUDiv (Value *a, Value *b, llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) -> Compute * |
void | createPhiPair (Addr *a, Addr *b, Loop *L) |
+auto | createConstant (llvm::ConstantInt *c, Value *&n) -> LoopInvariant * |
+auto | createConstant (llvm::ConstantFP *f, Value *&n) -> LoopInvariant * |
+auto | createConstant (llvm::ConstantFP *f) -> Bflt * |
+auto | createConstant (map< llvm::Value *, Value * > *llvmToInternalMap, llvm::ConstantFP *f) -> Bflt * |
+auto | createConstant (llvm::Type *typ, long long v) -> Cint * |
+auto | createConstant (llvm::Type *typ, long v) -> Cint * |
+auto | createConstant (llvm::Type *typ, int v) -> Cint * |
+auto | getArgument (llvm::Type *typ, int64_t number) -> FunArg * |
+auto | createConstant (llvm::Type *typ, double v) -> Cflt * |
+auto | createConstantVal (llvm::Value *val, Value *&n) -> CVal * |
+auto | createCondition (Predicate::Relation rel, Compute *instr, bool swap=false) -> Value * |
+auto | negate (Value *V) -> Value * |
+auto | createCondition (Predicate::Intersection pred, UList< Value * > *predicates, bool swap) -> Value * |
auto | createSelect (Predicate::Intersection P, Value *A, Value *B, UList< Value * > *pred) -> Compute * |
+void | addPredicate (Addr *A, Predicate::Set P, Predicate::Map *M) |
+auto | addPredicate (Arena<> *alloc, Predicate::Map *m, llvm::Value *value, LLVMIRBuilder LB, TreeResult &tr) -> ptrdiff_t |
+auto | push_array (IR::Value *base, PtrVector< IR::Value * > sizes) -> Array |
+Static Public Member Functions | |
+static void | assertFloatingPoint (llvm::Type *T) |
+static auto | getFastMathFlags (Value *V) -> llvm::FastMathFlags |
+
|
+ +inline | +
Creates a Phi
when hoisting Load* a
and Stow* b
out of a loop. For example, we go from for (int i=0; i<I; ++i){ for (int j=0; j<J; ++j) A[i] = foo(A[i]); } to for (int i=0; i<I; ++i){ w = A[i]; for (int j=0; j<J; ++j){ x = phi(w,y); y = foo(x); } // z = phi(w,y); A[i] = x; } The semantics of our phi
nodes are that if J<=0
such that the j
loop does not iterate, x = w
. That is, it works as if we had an equivalent z = phi
definition.
+
|
+ +inline | +
if *A = [(a & b) | (c & d)] *B = [(e & f) | (g & h)] then [(a & b) | (c & d)] & [(e & f) | (g & h)] = [(a & b) & (e & f)] | [(a & b) & (g & h)] | [(c & d) & (e & f)] | [(c & d) & (g & h)] for this to be empty, we need to have [(a & b) & (e & f)] = [(a & b) & (g & h)] = [(c & d) & (e & f)] = [(c & d) & (g & h)] = 0 Suggestion: loop over union elements, and take the set of all of the conditions for each side. Then use the simpler of these two to determine the direction of the select.
+ +try to remove I
as a duplicate this travels downstream; if I
is eliminated, all users of I
get updated, making them CSE-candidates. In this manner, we travel downstream through users.
+
|
+ +inline | +
We bail if there are more than 32 conditions; control flow that branchy is probably not worth trying to vectorize.
+ +
+
|
+ +inlineconstexpr | +
Get the cache's allocator. This is a long-lived bump allocator, mass-freeing after each sub-tree optimization.
+ +
+
|
+ +inline | +
Here, we have a set of methods that take a Predicate::Map* M
and a TreeResult
argument, returning a Value*
of some kind and a TreeResult
Any operands that are not in M
will be left incomplete, and added to the incomplete list of the TreeResult
argument. If M
is nullptr
, then all operands will be left incomplete.
+
|
+ +inline | +
replaceAllUsesWith(Value *oldNode, Value *newNode) replaces all uses of oldNode
with newNode
updating the operands of all users of oldNode
and the users
of all operands of oldNode
+
|
+ +inlineconstexpr | +
void replaceUsesByUsers(Value *oldNode, Value *newNode) The name is confusing. This iterates through oldNode's users (i.e. things using oldNode), and swaps the oldNode
for newNode
in those user's operands. It checks if those users are newNode
itself, if so, it does not modify. This allows replacing x
with f(x)
, for example. For example, we may wish to replace all uses of x
with ifelse(cond, x, y)
. That feature is used for control flow merging.
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Call, including all inherited members.
+calcCallCost(target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) -> std::array< llvm::InstructionCost, N > (defined in IR::Call) | IR::Call | inline |
Call(Compute *I) (defined in IR::Call) | IR::Call | inline |
classof(const Node *v) -> bool (defined in IR::Call) | IR::Call | inlinestatic |
getIntrinsicID() const -> llvm::Intrinsic::ID (defined in IR::Call) | IR::Call | inline |
getIntrinsicID(llvm::Value *v) -> llvm::Intrinsic::ID (defined in IR::Call) | IR::Call | inlinestatic |
getNumOperands() const -> size_t (defined in IR::Call) | IR::Call | inline |
getOperand(ptrdiff_t i) -> Value * (defined in IR::Call) | IR::Call | inline |
getOperand(ptrdiff_t i) const -> Value * (defined in IR::Call) | IR::Call | inline |
getOperands() -> MutPtrVector< Value * > (defined in IR::Call) | IR::Call | inline |
getOperands() const -> PtrVector< Value * > (defined in IR::Call) | IR::Call | inline |
isIntrinsic(llvm::Intrinsic::ID opCode) const -> bool (defined in IR::Call) | IR::Call | inline |
isMulAdd() const -> bool (defined in IR::Call) | IR::Call | inline |
operator Compute *() const (defined in IR::Call) | IR::Call | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+constexpr | operator Compute * () const |
+constexpr | Call (Compute *I) |
+auto | getIntrinsicID () const -> llvm::Intrinsic::ID |
+constexpr auto | isIntrinsic (llvm::Intrinsic::ID opCode) const -> bool |
+auto | isMulAdd () const -> bool |
+auto | getOperands () -> MutPtrVector< Value * > |
+auto | getOperands () const -> PtrVector< Value * > |
+auto | getOperand (ptrdiff_t i) -> Value * |
+auto | getOperand (ptrdiff_t i) const -> Value * |
+auto | getNumOperands () const -> size_t |
+template<size_t N, bool TTI> | |
auto | calcCallCost (target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) -> std::array< llvm::InstructionCost, N > |
+Static Public Member Functions | |
+static constexpr auto | classof (const Node *v) -> bool |
+static auto | getIntrinsicID (llvm::Value *v) -> llvm::Intrinsic::ID |
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Cflt, including all inherited members.
+addUser(Arena<> *alloc, Instruction *I) noexcept (defined in IR::Value) | IR::Value | inline |
calcLoopMask() -> uint16_t (defined in IR::LoopInvariant) | IR::LoopInvariant | inlinestatic |
Cflt(double v, llvm::Type *t) (defined in IR::Cflt) | IR::Cflt | inline |
checkDependsOnLoop(int depth) -> bool (defined in IR::Node) | IR::Node | |
checkUsedByInner() const -> bool (defined in IR::Node) | IR::Node | inline |
classof(const Node *v) -> bool (defined in IR::Cflt) | IR::Cflt | inlinestatic |
clearPrevNext() (defined in IR::Node) | IR::Node | inline |
clearVisited0() (defined in IR::Node) | IR::Node | inline |
clearVisited1() (defined in IR::Node) | IR::Node | inline |
create(Arena<> *alloc, double v, llvm::Type *t) -> Cflt * (defined in IR::Cflt) | IR::Cflt | inlinestatic |
currentDepth1 | IR::Node | protected |
forEach(const auto &f) (defined in IR::Node) | IR::Node | inline |
getChild() const -> Node * (defined in IR::Node) | IR::Node | inline |
getCurrentDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getInstKind(llvm::Instruction *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getKind() const -> ValKind (defined in IR::Node) | IR::Node | inline |
getKind(llvm::Value *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getMaxDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNaturalDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNext() const -> Node * (defined in IR::Node) | IR::Node | inline |
getNumScalarBits() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getNumScalarBytes() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getParent() const -> Node * (defined in IR::Node) | IR::Node | inline |
getPrev() const -> Node * (defined in IR::Node) | IR::Node | inline |
getReductionDst() const -> Instruction * | IR::Value | inline |
getSubLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getType() const -> llvm::Type * | IR::Value | inline |
getType(unsigned width) const -> llvm::Type * (defined in IR::Value) | IR::Value | inline |
getUsers() noexcept -> Users & (defined in IR::Value) | IR::Value | inline |
getUsers() const noexcept -> const Users & (defined in IR::Value) | IR::Value | inline |
getVal() const -> double (defined in IR::Cflt) | IR::Cflt | inline |
getVisitDepth0() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
getVisitDepth1() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
hoist(IR::Loop *P, int depth, IR::Loop *S) (defined in IR::Node) | IR::Node | |
insertAfter(Node *n) | IR::Node | inline |
insertAhead(Node *n) | IR::Node | inline |
insertChild(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
insertParent(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
isLoad() const -> bool (defined in IR::Value) | IR::Value | inline |
isStore() const -> bool | IR::Value | inline |
kind (defined in IR::Node) | IR::Node | protected |
linkReductionDst(Instruction *op) | IR::Value | inline |
loopdeps | IR::Node | protected |
LoopInvariant(ValKind knd, llvm::Type *t) (defined in IR::LoopInvariant) | IR::LoopInvariant | inlineprotected |
loopMask() -> uint16_t (defined in IR::LoopInvariant) | IR::LoopInvariant | inlinestatic |
loopMask() const -> int (defined in IR::Node) | IR::Node | inline |
maxDepth (defined in IR::Node) | IR::Node | protected |
Node(ValKind kind_) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned depth) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) (defined in IR::Node) | IR::Node | inlineprotected |
nodes() noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > | IR::Node | inline |
nodes() const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > (defined in IR::Node) | IR::Node | inline |
peelLoops(ptrdiff_t numToPeel) -> ptrdiff_t (defined in IR::Node) | IR::Node | inline |
printName(std::ostream &) const -> std::ostream & (defined in IR::Value) | IR::Value | inline |
reduction_dst_ (defined in IR::Value) | IR::Value | protected |
removeFromList() -> Node * (defined in IR::Node) | IR::Node | inline |
removeFromUsers(Instruction *I) (defined in IR::Value) | IR::Value | inline |
sameBlock(const Node *other) const -> bool (defined in IR::Node) | IR::Node | inline |
setChild(Node *n) -> Node * | IR::Node | inline |
setCurrentDepth(int d) (defined in IR::Node) | IR::Node | inline |
setNext(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParent(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParentLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setPrev(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setSubLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setUsedByInner() (defined in IR::Node) | IR::Node | inline |
setUsers(const Users &other) noexcept (defined in IR::Value) | IR::Value | inline |
usedByLoop | IR::Node | protected |
users (defined in IR::Value) | IR::Value | protected |
ValKind enum name (defined in IR::Node) | IR::Node | |
Value(ValKind kind_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned depth, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
verify() (defined in IR::Node) | IR::Node | inline |
visit0(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visit1(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visitDepth0 (defined in IR::Node) | IR::Node | protected |
visitDepth1 (defined in IR::Node) | IR::Node | protected |
visited0(uint8_t d) const -> bool | IR::Node | inline |
visited1(uint8_t d) const -> bool | IR::Node | inline |
VK_Bflt enum value (defined in IR::Node) | IR::Node | |
VK_Bint enum value (defined in IR::Node) | IR::Node | |
VK_Call enum value (defined in IR::Node) | IR::Node | |
VK_Cflt enum value (defined in IR::Node) | IR::Node | |
VK_Cint enum value (defined in IR::Node) | IR::Node | |
VK_CVal enum value (defined in IR::Node) | IR::Node | |
VK_Exit enum value (defined in IR::Node) | IR::Node | |
VK_FArg enum value (defined in IR::Node) | IR::Node | |
VK_Func enum value (defined in IR::Node) | IR::Node | |
VK_Load enum value (defined in IR::Node) | IR::Node | |
VK_Loop enum value (defined in IR::Node) | IR::Node | |
VK_Oprn enum value (defined in IR::Node) | IR::Node | |
VK_PhiN enum value (defined in IR::Node) | IR::Node | |
VK_Stow enum value (defined in IR::Node) | IR::Node | |
wasDropped() const -> bool (defined in IR::Node) | IR::Node | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+constexpr | Cflt (double v, llvm::Type *t) |
+constexpr auto | getVal () const -> double |
![]() | |
+auto | printName (std::ostream &) const -> std::ostream & |
+constexpr auto | getUsers () noexcept -> Users & |
+constexpr auto | getUsers () const noexcept -> const Users & |
+constexpr void | setUsers (const Users &other) noexcept |
+constexpr void | addUser (Arena<> *alloc, Instruction *I) noexcept |
+constexpr void | removeFromUsers (Instruction *I) |
constexpr auto | isStore () const -> bool |
+constexpr auto | isLoad () const -> bool |
constexpr auto | getReductionDst () const -> Instruction * |
+constexpr void | linkReductionDst (Instruction *op) |
this->reduction_dst_ = op; | |
+constexpr auto | getType () const -> llvm::Type * |
these methods are overloaded for specific subtypes | |
+auto | getType (unsigned width) const -> llvm::Type * |
+auto | getNumScalarBits () const -> unsigned |
+auto | getNumScalarBytes () const -> unsigned |
![]() | |
+constexpr void | setUsedByInner () |
+constexpr auto | checkUsedByInner () const -> bool |
+constexpr auto | loopMask () const -> int |
+constexpr auto | peelLoops (ptrdiff_t numToPeel) -> ptrdiff_t |
+constexpr auto | checkDependsOnLoop (int depth) -> bool |
+constexpr void | visit0 (uint8_t d) |
+constexpr auto | getVisitDepth0 () const -> uint8_t |
+constexpr void | clearVisited0 () |
+constexpr auto | visited0 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr void | visit1 (uint8_t d) |
+constexpr auto | getVisitDepth1 () const -> uint8_t |
+constexpr void | clearVisited1 () |
+constexpr auto | visited1 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr auto | sameBlock (const Node *other) const -> bool |
+constexpr auto | getKind () const -> ValKind |
+constexpr auto | getCurrentDepth () const -> int |
+constexpr auto | getMaxDepth () const -> int |
+constexpr auto | getNaturalDepth () const -> int |
+constexpr auto | getParent () const -> Node * |
+constexpr auto | getChild () const -> Node * |
+constexpr auto | getPrev () const -> Node * |
+constexpr auto | getNext () const -> Node * |
+void | verify () |
+constexpr auto | setNext (Node *n) -> Node * |
+constexpr auto | setPrev (Node *n) -> Node * |
constexpr auto | setChild (Node *n) -> Node * |
+constexpr auto | setParent (Node *n) -> Node * |
+constexpr void | setParentLoop (IR::Node *L) |
+constexpr void | setSubLoop (IR::Node *L) |
+constexpr void | setCurrentDepth (int d) |
constexpr void | insertAhead (Node *n) |
constexpr void | insertAfter (Node *n) |
+constexpr void | clearPrevNext () |
+constexpr auto | wasDropped () const -> bool |
+constexpr auto | removeFromList () -> Node * |
+constexpr void | insertChild (Valid< Node > n) |
+constexpr void | insertParent (Valid< Node > n) |
+constexpr void | forEach (const auto &f) |
+constexpr auto | nodes () noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > |
Iterate through all instructions. | |
+constexpr auto | nodes () const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > |
+constexpr auto | getLoop () const noexcept -> Loop * |
+constexpr auto | calcLoopMask () -> uint16_t |
+constexpr auto | getSubLoop () const noexcept -> Loop * |
+constexpr void | hoist (IR::Loop *P, int depth, IR::Loop *S) |
+Static Public Member Functions | |
+static constexpr auto | create (Arena<> *alloc, double v, llvm::Type *t) -> Cflt * |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
+static constexpr auto | loopMask () -> uint16_t |
+static constexpr auto | calcLoopMask () -> uint16_t |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static auto | getInstKind (llvm::Instruction *v) -> ValKind |
+static auto | getKind (llvm::Value *v) -> ValKind |
+Additional Inherited Members | |
![]() | |
enum | ValKind : uint8_t { + VK_Load +, VK_Stow +, VK_Loop +, VK_Exit +, + VK_FArg +, VK_CVal +, VK_Cint +, VK_Bint +, + VK_Cflt +, VK_Bflt +, VK_PhiN +, VK_Func +, + VK_Call +, VK_Oprn + + } |
![]() | |
+constexpr | LoopInvariant (ValKind knd, llvm::Type *t) |
![]() | |
+constexpr | Value (ValKind kind_, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned depth, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) |
![]() | |
+constexpr | Node (ValKind kind_) |
+constexpr | Node (ValKind kind_, unsigned depth) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) |
![]() | |
+Instruction * | reduction_dst_ {nullptr} |
+Users | users |
![]() | |
+const ValKind | kind |
+uint8_t | currentDepth1: 4 {0} |
The current position, 0 means top level, 1 inside a single loop. | |
+uint8_t | maxDepth: 4 {0} |
uint8_t | usedByLoop: 1 {0} |
+uint8_t | visitDepth0: 7 {127} |
+uint8_t | visitDepth1 {255} |
uint16_t | loopdeps {std::numeric_limits<uint16_t>::max()} |
Cnst A constant value w/ respect to the loopnest.
+
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Cint, including all inherited members.
+addUser(Arena<> *alloc, Instruction *I) noexcept (defined in IR::Value) | IR::Value | inline |
calcLoopMask() -> uint16_t (defined in IR::LoopInvariant) | IR::LoopInvariant | inlinestatic |
checkDependsOnLoop(int depth) -> bool (defined in IR::Node) | IR::Node | |
checkUsedByInner() const -> bool (defined in IR::Node) | IR::Node | inline |
Cint(int64_t v, llvm::Type *t) (defined in IR::Cint) | IR::Cint | inline |
classof(const Node *v) -> bool (defined in IR::Cint) | IR::Cint | inlinestatic |
clearPrevNext() (defined in IR::Node) | IR::Node | inline |
clearVisited0() (defined in IR::Node) | IR::Node | inline |
clearVisited1() (defined in IR::Node) | IR::Node | inline |
create(Arena<> *alloc, int64_t v, llvm::Type *t) -> Cint * (defined in IR::Cint) | IR::Cint | inlinestatic |
currentDepth1 | IR::Node | protected |
forEach(const auto &f) (defined in IR::Node) | IR::Node | inline |
getChild() const -> Node * (defined in IR::Node) | IR::Node | inline |
getCurrentDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getInstKind(llvm::Instruction *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getKind() const -> ValKind (defined in IR::Node) | IR::Node | inline |
getKind(llvm::Value *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getMaxDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNaturalDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNext() const -> Node * (defined in IR::Node) | IR::Node | inline |
getNumScalarBits() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getNumScalarBytes() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getParent() const -> Node * (defined in IR::Node) | IR::Node | inline |
getPrev() const -> Node * (defined in IR::Node) | IR::Node | inline |
getReductionDst() const -> Instruction * | IR::Value | inline |
getSubLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getType() const -> llvm::Type * | IR::Value | inline |
getType(unsigned width) const -> llvm::Type * (defined in IR::Value) | IR::Value | inline |
getUsers() noexcept -> Users & (defined in IR::Value) | IR::Value | inline |
getUsers() const noexcept -> const Users & (defined in IR::Value) | IR::Value | inline |
getVal() const -> int64_t (defined in IR::Cint) | IR::Cint | inline |
getVisitDepth0() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
getVisitDepth1() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
hoist(IR::Loop *P, int depth, IR::Loop *S) (defined in IR::Node) | IR::Node | |
insertAfter(Node *n) | IR::Node | inline |
insertAhead(Node *n) | IR::Node | inline |
insertChild(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
insertParent(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
isLoad() const -> bool (defined in IR::Value) | IR::Value | inline |
isOne() const (defined in IR::Cint) | IR::Cint | inline |
isStore() const -> bool | IR::Value | inline |
kind (defined in IR::Node) | IR::Node | protected |
linkReductionDst(Instruction *op) | IR::Value | inline |
loopdeps | IR::Node | protected |
LoopInvariant(ValKind knd, llvm::Type *t) (defined in IR::LoopInvariant) | IR::LoopInvariant | inlineprotected |
loopMask() -> uint16_t (defined in IR::LoopInvariant) | IR::LoopInvariant | inlinestatic |
loopMask() const -> int (defined in IR::Node) | IR::Node | inline |
maxDepth (defined in IR::Node) | IR::Node | protected |
Node(ValKind kind_) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned depth) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) (defined in IR::Node) | IR::Node | inlineprotected |
nodes() noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > | IR::Node | inline |
nodes() const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > (defined in IR::Node) | IR::Node | inline |
peelLoops(ptrdiff_t numToPeel) -> ptrdiff_t (defined in IR::Node) | IR::Node | inline |
printName(std::ostream &) const -> std::ostream & (defined in IR::Value) | IR::Value | inline |
reduction_dst_ (defined in IR::Value) | IR::Value | protected |
removeFromList() -> Node * (defined in IR::Node) | IR::Node | inline |
removeFromUsers(Instruction *I) (defined in IR::Value) | IR::Value | inline |
sameBlock(const Node *other) const -> bool (defined in IR::Node) | IR::Node | inline |
setChild(Node *n) -> Node * | IR::Node | inline |
setCurrentDepth(int d) (defined in IR::Node) | IR::Node | inline |
setNext(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParent(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParentLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setPrev(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setSubLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setUsedByInner() (defined in IR::Node) | IR::Node | inline |
setUsers(const Users &other) noexcept (defined in IR::Value) | IR::Value | inline |
usedByLoop | IR::Node | protected |
users (defined in IR::Value) | IR::Value | protected |
ValKind enum name (defined in IR::Node) | IR::Node | |
Value(ValKind kind_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned depth, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
verify() (defined in IR::Node) | IR::Node | inline |
visit0(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visit1(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visitDepth0 (defined in IR::Node) | IR::Node | protected |
visitDepth1 (defined in IR::Node) | IR::Node | protected |
visited0(uint8_t d) const -> bool | IR::Node | inline |
visited1(uint8_t d) const -> bool | IR::Node | inline |
VK_Bflt enum value (defined in IR::Node) | IR::Node | |
VK_Bint enum value (defined in IR::Node) | IR::Node | |
VK_Call enum value (defined in IR::Node) | IR::Node | |
VK_Cflt enum value (defined in IR::Node) | IR::Node | |
VK_Cint enum value (defined in IR::Node) | IR::Node | |
VK_CVal enum value (defined in IR::Node) | IR::Node | |
VK_Exit enum value (defined in IR::Node) | IR::Node | |
VK_FArg enum value (defined in IR::Node) | IR::Node | |
VK_Func enum value (defined in IR::Node) | IR::Node | |
VK_Load enum value (defined in IR::Node) | IR::Node | |
VK_Loop enum value (defined in IR::Node) | IR::Node | |
VK_Oprn enum value (defined in IR::Node) | IR::Node | |
VK_PhiN enum value (defined in IR::Node) | IR::Node | |
VK_Stow enum value (defined in IR::Node) | IR::Node | |
wasDropped() const -> bool (defined in IR::Node) | IR::Node | inline |
+ LoopModels
+
+ |
+
A constant value w/ respect to the loopnest. + More...
++Public Member Functions | |
+constexpr | Cint (int64_t v, llvm::Type *t) |
+constexpr auto | getVal () const -> int64_t |
+bool | isOne () const |
![]() | |
+auto | printName (std::ostream &) const -> std::ostream & |
+constexpr auto | getUsers () noexcept -> Users & |
+constexpr auto | getUsers () const noexcept -> const Users & |
+constexpr void | setUsers (const Users &other) noexcept |
+constexpr void | addUser (Arena<> *alloc, Instruction *I) noexcept |
+constexpr void | removeFromUsers (Instruction *I) |
constexpr auto | isStore () const -> bool |
+constexpr auto | isLoad () const -> bool |
constexpr auto | getReductionDst () const -> Instruction * |
+constexpr void | linkReductionDst (Instruction *op) |
this->reduction_dst_ = op; | |
+constexpr auto | getType () const -> llvm::Type * |
these methods are overloaded for specific subtypes | |
+auto | getType (unsigned width) const -> llvm::Type * |
+auto | getNumScalarBits () const -> unsigned |
+auto | getNumScalarBytes () const -> unsigned |
![]() | |
+constexpr void | setUsedByInner () |
+constexpr auto | checkUsedByInner () const -> bool |
+constexpr auto | loopMask () const -> int |
+constexpr auto | peelLoops (ptrdiff_t numToPeel) -> ptrdiff_t |
+constexpr auto | checkDependsOnLoop (int depth) -> bool |
+constexpr void | visit0 (uint8_t d) |
+constexpr auto | getVisitDepth0 () const -> uint8_t |
+constexpr void | clearVisited0 () |
+constexpr auto | visited0 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr void | visit1 (uint8_t d) |
+constexpr auto | getVisitDepth1 () const -> uint8_t |
+constexpr void | clearVisited1 () |
+constexpr auto | visited1 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr auto | sameBlock (const Node *other) const -> bool |
+constexpr auto | getKind () const -> ValKind |
+constexpr auto | getCurrentDepth () const -> int |
+constexpr auto | getMaxDepth () const -> int |
+constexpr auto | getNaturalDepth () const -> int |
+constexpr auto | getParent () const -> Node * |
+constexpr auto | getChild () const -> Node * |
+constexpr auto | getPrev () const -> Node * |
+constexpr auto | getNext () const -> Node * |
+void | verify () |
+constexpr auto | setNext (Node *n) -> Node * |
+constexpr auto | setPrev (Node *n) -> Node * |
constexpr auto | setChild (Node *n) -> Node * |
+constexpr auto | setParent (Node *n) -> Node * |
+constexpr void | setParentLoop (IR::Node *L) |
+constexpr void | setSubLoop (IR::Node *L) |
+constexpr void | setCurrentDepth (int d) |
constexpr void | insertAhead (Node *n) |
constexpr void | insertAfter (Node *n) |
+constexpr void | clearPrevNext () |
+constexpr auto | wasDropped () const -> bool |
+constexpr auto | removeFromList () -> Node * |
+constexpr void | insertChild (Valid< Node > n) |
+constexpr void | insertParent (Valid< Node > n) |
+constexpr void | forEach (const auto &f) |
+constexpr auto | nodes () noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > |
Iterate through all instructions. | |
+constexpr auto | nodes () const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > |
+constexpr auto | getLoop () const noexcept -> Loop * |
+constexpr auto | calcLoopMask () -> uint16_t |
+constexpr auto | getSubLoop () const noexcept -> Loop * |
+constexpr void | hoist (IR::Loop *P, int depth, IR::Loop *S) |
+Static Public Member Functions | |
+static constexpr auto | create (Arena<> *alloc, int64_t v, llvm::Type *t) -> Cint * |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
+static constexpr auto | loopMask () -> uint16_t |
+static constexpr auto | calcLoopMask () -> uint16_t |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static auto | getInstKind (llvm::Instruction *v) -> ValKind |
+static auto | getKind (llvm::Value *v) -> ValKind |
+Additional Inherited Members | |
![]() | |
enum | ValKind : uint8_t { + VK_Load +, VK_Stow +, VK_Loop +, VK_Exit +, + VK_FArg +, VK_CVal +, VK_Cint +, VK_Bint +, + VK_Cflt +, VK_Bflt +, VK_PhiN +, VK_Func +, + VK_Call +, VK_Oprn + + } |
![]() | |
+constexpr | LoopInvariant (ValKind knd, llvm::Type *t) |
![]() | |
+constexpr | Value (ValKind kind_, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned depth, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) |
![]() | |
+constexpr | Node (ValKind kind_) |
+constexpr | Node (ValKind kind_, unsigned depth) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) |
![]() | |
+Instruction * | reduction_dst_ {nullptr} |
+Users | users |
![]() | |
+const ValKind | kind |
+uint8_t | currentDepth1: 4 {0} |
The current position, 0 means top level, 1 inside a single loop. | |
+uint8_t | maxDepth: 4 {0} |
uint8_t | usedByLoop: 1 {0} |
+uint8_t | visitDepth0: 7 {127} |
+uint8_t | visitDepth1 {255} |
uint16_t | loopdeps {std::numeric_limits<uint16_t>::max()} |
A constant value w/ respect to the loopnest.
+
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Compute, including all inherited members.
+addUser(Arena<> *alloc, Instruction *I) noexcept (defined in IR::Value) | IR::Value | inline |
allowsContract() const -> bool (defined in IR::Compute) | IR::Compute | inline |
allUsersAdditiveContract() const -> bool (defined in IR::Compute) | IR::Compute | inline |
argTypes(unsigned vectorWidth) -> llvm::SmallVector< llvm::Type *, 4 > (defined in IR::Compute) | IR::Compute | inline |
blkidx_ (defined in IR::Instruction) | IR::Instruction | protected |
calcCost(target::Machine< TTI >, unsigned, std::array< CostKind, N >) -> std::array< llvm::InstructionCost, N > (defined in IR::Compute) | IR::Compute | inline |
calcCost(target::Machine< TTI >, unsigned, CostKind=CostKind::TCK_RecipThroughput) -> llvm::InstructionCost (defined in IR::Compute) | IR::Compute | inline |
calcLoopIndepFlag(ptrdiff_t depth1) -> uint32_t (defined in IR::Compute) | IR::Compute | inline |
calcLoopMask() -> int (defined in IR::Compute) | IR::Compute | inline |
canContract() const -> bool (defined in IR::Compute) | IR::Compute | inline |
checkDependsOnLoop(int depth) -> bool (defined in IR::Node) | IR::Node | |
checkUsedByInner() const -> bool (defined in IR::Node) | IR::Node | inline |
classof(const Node *v) -> bool (defined in IR::Compute) | IR::Compute | inlinestatic |
clearPrevNext() (defined in IR::Node) | IR::Node | inline |
clearVisited0() (defined in IR::Node) | IR::Node | inline |
clearVisited1() (defined in IR::Node) | IR::Node | inline |
commuatativeOperandsFlag() const -> uint8_t (defined in IR::Compute) | IR::Compute | inline |
Compute(const Compute &)=delete (defined in IR::Compute) | IR::Compute | |
Compute(ValKind k, llvm::Instruction *i, llvm::Intrinsic::ID id, int numOps) (defined in IR::Compute) | IR::Compute | inline |
Compute(ValKind k, llvm::Intrinsic::ID id, int numOps, llvm::Type *t, llvm::FastMathFlags fmf) (defined in IR::Compute) | IR::Compute | inline |
CostKind typedef (defined in IR::Instruction) | IR::Instruction | |
currentDepth1 | IR::Node | protected |
diffMask(ptrdiff_t smaller, ptrdiff_t larger) -> uint32_t (defined in IR::Compute) | IR::Compute | inlineprotectedstatic |
diffMask(Value *v, ptrdiff_t depth1) -> uint32_t (defined in IR::Compute) | IR::Compute | inlineprotectedstatic |
fastMathFlags (defined in IR::Compute) | IR::Compute | protected |
forEach(const auto &f) (defined in IR::Node) | IR::Node | inline |
getBasicBlock() -> llvm::BasicBlock * (defined in IR::Compute) | IR::Compute | inline |
getBlkIdx() const -> int | IR::Instruction | inline |
getChild() const -> Node * (defined in IR::Node) | IR::Node | inline |
getCmpPredicate() const -> llvm::CmpInst::Predicate (defined in IR::Compute) | IR::Compute | inline |
getCost(target::Machine< TTI > target, unsigned width, std::array< CostKind, N > costKinds) -> std::array< llvm::InstructionCost, N > (defined in IR::Compute) | IR::Compute | inline |
getCost(target::Machine< TTI > target, unsigned width, CostKind costKind=CostKind::TCK_RecipThroughput) -> llvm::InstructionCost (defined in IR::Compute) | IR::Compute | inline |
getCurrentDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getFastMathFlags() const -> llvm::FastMathFlags (defined in IR::Compute) | IR::Compute | inline |
getIDKind(llvm::Instruction *I) -> Pair< llvm::Intrinsic::ID, ValKind > (defined in IR::Compute) | IR::Compute | inlinestatic |
getInstKind(llvm::Instruction *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getKind() const -> ValKind (defined in IR::Node) | IR::Node | inline |
getKind(llvm::Value *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getLLVMInstruction() const -> llvm::Instruction * (defined in IR::Compute) | IR::Compute | inline |
getLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getLoopIndepFlag() const -> uint32_t (defined in IR::Compute) | IR::Compute | inline |
getMaxDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNaturalDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNext() const -> Node * (defined in IR::Node) | IR::Node | inline |
getNumOperands() const -> unsigned (defined in IR::Compute) | IR::Compute | inline |
getNumScalarBits() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getNumScalarBytes() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getOperand(ptrdiff_t i) const -> Value * | IR::Compute | inline |
getOperands() -> MutPtrVector< Value * > (defined in IR::Compute) | IR::Compute | inline |
getOperands() const -> PtrVector< Value * > | IR::Compute | inline |
getOpId() const -> llvm::Intrinsic::ID (defined in IR::Compute) | IR::Compute | inline |
getParent() const -> Node * (defined in IR::Node) | IR::Node | inline |
getPrev() const -> Node * (defined in IR::Node) | IR::Node | inline |
getReductionDst() const -> Instruction * | IR::Value | inline |
getSubLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getTopIdx() const -> int | IR::Instruction | inline |
getType(unsigned int vectorWidth) const -> llvm::Type * (defined in IR::Compute) | IR::Compute | inline |
getType() const -> llvm::Type * | IR::Compute | inline |
getType(unsigned width) const -> llvm::Type * (defined in IR::Compute) | IR::Compute | inline |
getUsers() noexcept -> Users & (defined in IR::Value) | IR::Value | inline |
getUsers() const noexcept -> const Users & (defined in IR::Value) | IR::Value | inline |
getVisitDepth0() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
getVisitDepth1() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
hoist(IR::Loop *P, int depth, IR::Loop *S) (defined in IR::Node) | IR::Node | |
insertAfter(Node *n) | IR::Node | inline |
insertAhead(Node *n) | IR::Node | inline |
insertChild(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
insertParent(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
inst (defined in IR::Compute) | IR::Compute | protected |
Instruction(ValKind kind_, llvm::Type *t) | IR::Instruction | inlineprotected |
Instruction(ValKind kind_, unsigned depth, llvm::Type *t) (defined in IR::Instruction) | IR::Instruction | inlineprotected |
Instruction(ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) (defined in IR::Instruction) | IR::Instruction | inlineprotected |
Instruction(ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) (defined in IR::Instruction) | IR::Instruction | inlineprotected |
isAddOrSub() const -> bool (defined in IR::Compute) | IR::Compute | inline |
isCommutativeCall() const -> bool (defined in IR::Compute) | IR::Compute | inline |
isComplete() const -> bool (defined in IR::Compute) | IR::Compute | inline |
isFMul() const -> bool (defined in IR::Compute) | IR::Compute | inline |
isFNeg() const -> bool (defined in IR::Compute) | IR::Compute | inline |
isIncomplete() const -> bool (defined in IR::Compute) | IR::Compute | inline |
isLoad() const -> bool (defined in IR::Value) | IR::Value | inline |
isMulAdd() const -> bool (defined in IR::Compute) | IR::Compute | inline |
isStore() const -> bool | IR::Value | inline |
kind (defined in IR::Node) | IR::Node | protected |
linkReductionDst(Instruction *op) | IR::Value | inline |
loopdeps | IR::Node | protected |
loopIndepFlag (defined in IR::Compute) | IR::Compute | protected |
loopMask() const -> int (defined in IR::Node) | IR::Node | inline |
makeIncomplete() (defined in IR::Compute) | IR::Compute | inline |
maxDepth (defined in IR::Node) | IR::Node | protected |
Node(ValKind kind_) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned depth) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) (defined in IR::Node) | IR::Node | inlineprotected |
nodes() noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > | IR::Node | inline |
nodes() const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > (defined in IR::Node) | IR::Node | inline |
numCompleteOps() -> unsigned (defined in IR::Compute) | IR::Compute | inline |
numOperands (defined in IR::Compute) | IR::Compute | protected |
operandIsLoad(unsigned i=0) const -> bool (defined in IR::Compute) | IR::Compute | inline |
operands (defined in IR::Compute) | IR::Compute | protected |
operator==(Compute const &other) const -> bool (defined in IR::Compute) | IR::Compute | inline |
opId (defined in IR::Compute) | IR::Compute | protected |
peelLoops(ptrdiff_t numToPeel) -> ptrdiff_t (defined in IR::Node) | IR::Node | inline |
printName(std::ostream &os) const -> std::ostream & (defined in IR::Instruction) | IR::Instruction | inline |
reassociableArgs() const -> uint32_t (defined in IR::Compute) | IR::Compute | inline |
reduction_dst_ (defined in IR::Value) | IR::Value | protected |
removeFromList() -> Node * (defined in IR::Node) | IR::Node | inline |
removeFromUsers(Instruction *I) (defined in IR::Value) | IR::Value | inline |
sameBlock(const Node *other) const -> bool (defined in IR::Node) | IR::Node | inline |
setChild(Node *n) -> Node * | IR::Node | inline |
setCurrentDepth(int d) (defined in IR::Node) | IR::Node | inline |
setFast(llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) (defined in IR::Compute) | IR::Compute | inline |
setNext(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setNumOps(int n) (defined in IR::Compute) | IR::Compute | inline |
setOperands(Arena<> *alloc, PtrVector< Value * > ops) (defined in IR::Compute) | IR::Compute | inline |
setParent(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParentLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setPosition(std::array< int, 2 > newidx) -> std::array< int, 2 > (defined in IR::Instruction) | IR::Instruction | inline |
setPrev(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setSubLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setUsedByInner() (defined in IR::Node) | IR::Node | inline |
setUsers(const Users &other) noexcept (defined in IR::Value) | IR::Value | inline |
stripFNeg(Compute *C) -> Instruction * (defined in IR::Compute) | IR::Compute | inlinestatic |
topidx_ (defined in IR::Instruction) | IR::Instruction | protected |
usedByLoop | IR::Node | protected |
userIsStore() const -> bool (defined in IR::Compute) | IR::Compute | inline |
users (defined in IR::Value) | IR::Value | protected |
ValKind enum name (defined in IR::Node) | IR::Node | |
Value(ValKind kind_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned depth, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
verify() (defined in IR::Node) | IR::Node | inline |
visit0(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visit1(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visitDepth0 (defined in IR::Node) | IR::Node | protected |
visitDepth1 (defined in IR::Node) | IR::Node | protected |
visited0(uint8_t d) const -> bool | IR::Node | inline |
visited1(uint8_t d) const -> bool | IR::Node | inline |
VK_Bflt enum value (defined in IR::Node) | IR::Node | |
VK_Bint enum value (defined in IR::Node) | IR::Node | |
VK_Call enum value (defined in IR::Node) | IR::Node | |
VK_Cflt enum value (defined in IR::Node) | IR::Node | |
VK_Cint enum value (defined in IR::Node) | IR::Node | |
VK_CVal enum value (defined in IR::Node) | IR::Node | |
VK_Exit enum value (defined in IR::Node) | IR::Node | |
VK_FArg enum value (defined in IR::Node) | IR::Node | |
VK_Func enum value (defined in IR::Node) | IR::Node | |
VK_Load enum value (defined in IR::Node) | IR::Node | |
VK_Loop enum value (defined in IR::Node) | IR::Node | |
VK_Oprn enum value (defined in IR::Node) | IR::Node | |
VK_PhiN enum value (defined in IR::Node) | IR::Node | |
VK_Stow enum value (defined in IR::Node) | IR::Node | |
wasDropped() const -> bool (defined in IR::Node) | IR::Node | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+ | Compute (const Compute &)=delete |
+ | Compute (ValKind k, llvm::Instruction *i, llvm::Intrinsic::ID id, int numOps) |
+constexpr | Compute (ValKind k, llvm::Intrinsic::ID id, int numOps, llvm::Type *t, llvm::FastMathFlags fmf) |
+constexpr auto | getLLVMInstruction () const -> llvm::Instruction * |
+auto | getBasicBlock () -> llvm::BasicBlock * |
+auto | argTypes (unsigned vectorWidth) -> llvm::SmallVector< llvm::Type *, 4 > |
+constexpr void | setNumOps (int n) |
+constexpr auto | numCompleteOps () -> unsigned |
+constexpr void | makeIncomplete () |
+constexpr auto | getNumOperands () const -> unsigned |
+constexpr auto | getOpId () const -> llvm::Intrinsic::ID |
+constexpr auto | getOperands () -> MutPtrVector< Value * > |
+constexpr auto | calcLoopMask () -> int |
+constexpr auto | getLoopIndepFlag () const -> uint32_t |
+constexpr auto | calcLoopIndepFlag (ptrdiff_t depth1) -> uint32_t |
+constexpr auto | getOperands () const -> PtrVector< Value * > |
Get the arguments to this function. | |
+constexpr auto | getOperand (ptrdiff_t i) const -> Value * |
Get the i th argument of this function. | |
+constexpr void | setOperands (Arena<> *alloc, PtrVector< Value * > ops) |
+constexpr void | setFast (llvm::FastMathFlags fmf=llvm::FastMathFlags::getFast()) |
+constexpr auto | getFastMathFlags () const -> llvm::FastMathFlags |
+auto | allowsContract () const -> bool |
+auto | reassociableArgs () const -> uint32_t |
+auto | isComplete () const -> bool |
+auto | isIncomplete () const -> bool |
+auto | isCommutativeCall () const -> bool |
+auto | isMulAdd () const -> bool |
+auto | commuatativeOperandsFlag () const -> uint8_t |
+auto | operator== (Compute const &other) const -> bool |
+template<size_t N, bool TTI> | |
auto | getCost (target::Machine< TTI > target, unsigned width, std::array< CostKind, N > costKinds) -> std::array< llvm::InstructionCost, N > |
+template<bool TTI> | |
auto | getCost (target::Machine< TTI > target, unsigned width, CostKind costKind=CostKind::TCK_RecipThroughput) -> llvm::InstructionCost |
+template<size_t N, bool TTI> | |
auto | calcCost (target::Machine< TTI >, unsigned, std::array< CostKind, N >) -> std::array< llvm::InstructionCost, N > |
+template<bool TTI> | |
auto | calcCost (target::Machine< TTI >, unsigned, CostKind=CostKind::TCK_RecipThroughput) -> llvm::InstructionCost |
+auto | getType (unsigned int vectorWidth) const -> llvm::Type * |
+auto | getCmpPredicate () const -> llvm::CmpInst::Predicate |
+auto | operandIsLoad (unsigned i=0) const -> bool |
+auto | userIsStore () const -> bool |
+auto | allUsersAdditiveContract () const -> bool |
+constexpr auto | isAddOrSub () const -> bool |
+constexpr auto | isFNeg () const -> bool |
+constexpr auto | isFMul () const -> bool |
+constexpr auto | canContract () const -> bool |
+constexpr auto | getType () const -> llvm::Type * |
these methods are overloaded for specific subtypes | |
+auto | getType (unsigned width) const -> llvm::Type * |
![]() | |
+auto | printName (std::ostream &os) const -> std::ostream & |
+constexpr auto | getTopIdx () const -> int |
Gives position within the loop nest; starts at 0 . | |
constexpr auto | getBlkIdx () const -> int |
+constexpr auto | setPosition (std::array< int, 2 > newidx) -> std::array< int, 2 > |
![]() | |
+auto | printName (std::ostream &) const -> std::ostream & |
+constexpr auto | getUsers () noexcept -> Users & |
+constexpr auto | getUsers () const noexcept -> const Users & |
+constexpr void | setUsers (const Users &other) noexcept |
+constexpr void | addUser (Arena<> *alloc, Instruction *I) noexcept |
+constexpr void | removeFromUsers (Instruction *I) |
constexpr auto | isStore () const -> bool |
+constexpr auto | isLoad () const -> bool |
constexpr auto | getReductionDst () const -> Instruction * |
+constexpr void | linkReductionDst (Instruction *op) |
this->reduction_dst_ = op; | |
+constexpr auto | getType () const -> llvm::Type * |
these methods are overloaded for specific subtypes | |
+auto | getType (unsigned width) const -> llvm::Type * |
+auto | getNumScalarBits () const -> unsigned |
+auto | getNumScalarBytes () const -> unsigned |
![]() | |
+constexpr void | setUsedByInner () |
+constexpr auto | checkUsedByInner () const -> bool |
+constexpr auto | loopMask () const -> int |
+constexpr auto | peelLoops (ptrdiff_t numToPeel) -> ptrdiff_t |
+constexpr auto | checkDependsOnLoop (int depth) -> bool |
+constexpr void | visit0 (uint8_t d) |
+constexpr auto | getVisitDepth0 () const -> uint8_t |
+constexpr void | clearVisited0 () |
+constexpr auto | visited0 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr void | visit1 (uint8_t d) |
+constexpr auto | getVisitDepth1 () const -> uint8_t |
+constexpr void | clearVisited1 () |
+constexpr auto | visited1 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr auto | sameBlock (const Node *other) const -> bool |
+constexpr auto | getKind () const -> ValKind |
+constexpr auto | getCurrentDepth () const -> int |
+constexpr auto | getMaxDepth () const -> int |
+constexpr auto | getNaturalDepth () const -> int |
+constexpr auto | getParent () const -> Node * |
+constexpr auto | getChild () const -> Node * |
+constexpr auto | getPrev () const -> Node * |
+constexpr auto | getNext () const -> Node * |
+void | verify () |
+constexpr auto | setNext (Node *n) -> Node * |
+constexpr auto | setPrev (Node *n) -> Node * |
constexpr auto | setChild (Node *n) -> Node * |
+constexpr auto | setParent (Node *n) -> Node * |
+constexpr void | setParentLoop (IR::Node *L) |
+constexpr void | setSubLoop (IR::Node *L) |
+constexpr void | setCurrentDepth (int d) |
constexpr void | insertAhead (Node *n) |
constexpr void | insertAfter (Node *n) |
+constexpr void | clearPrevNext () |
+constexpr auto | wasDropped () const -> bool |
+constexpr auto | removeFromList () -> Node * |
+constexpr void | insertChild (Valid< Node > n) |
+constexpr void | insertParent (Valid< Node > n) |
+constexpr void | forEach (const auto &f) |
+constexpr auto | nodes () noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > |
Iterate through all instructions. | |
+constexpr auto | nodes () const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > |
+constexpr auto | getLoop () const noexcept -> Loop * |
+constexpr auto | calcLoopMask () -> uint16_t |
+constexpr auto | getSubLoop () const noexcept -> Loop * |
+constexpr void | hoist (IR::Loop *P, int depth, IR::Loop *S) |
+Static Public Member Functions | |
+static constexpr auto | classof (const Node *v) -> bool |
+static auto | getIDKind (llvm::Instruction *I) -> Pair< llvm::Intrinsic::ID, ValKind > |
+static auto | stripFNeg (Compute *C) -> Instruction * |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static auto | getInstKind (llvm::Instruction *v) -> ValKind |
+static auto | getKind (llvm::Value *v) -> ValKind |
+Static Protected Member Functions | |
+static constexpr auto | diffMask (ptrdiff_t smaller, ptrdiff_t larger) -> uint32_t |
+static constexpr auto | diffMask (Value *v, ptrdiff_t depth1) -> uint32_t |
+Protected Attributes | |
+llvm::Instruction * | inst {nullptr} |
+llvm::Intrinsic::ID | opId |
+llvm::FastMathFlags | fastMathFlags |
+uint32_t | loopIndepFlag |
+int | numOperands |
+Value * | operands [] |
![]() | |
+int | topidx_ {-1} |
+int | blkidx_ {-1} |
![]() | |
+Instruction * | reduction_dst_ {nullptr} |
+Users | users |
![]() | |
+const ValKind | kind |
+uint8_t | currentDepth1: 4 {0} |
The current position, 0 means top level, 1 inside a single loop. | |
+uint8_t | maxDepth: 4 {0} |
uint8_t | usedByLoop: 1 {0} |
+uint8_t | visitDepth0: 7 {127} |
+uint8_t | visitDepth1 {255} |
uint16_t | loopdeps {std::numeric_limits<uint16_t>::max()} |
+Additional Inherited Members | |
![]() | |
+using | CostKind = llvm::TargetTransformInfo::TargetCostKind |
![]() | |
enum | ValKind : uint8_t { + VK_Load +, VK_Stow +, VK_Loop +, VK_Exit +, + VK_FArg +, VK_CVal +, VK_Cint +, VK_Bint +, + VK_Cflt +, VK_Bflt +, VK_PhiN +, VK_Func +, + VK_Call +, VK_Oprn + + } |
![]() | |
constexpr | Instruction (ValKind kind_, llvm::Type *t) |
+constexpr | Instruction (ValKind kind_, unsigned depth, llvm::Type *t) |
+constexpr | Instruction (ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) |
+constexpr | Instruction (ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) |
![]() | |
+constexpr | Value (ValKind kind_, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned depth, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) |
![]() | |
+constexpr | Node (ValKind kind_) |
+constexpr | Node (ValKind kind_, unsigned depth) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) |
+ LoopModels
+
+ |
+
This is the complete list of members for IR::FunArg, including all inherited members.
+addUser(Arena<> *alloc, Instruction *I) noexcept (defined in IR::Value) | IR::Value | inline |
calcLoopMask() -> uint16_t (defined in IR::LoopInvariant) | IR::LoopInvariant | inlinestatic |
checkDependsOnLoop(int depth) -> bool (defined in IR::Node) | IR::Node | |
checkUsedByInner() const -> bool (defined in IR::Node) | IR::Node | inline |
classof(const Node *v) -> bool (defined in IR::FunArg) | IR::FunArg | inlinestatic |
clearPrevNext() (defined in IR::Node) | IR::Node | inline |
clearVisited0() (defined in IR::Node) | IR::Node | inline |
clearVisited1() (defined in IR::Node) | IR::Node | inline |
create(Arena<> *alloc, int64_t arg, llvm::Type *t) -> FunArg * (defined in IR::FunArg) | IR::FunArg | inlinestatic |
currentDepth1 | IR::Node | protected |
forEach(const auto &f) (defined in IR::Node) | IR::Node | inline |
FunArg(int64_t arg, llvm::Type *t) (defined in IR::FunArg) | IR::FunArg | inline |
getArgNumber() const -> int64_t (defined in IR::FunArg) | IR::FunArg | inline |
getChild() const -> Node * (defined in IR::Node) | IR::Node | inline |
getCurrentDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getInstKind(llvm::Instruction *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getKind() const -> ValKind (defined in IR::Node) | IR::Node | inline |
getKind(llvm::Value *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getMaxDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNaturalDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNext() const -> Node * (defined in IR::Node) | IR::Node | inline |
getNumScalarBits() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getNumScalarBytes() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getParent() const -> Node * (defined in IR::Node) | IR::Node | inline |
getPrev() const -> Node * (defined in IR::Node) | IR::Node | inline |
getReductionDst() const -> Instruction * | IR::Value | inline |
getSubLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getType() const -> llvm::Type * | IR::Value | inline |
getType(unsigned width) const -> llvm::Type * (defined in IR::Value) | IR::Value | inline |
getUsers() noexcept -> Users & (defined in IR::Value) | IR::Value | inline |
getUsers() const noexcept -> const Users & (defined in IR::Value) | IR::Value | inline |
getVisitDepth0() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
getVisitDepth1() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
hoist(IR::Loop *P, int depth, IR::Loop *S) (defined in IR::Node) | IR::Node | |
insertAfter(Node *n) | IR::Node | inline |
insertAhead(Node *n) | IR::Node | inline |
insertChild(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
insertParent(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
isLoad() const -> bool (defined in IR::Value) | IR::Value | inline |
isStore() const -> bool | IR::Value | inline |
kind (defined in IR::Node) | IR::Node | protected |
linkReductionDst(Instruction *op) | IR::Value | inline |
loopdeps | IR::Node | protected |
LoopInvariant(ValKind knd, llvm::Type *t) (defined in IR::LoopInvariant) | IR::LoopInvariant | inlineprotected |
loopMask() -> uint16_t (defined in IR::LoopInvariant) | IR::LoopInvariant | inlinestatic |
loopMask() const -> int (defined in IR::Node) | IR::Node | inline |
maxDepth (defined in IR::Node) | IR::Node | protected |
Node(ValKind kind_) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned depth) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) (defined in IR::Node) | IR::Node | inlineprotected |
nodes() noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > | IR::Node | inline |
nodes() const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > (defined in IR::Node) | IR::Node | inline |
peelLoops(ptrdiff_t numToPeel) -> ptrdiff_t (defined in IR::Node) | IR::Node | inline |
printName(std::ostream &) const -> std::ostream & (defined in IR::Value) | IR::Value | inline |
reduction_dst_ (defined in IR::Value) | IR::Value | protected |
removeFromList() -> Node * (defined in IR::Node) | IR::Node | inline |
removeFromUsers(Instruction *I) (defined in IR::Value) | IR::Value | inline |
sameBlock(const Node *other) const -> bool (defined in IR::Node) | IR::Node | inline |
setChild(Node *n) -> Node * | IR::Node | inline |
setCurrentDepth(int d) (defined in IR::Node) | IR::Node | inline |
setNext(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParent(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParentLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setPrev(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setSubLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setUsedByInner() (defined in IR::Node) | IR::Node | inline |
setUsers(const Users &other) noexcept (defined in IR::Value) | IR::Value | inline |
usedByLoop | IR::Node | protected |
users (defined in IR::Value) | IR::Value | protected |
ValKind enum name (defined in IR::Node) | IR::Node | |
Value(ValKind kind_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned depth, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
verify() (defined in IR::Node) | IR::Node | inline |
visit0(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visit1(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visitDepth0 (defined in IR::Node) | IR::Node | protected |
visitDepth1 (defined in IR::Node) | IR::Node | protected |
visited0(uint8_t d) const -> bool | IR::Node | inline |
visited1(uint8_t d) const -> bool | IR::Node | inline |
VK_Bflt enum value (defined in IR::Node) | IR::Node | |
VK_Bint enum value (defined in IR::Node) | IR::Node | |
VK_Call enum value (defined in IR::Node) | IR::Node | |
VK_Cflt enum value (defined in IR::Node) | IR::Node | |
VK_Cint enum value (defined in IR::Node) | IR::Node | |
VK_CVal enum value (defined in IR::Node) | IR::Node | |
VK_Exit enum value (defined in IR::Node) | IR::Node | |
VK_FArg enum value (defined in IR::Node) | IR::Node | |
VK_Func enum value (defined in IR::Node) | IR::Node | |
VK_Load enum value (defined in IR::Node) | IR::Node | |
VK_Loop enum value (defined in IR::Node) | IR::Node | |
VK_Oprn enum value (defined in IR::Node) | IR::Node | |
VK_PhiN enum value (defined in IR::Node) | IR::Node | |
VK_Stow enum value (defined in IR::Node) | IR::Node | |
wasDropped() const -> bool (defined in IR::Node) | IR::Node | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+constexpr | FunArg (int64_t arg, llvm::Type *t) |
+constexpr auto | getArgNumber () const -> int64_t |
![]() | |
+auto | printName (std::ostream &) const -> std::ostream & |
+constexpr auto | getUsers () noexcept -> Users & |
+constexpr auto | getUsers () const noexcept -> const Users & |
+constexpr void | setUsers (const Users &other) noexcept |
+constexpr void | addUser (Arena<> *alloc, Instruction *I) noexcept |
+constexpr void | removeFromUsers (Instruction *I) |
constexpr auto | isStore () const -> bool |
+constexpr auto | isLoad () const -> bool |
constexpr auto | getReductionDst () const -> Instruction * |
+constexpr void | linkReductionDst (Instruction *op) |
this->reduction_dst_ = op; | |
+constexpr auto | getType () const -> llvm::Type * |
these methods are overloaded for specific subtypes | |
+auto | getType (unsigned width) const -> llvm::Type * |
+auto | getNumScalarBits () const -> unsigned |
+auto | getNumScalarBytes () const -> unsigned |
![]() | |
+constexpr void | setUsedByInner () |
+constexpr auto | checkUsedByInner () const -> bool |
+constexpr auto | loopMask () const -> int |
+constexpr auto | peelLoops (ptrdiff_t numToPeel) -> ptrdiff_t |
+constexpr auto | checkDependsOnLoop (int depth) -> bool |
+constexpr void | visit0 (uint8_t d) |
+constexpr auto | getVisitDepth0 () const -> uint8_t |
+constexpr void | clearVisited0 () |
+constexpr auto | visited0 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr void | visit1 (uint8_t d) |
+constexpr auto | getVisitDepth1 () const -> uint8_t |
+constexpr void | clearVisited1 () |
+constexpr auto | visited1 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr auto | sameBlock (const Node *other) const -> bool |
+constexpr auto | getKind () const -> ValKind |
+constexpr auto | getCurrentDepth () const -> int |
+constexpr auto | getMaxDepth () const -> int |
+constexpr auto | getNaturalDepth () const -> int |
+constexpr auto | getParent () const -> Node * |
+constexpr auto | getChild () const -> Node * |
+constexpr auto | getPrev () const -> Node * |
+constexpr auto | getNext () const -> Node * |
+void | verify () |
+constexpr auto | setNext (Node *n) -> Node * |
+constexpr auto | setPrev (Node *n) -> Node * |
constexpr auto | setChild (Node *n) -> Node * |
+constexpr auto | setParent (Node *n) -> Node * |
+constexpr void | setParentLoop (IR::Node *L) |
+constexpr void | setSubLoop (IR::Node *L) |
+constexpr void | setCurrentDepth (int d) |
constexpr void | insertAhead (Node *n) |
constexpr void | insertAfter (Node *n) |
+constexpr void | clearPrevNext () |
+constexpr auto | wasDropped () const -> bool |
+constexpr auto | removeFromList () -> Node * |
+constexpr void | insertChild (Valid< Node > n) |
+constexpr void | insertParent (Valid< Node > n) |
+constexpr void | forEach (const auto &f) |
+constexpr auto | nodes () noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > |
Iterate through all instructions. | |
+constexpr auto | nodes () const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > |
+constexpr auto | getLoop () const noexcept -> Loop * |
+constexpr auto | calcLoopMask () -> uint16_t |
+constexpr auto | getSubLoop () const noexcept -> Loop * |
+constexpr void | hoist (IR::Loop *P, int depth, IR::Loop *S) |
+Static Public Member Functions | |
+static constexpr auto | create (Arena<> *alloc, int64_t arg, llvm::Type *t) -> FunArg * |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
+static constexpr auto | loopMask () -> uint16_t |
+static constexpr auto | calcLoopMask () -> uint16_t |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static auto | getInstKind (llvm::Instruction *v) -> ValKind |
+static auto | getKind (llvm::Value *v) -> ValKind |
+Additional Inherited Members | |
![]() | |
enum | ValKind : uint8_t { + VK_Load +, VK_Stow +, VK_Loop +, VK_Exit +, + VK_FArg +, VK_CVal +, VK_Cint +, VK_Bint +, + VK_Cflt +, VK_Bflt +, VK_PhiN +, VK_Func +, + VK_Call +, VK_Oprn + + } |
![]() | |
+constexpr | LoopInvariant (ValKind knd, llvm::Type *t) |
![]() | |
+constexpr | Value (ValKind kind_, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned depth, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) |
![]() | |
+constexpr | Node (ValKind kind_) |
+constexpr | Node (ValKind kind_, unsigned depth) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) |
![]() | |
+Instruction * | reduction_dst_ {nullptr} |
+Users | users |
![]() | |
+const ValKind | kind |
+uint8_t | currentDepth1: 4 {0} |
The current position, 0 means top level, 1 inside a single loop. | |
+uint8_t | maxDepth: 4 {0} |
uint8_t | usedByLoop: 1 {0} |
+uint8_t | visitDepth0: 7 {127} |
+uint8_t | visitDepth1 {255} |
uint16_t | loopdeps {std::numeric_limits<uint16_t>::max()} |
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Instruction, including all inherited members.
+addUser(Arena<> *alloc, Instruction *I) noexcept (defined in IR::Value) | IR::Value | inline |
blkidx_ (defined in IR::Instruction) | IR::Instruction | protected |
calcLoopMask() -> uint16_t (defined in IR::Node) | IR::Node | |
checkDependsOnLoop(int depth) -> bool (defined in IR::Node) | IR::Node | |
checkUsedByInner() const -> bool (defined in IR::Node) | IR::Node | inline |
classof(const Node *v) -> bool (defined in IR::Instruction) | IR::Instruction | inlinestatic |
clearPrevNext() (defined in IR::Node) | IR::Node | inline |
clearVisited0() (defined in IR::Node) | IR::Node | inline |
clearVisited1() (defined in IR::Node) | IR::Node | inline |
CostKind typedef (defined in IR::Instruction) | IR::Instruction | |
currentDepth1 | IR::Node | protected |
forEach(const auto &f) (defined in IR::Node) | IR::Node | inline |
getBlkIdx() const -> int | IR::Instruction | inline |
getChild() const -> Node * (defined in IR::Node) | IR::Node | inline |
getCurrentDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getInstKind(llvm::Instruction *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getKind() const -> ValKind (defined in IR::Node) | IR::Node | inline |
getKind(llvm::Value *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getMaxDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNaturalDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNext() const -> Node * (defined in IR::Node) | IR::Node | inline |
getNumScalarBits() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getNumScalarBytes() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getParent() const -> Node * (defined in IR::Node) | IR::Node | inline |
getPrev() const -> Node * (defined in IR::Node) | IR::Node | inline |
getReductionDst() const -> Instruction * | IR::Value | inline |
getSubLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getTopIdx() const -> int | IR::Instruction | inline |
getType() const -> llvm::Type * | IR::Value | inline |
getType(unsigned width) const -> llvm::Type * (defined in IR::Value) | IR::Value | inline |
getUsers() noexcept -> Users & (defined in IR::Value) | IR::Value | inline |
getUsers() const noexcept -> const Users & (defined in IR::Value) | IR::Value | inline |
getVisitDepth0() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
getVisitDepth1() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
hoist(IR::Loop *P, int depth, IR::Loop *S) (defined in IR::Node) | IR::Node | |
insertAfter(Node *n) | IR::Node | inline |
insertAhead(Node *n) | IR::Node | inline |
insertChild(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
insertParent(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
Instruction(ValKind kind_, llvm::Type *t) | IR::Instruction | inlineprotected |
Instruction(ValKind kind_, unsigned depth, llvm::Type *t) (defined in IR::Instruction) | IR::Instruction | inlineprotected |
Instruction(ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) (defined in IR::Instruction) | IR::Instruction | inlineprotected |
Instruction(ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) (defined in IR::Instruction) | IR::Instruction | inlineprotected |
isLoad() const -> bool (defined in IR::Value) | IR::Value | inline |
isStore() const -> bool | IR::Value | inline |
kind (defined in IR::Node) | IR::Node | protected |
linkReductionDst(Instruction *op) | IR::Value | inline |
loopdeps | IR::Node | protected |
loopMask() const -> int (defined in IR::Node) | IR::Node | inline |
maxDepth (defined in IR::Node) | IR::Node | protected |
Node(ValKind kind_) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned depth) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) (defined in IR::Node) | IR::Node | inlineprotected |
nodes() noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > | IR::Node | inline |
nodes() const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > (defined in IR::Node) | IR::Node | inline |
peelLoops(ptrdiff_t numToPeel) -> ptrdiff_t (defined in IR::Node) | IR::Node | inline |
printName(std::ostream &os) const -> std::ostream & (defined in IR::Instruction) | IR::Instruction | inline |
reduction_dst_ (defined in IR::Value) | IR::Value | protected |
removeFromList() -> Node * (defined in IR::Node) | IR::Node | inline |
removeFromUsers(Instruction *I) (defined in IR::Value) | IR::Value | inline |
sameBlock(const Node *other) const -> bool (defined in IR::Node) | IR::Node | inline |
setChild(Node *n) -> Node * | IR::Node | inline |
setCurrentDepth(int d) (defined in IR::Node) | IR::Node | inline |
setNext(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParent(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParentLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setPosition(std::array< int, 2 > newidx) -> std::array< int, 2 > (defined in IR::Instruction) | IR::Instruction | inline |
setPrev(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setSubLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setUsedByInner() (defined in IR::Node) | IR::Node | inline |
setUsers(const Users &other) noexcept (defined in IR::Value) | IR::Value | inline |
topidx_ (defined in IR::Instruction) | IR::Instruction | protected |
usedByLoop | IR::Node | protected |
users (defined in IR::Value) | IR::Value | protected |
ValKind enum name (defined in IR::Node) | IR::Node | |
Value(ValKind kind_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned depth, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
verify() (defined in IR::Node) | IR::Node | inline |
visit0(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visit1(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visitDepth0 (defined in IR::Node) | IR::Node | protected |
visitDepth1 (defined in IR::Node) | IR::Node | protected |
visited0(uint8_t d) const -> bool | IR::Node | inline |
visited1(uint8_t d) const -> bool | IR::Node | inline |
VK_Bflt enum value (defined in IR::Node) | IR::Node | |
VK_Bint enum value (defined in IR::Node) | IR::Node | |
VK_Call enum value (defined in IR::Node) | IR::Node | |
VK_Cflt enum value (defined in IR::Node) | IR::Node | |
VK_Cint enum value (defined in IR::Node) | IR::Node | |
VK_CVal enum value (defined in IR::Node) | IR::Node | |
VK_Exit enum value (defined in IR::Node) | IR::Node | |
VK_FArg enum value (defined in IR::Node) | IR::Node | |
VK_Func enum value (defined in IR::Node) | IR::Node | |
VK_Load enum value (defined in IR::Node) | IR::Node | |
VK_Loop enum value (defined in IR::Node) | IR::Node | |
VK_Oprn enum value (defined in IR::Node) | IR::Node | |
VK_PhiN enum value (defined in IR::Node) | IR::Node | |
VK_Stow enum value (defined in IR::Node) | IR::Node | |
wasDropped() const -> bool (defined in IR::Node) | IR::Node | inline |
+ LoopModels
+
+ |
+
May be an Addr or a Compute. + More...
++Classes | |
struct | Identifier |
+Public Types | |
+using | CostKind = llvm::TargetTransformInfo::TargetCostKind |
![]() | |
enum | ValKind : uint8_t { + VK_Load +, VK_Stow +, VK_Loop +, VK_Exit +, + VK_FArg +, VK_CVal +, VK_Cint +, VK_Bint +, + VK_Cflt +, VK_Bflt +, VK_PhiN +, VK_Func +, + VK_Call +, VK_Oprn + + } |
+Public Member Functions | |
+auto | printName (std::ostream &os) const -> std::ostream & |
+constexpr auto | getTopIdx () const -> int |
Gives position within the loop nest; starts at 0 . | |
constexpr auto | getBlkIdx () const -> int |
+constexpr auto | setPosition (std::array< int, 2 > newidx) -> std::array< int, 2 > |
![]() | |
+auto | printName (std::ostream &) const -> std::ostream & |
+constexpr auto | getUsers () noexcept -> Users & |
+constexpr auto | getUsers () const noexcept -> const Users & |
+constexpr void | setUsers (const Users &other) noexcept |
+constexpr void | addUser (Arena<> *alloc, Instruction *I) noexcept |
+constexpr void | removeFromUsers (Instruction *I) |
constexpr auto | isStore () const -> bool |
+constexpr auto | isLoad () const -> bool |
constexpr auto | getReductionDst () const -> Instruction * |
+constexpr void | linkReductionDst (Instruction *op) |
this->reduction_dst_ = op; | |
+constexpr auto | getType () const -> llvm::Type * |
these methods are overloaded for specific subtypes | |
+auto | getType (unsigned width) const -> llvm::Type * |
+auto | getNumScalarBits () const -> unsigned |
+auto | getNumScalarBytes () const -> unsigned |
![]() | |
+constexpr void | setUsedByInner () |
+constexpr auto | checkUsedByInner () const -> bool |
+constexpr auto | loopMask () const -> int |
+constexpr auto | peelLoops (ptrdiff_t numToPeel) -> ptrdiff_t |
+constexpr auto | checkDependsOnLoop (int depth) -> bool |
+constexpr void | visit0 (uint8_t d) |
+constexpr auto | getVisitDepth0 () const -> uint8_t |
+constexpr void | clearVisited0 () |
+constexpr auto | visited0 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr void | visit1 (uint8_t d) |
+constexpr auto | getVisitDepth1 () const -> uint8_t |
+constexpr void | clearVisited1 () |
+constexpr auto | visited1 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr auto | sameBlock (const Node *other) const -> bool |
+constexpr auto | getKind () const -> ValKind |
+constexpr auto | getCurrentDepth () const -> int |
+constexpr auto | getMaxDepth () const -> int |
+constexpr auto | getNaturalDepth () const -> int |
+constexpr auto | getParent () const -> Node * |
+constexpr auto | getChild () const -> Node * |
+constexpr auto | getPrev () const -> Node * |
+constexpr auto | getNext () const -> Node * |
+void | verify () |
+constexpr auto | setNext (Node *n) -> Node * |
+constexpr auto | setPrev (Node *n) -> Node * |
constexpr auto | setChild (Node *n) -> Node * |
+constexpr auto | setParent (Node *n) -> Node * |
+constexpr void | setParentLoop (IR::Node *L) |
+constexpr void | setSubLoop (IR::Node *L) |
+constexpr void | setCurrentDepth (int d) |
constexpr void | insertAhead (Node *n) |
constexpr void | insertAfter (Node *n) |
+constexpr void | clearPrevNext () |
+constexpr auto | wasDropped () const -> bool |
+constexpr auto | removeFromList () -> Node * |
+constexpr void | insertChild (Valid< Node > n) |
+constexpr void | insertParent (Valid< Node > n) |
+constexpr void | forEach (const auto &f) |
+constexpr auto | nodes () noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > |
Iterate through all instructions. | |
+constexpr auto | nodes () const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > |
+constexpr auto | getLoop () const noexcept -> Loop * |
+constexpr auto | calcLoopMask () -> uint16_t |
+constexpr auto | getSubLoop () const noexcept -> Loop * |
+constexpr void | hoist (IR::Loop *P, int depth, IR::Loop *S) |
+Static Public Member Functions | |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static auto | getInstKind (llvm::Instruction *v) -> ValKind |
+static auto | getKind (llvm::Value *v) -> ValKind |
+Protected Member Functions | |
constexpr | Instruction (ValKind kind_, llvm::Type *t) |
+constexpr | Instruction (ValKind kind_, unsigned depth, llvm::Type *t) |
+constexpr | Instruction (ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) |
+constexpr | Instruction (ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) |
![]() | |
+constexpr | Value (ValKind kind_, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned depth, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) |
![]() | |
+constexpr | Node (ValKind kind_) |
+constexpr | Node (ValKind kind_, unsigned depth) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) |
+Protected Attributes | |
+int | topidx_ {-1} |
+int | blkidx_ {-1} |
![]() | |
+Instruction * | reduction_dst_ {nullptr} |
+Users | users |
![]() | |
+const ValKind | kind |
+uint8_t | currentDepth1: 4 {0} |
The current position, 0 means top level, 1 inside a single loop. | |
+uint8_t | maxDepth: 4 {0} |
uint8_t | usedByLoop: 1 {0} |
+uint8_t | visitDepth0: 7 {127} |
+uint8_t | visitDepth1 {255} |
uint16_t | loopdeps {std::numeric_limits<uint16_t>::max()} |
+
|
+ +inlineconstexprprotected | +
For use with control flow merging same operation on same type with disparate branches can be merged This only identifies instructions
+ +
+
|
+ +inlineconstexpr | +
Gives the idx of the sorted basic block. 0 are loop invariant instructions that are hoisted outside and in front of the root loop.
+ +
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Load, including all inherited members.
+addr (defined in IR::AddrWrapper) | IR::AddrWrapper | protected |
AddrWrapper(Addr *a) (defined in IR::AddrWrapper) | IR::AddrWrapper | inlineprotected |
getChild() const -> Node * (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getCurrentDepth() const -> int (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getInstruction() const -> llvm::Instruction * (defined in IR::Load) | IR::Load | inline |
getLoop() const -> poly::Loop * (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getNaturalDepth() const -> int (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getNext() const -> Node * (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getParent() const -> Node * (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getPrev() const -> Node * (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
insertAfter(Node *n) (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
insertAhead(Node *n) (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
insertChild(Node *n) (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
insertParent(Node *n) (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
Load(Addr *a) (defined in IR::Load) | IR::Load | inline |
Load(Node *a) (defined in IR::Load) | IR::Load | inline |
operator Addr *() (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
operator bool() (defined in IR::AddrWrapper) | IR::AddrWrapper | inlineexplicit |
operator==(const AddrWrapper &other) const -> bool (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
setChild(Node *n) (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
setParent(Node *n) (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+ | Load (Addr *a) |
+ | Load (Node *a) |
+auto | getInstruction () const -> llvm::Instruction * |
![]() | |
+constexpr | operator bool () |
+constexpr auto | getChild () const -> Node * |
+constexpr auto | getParent () const -> Node * |
+constexpr auto | getNext () const -> Node * |
+constexpr auto | getPrev () const -> Node * |
+constexpr void | setChild (Node *n) |
+constexpr void | setParent (Node *n) |
+constexpr void | insertChild (Node *n) |
+constexpr void | insertParent (Node *n) |
+constexpr void | insertAfter (Node *n) |
+constexpr void | insertAhead (Node *n) |
+constexpr auto | getCurrentDepth () const -> int |
+constexpr auto | getNaturalDepth () const -> int |
+constexpr auto | operator== (const AddrWrapper &other) const -> bool |
+constexpr auto | getLoop () const -> poly::Loop * |
+constexpr | operator Addr * () |
+Additional Inherited Members | |
![]() | |
+constexpr | AddrWrapper (Addr *a) |
![]() | |
+Addr * | addr |
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Loop, including all inherited members.
+addEdge(math::MutPtrVector< int32_t > deps, int32_t d) (defined in IR::Loop) | IR::Loop | inline |
calcLoopMask() -> int (defined in IR::Loop) | IR::Loop | inline |
checkDependsOnLoop(int depth) -> bool (defined in IR::Node) | IR::Node | |
checkUsedByInner() const -> bool (defined in IR::Node) | IR::Node | inline |
classof(const Node *v) -> bool (defined in IR::Loop) | IR::Loop | inlinestatic |
clearPrevNext() (defined in IR::Node) | IR::Node | inline |
clearVisited0() (defined in IR::Node) | IR::Node | inline |
clearVisited1() (defined in IR::Node) | IR::Node | inline |
contains(IR::Node *N) const -> bool | IR::Loop | inline |
currentDepth1 | IR::Node | protected |
edges(math::PtrVector< int32_t > edges) const -> utils::VForwardRange | IR::Loop | inline |
forEach(const auto &f) (defined in IR::Node) | IR::Node | inline |
getAffineLoop() const -> poly::Loop * (defined in IR::Loop) | IR::Loop | inline |
getChild() const -> Node * (defined in IR::Node) | IR::Node | inline |
getCurrentDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getEdge() const -> int32_t (defined in IR::Loop) | IR::Loop | inline |
getInstKind(llvm::Instruction *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getKind() const -> ValKind (defined in IR::Node) | IR::Node | inline |
getKind(llvm::Value *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getLast() const -> Node * | IR::Loop | inline |
getLegality() -> CostModeling::Legality (defined in IR::Loop) | IR::Loop | inline |
getLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getLoopAtDepth(uint8_t depth1) -> Loop * (defined in IR::Loop) | IR::Loop | inline |
getMaxDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNaturalDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNext() const -> Node * (defined in IR::Node) | IR::Node | inline |
getNextLoop() const -> Loop * | IR::Loop | inline |
getNumBBs() const -> int (defined in IR::Loop) | IR::Loop | |
getNumLoops() const -> int (defined in IR::Loop) | IR::Loop | inline |
getOuterLoop() const -> Loop * | IR::Loop | inline |
getParent() const -> Node * (defined in IR::Node) | IR::Node | inline |
getPrev() const -> Node * (defined in IR::Node) | IR::Node | inline |
getSubloop(IR::Node *N) -> Loop * (defined in IR::Loop) | IR::Loop | inline |
getSubLoop() const -> Loop * | IR::Loop | inline |
getVisitDepth0() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
getVisitDepth1() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
hoist(IR::Loop *P, int depth, IR::Loop *S) (defined in IR::Node) | IR::Node | |
insertAfter(Node *n) | IR::Node | inline |
insertAhead(Node *n) | IR::Node | inline |
insertChild(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
insertParent(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
kind (defined in IR::Node) | IR::Node | protected |
Loop(unsigned depth1) (defined in IR::Loop) | IR::Loop | inline |
Loop(unsigned depth1, poly::Loop *AL) (defined in IR::Loop) | IR::Loop | inline |
loopdeps | IR::Node | protected |
loopMask() const -> int (defined in IR::Node) | IR::Node | inline |
maxDepth (defined in IR::Node) | IR::Node | protected |
Node(ValKind kind_) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned depth) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) (defined in IR::Node) | IR::Node | inlineprotected |
nodes() noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > | IR::Node | inline |
nodes() const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > (defined in IR::Node) | IR::Node | inline |
peelLoops(ptrdiff_t numToPeel) -> ptrdiff_t (defined in IR::Node) | IR::Node | inline |
removeFromList() -> Node * (defined in IR::Node) | IR::Node | inline |
revNodes() noexcept -> utils::ListRange< Node, utils::GetPrev, utils::Identity > (defined in IR::Loop) | IR::Loop | inline |
revNodes() const noexcept -> utils::ListRange< const Node, utils::GetPrev, utils::Identity > (defined in IR::Loop) | IR::Loop | inline |
sameBlock(const Node *other) const -> bool (defined in IR::Node) | IR::Node | inline |
setAffineLoop(poly::Loop *L) (defined in IR::Loop) | IR::Loop | inline |
setAffineLoop() (defined in IR::Loop) | IR::Loop | inline |
setChild(Node *n) -> Node * | IR::Node | inline |
setCurrentDepth(int d) (defined in IR::Node) | IR::Node | inline |
setEdge(int32_t edge_id) (defined in IR::Loop) | IR::Loop | inline |
setLast(Node *n) (defined in IR::Loop) | IR::Loop | inline |
setLegality(CostModeling::Legality legality) (defined in IR::Loop) | IR::Loop | inline |
setNext(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParent(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParentLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setPrev(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setSubLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setUsedByInner() (defined in IR::Node) | IR::Node | inline |
subLoops() const (defined in IR::Loop) | IR::Loop | inline |
usedByLoop | IR::Node | protected |
ValKind enum name (defined in IR::Node) | IR::Node | |
verify() (defined in IR::Node) | IR::Node | inline |
visit0(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visit1(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visitDepth0 (defined in IR::Node) | IR::Node | protected |
visitDepth1 (defined in IR::Node) | IR::Node | protected |
visited0(uint8_t d) const -> bool | IR::Node | inline |
visited1(uint8_t d) const -> bool | IR::Node | inline |
VK_Bflt enum value (defined in IR::Node) | IR::Node | |
VK_Bint enum value (defined in IR::Node) | IR::Node | |
VK_Call enum value (defined in IR::Node) | IR::Node | |
VK_Cflt enum value (defined in IR::Node) | IR::Node | |
VK_Cint enum value (defined in IR::Node) | IR::Node | |
VK_CVal enum value (defined in IR::Node) | IR::Node | |
VK_Exit enum value (defined in IR::Node) | IR::Node | |
VK_FArg enum value (defined in IR::Node) | IR::Node | |
VK_Func enum value (defined in IR::Node) | IR::Node | |
VK_Load enum value (defined in IR::Node) | IR::Node | |
VK_Loop enum value (defined in IR::Node) | IR::Node | |
VK_Oprn enum value (defined in IR::Node) | IR::Node | |
VK_PhiN enum value (defined in IR::Node) | IR::Node | |
VK_Stow enum value (defined in IR::Node) | IR::Node | |
wasDropped() const -> bool (defined in IR::Node) | IR::Node | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+constexpr auto | edges (math::PtrVector< int32_t > edges) const -> utils::VForwardRange |
Get the IDs for the Dependencies carried by this loop. | |
+constexpr | Loop (unsigned depth1) |
+constexpr | Loop (unsigned depth1, poly::Loop *AL) |
+constexpr auto | getSubLoop () const -> Loop * |
Get the first subloop. | |
+constexpr auto | getOuterLoop () const -> Loop * |
Return the enclosing, parent loop. | |
+constexpr auto | getNextLoop () const -> Loop * |
Returns the next loop at the same level. | |
+constexpr auto | subLoops () const |
+constexpr auto | getNumLoops () const -> int |
constexpr auto | getLast () const -> Node * |
+constexpr void | setLast (Node *n) |
+constexpr auto | getAffineLoop () const -> poly::Loop * |
+constexpr void | setAffineLoop (poly::Loop *L) |
+constexpr void | setAffineLoop () |
+constexpr auto | contains (IR::Node *N) const -> bool |
Note !L->contains(L) | |
+constexpr auto | getSubloop (IR::Node *N) -> Loop * |
+constexpr auto | getEdge () const -> int32_t |
+constexpr void | setEdge (int32_t edge_id) |
+constexpr void | addEdge (math::MutPtrVector< int32_t > deps, int32_t d) |
+constexpr auto | getLoopAtDepth (uint8_t depth1) -> Loop * |
+constexpr auto | getLegality () -> CostModeling::Legality |
+constexpr void | setLegality (CostModeling::Legality legality) |
+constexpr auto | calcLoopMask () -> int |
+constexpr auto | revNodes () noexcept -> utils::ListRange< Node, utils::GetPrev, utils::Identity > |
+constexpr auto | revNodes () const noexcept -> utils::ListRange< const Node, utils::GetPrev, utils::Identity > |
+constexpr auto | getNumBBs () const -> int |
![]() | |
+constexpr void | setUsedByInner () |
+constexpr auto | checkUsedByInner () const -> bool |
+constexpr auto | loopMask () const -> int |
+constexpr auto | peelLoops (ptrdiff_t numToPeel) -> ptrdiff_t |
+constexpr auto | checkDependsOnLoop (int depth) -> bool |
+constexpr void | visit0 (uint8_t d) |
+constexpr auto | getVisitDepth0 () const -> uint8_t |
+constexpr void | clearVisited0 () |
+constexpr auto | visited0 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr void | visit1 (uint8_t d) |
+constexpr auto | getVisitDepth1 () const -> uint8_t |
+constexpr void | clearVisited1 () |
+constexpr auto | visited1 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr auto | sameBlock (const Node *other) const -> bool |
+constexpr auto | getKind () const -> ValKind |
+constexpr auto | getCurrentDepth () const -> int |
+constexpr auto | getMaxDepth () const -> int |
+constexpr auto | getNaturalDepth () const -> int |
+constexpr auto | getParent () const -> Node * |
+constexpr auto | getChild () const -> Node * |
+constexpr auto | getPrev () const -> Node * |
+constexpr auto | getNext () const -> Node * |
+void | verify () |
+constexpr auto | setNext (Node *n) -> Node * |
+constexpr auto | setPrev (Node *n) -> Node * |
constexpr auto | setChild (Node *n) -> Node * |
+constexpr auto | setParent (Node *n) -> Node * |
+constexpr void | setParentLoop (IR::Node *L) |
+constexpr void | setSubLoop (IR::Node *L) |
+constexpr void | setCurrentDepth (int d) |
constexpr void | insertAhead (Node *n) |
constexpr void | insertAfter (Node *n) |
+constexpr void | clearPrevNext () |
+constexpr auto | wasDropped () const -> bool |
+constexpr auto | removeFromList () -> Node * |
+constexpr void | insertChild (Valid< Node > n) |
+constexpr void | insertParent (Valid< Node > n) |
+constexpr void | forEach (const auto &f) |
+constexpr auto | nodes () noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > |
Iterate through all instructions. | |
+constexpr auto | nodes () const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > |
+constexpr auto | getLoop () const noexcept -> Loop * |
+constexpr auto | calcLoopMask () -> uint16_t |
+constexpr auto | getSubLoop () const noexcept -> Loop * |
+constexpr void | hoist (IR::Loop *P, int depth, IR::Loop *S) |
+Static Public Member Functions | |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static auto | getInstKind (llvm::Instruction *v) -> ValKind |
+static auto | getKind (llvm::Value *v) -> ValKind |
+Additional Inherited Members | |
![]() | |
enum | ValKind : uint8_t { + VK_Load +, VK_Stow +, VK_Loop +, VK_Exit +, + VK_FArg +, VK_CVal +, VK_Cint +, VK_Bint +, + VK_Cflt +, VK_Bflt +, VK_PhiN +, VK_Func +, + VK_Call +, VK_Oprn + + } |
![]() | |
+constexpr | Node (ValKind kind_) |
+constexpr | Node (ValKind kind_, unsigned depth) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) |
![]() | |
+const ValKind | kind |
+uint8_t | currentDepth1: 4 {0} |
The current position, 0 means top level, 1 inside a single loop. | |
+uint8_t | maxDepth: 4 {0} |
uint8_t | usedByLoop: 1 {0} |
+uint8_t | visitDepth0: 7 {127} |
+uint8_t | visitDepth1 {255} |
uint16_t | loopdeps {std::numeric_limits<uint16_t>::max()} |
Loop parent: outer loop child: inner (sub) loop last is the last instruction in the body
+
+
|
+ +inlineconstexpr | +
getLast() Get the last node in the loop. Useful for iterating backwards.
+ +
+ LoopModels
+
+ |
+
This is the complete list of members for IR::LoopInvariant, including all inherited members.
+addUser(Arena<> *alloc, Instruction *I) noexcept (defined in IR::Value) | IR::Value | inline |
calcLoopMask() -> uint16_t (defined in IR::LoopInvariant) | IR::LoopInvariant | inlinestatic |
checkDependsOnLoop(int depth) -> bool (defined in IR::Node) | IR::Node | |
checkUsedByInner() const -> bool (defined in IR::Node) | IR::Node | inline |
classof(const Node *v) -> bool (defined in IR::LoopInvariant) | IR::LoopInvariant | inlinestatic |
clearPrevNext() (defined in IR::Node) | IR::Node | inline |
clearVisited0() (defined in IR::Node) | IR::Node | inline |
clearVisited1() (defined in IR::Node) | IR::Node | inline |
currentDepth1 | IR::Node | protected |
forEach(const auto &f) (defined in IR::Node) | IR::Node | inline |
getChild() const -> Node * (defined in IR::Node) | IR::Node | inline |
getCurrentDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getInstKind(llvm::Instruction *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getKind() const -> ValKind (defined in IR::Node) | IR::Node | inline |
getKind(llvm::Value *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getMaxDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNaturalDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNext() const -> Node * (defined in IR::Node) | IR::Node | inline |
getNumScalarBits() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getNumScalarBytes() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getParent() const -> Node * (defined in IR::Node) | IR::Node | inline |
getPrev() const -> Node * (defined in IR::Node) | IR::Node | inline |
getReductionDst() const -> Instruction * | IR::Value | inline |
getSubLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getType() const -> llvm::Type * | IR::Value | inline |
getType(unsigned width) const -> llvm::Type * (defined in IR::Value) | IR::Value | inline |
getUsers() noexcept -> Users & (defined in IR::Value) | IR::Value | inline |
getUsers() const noexcept -> const Users & (defined in IR::Value) | IR::Value | inline |
getVisitDepth0() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
getVisitDepth1() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
hoist(IR::Loop *P, int depth, IR::Loop *S) (defined in IR::Node) | IR::Node | |
insertAfter(Node *n) | IR::Node | inline |
insertAhead(Node *n) | IR::Node | inline |
insertChild(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
insertParent(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
isLoad() const -> bool (defined in IR::Value) | IR::Value | inline |
isStore() const -> bool | IR::Value | inline |
kind (defined in IR::Node) | IR::Node | protected |
linkReductionDst(Instruction *op) | IR::Value | inline |
loopdeps | IR::Node | protected |
LoopInvariant(ValKind knd, llvm::Type *t) (defined in IR::LoopInvariant) | IR::LoopInvariant | inlineprotected |
loopMask() -> uint16_t (defined in IR::LoopInvariant) | IR::LoopInvariant | inlinestatic |
loopMask() const -> int (defined in IR::Node) | IR::Node | inline |
maxDepth (defined in IR::Node) | IR::Node | protected |
Node(ValKind kind_) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned depth) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) (defined in IR::Node) | IR::Node | inlineprotected |
nodes() noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > | IR::Node | inline |
nodes() const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > (defined in IR::Node) | IR::Node | inline |
peelLoops(ptrdiff_t numToPeel) -> ptrdiff_t (defined in IR::Node) | IR::Node | inline |
printName(std::ostream &) const -> std::ostream & (defined in IR::Value) | IR::Value | inline |
reduction_dst_ (defined in IR::Value) | IR::Value | protected |
removeFromList() -> Node * (defined in IR::Node) | IR::Node | inline |
removeFromUsers(Instruction *I) (defined in IR::Value) | IR::Value | inline |
sameBlock(const Node *other) const -> bool (defined in IR::Node) | IR::Node | inline |
setChild(Node *n) -> Node * | IR::Node | inline |
setCurrentDepth(int d) (defined in IR::Node) | IR::Node | inline |
setNext(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParent(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParentLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setPrev(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setSubLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setUsedByInner() (defined in IR::Node) | IR::Node | inline |
setUsers(const Users &other) noexcept (defined in IR::Value) | IR::Value | inline |
usedByLoop | IR::Node | protected |
users (defined in IR::Value) | IR::Value | protected |
ValKind enum name (defined in IR::Node) | IR::Node | |
Value(ValKind kind_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned depth, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
verify() (defined in IR::Node) | IR::Node | inline |
visit0(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visit1(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visitDepth0 (defined in IR::Node) | IR::Node | protected |
visitDepth1 (defined in IR::Node) | IR::Node | protected |
visited0(uint8_t d) const -> bool | IR::Node | inline |
visited1(uint8_t d) const -> bool | IR::Node | inline |
VK_Bflt enum value (defined in IR::Node) | IR::Node | |
VK_Bint enum value (defined in IR::Node) | IR::Node | |
VK_Call enum value (defined in IR::Node) | IR::Node | |
VK_Cflt enum value (defined in IR::Node) | IR::Node | |
VK_Cint enum value (defined in IR::Node) | IR::Node | |
VK_CVal enum value (defined in IR::Node) | IR::Node | |
VK_Exit enum value (defined in IR::Node) | IR::Node | |
VK_FArg enum value (defined in IR::Node) | IR::Node | |
VK_Func enum value (defined in IR::Node) | IR::Node | |
VK_Load enum value (defined in IR::Node) | IR::Node | |
VK_Loop enum value (defined in IR::Node) | IR::Node | |
VK_Oprn enum value (defined in IR::Node) | IR::Node | |
VK_PhiN enum value (defined in IR::Node) | IR::Node | |
VK_Stow enum value (defined in IR::Node) | IR::Node | |
wasDropped() const -> bool (defined in IR::Node) | IR::Node | inline |
+ LoopModels
+
+ |
+
+Classes | |
struct | Argument |
struct | Identifier |
+Static Public Member Functions | |
+static constexpr auto | classof (const Node *v) -> bool |
+static constexpr auto | loopMask () -> uint16_t |
+static constexpr auto | calcLoopMask () -> uint16_t |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static auto | getInstKind (llvm::Instruction *v) -> ValKind |
+static auto | getKind (llvm::Value *v) -> ValKind |
+Protected Member Functions | |
+constexpr | LoopInvariant (ValKind knd, llvm::Type *t) |
![]() | |
+constexpr | Value (ValKind kind_, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned depth, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) |
![]() | |
+constexpr | Node (ValKind kind_) |
+constexpr | Node (ValKind kind_, unsigned depth) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) |
+Additional Inherited Members | |
![]() | |
enum | ValKind : uint8_t { + VK_Load +, VK_Stow +, VK_Loop +, VK_Exit +, + VK_FArg +, VK_CVal +, VK_Cint +, VK_Bint +, + VK_Cflt +, VK_Bflt +, VK_PhiN +, VK_Func +, + VK_Call +, VK_Oprn + + } |
![]() | |
+auto | printName (std::ostream &) const -> std::ostream & |
+constexpr auto | getUsers () noexcept -> Users & |
+constexpr auto | getUsers () const noexcept -> const Users & |
+constexpr void | setUsers (const Users &other) noexcept |
+constexpr void | addUser (Arena<> *alloc, Instruction *I) noexcept |
+constexpr void | removeFromUsers (Instruction *I) |
constexpr auto | isStore () const -> bool |
+constexpr auto | isLoad () const -> bool |
constexpr auto | getReductionDst () const -> Instruction * |
+constexpr void | linkReductionDst (Instruction *op) |
this->reduction_dst_ = op; | |
+constexpr auto | getType () const -> llvm::Type * |
these methods are overloaded for specific subtypes | |
+auto | getType (unsigned width) const -> llvm::Type * |
+auto | getNumScalarBits () const -> unsigned |
+auto | getNumScalarBytes () const -> unsigned |
![]() | |
+constexpr void | setUsedByInner () |
+constexpr auto | checkUsedByInner () const -> bool |
+constexpr auto | loopMask () const -> int |
+constexpr auto | peelLoops (ptrdiff_t numToPeel) -> ptrdiff_t |
+constexpr auto | checkDependsOnLoop (int depth) -> bool |
+constexpr void | visit0 (uint8_t d) |
+constexpr auto | getVisitDepth0 () const -> uint8_t |
+constexpr void | clearVisited0 () |
+constexpr auto | visited0 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr void | visit1 (uint8_t d) |
+constexpr auto | getVisitDepth1 () const -> uint8_t |
+constexpr void | clearVisited1 () |
+constexpr auto | visited1 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr auto | sameBlock (const Node *other) const -> bool |
+constexpr auto | getKind () const -> ValKind |
+constexpr auto | getCurrentDepth () const -> int |
+constexpr auto | getMaxDepth () const -> int |
+constexpr auto | getNaturalDepth () const -> int |
+constexpr auto | getParent () const -> Node * |
+constexpr auto | getChild () const -> Node * |
+constexpr auto | getPrev () const -> Node * |
+constexpr auto | getNext () const -> Node * |
+void | verify () |
+constexpr auto | setNext (Node *n) -> Node * |
+constexpr auto | setPrev (Node *n) -> Node * |
constexpr auto | setChild (Node *n) -> Node * |
+constexpr auto | setParent (Node *n) -> Node * |
+constexpr void | setParentLoop (IR::Node *L) |
+constexpr void | setSubLoop (IR::Node *L) |
+constexpr void | setCurrentDepth (int d) |
constexpr void | insertAhead (Node *n) |
constexpr void | insertAfter (Node *n) |
+constexpr void | clearPrevNext () |
+constexpr auto | wasDropped () const -> bool |
+constexpr auto | removeFromList () -> Node * |
+constexpr void | insertChild (Valid< Node > n) |
+constexpr void | insertParent (Valid< Node > n) |
+constexpr void | forEach (const auto &f) |
+constexpr auto | nodes () noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > |
Iterate through all instructions. | |
+constexpr auto | nodes () const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > |
+constexpr auto | getLoop () const noexcept -> Loop * |
+constexpr auto | calcLoopMask () -> uint16_t |
+constexpr auto | getSubLoop () const noexcept -> Loop * |
+constexpr void | hoist (IR::Loop *P, int depth, IR::Loop *S) |
![]() | |
+Instruction * | reduction_dst_ {nullptr} |
+Users | users |
![]() | |
+const ValKind | kind |
+uint8_t | currentDepth1: 4 {0} |
The current position, 0 means top level, 1 inside a single loop. | |
+uint8_t | maxDepth: 4 {0} |
uint8_t | usedByLoop: 1 {0} |
+uint8_t | visitDepth0: 7 {127} |
+uint8_t | visitDepth1 {255} |
uint16_t | loopdeps {std::numeric_limits<uint16_t>::max()} |
Cnst This is a loop invariant value. In contrast to CVal
, this holds a type, and should have a subtype (only constructor is protected) to hold a particlar value instance.
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Node, including all inherited members.
+calcLoopMask() -> uint16_t (defined in IR::Node) | IR::Node | |
checkDependsOnLoop(int depth) -> bool (defined in IR::Node) | IR::Node | |
checkUsedByInner() const -> bool (defined in IR::Node) | IR::Node | inline |
clearPrevNext() (defined in IR::Node) | IR::Node | inline |
clearVisited0() (defined in IR::Node) | IR::Node | inline |
clearVisited1() (defined in IR::Node) | IR::Node | inline |
currentDepth1 | IR::Node | protected |
forEach(const auto &f) (defined in IR::Node) | IR::Node | inline |
getChild() const -> Node * (defined in IR::Node) | IR::Node | inline |
getCurrentDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getInstKind(llvm::Instruction *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getKind() const -> ValKind (defined in IR::Node) | IR::Node | inline |
getKind(llvm::Value *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getMaxDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNaturalDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNext() const -> Node * (defined in IR::Node) | IR::Node | inline |
getParent() const -> Node * (defined in IR::Node) | IR::Node | inline |
getPrev() const -> Node * (defined in IR::Node) | IR::Node | inline |
getSubLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getVisitDepth0() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
getVisitDepth1() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
hoist(IR::Loop *P, int depth, IR::Loop *S) (defined in IR::Node) | IR::Node | |
insertAfter(Node *n) | IR::Node | inline |
insertAhead(Node *n) | IR::Node | inline |
insertChild(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
insertParent(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
kind (defined in IR::Node) | IR::Node | protected |
loopdeps | IR::Node | protected |
loopMask() const -> int (defined in IR::Node) | IR::Node | inline |
maxDepth (defined in IR::Node) | IR::Node | protected |
Node(ValKind kind_) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned depth) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) (defined in IR::Node) | IR::Node | inlineprotected |
nodes() noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > | IR::Node | inline |
nodes() const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > (defined in IR::Node) | IR::Node | inline |
peelLoops(ptrdiff_t numToPeel) -> ptrdiff_t (defined in IR::Node) | IR::Node | inline |
removeFromList() -> Node * (defined in IR::Node) | IR::Node | inline |
sameBlock(const Node *other) const -> bool (defined in IR::Node) | IR::Node | inline |
setChild(Node *n) -> Node * | IR::Node | inline |
setCurrentDepth(int d) (defined in IR::Node) | IR::Node | inline |
setNext(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParent(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParentLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setPrev(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setSubLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setUsedByInner() (defined in IR::Node) | IR::Node | inline |
usedByLoop | IR::Node | protected |
ValKind enum name (defined in IR::Node) | IR::Node | |
verify() (defined in IR::Node) | IR::Node | inline |
visit0(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visit1(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visitDepth0 (defined in IR::Node) | IR::Node | protected |
visitDepth1 (defined in IR::Node) | IR::Node | protected |
visited0(uint8_t d) const -> bool | IR::Node | inline |
visited1(uint8_t d) const -> bool | IR::Node | inline |
VK_Bflt enum value (defined in IR::Node) | IR::Node | |
VK_Bint enum value (defined in IR::Node) | IR::Node | |
VK_Call enum value (defined in IR::Node) | IR::Node | |
VK_Cflt enum value (defined in IR::Node) | IR::Node | |
VK_Cint enum value (defined in IR::Node) | IR::Node | |
VK_CVal enum value (defined in IR::Node) | IR::Node | |
VK_Exit enum value (defined in IR::Node) | IR::Node | |
VK_FArg enum value (defined in IR::Node) | IR::Node | |
VK_Func enum value (defined in IR::Node) | IR::Node | |
VK_Load enum value (defined in IR::Node) | IR::Node | |
VK_Loop enum value (defined in IR::Node) | IR::Node | |
VK_Oprn enum value (defined in IR::Node) | IR::Node | |
VK_PhiN enum value (defined in IR::Node) | IR::Node | |
VK_Stow enum value (defined in IR::Node) | IR::Node | |
wasDropped() const -> bool (defined in IR::Node) | IR::Node | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+constexpr void | setUsedByInner () |
+constexpr auto | checkUsedByInner () const -> bool |
+constexpr auto | loopMask () const -> int |
+constexpr auto | peelLoops (ptrdiff_t numToPeel) -> ptrdiff_t |
+constexpr auto | checkDependsOnLoop (int depth) -> bool |
+constexpr void | visit0 (uint8_t d) |
+constexpr auto | getVisitDepth0 () const -> uint8_t |
+constexpr void | clearVisited0 () |
+constexpr auto | visited0 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr void | visit1 (uint8_t d) |
+constexpr auto | getVisitDepth1 () const -> uint8_t |
+constexpr void | clearVisited1 () |
+constexpr auto | visited1 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr auto | sameBlock (const Node *other) const -> bool |
+constexpr auto | getKind () const -> ValKind |
+constexpr auto | getCurrentDepth () const -> int |
+constexpr auto | getMaxDepth () const -> int |
+constexpr auto | getNaturalDepth () const -> int |
+constexpr auto | getParent () const -> Node * |
+constexpr auto | getChild () const -> Node * |
+constexpr auto | getPrev () const -> Node * |
+constexpr auto | getNext () const -> Node * |
+void | verify () |
+constexpr auto | setNext (Node *n) -> Node * |
+constexpr auto | setPrev (Node *n) -> Node * |
constexpr auto | setChild (Node *n) -> Node * |
+constexpr auto | setParent (Node *n) -> Node * |
+constexpr void | setParentLoop (IR::Node *L) |
+constexpr void | setSubLoop (IR::Node *L) |
+constexpr void | setCurrentDepth (int d) |
constexpr void | insertAhead (Node *n) |
constexpr void | insertAfter (Node *n) |
+constexpr void | clearPrevNext () |
+constexpr auto | wasDropped () const -> bool |
+constexpr auto | removeFromList () -> Node * |
+constexpr void | insertChild (Valid< Node > n) |
+constexpr void | insertParent (Valid< Node > n) |
+constexpr void | forEach (const auto &f) |
+constexpr auto | nodes () noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > |
Iterate through all instructions. | |
+constexpr auto | nodes () const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > |
+constexpr auto | getLoop () const noexcept -> Loop * |
+constexpr auto | calcLoopMask () -> uint16_t |
+constexpr auto | getSubLoop () const noexcept -> Loop * |
+constexpr void | hoist (IR::Loop *P, int depth, IR::Loop *S) |
+Static Public Member Functions | |
+static auto | getInstKind (llvm::Instruction *v) -> ValKind |
+static auto | getKind (llvm::Value *v) -> ValKind |
+Protected Attributes | |
+const ValKind | kind |
+uint8_t | currentDepth1: 4 {0} |
The current position, 0 means top level, 1 inside a single loop. | |
+uint8_t | maxDepth: 4 {0} |
uint8_t | usedByLoop: 1 {0} |
+uint8_t | visitDepth0: 7 {127} |
+uint8_t | visitDepth1 {255} |
uint16_t | loopdeps {std::numeric_limits<uint16_t>::max()} |
We take an approach similar to LLVM's RTTI however, we want to take advantage of FAMs while having a "hieararchy" we accomplish this via a base class, and then wrapper classes that simply hold the Val*
.
Val
has a base memory layout which can be used for iterating over the IR
The IR forms a graph with many links. Linear links let us follow the flat structure that mirrors code we would generate. We additionally have links that let us view it as a tree structure.
+For example, we may have
+0. // VK_Loop // toplevel
w = y2 - q
Start and end of a level are given by nullptr
.
Same level -> means getNext() Sub-level -> means getChild() We have 0. -> 1. -> 2. -> 21. -> 22 -> 23 -> 3 -> 4 -> 8-> 9 -> 10 -> 11 -> 17 -> 18 -> 19 -> 20 -> 5 -> 6 -> 7 -> 12 -> 13 -> 14 -> 15 -> 16 For a Loop
, getChild()
returns the first contained instruction, and For Instruction
s, getChild()
returns the first sub-loop. getParent()
returns the enclosing (outer) loop. Thus, for example, we can iterate over all sub-loops of L
via
Node* C = getChild(); +C = llvm::isa<Loop>(C) ? C : C->getChild(); +while (C){ + // do stuff with `C` + C = C->getNext() + C = (!C || llvm::isa<Loop>(C)) ? C : C->getChild(); +} ++
+
|
+ +inlineconstexpr | +
insert n
after this
: prev->this->next
bcomes prev->this->n->next
+
|
+ +inlineconstexpr | +
insert n
ahead of this
prev->this->next
bcomes prev->n->this->next
+
|
+ +inlineconstexpr | +
Currently, this == node
is allowed because AddrChain
uses it. This sets child to n
, and the child's parent to this
To additionally set n->child
to this->child
, and child->parent=n
, use insertChild
. The effective difference is setChild
loses the place in a parent/child chain, as the original this->child
is lost, and its parent isn't updated either. Thus, setChild
is only really appropriate when pushing *this
, or not building a chain.
+
|
+ +protected | +
Mask indicating dependencies. The bits of the mask go [0,...,inner,...,outer] This is in constrast to indexMatrix, and depth indexing, which are [outer,...,inner] Thus, the bits of loopdeps
should be read from right to left, which is the natural way to iterate over bits anyway. This also keeps masks in alignment with one another. This is noteworthy, because while collections such as arrays are naturally FIFO, bits are more naturally FILO.
+
|
+ +protected | +
For an Addr
, this is the "natural depth" where it would be placed in a loop without dependencies, i.e., the inner mostindex 0
means top level, 1
inside a single loop, etc
+ LoopModels
+
+ |
+
This is the complete list of members for IR::OpaqueFunc, including all inherited members.
+calcCallCost(target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) -> std::array< llvm::InstructionCost, N > (defined in IR::OpaqueFunc) | IR::OpaqueFunc | inline |
calcCallCost(target::Machine< TTI > target, llvm::Function *F, unsigned int vectorWidth, std::array< CostKind, N > costKinds) -> std::array< llvm::InstructionCost, N > (defined in IR::OpaqueFunc) | IR::OpaqueFunc | inline |
getFunction() -> llvm::Function * (defined in IR::OpaqueFunc) | IR::OpaqueFunc | inline |
getOperands() const -> PtrVector< Value * > (defined in IR::OpaqueFunc) | IR::OpaqueFunc | inline |
OpaqueFunc(Compute *I) (defined in IR::OpaqueFunc) | IR::OpaqueFunc | inline |
operator Compute *() const (defined in IR::OpaqueFunc) | IR::OpaqueFunc | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+constexpr | operator Compute * () const |
+constexpr | OpaqueFunc (Compute *I) |
+constexpr auto | getOperands () const -> PtrVector< Value * > |
+auto | getFunction () -> llvm::Function * |
+template<size_t N, bool TTI> | |
auto | calcCallCost (target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) -> std::array< llvm::InstructionCost, N > |
+template<size_t N, bool TTI> | |
auto | calcCallCost (target::Machine< TTI > target, llvm::Function *F, unsigned int vectorWidth, std::array< CostKind, N > costKinds) -> std::array< llvm::InstructionCost, N > |
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Operation, including all inherited members.
+calcBinaryArithmeticCost(target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > (defined in IR::Operation) | IR::Operation | inline |
calcCastCost(target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > (defined in IR::Operation) | IR::Operation | inline |
calcCastCost(target::Machine< TTI > target, unsigned int vectorWidth, CostKind costKind=CostKind::TCK_RecipThroughput) const -> llvm::InstructionCost (defined in IR::Operation) | IR::Operation | inline |
calcCmpSelectCost(target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > (defined in IR::Operation) | IR::Operation | inline |
calcCost(target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > (defined in IR::Operation) | IR::Operation | inline |
calcCost(target::Machine< TTI > target, unsigned int vectorWidth, CostKind costKind=CostKind::TCK_RecipThroughput) const -> llvm::InstructionCost (defined in IR::Operation) | IR::Operation | inline |
calculateCostFAddFSub(target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > (defined in IR::Operation) | IR::Operation | inline |
calculateCostFMul(target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > | IR::Operation | inline |
calculateFNegCost(target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > (defined in IR::Operation) | IR::Operation | inline |
calcUnaryArithmeticCost(target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > (defined in IR::Operation) | IR::Operation | inline |
getCastContext() const -> llvm::TargetTransformInfo::CastContextHint (defined in IR::Operation) | IR::Operation | inline |
getInstruction() const -> llvm::Instruction * (defined in IR::Operation) | IR::Operation | inline |
getNumOperands() const -> unsigned (defined in IR::Operation) | IR::Operation | inline |
getOpCode() const -> llvm::Intrinsic::ID (defined in IR::Operation) | IR::Operation | inline |
getOpCode(llvm::Value *v) -> std::optional< llvm::Intrinsic::ID > (defined in IR::Operation) | IR::Operation | inlinestatic |
getOperand(ptrdiff_t i) const -> Value * (defined in IR::Operation) | IR::Operation | inline |
getOperands() const -> PtrVector< Value * > (defined in IR::Operation) | IR::Operation | inline |
getPredicate() const -> llvm::CmpInst::Predicate (defined in IR::Operation) | IR::Operation | inline |
getType() const -> llvm::Type * (defined in IR::Operation) | IR::Operation | inline |
getType(unsigned w) const -> llvm::Type * (defined in IR::Operation) | IR::Operation | inline |
isCmp(Node *n) -> bool (defined in IR::Operation) | IR::Operation | inlinestatic |
isCmp() const -> bool (defined in IR::Operation) | IR::Operation | inline |
isExtract(Node *n) -> bool (defined in IR::Operation) | IR::Operation | inlinestatic |
isExtract() const -> bool (defined in IR::Operation) | IR::Operation | inline |
isExtractValue(Node *n) -> bool (defined in IR::Operation) | IR::Operation | inlinestatic |
isExtractValue() const -> bool (defined in IR::Operation) | IR::Operation | inline |
isFAdd(Node *n) -> bool (defined in IR::Operation) | IR::Operation | inlinestatic |
isFAdd() const -> bool (defined in IR::Operation) | IR::Operation | inline |
isFcmp(Node *n) -> bool (defined in IR::Operation) | IR::Operation | inlinestatic |
isFcmp() const -> bool (defined in IR::Operation) | IR::Operation | inline |
isFMul(Node *n) -> bool (defined in IR::Operation) | IR::Operation | inlinestatic |
isFMul() const -> bool (defined in IR::Operation) | IR::Operation | inline |
isFMulOrFNegOfFMul(Node *n) -> bool (defined in IR::Operation) | IR::Operation | inlinestatic |
isFMulOrFNegOfFMul() const -> bool (defined in IR::Operation) | IR::Operation | inline |
isFNeg(Node *n) -> bool (defined in IR::Operation) | IR::Operation | inlinestatic |
isFNeg() const -> bool (defined in IR::Operation) | IR::Operation | inline |
isFSub(Node *n) -> bool (defined in IR::Operation) | IR::Operation | inlinestatic |
isFSub() const -> bool (defined in IR::Operation) | IR::Operation | inline |
isIcmp(Node *n) -> bool (defined in IR::Operation) | IR::Operation | inlinestatic |
isIcmp() const -> bool (defined in IR::Operation) | IR::Operation | inline |
isInsert(Node *n) -> bool (defined in IR::Operation) | IR::Operation | inlinestatic |
isInsert() const -> bool (defined in IR::Operation) | IR::Operation | inline |
isInsertValue(Node *n) -> bool (defined in IR::Operation) | IR::Operation | inlinestatic |
isInsertValue() const -> bool (defined in IR::Operation) | IR::Operation | inline |
isInstruction(llvm::Intrinsic::ID opCode) const -> bool (defined in IR::Operation) | IR::Operation | inline |
isSelect(Node *n) -> bool (defined in IR::Operation) | IR::Operation | inlinestatic |
isSelect() const -> bool (defined in IR::Operation) | IR::Operation | inline |
isShuffle(Node *n) -> bool (defined in IR::Operation) | IR::Operation | inlinestatic |
isShuffle() const -> bool (defined in IR::Operation) | IR::Operation | inline |
Operation(Compute *I) (defined in IR::Operation) | IR::Operation | inline |
Operation(Node *n) (defined in IR::Operation) | IR::Operation | inline |
operator bool() const (defined in IR::Operation) | IR::Operation | inlineexplicit |
operator Compute *() const (defined in IR::Operation) | IR::Operation | inline |
selectCost(target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > | IR::Operation | inline |
selectCost(target::Machine< TTI > target, llvm::Type *T, std::array< CostKind, N > costKinds) -> std::array< llvm::InstructionCost, N > (defined in IR::Operation) | IR::Operation | inlinestatic |
selectCost(target::Machine< TTI > target, unsigned int vectorWidth, CostKind costKind=CostKind::TCK_RecipThroughput) const -> llvm::InstructionCost (defined in IR::Operation) | IR::Operation | inline |
selectCost(target::Machine< TTI > target, llvm::Type *T, CostKind costKind=CostKind::TCK_RecipThroughput) -> llvm::InstructionCost (defined in IR::Operation) | IR::Operation | inlinestatic |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+constexpr | operator Compute * () const |
+constexpr | Operation (Compute *I) |
+constexpr | Operation (Node *n) |
+constexpr | operator bool () const |
+auto | getOpCode () const -> llvm::Intrinsic::ID |
+constexpr auto | getOperands () const -> PtrVector< Value * > |
+constexpr auto | getOperand (ptrdiff_t i) const -> Value * |
+constexpr auto | getNumOperands () const -> unsigned |
+auto | isInstruction (llvm::Intrinsic::ID opCode) const -> bool |
+auto | isFMul () const -> bool |
+auto | isFNeg () const -> bool |
+auto | isFMulOrFNegOfFMul () const -> bool |
+auto | isFAdd () const -> bool |
+auto | isFSub () const -> bool |
+auto | isShuffle () const -> bool |
+auto | isFcmp () const -> bool |
+auto | isIcmp () const -> bool |
+auto | isCmp () const -> bool |
+auto | isSelect () const -> bool |
+auto | isExtract () const -> bool |
+auto | isInsert () const -> bool |
+auto | isExtractValue () const -> bool |
+auto | isInsertValue () const -> bool |
+auto | getType () const -> llvm::Type * |
+auto | getType (unsigned w) const -> llvm::Type * |
+template<size_t N, bool TTI> | |
auto | calcUnaryArithmeticCost (target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > |
+auto | getInstruction () const -> llvm::Instruction * |
+template<size_t N, bool TTI> | |
auto | calcBinaryArithmeticCost (target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > |
+auto | getPredicate () const -> llvm::CmpInst::Predicate |
+template<size_t N, bool TTI> | |
auto | calcCmpSelectCost (target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > |
template<size_t N, bool TTI> | |
auto | selectCost (target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > |
+template<bool TTI> | |
auto | selectCost (target::Machine< TTI > target, unsigned int vectorWidth, CostKind costKind=CostKind::TCK_RecipThroughput) const -> llvm::InstructionCost |
+auto | getCastContext () const -> llvm::TargetTransformInfo::CastContextHint |
+template<size_t N, bool TTI> | |
auto | calcCastCost (target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > |
+template<bool TTI> | |
auto | calcCastCost (target::Machine< TTI > target, unsigned int vectorWidth, CostKind costKind=CostKind::TCK_RecipThroughput) const -> llvm::InstructionCost |
+template<size_t N, bool TTI> | |
auto | calculateCostFAddFSub (target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > |
template<size_t N, bool TTI> | |
auto | calculateCostFMul (target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > |
+template<size_t N, bool TTI> | |
auto | calculateFNegCost (target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > |
+template<size_t N, bool TTI> | |
auto | calcCost (target::Machine< TTI > target, unsigned int vectorWidth, std::array< CostKind, N > costKinds) const -> std::array< llvm::InstructionCost, N > |
+template<bool TTI> | |
auto | calcCost (target::Machine< TTI > target, unsigned int vectorWidth, CostKind costKind=CostKind::TCK_RecipThroughput) const -> llvm::InstructionCost |
+Static Public Member Functions | |
+static auto | getOpCode (llvm::Value *v) -> std::optional< llvm::Intrinsic::ID > |
+static auto | isFMul (Node *n) -> bool |
+static auto | isFNeg (Node *n) -> bool |
+static auto | isFMulOrFNegOfFMul (Node *n) -> bool |
+static auto | isFAdd (Node *n) -> bool |
+static auto | isFSub (Node *n) -> bool |
+static auto | isShuffle (Node *n) -> bool |
+static auto | isFcmp (Node *n) -> bool |
+static auto | isIcmp (Node *n) -> bool |
+static auto | isCmp (Node *n) -> bool |
+static auto | isSelect (Node *n) -> bool |
+static auto | isExtract (Node *n) -> bool |
+static auto | isInsert (Node *n) -> bool |
+static auto | isExtractValue (Node *n) -> bool |
+static auto | isInsertValue (Node *n) -> bool |
+template<size_t N, bool TTI> | |
static auto | selectCost (target::Machine< TTI > target, llvm::Type *T, std::array< CostKind, N > costKinds) -> std::array< llvm::InstructionCost, N > |
+template<bool TTI> | |
static auto | selectCost (target::Machine< TTI > target, llvm::Type *T, CostKind costKind=CostKind::TCK_RecipThroughput) -> llvm::InstructionCost |
+
|
+ +inline | +
return 0
if all users are fusible with the fmul
Fusion possibilities: fmadd a * b + c fmsub a * b - c fnmadd c - a * b // maybe -(a * b) + c ? fnmsub -(a * b) - c
+
|
+ +inline | +
for calculating the cost of a select when merging this instruction with another one.
+ +
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Phi, including all inherited members.
+addUser(Arena<> *alloc, Instruction *I) noexcept (defined in IR::Value) | IR::Value | inline |
blkidx_ (defined in IR::Instruction) | IR::Instruction | protected |
calcLoopMask() -> uint16_t (defined in IR::Node) | IR::Node | |
checkDependsOnLoop(int depth) -> bool (defined in IR::Node) | IR::Node | |
checkUsedByInner() const -> bool (defined in IR::Node) | IR::Node | inline |
classof(const Node *v) -> bool (defined in IR::Phi) | IR::Phi | inlinestatic |
clearPrevNext() (defined in IR::Node) | IR::Node | inline |
clearVisited0() (defined in IR::Node) | IR::Node | inline |
clearVisited1() (defined in IR::Node) | IR::Node | inline |
CostKind typedef (defined in IR::Instruction) | IR::Instruction | |
currentDepth1 | IR::Node | protected |
dump(std::ostream &os) const -> std::ostream & (defined in IR::Phi) | IR::Phi | inline |
forEach(const auto &f) (defined in IR::Node) | IR::Node | inline |
getBlkIdx() const -> int | IR::Instruction | inline |
getChild() const -> Node * (defined in IR::Node) | IR::Node | inline |
getCurrentDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getInstKind(llvm::Instruction *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getKind() const -> ValKind (defined in IR::Node) | IR::Node | inline |
getKind(llvm::Value *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getMaxDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNaturalDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNext() const -> Node * (defined in IR::Node) | IR::Node | inline |
getNumScalarBits() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getNumScalarBytes() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getOpArray() const -> std::array< Value *, 2 > (defined in IR::Phi) | IR::Phi | inline |
getOperand(ptrdiff_t i) const -> Value * (defined in IR::Phi) | IR::Phi | inline |
getOperands() -> math::MutPtrVector< Value * > (defined in IR::Phi) | IR::Phi | inline |
getOperands() const -> math::PtrVector< Value * > (defined in IR::Phi) | IR::Phi | inline |
getParent() const -> Node * (defined in IR::Node) | IR::Node | inline |
getPrev() const -> Node * (defined in IR::Node) | IR::Node | inline |
getReductionDst() const -> Instruction * | IR::Value | inline |
getSubLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getTopIdx() const -> int | IR::Instruction | inline |
getType() const -> llvm::Type * | IR::Value | inline |
getType(unsigned width) const -> llvm::Type * (defined in IR::Value) | IR::Value | inline |
getUsers() noexcept -> Users & (defined in IR::Value) | IR::Value | inline |
getUsers() const noexcept -> const Users & (defined in IR::Value) | IR::Value | inline |
getVisitDepth0() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
getVisitDepth1() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
hoist(IR::Loop *P, int depth, IR::Loop *S) (defined in IR::Node) | IR::Node | |
insertAfter(Node *n) | IR::Node | inline |
insertAhead(Node *n) | IR::Node | inline |
insertChild(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
insertParent(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
Instruction(ValKind kind_, llvm::Type *t) | IR::Instruction | inlineprotected |
Instruction(ValKind kind_, unsigned depth, llvm::Type *t) (defined in IR::Instruction) | IR::Instruction | inlineprotected |
Instruction(ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) (defined in IR::Instruction) | IR::Instruction | inlineprotected |
Instruction(ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) (defined in IR::Instruction) | IR::Instruction | inlineprotected |
isAccumPhi() const -> bool (defined in IR::Phi) | IR::Phi | inline |
isJoinPhi() const -> bool (defined in IR::Phi) | IR::Phi | inline |
isLoad() const -> bool (defined in IR::Value) | IR::Value | inline |
isReassociable() const -> bool (defined in IR::Phi) | IR::Phi | inline |
isStore() const -> bool | IR::Value | inline |
kind (defined in IR::Node) | IR::Node | protected |
linkReductionDst(Instruction *op) | IR::Value | inline |
loopdeps | IR::Node | protected |
loopMask() const -> int (defined in IR::Node) | IR::Node | inline |
maxDepth (defined in IR::Node) | IR::Node | protected |
Node(ValKind kind_) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned depth) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) (defined in IR::Node) | IR::Node | inlineprotected |
nodes() noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > | IR::Node | inline |
nodes() const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > (defined in IR::Node) | IR::Node | inline |
peelLoops(ptrdiff_t numToPeel) -> ptrdiff_t (defined in IR::Node) | IR::Node | inline |
Phi(Addr *a, Addr *b, Loop *L) | IR::Phi | inline |
printName(std::ostream &os) const -> std::ostream & (defined in IR::Instruction) | IR::Instruction | inline |
reduction_dst_ (defined in IR::Value) | IR::Value | protected |
removeFromList() -> Node * (defined in IR::Node) | IR::Node | inline |
removeFromUsers(Instruction *I) (defined in IR::Value) | IR::Value | inline |
sameBlock(const Node *other) const -> bool (defined in IR::Node) | IR::Node | inline |
setChild(Node *n) -> Node * | IR::Node | inline |
setCurrentDepth(int d) (defined in IR::Node) | IR::Node | inline |
setNext(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setOperands(math::PtrVector< Value * > ops) (defined in IR::Phi) | IR::Phi | inline |
setParent(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParentLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setPosition(std::array< int, 2 > newidx) -> std::array< int, 2 > (defined in IR::Instruction) | IR::Instruction | inline |
setPrev(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setSubLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setUsedByInner() (defined in IR::Node) | IR::Node | inline |
setUsers(const Users &other) noexcept (defined in IR::Value) | IR::Value | inline |
topidx_ (defined in IR::Instruction) | IR::Instruction | protected |
usedByLoop | IR::Node | protected |
users (defined in IR::Value) | IR::Value | protected |
ValKind enum name (defined in IR::Node) | IR::Node | |
Value(ValKind kind_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned depth, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
verify() (defined in IR::Node) | IR::Node | inline |
visit0(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visit1(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visitDepth0 (defined in IR::Node) | IR::Node | protected |
visitDepth1 (defined in IR::Node) | IR::Node | protected |
visited0(uint8_t d) const -> bool | IR::Node | inline |
visited1(uint8_t d) const -> bool | IR::Node | inline |
VK_Bflt enum value (defined in IR::Node) | IR::Node | |
VK_Bint enum value (defined in IR::Node) | IR::Node | |
VK_Call enum value (defined in IR::Node) | IR::Node | |
VK_Cflt enum value (defined in IR::Node) | IR::Node | |
VK_Cint enum value (defined in IR::Node) | IR::Node | |
VK_CVal enum value (defined in IR::Node) | IR::Node | |
VK_Exit enum value (defined in IR::Node) | IR::Node | |
VK_FArg enum value (defined in IR::Node) | IR::Node | |
VK_Func enum value (defined in IR::Node) | IR::Node | |
VK_Load enum value (defined in IR::Node) | IR::Node | |
VK_Loop enum value (defined in IR::Node) | IR::Node | |
VK_Oprn enum value (defined in IR::Node) | IR::Node | |
VK_PhiN enum value (defined in IR::Node) | IR::Node | |
VK_Stow enum value (defined in IR::Node) | IR::Node | |
wasDropped() const -> bool (defined in IR::Node) | IR::Node | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+constexpr auto | isAccumPhi () const -> bool |
+constexpr auto | isJoinPhi () const -> bool |
constexpr | Phi (Addr *a, Addr *b, Loop *L) |
+constexpr auto | getOperands () -> math::MutPtrVector< Value * > |
+constexpr auto | getOperands () const -> math::PtrVector< Value * > |
+constexpr auto | getOpArray () const -> std::array< Value *, 2 > |
+constexpr auto | getOperand (ptrdiff_t i) const -> Value * |
+constexpr void | setOperands (math::PtrVector< Value * > ops) |
+constexpr auto | isReassociable () const -> bool |
+auto | dump (std::ostream &os) const -> std::ostream & |
![]() | |
+auto | printName (std::ostream &os) const -> std::ostream & |
+constexpr auto | getTopIdx () const -> int |
Gives position within the loop nest; starts at 0 . | |
constexpr auto | getBlkIdx () const -> int |
+constexpr auto | setPosition (std::array< int, 2 > newidx) -> std::array< int, 2 > |
![]() | |
+auto | printName (std::ostream &) const -> std::ostream & |
+constexpr auto | getUsers () noexcept -> Users & |
+constexpr auto | getUsers () const noexcept -> const Users & |
+constexpr void | setUsers (const Users &other) noexcept |
+constexpr void | addUser (Arena<> *alloc, Instruction *I) noexcept |
+constexpr void | removeFromUsers (Instruction *I) |
constexpr auto | isStore () const -> bool |
+constexpr auto | isLoad () const -> bool |
constexpr auto | getReductionDst () const -> Instruction * |
+constexpr void | linkReductionDst (Instruction *op) |
this->reduction_dst_ = op; | |
+constexpr auto | getType () const -> llvm::Type * |
these methods are overloaded for specific subtypes | |
+auto | getType (unsigned width) const -> llvm::Type * |
+auto | getNumScalarBits () const -> unsigned |
+auto | getNumScalarBytes () const -> unsigned |
![]() | |
+constexpr void | setUsedByInner () |
+constexpr auto | checkUsedByInner () const -> bool |
+constexpr auto | loopMask () const -> int |
+constexpr auto | peelLoops (ptrdiff_t numToPeel) -> ptrdiff_t |
+constexpr auto | checkDependsOnLoop (int depth) -> bool |
+constexpr void | visit0 (uint8_t d) |
+constexpr auto | getVisitDepth0 () const -> uint8_t |
+constexpr void | clearVisited0 () |
+constexpr auto | visited0 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr void | visit1 (uint8_t d) |
+constexpr auto | getVisitDepth1 () const -> uint8_t |
+constexpr void | clearVisited1 () |
+constexpr auto | visited1 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr auto | sameBlock (const Node *other) const -> bool |
+constexpr auto | getKind () const -> ValKind |
+constexpr auto | getCurrentDepth () const -> int |
+constexpr auto | getMaxDepth () const -> int |
+constexpr auto | getNaturalDepth () const -> int |
+constexpr auto | getParent () const -> Node * |
+constexpr auto | getChild () const -> Node * |
+constexpr auto | getPrev () const -> Node * |
+constexpr auto | getNext () const -> Node * |
+void | verify () |
+constexpr auto | setNext (Node *n) -> Node * |
+constexpr auto | setPrev (Node *n) -> Node * |
constexpr auto | setChild (Node *n) -> Node * |
+constexpr auto | setParent (Node *n) -> Node * |
+constexpr void | setParentLoop (IR::Node *L) |
+constexpr void | setSubLoop (IR::Node *L) |
+constexpr void | setCurrentDepth (int d) |
constexpr void | insertAhead (Node *n) |
constexpr void | insertAfter (Node *n) |
+constexpr void | clearPrevNext () |
+constexpr auto | wasDropped () const -> bool |
+constexpr auto | removeFromList () -> Node * |
+constexpr void | insertChild (Valid< Node > n) |
+constexpr void | insertParent (Valid< Node > n) |
+constexpr void | forEach (const auto &f) |
+constexpr auto | nodes () noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > |
Iterate through all instructions. | |
+constexpr auto | nodes () const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > |
+constexpr auto | getLoop () const noexcept -> Loop * |
+constexpr auto | calcLoopMask () -> uint16_t |
+constexpr auto | getSubLoop () const noexcept -> Loop * |
+constexpr void | hoist (IR::Loop *P, int depth, IR::Loop *S) |
+Static Public Member Functions | |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static auto | getInstKind (llvm::Instruction *v) -> ValKind |
+static auto | getKind (llvm::Value *v) -> ValKind |
+Additional Inherited Members | |
![]() | |
+using | CostKind = llvm::TargetTransformInfo::TargetCostKind |
![]() | |
enum | ValKind : uint8_t { + VK_Load +, VK_Stow +, VK_Loop +, VK_Exit +, + VK_FArg +, VK_CVal +, VK_Cint +, VK_Bint +, + VK_Cflt +, VK_Bflt +, VK_PhiN +, VK_Func +, + VK_Call +, VK_Oprn + + } |
![]() | |
constexpr | Instruction (ValKind kind_, llvm::Type *t) |
+constexpr | Instruction (ValKind kind_, unsigned depth, llvm::Type *t) |
+constexpr | Instruction (ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) |
+constexpr | Instruction (ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) |
![]() | |
+constexpr | Value (ValKind kind_, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned depth, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) |
![]() | |
+constexpr | Node (ValKind kind_) |
+constexpr | Node (ValKind kind_, unsigned depth) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) |
![]() | |
+int | topidx_ {-1} |
+int | blkidx_ {-1} |
![]() | |
+Instruction * | reduction_dst_ {nullptr} |
+Users | users |
![]() | |
+const ValKind | kind |
+uint8_t | currentDepth1: 4 {0} |
The current position, 0 means top level, 1 inside a single loop. | |
+uint8_t | maxDepth: 4 {0} |
uint8_t | usedByLoop: 1 {0} |
+uint8_t | visitDepth0: 7 {127} |
+uint8_t | visitDepth1 {255} |
uint16_t | loopdeps {std::numeric_limits<uint16_t>::max()} |
Our Phi are simple. for (ptrdiff_t m = 0; m < M; ++m){ xm = 0.0; // or xm = x[m]; for (ptrdiff_t n = 0; n < N; ++n) xm += A[m, n] * y[n]; x[m] = xm; } We would have %0 = 0.0 %1 = loopstart // or xinit = x[%1] %2 = loopstart %3 = Phi(%0, %7) %4 = A[%1, %2] %5 = y[%2] %6 = %4 * %5 %7 = %3 + %6 x[m] = %3
+getOperand(0)
if no trips completed, getOperand(1)
otherwise. Or, a double-reduction example: for (ptrdiff_t m = 0; m < M; ++m){ xm = 0.0; // or xm = x[m]; for (ptrdiff_t n = 0; n < N; ++n) for (ptrdiff_t k = 0; k < K; ++k) xm += A[m, n, k] * y[n, k]; x[m] = xm; } We would have %0 = 0.0 %1 = loopstart // or xinit = x[%1] %2 = loopstart %3 = Phi(%0, %10) // accu - loopmask = 0x01 %4 = loopstart %5 = Phi(%3, %9) // accu - loopmask = 0x01 %6 = A[%1, %2, %4] %7 = y[%2, %4] %8 = %6 * %7 %9 = %5 + %8 %10 = Phi(%3, %9) // join %11 = Phi(%0, %10) // join x[m] = %11
+
|
+ +inlineconstexpr | +
places Phi(a, b)
in L
a
is assumed to be a hoisted initializer, and b
The loop mask excludes the current and deeper loops, as it is not unrolled with respect to any of these! This sets getOperands()
to a
and b->getStoredVal()
, but does not update the users of the oeprands; that is the responsibility of the IR::Cache
object.
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Predicate::Map, including all inherited members.
+assume(Intersection predicate) (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
begin() (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
clear() (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
contains(llvm::BasicBlock *BB) const -> bool (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
contains(llvm::Instruction *I) const -> bool (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
Destination enum name (defined in IR::Predicate::Map) | IR::Predicate::Map | |
empty() const -> bool (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
end() (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
find(llvm::BasicBlock *bb) -> containers::Pair< llvm::BasicBlock *, Set > * (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
find(llvm::Instruction *inst) -> containers::Pair< llvm::BasicBlock *, Set > * (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
getPredicates() (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
insert(containers::Pair< llvm::BasicBlock *, Set > &&pair) (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
isDivergent() const -> bool (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
isInPath(llvm::BasicBlock *BB) -> bool (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
isInPath(llvm::Instruction *I) -> bool (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
Map(Arena<> *alloc) (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
Map(const Map &x)=default (defined in IR::Predicate::Map) | IR::Predicate::Map | |
Map(Map &&x) noexcept (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
operator=(Map &&) -> Map &=default (defined in IR::Predicate::Map) | IR::Predicate::Map | |
operator[](llvm::BasicBlock *bb) -> Set (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
operator[](llvm::Instruction *inst) -> std::optional< Set > (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
rbegin() (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
reach(Arena<> *alloc, llvm::BasicBlock *BB, Intersection predicate) (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
rend() (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
size() const -> size_t (defined in IR::Predicate::Map) | IR::Predicate::Map | inline |
+ LoopModels
+
+ |
+
+Public Types | |
enum class | Destination { Reached +, Unreachable +, Returned +, Unknown + } |
+Public Member Functions | |
+ | Map (Arena<> *alloc) |
+ | Map (const Map &x)=default |
+ | Map (Map &&x) noexcept |
+auto | operator= (Map &&) -> Map &=default |
+auto | size () const -> size_t |
+auto | empty () const -> bool |
+auto | isDivergent () const -> bool |
+auto | getPredicates () |
+auto | find (llvm::BasicBlock *bb) -> containers::Pair< llvm::BasicBlock *, Set > * |
+auto | find (llvm::Instruction *inst) -> containers::Pair< llvm::BasicBlock *, Set > * |
+auto | begin () |
+auto | end () |
+auto | rbegin () |
+auto | rend () |
+auto | operator[] (llvm::BasicBlock *bb) -> Set |
+auto | operator[] (llvm::Instruction *inst) -> std::optional< Set > |
+void | insert (containers::Pair< llvm::BasicBlock *, Set > &&pair) |
+auto | contains (llvm::BasicBlock *BB) const -> bool |
+auto | contains (llvm::Instruction *I) const -> bool |
+auto | isInPath (llvm::BasicBlock *BB) -> bool |
+auto | isInPath (llvm::Instruction *I) -> bool |
+void | clear () |
+void | reach (Arena<> *alloc, llvm::BasicBlock *BB, Intersection predicate) |
+void | assume (Intersection predicate) |
+ LoopModels
+
+ |
+
This is the complete list of members for IR::ReMapper, including all inherited members.
+operator[](Instruction *J) -> Instruction * (defined in IR::ReMapper) | IR::ReMapper | inline |
operator[](Value *J) -> Value * (defined in IR::ReMapper) | IR::ReMapper | inline |
remapFromTo(Instruction *K, Instruction *J) (defined in IR::ReMapper) | IR::ReMapper | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+auto | operator[] (Instruction *J) -> Instruction * |
+auto | operator[] (Value *J) -> Value * |
+void | remapFromTo (Instruction *K, Instruction *J) |
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Stow, including all inherited members.
+addr (defined in IR::AddrWrapper) | IR::AddrWrapper | protected |
AddrWrapper(Addr *a) (defined in IR::AddrWrapper) | IR::AddrWrapper | inlineprotected |
getChild() const -> Node * (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getCurrentDepth() const -> int (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getInstruction() const -> llvm::StoreInst * (defined in IR::Stow) | IR::Stow | inline |
getLoop() const -> poly::Loop * (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getNaturalDepth() const -> int (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getNext() const -> Node * (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getParent() const -> Node * (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getPrev() const -> Node * (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
getStoredVal() const -> Value * (defined in IR::Stow) | IR::Stow | inline |
getStoredValPtr() -> Value ** (defined in IR::Stow) | IR::Stow | inline |
insertAfter(Node *n) (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
insertAhead(Node *n) (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
insertChild(Node *n) (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
insertParent(Node *n) (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
operator Addr *() (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
operator bool() (defined in IR::AddrWrapper) | IR::AddrWrapper | inlineexplicit |
operator==(const AddrWrapper &other) const -> bool (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
setChild(Node *n) (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
setParent(Node *n) (defined in IR::AddrWrapper) | IR::AddrWrapper | inline |
setVal(Arena<> *alloc, Value *n) (defined in IR::Stow) | IR::Stow | inline |
Stow(Addr *a) (defined in IR::Stow) | IR::Stow | inline |
Stow(Node *a) (defined in IR::Stow) | IR::Stow | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+ | Stow (Addr *a) |
+ | Stow (Node *a) |
+auto | getInstruction () const -> llvm::StoreInst * |
+constexpr auto | getStoredVal () const -> Value * |
+constexpr auto | getStoredValPtr () -> Value ** |
+constexpr void | setVal (Arena<> *alloc, Value *n) |
![]() | |
+constexpr | operator bool () |
+constexpr auto | getChild () const -> Node * |
+constexpr auto | getParent () const -> Node * |
+constexpr auto | getNext () const -> Node * |
+constexpr auto | getPrev () const -> Node * |
+constexpr void | setChild (Node *n) |
+constexpr void | setParent (Node *n) |
+constexpr void | insertChild (Node *n) |
+constexpr void | insertParent (Node *n) |
+constexpr void | insertAfter (Node *n) |
+constexpr void | insertAhead (Node *n) |
+constexpr auto | getCurrentDepth () const -> int |
+constexpr auto | getNaturalDepth () const -> int |
+constexpr auto | operator== (const AddrWrapper &other) const -> bool |
+constexpr auto | getLoop () const -> poly::Loop * |
+constexpr | operator Addr * () |
+Additional Inherited Members | |
![]() | |
+constexpr | AddrWrapper (Addr *a) |
![]() | |
+Addr * | addr |
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Users, including all inherited members.
+Addr (defined in IR::Users) | IR::Users | friend |
begin() noexcept -> Instruction ** (defined in IR::Users) | IR::Users | inline |
begin() const noexcept -> Instruction *const * (defined in IR::Users) | IR::Users | inline |
clear() (defined in IR::Users) | IR::Users | inline |
contains(Instruction *v) const noexcept -> bool (defined in IR::Users) | IR::Users | inline |
end() noexcept -> Instruction ** (defined in IR::Users) | IR::Users | inline |
end() const noexcept -> Instruction *const * (defined in IR::Users) | IR::Users | inline |
operator=(const Users &) -> Users &=default (defined in IR::Users) | IR::Users | |
p_ (defined in IR::Users) | IR::Users | |
push_back(Arena<> *alloc, Instruction *v) (defined in IR::Users) | IR::Users | inline |
push_back_within_capacity(Instruction *v) (defined in IR::Users) | IR::Users | inline |
pushKnownUnique(Arena<> *alloc, Instruction *v) (defined in IR::Users) | IR::Users | inline |
remove(Instruction *v) noexcept (defined in IR::Users) | IR::Users | inline |
size() const noexcept -> int (defined in IR::Users) | IR::Users | inline |
Users()=default (defined in IR::Users) | IR::Users | |
Users(const Users &)=delete (defined in IR::Users) | IR::Users | |
Users(Users &&)=delete (defined in IR::Users) | IR::Users | |
v_ (defined in IR::Users) | IR::Users | |
val_ (defined in IR::Users) | IR::Users |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+ | Users (const Users &)=delete |
+ | Users (Users &&)=delete |
+constexpr auto | operator= (const Users &) -> Users &=default |
+constexpr auto | begin () noexcept -> Instruction ** |
+constexpr auto | end () noexcept -> Instruction ** |
+constexpr auto | begin () const noexcept -> Instruction *const * |
+constexpr auto | end () const noexcept -> Instruction *const * |
+constexpr auto | size () const noexcept -> int |
+constexpr auto | contains (Instruction *v) const noexcept -> bool |
+constexpr void | pushKnownUnique (Arena<> *alloc, Instruction *v) |
+constexpr void | push_back (Arena<> *alloc, Instruction *v) |
+constexpr void | push_back_within_capacity (Instruction *v) |
+constexpr void | remove (Instruction *v) noexcept |
+constexpr void | clear () |
+Friends | |
+class | Addr |
+ LoopModels
+
+ |
+
This is the complete list of members for IR::Value, including all inherited members.
+addUser(Arena<> *alloc, Instruction *I) noexcept (defined in IR::Value) | IR::Value | inline |
calcLoopMask() -> uint16_t (defined in IR::Node) | IR::Node | |
checkDependsOnLoop(int depth) -> bool (defined in IR::Node) | IR::Node | |
checkUsedByInner() const -> bool (defined in IR::Node) | IR::Node | inline |
classof(const Node *v) -> bool (defined in IR::Value) | IR::Value | inlinestatic |
clearPrevNext() (defined in IR::Node) | IR::Node | inline |
clearVisited0() (defined in IR::Node) | IR::Node | inline |
clearVisited1() (defined in IR::Node) | IR::Node | inline |
currentDepth1 | IR::Node | protected |
forEach(const auto &f) (defined in IR::Node) | IR::Node | inline |
getChild() const -> Node * (defined in IR::Node) | IR::Node | inline |
getCurrentDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getInstKind(llvm::Instruction *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getKind() const -> ValKind (defined in IR::Node) | IR::Node | inline |
getKind(llvm::Value *v) -> ValKind (defined in IR::Node) | IR::Node | inlinestatic |
getLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getMaxDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNaturalDepth() const -> int (defined in IR::Node) | IR::Node | inline |
getNext() const -> Node * (defined in IR::Node) | IR::Node | inline |
getNumScalarBits() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getNumScalarBytes() const -> unsigned (defined in IR::Value) | IR::Value | inline |
getParent() const -> Node * (defined in IR::Node) | IR::Node | inline |
getPrev() const -> Node * (defined in IR::Node) | IR::Node | inline |
getReductionDst() const -> Instruction * | IR::Value | inline |
getSubLoop() const noexcept -> Loop * (defined in IR::Node) | IR::Node | |
getType() const -> llvm::Type * | IR::Value | inline |
getType(unsigned width) const -> llvm::Type * (defined in IR::Value) | IR::Value | inline |
getUsers() noexcept -> Users & (defined in IR::Value) | IR::Value | inline |
getUsers() const noexcept -> const Users & (defined in IR::Value) | IR::Value | inline |
getVisitDepth0() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
getVisitDepth1() const -> uint8_t (defined in IR::Node) | IR::Node | inline |
hoist(IR::Loop *P, int depth, IR::Loop *S) (defined in IR::Node) | IR::Node | |
insertAfter(Node *n) | IR::Node | inline |
insertAhead(Node *n) | IR::Node | inline |
insertChild(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
insertParent(Valid< Node > n) (defined in IR::Node) | IR::Node | inline |
isLoad() const -> bool (defined in IR::Value) | IR::Value | inline |
isStore() const -> bool | IR::Value | inline |
kind (defined in IR::Node) | IR::Node | protected |
linkReductionDst(Instruction *op) | IR::Value | inline |
loopdeps | IR::Node | protected |
loopMask() const -> int (defined in IR::Node) | IR::Node | inline |
maxDepth (defined in IR::Node) | IR::Node | protected |
Node(ValKind kind_) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned depth) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps) (defined in IR::Node) | IR::Node | inlineprotected |
Node(ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) (defined in IR::Node) | IR::Node | inlineprotected |
nodes() noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > | IR::Node | inline |
nodes() const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > (defined in IR::Node) | IR::Node | inline |
operator<< (defined in IR::Value) | IR::Value | friend |
peelLoops(ptrdiff_t numToPeel) -> ptrdiff_t (defined in IR::Node) | IR::Node | inline |
printName(std::ostream &) const -> std::ostream & (defined in IR::Value) | IR::Value | inline |
reduction_dst_ (defined in IR::Value) | IR::Value | protected |
removeFromList() -> Node * (defined in IR::Node) | IR::Node | inline |
removeFromUsers(Instruction *I) (defined in IR::Value) | IR::Value | inline |
sameBlock(const Node *other) const -> bool (defined in IR::Node) | IR::Node | inline |
setChild(Node *n) -> Node * | IR::Node | inline |
setCurrentDepth(int d) (defined in IR::Node) | IR::Node | inline |
setNext(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParent(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setParentLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setPrev(Node *n) -> Node * (defined in IR::Node) | IR::Node | inline |
setSubLoop(IR::Node *L) (defined in IR::Node) | IR::Node | inline |
setUsedByInner() (defined in IR::Node) | IR::Node | inline |
setUsers(const Users &other) noexcept (defined in IR::Value) | IR::Value | inline |
usedByLoop | IR::Node | protected |
users (defined in IR::Value) | IR::Value | protected |
ValKind enum name (defined in IR::Node) | IR::Node | |
Value(ValKind kind_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned depth, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
Value(ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) (defined in IR::Value) | IR::Value | inlineprotected |
verify() (defined in IR::Node) | IR::Node | inline |
visit0(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visit1(uint8_t d) (defined in IR::Node) | IR::Node | inline |
visitDepth0 (defined in IR::Node) | IR::Node | protected |
visitDepth1 (defined in IR::Node) | IR::Node | protected |
visited0(uint8_t d) const -> bool | IR::Node | inline |
visited1(uint8_t d) const -> bool | IR::Node | inline |
VK_Bflt enum value (defined in IR::Node) | IR::Node | |
VK_Bint enum value (defined in IR::Node) | IR::Node | |
VK_Call enum value (defined in IR::Node) | IR::Node | |
VK_Cflt enum value (defined in IR::Node) | IR::Node | |
VK_Cint enum value (defined in IR::Node) | IR::Node | |
VK_CVal enum value (defined in IR::Node) | IR::Node | |
VK_Exit enum value (defined in IR::Node) | IR::Node | |
VK_FArg enum value (defined in IR::Node) | IR::Node | |
VK_Func enum value (defined in IR::Node) | IR::Node | |
VK_Load enum value (defined in IR::Node) | IR::Node | |
VK_Loop enum value (defined in IR::Node) | IR::Node | |
VK_Oprn enum value (defined in IR::Node) | IR::Node | |
VK_PhiN enum value (defined in IR::Node) | IR::Node | |
VK_Stow enum value (defined in IR::Node) | IR::Node | |
wasDropped() const -> bool (defined in IR::Node) | IR::Node | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+auto | printName (std::ostream &) const -> std::ostream & |
+constexpr auto | getUsers () noexcept -> Users & |
+constexpr auto | getUsers () const noexcept -> const Users & |
+constexpr void | setUsers (const Users &other) noexcept |
+constexpr void | addUser (Arena<> *alloc, Instruction *I) noexcept |
+constexpr void | removeFromUsers (Instruction *I) |
constexpr auto | isStore () const -> bool |
+constexpr auto | isLoad () const -> bool |
constexpr auto | getReductionDst () const -> Instruction * |
+constexpr void | linkReductionDst (Instruction *op) |
this->reduction_dst_ = op; | |
+constexpr auto | getType () const -> llvm::Type * |
these methods are overloaded for specific subtypes | |
+auto | getType (unsigned width) const -> llvm::Type * |
+auto | getNumScalarBits () const -> unsigned |
+auto | getNumScalarBytes () const -> unsigned |
![]() | |
+constexpr void | setUsedByInner () |
+constexpr auto | checkUsedByInner () const -> bool |
+constexpr auto | loopMask () const -> int |
+constexpr auto | peelLoops (ptrdiff_t numToPeel) -> ptrdiff_t |
+constexpr auto | checkDependsOnLoop (int depth) -> bool |
+constexpr void | visit0 (uint8_t d) |
+constexpr auto | getVisitDepth0 () const -> uint8_t |
+constexpr void | clearVisited0 () |
+constexpr auto | visited0 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr void | visit1 (uint8_t d) |
+constexpr auto | getVisitDepth1 () const -> uint8_t |
+constexpr void | clearVisited1 () |
+constexpr auto | visited1 (uint8_t d) const -> bool |
bool visited(uint8_t d) { return visitDepth == d; } | |
+constexpr auto | sameBlock (const Node *other) const -> bool |
+constexpr auto | getKind () const -> ValKind |
+constexpr auto | getCurrentDepth () const -> int |
+constexpr auto | getMaxDepth () const -> int |
+constexpr auto | getNaturalDepth () const -> int |
+constexpr auto | getParent () const -> Node * |
+constexpr auto | getChild () const -> Node * |
+constexpr auto | getPrev () const -> Node * |
+constexpr auto | getNext () const -> Node * |
+void | verify () |
+constexpr auto | setNext (Node *n) -> Node * |
+constexpr auto | setPrev (Node *n) -> Node * |
constexpr auto | setChild (Node *n) -> Node * |
+constexpr auto | setParent (Node *n) -> Node * |
+constexpr void | setParentLoop (IR::Node *L) |
+constexpr void | setSubLoop (IR::Node *L) |
+constexpr void | setCurrentDepth (int d) |
constexpr void | insertAhead (Node *n) |
constexpr void | insertAfter (Node *n) |
+constexpr void | clearPrevNext () |
+constexpr auto | wasDropped () const -> bool |
+constexpr auto | removeFromList () -> Node * |
+constexpr void | insertChild (Valid< Node > n) |
+constexpr void | insertParent (Valid< Node > n) |
+constexpr void | forEach (const auto &f) |
+constexpr auto | nodes () noexcept -> utils::ListRange< Node, utils::GetNext, utils::Identity > |
Iterate through all instructions. | |
+constexpr auto | nodes () const noexcept -> utils::ListRange< const Node, utils::GetNext, utils::Identity > |
+constexpr auto | getLoop () const noexcept -> Loop * |
+constexpr auto | calcLoopMask () -> uint16_t |
+constexpr auto | getSubLoop () const noexcept -> Loop * |
+constexpr void | hoist (IR::Loop *P, int depth, IR::Loop *S) |
+Static Public Member Functions | |
+static constexpr auto | classof (const Node *v) -> bool |
![]() | |
+static auto | getInstKind (llvm::Instruction *v) -> ValKind |
+static auto | getKind (llvm::Value *v) -> ValKind |
+Protected Member Functions | |
+constexpr | Value (ValKind kind_, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned depth, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, llvm::Type *t) |
+constexpr | Value (ValKind kind_, unsigned curDepth, int deps, unsigned maxDepth_, llvm::Type *t) |
![]() | |
+constexpr | Node (ValKind kind_) |
+constexpr | Node (ValKind kind_, unsigned depth) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps) |
+constexpr | Node (ValKind kind_, unsigned curDepth, uint16_t deps, unsigned maxDepth_) |
+Protected Attributes | |
+Instruction * | reduction_dst_ {nullptr} |
+Users | users |
![]() | |
+const ValKind | kind |
+uint8_t | currentDepth1: 4 {0} |
The current position, 0 means top level, 1 inside a single loop. | |
+uint8_t | maxDepth: 4 {0} |
uint8_t | usedByLoop: 1 {0} |
+uint8_t | visitDepth0: 7 {127} |
+uint8_t | visitDepth1 {255} |
uint16_t | loopdeps {std::numeric_limits<uint16_t>::max()} |
+Friends | |
+auto | operator<< (std::ostream &os, const Value &v) -> std::ostream & |
+Additional Inherited Members | |
![]() | |
enum | ValKind : uint8_t { + VK_Load +, VK_Stow +, VK_Loop +, VK_Exit +, + VK_FArg +, VK_CVal +, VK_Cint +, VK_Bint +, + VK_Cflt +, VK_Bflt +, VK_PhiN +, VK_Func +, + VK_Call +, VK_Oprn + + } |
+
|
+ +inlineconstexpr | +
Defines a cycle of instructions corresponding to a reduction e.g. x = a[i]; y = foo(x); z = bar(y); a[i] = z; The cycle would let us visit foo(x)
and bar(y)
.
+
|
+ +inlineconstexpr | +
isStore() is true if the address is a store, false if it is a load If the memory access is a store, this can still be a reload
+ +
+ LoopModels
+
+ |
+
This is the complete list of members for IR::cost::VectorWidth, including all inherited members.
+getLog2Width() const -> unsigned (defined in IR::cost::VectorWidth) | IR::cost::VectorWidth | inline |
getWidth() const -> unsigned (defined in IR::cost::VectorWidth) | IR::cost::VectorWidth | inline |
VectorWidth(unsigned w) (defined in IR::cost::VectorWidth) | IR::cost::VectorWidth | inlineexplicit |
VectorWidth(unsigned w, unsigned l2w) (defined in IR::cost::VectorWidth) | IR::cost::VectorWidth | inlineexplicit |
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
This is the complete list of members for IR::cost::VectorizationCosts, including all inherited members.
+get(unsigned l2w) const -> RecipThroughputLatency (defined in IR::cost::VectorizationCosts) | IR::cost::VectorizationCosts | inline |
operator[](unsigned l2w) -> ProxyReference (defined in IR::cost::VectorizationCosts) | IR::cost::VectorizationCosts | inline |
operator[](unsigned l2w) const -> RecipThroughputLatency (defined in IR::cost::VectorizationCosts) | IR::cost::VectorizationCosts | inline |
operator[](VectorWidth vw) -> ProxyReference (defined in IR::cost::VectorizationCosts) | IR::cost::VectorizationCosts | inline |
operator[](VectorWidth vw) const -> RecipThroughputLatency (defined in IR::cost::VectorizationCosts) | IR::cost::VectorizationCosts | inline |
+ LoopModels
+
+ |
+
+Classes | |
struct | ProxyReference |
+Public Member Functions | |
+constexpr auto | get (unsigned l2w) const -> RecipThroughputLatency |
+constexpr auto | operator[] (unsigned l2w) -> ProxyReference |
+constexpr auto | operator[] (unsigned l2w) const -> RecipThroughputLatency |
+constexpr auto | operator[] (VectorWidth vw) -> ProxyReference |
+constexpr auto | operator[] (VectorWidth vw) const -> RecipThroughputLatency |
+ LoopModels
+
+ |
+
This is the complete list of members for TestLoopFunction, including all inherited members.
+addLoop(PtrMatrix< int64_t > A, ptrdiff_t numLoops) -> poly::Loop * (defined in TestLoopFunction) | TestLoopFunction | inline |
addLoop(PtrMatrix< int64_t > A, ptrdiff_t numLoops, PtrVector< IR::Value * > symbols) -> poly::Loop * (defined in TestLoopFunction) | TestLoopFunction | inline |
createArray() -> IR::FunArg * (defined in TestLoopFunction) | TestLoopFunction | inline |
CreateFAdd(llvm::Value *lhs, llvm::Value *rhs) -> llvm::Value * (defined in TestLoopFunction) | TestLoopFunction | inline |
CreateFDiv(llvm::Value *lhs, llvm::Value *rhs) -> llvm::Value * (defined in TestLoopFunction) | TestLoopFunction | inline |
CreateFDiv(llvm::Value *lhs, llvm::Value *rhs, const char *s) -> llvm::Value * (defined in TestLoopFunction) | TestLoopFunction | inline |
CreateFMul(llvm::Value *lhs, llvm::Value *rhs) -> llvm::Value * (defined in TestLoopFunction) | TestLoopFunction | inline |
CreateFSub(llvm::Value *lhs, llvm::Value *rhs) -> llvm::Value * (defined in TestLoopFunction) | TestLoopFunction | inline |
createInt64() -> IR::FunArg * (defined in TestLoopFunction) | TestLoopFunction | inline |
createLoad(IR::Value *ptr, llvm::Type *elt, PtrMatrix< int64_t > indMat, PtrVector< IR::Value * > sizes, PtrVector< int64_t > omegas, poly::Loop *pl) -> IR::Addr * | TestLoopFunction | inline |
createLoad(IR::Value *ptr, llvm::Type *elt, PtrMatrix< int64_t > indMat, PtrVector< int64_t > constOffsets, PtrVector< IR::Value * > sizes, PtrVector< int64_t > omegas, poly::Loop *pl) -> IR::Addr * | TestLoopFunction | inline |
CreateLoad(llvm::Value *ptr, llvm::Value *offset) -> llvm::LoadInst * (defined in TestLoopFunction) | TestLoopFunction | inline |
CreateSqrt(llvm::Value *v) -> llvm::Value * (defined in TestLoopFunction) | TestLoopFunction | inline |
CreateStore(llvm::Value *val, llvm::Value *ptr, llvm::Value *offset) -> llvm::StoreInst * (defined in TestLoopFunction) | TestLoopFunction | inline |
createStow(IR::Value *ptr, IR::Value *stored, PtrMatrix< int64_t > indMat, PtrVector< IR::Value * > sizes, PtrVector< int64_t > omegas, poly::Loop *pl) -> IR::Addr * | TestLoopFunction | inline |
createStow(IR::Value *ptr, IR::Value *stored, PtrMatrix< int64_t > indMat, PtrVector< int64_t > constOffsets, PtrVector< IR::Value * > sizes, PtrVector< int64_t > omegas, poly::Loop *pl) -> IR::Addr * | TestLoopFunction | inline |
CreateUIToF64(llvm::Value *v) -> llvm::Value * (defined in TestLoopFunction) | TestLoopFunction | inline |
functionArg(llvm::Type *typ) -> IR::FunArg * (defined in TestLoopFunction) | TestLoopFunction | inline |
getAlloc() -> alloc::Arena<> * (defined in TestLoopFunction) | TestLoopFunction | inline |
getBuilder() -> llvm::IRBuilder<> & (defined in TestLoopFunction) | TestLoopFunction | inline |
getConstInt(int64_t i) -> IR::Cint * (defined in TestLoopFunction) | TestLoopFunction | inline |
getDoubleTy() -> llvm::Type * (defined in TestLoopFunction) | TestLoopFunction | inline |
getInt64Ty() -> llvm::IntegerType * (defined in TestLoopFunction) | TestLoopFunction | inline |
getIRC() -> IR::Cache & (defined in TestLoopFunction) | TestLoopFunction | inline |
getLLVMConstInt(int64_t i) -> llvm::ConstantInt * (defined in TestLoopFunction) | TestLoopFunction | inline |
getLoopNest(size_t i) -> poly::Loop * (defined in TestLoopFunction) | TestLoopFunction | inline |
getNumLoopNests() -> size_t (defined in TestLoopFunction) | TestLoopFunction | inline |
getSCEVUnknown(llvm::Value *v) -> const llvm::SCEVUnknown * | TestLoopFunction | inline |
getSE() -> llvm::ScalarEvolution & (defined in TestLoopFunction) | TestLoopFunction | inline |
getTarget() const -> target::Machine< false > (defined in TestLoopFunction) | TestLoopFunction | inline |
getTreeResult() const -> IR::TreeResult (defined in TestLoopFunction) | TestLoopFunction | inline |
getZeroF64() -> llvm::Value * (defined in TestLoopFunction) | TestLoopFunction | inline |
TestLoopFunction(target::MachineCore::Arch arch=target::MachineCore::Arch::SkylakeServer) (defined in TestLoopFunction) | TestLoopFunction | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+auto | getAlloc () -> alloc::Arena<> * |
+auto | getIRC () -> IR::Cache & |
+auto | getTreeResult () const -> IR::TreeResult |
+auto | getLoopNest (size_t i) -> poly::Loop * |
+auto | getNumLoopNests () -> size_t |
+auto | getTarget () const -> target::Machine< false > |
+auto | addLoop (PtrMatrix< int64_t > A, ptrdiff_t numLoops) -> poly::Loop * |
+auto | addLoop (PtrMatrix< int64_t > A, ptrdiff_t numLoops, PtrVector< IR::Value * > symbols) -> poly::Loop * |
auto | createLoad (IR::Value *ptr, llvm::Type *elt, PtrMatrix< int64_t > indMat, PtrVector< IR::Value * > sizes, PtrVector< int64_t > omegas, poly::Loop *pl) -> IR::Addr * |
+auto | createStow (IR::Value *ptr, IR::Value *stored, PtrMatrix< int64_t > indMat, PtrVector< IR::Value * > sizes, PtrVector< int64_t > omegas, poly::Loop *pl) -> IR::Addr * |
omegas gives the lexicographical indexing into the loop tree | |
+auto | createLoad (IR::Value *ptr, llvm::Type *elt, PtrMatrix< int64_t > indMat, PtrVector< int64_t > constOffsets, PtrVector< IR::Value * > sizes, PtrVector< int64_t > omegas, poly::Loop *pl) -> IR::Addr * |
omegas gives the lexicographical indexing into the loop tree | |
+auto | createStow (IR::Value *ptr, IR::Value *stored, PtrMatrix< int64_t > indMat, PtrVector< int64_t > constOffsets, PtrVector< IR::Value * > sizes, PtrVector< int64_t > omegas, poly::Loop *pl) -> IR::Addr * |
omegas gives the lexicographical indexing into the loop tree | |
+auto | functionArg (llvm::Type *typ) -> IR::FunArg * |
+auto | createInt64 () -> IR::FunArg * |
+auto | getInt64Ty () -> llvm::IntegerType * |
+auto | getDoubleTy () -> llvm::Type * |
+auto | createArray () -> IR::FunArg * |
+ | TestLoopFunction (target::MachineCore::Arch arch=target::MachineCore::Arch::SkylakeServer) |
+auto | getConstInt (int64_t i) -> IR::Cint * |
+auto | getSE () -> llvm::ScalarEvolution & |
+auto | getSCEVUnknown (llvm::Value *v) -> const llvm::SCEVUnknown * |
obselete llvm funs | |
+auto | getLLVMConstInt (int64_t i) -> llvm::ConstantInt * |
+auto | getBuilder () -> llvm::IRBuilder<> & |
+auto | CreateLoad (llvm::Value *ptr, llvm::Value *offset) -> llvm::LoadInst * |
+auto | CreateStore (llvm::Value *val, llvm::Value *ptr, llvm::Value *offset) -> llvm::StoreInst * |
+auto | getZeroF64 () -> llvm::Value * |
+auto | CreateUIToF64 (llvm::Value *v) -> llvm::Value * |
+auto | CreateFAdd (llvm::Value *lhs, llvm::Value *rhs) -> llvm::Value * |
+auto | CreateFSub (llvm::Value *lhs, llvm::Value *rhs) -> llvm::Value * |
+auto | CreateFMul (llvm::Value *lhs, llvm::Value *rhs) -> llvm::Value * |
+auto | CreateFDiv (llvm::Value *lhs, llvm::Value *rhs) -> llvm::Value * |
+auto | CreateFDiv (llvm::Value *lhs, llvm::Value *rhs, const char *s) -> llvm::Value * |
+auto | CreateSqrt (llvm::Value *v) -> llvm::Value * |
+
|
+ +inline | +
createLoad(IR::Value <em>ptr, llvm::Type *elt, PtrMatrix<int64_t> indMat,
+ PtrVector<IR::Value *> sizes, PtrVector<int64_t> omegas) -> Addr omegas
gives the lexicographical indexing into the loop tree
+ LoopModels
+
+ |
+
This is the complete list of members for TurboLoop, including all inherited members.
+run() -> llvm::PreservedAnalyses (defined in TurboLoop) | TurboLoop | inline |
TurboLoop(llvm::Function &F, llvm::FunctionAnalysisManager &FAM) (defined in TurboLoop) | TurboLoop | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+ | TurboLoop (llvm::Function &F, llvm::FunctionAnalysisManager &FAM) |
+auto | run () -> llvm::PreservedAnalyses |
+ LoopModels
+
+ |
+
This is the complete list of members for TurboLoopPass, including all inherited members.
+TurboLoopPass()=default (defined in TurboLoopPass) | TurboLoopPass | |
TurboLoopPass(const TurboLoopPass &)=delete (defined in TurboLoopPass) | TurboLoopPass | |
TurboLoopPass(TurboLoopPass &&)=default (defined in TurboLoopPass) | TurboLoopPass |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+ | TurboLoopPass (const TurboLoopPass &)=delete |
+ | TurboLoopPass (TurboLoopPass &&)=default |
+ LoopModels
+
+ |
+
This is the complete list of members for builder::Builder, including all inherited members.
+addLoop(ptrdiff_t numLoops, ptrdiff_t numSym, ptrdiff_t numConstraints) -> poly::Loop * | builder::Builder | inline |
addLoop(PtrMatrix< int64_t > A, ptrdiff_t numLoops, PtrVector< IR::Value * > symbols) -> poly::Loop * (defined in builder::Builder) | builder::Builder | inline |
Builder(IR::Cache &ir_) (defined in builder::Builder) | builder::Builder | inline |
operator IR::TreeResult() const (defined in builder::Builder) | builder::Builder | inlineexplicit |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+constexpr | Builder (IR::Cache &ir_) |
+constexpr | operator IR::TreeResult () const |
auto | addLoop (ptrdiff_t numLoops, ptrdiff_t numSym, ptrdiff_t numConstraints) -> poly::Loop * |
+auto | addLoop (PtrMatrix< int64_t > A, ptrdiff_t numLoops, PtrVector< IR::Value * > symbols) -> poly::Loop * |
Used to construct an IR::Cache
and an IR::TreeResult
, that can be fed to lp::LoopBlock
's optimize. Has some convenience functions for defining poly loops and IR statements.
+
|
+ +inline | +
addLoop(PtrMatrix<int64_t> A, ptrdiff_t numLoops, llvm::SCEV const symSource=nullptr) Ax >= 0
A
is a numConstraints
x (1 + numLoops + numSymbols)matrix If we have symbols, a ptr giving the
SCEV`s may be provided. Otherwise, the builder generates dynamic symbols??? In that case, how should the generated code receive them as arguments? Perhaps, we should add an incremental loop/subloop interface, that assumes ordered adds?
+ LoopModels
+
+ |
+
This is the complete list of members for dict::Binary< K, V >, including all inherited members.
+clear() (defined in dict::Binary< K, V >) | dict::Binary< K, V > | inline |
erase(inparam_t< K > key) -> bool (defined in dict::Binary< K, V >) | dict::Binary< K, V > | inline |
find(inparam_t< K > key) -> std::optional< Ref > (defined in dict::Binary< K, V >) | dict::Binary< K, V > | inline |
keys() -> math::MutPtrVector< K > (defined in dict::Binary< K, V >) | dict::Binary< K, V > | inline |
keys() const -> math::PtrVector< K > (defined in dict::Binary< K, V >) | dict::Binary< K, V > | inline |
operator[](inparam_t< K > key) -> V & (defined in dict::Binary< K, V >) | dict::Binary< K, V > | inline |
size() const -> ptrdiff_t (defined in dict::Binary< K, V >) | dict::Binary< K, V > | inline |
values() -> math::MutPtrVector< V > (defined in dict::Binary< K, V >) | dict::Binary< K, V > | inline |
values() const -> math::PtrVector< V > (defined in dict::Binary< K, V >) | dict::Binary< K, V > | inline |
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
This is the complete list of members for dict::Linear< K, V >, including all inherited members.
+clear() (defined in dict::Linear< K, V >) | dict::Linear< K, V > | inline |
decRemoveIfNot(inparam_t< K > key) (defined in dict::Linear< K, V >) | dict::Linear< K, V > | inline |
erase(inparam_t< K > key) -> bool (defined in dict::Linear< K, V >) | dict::Linear< K, V > | inline |
find(inparam_t< K > key) -> std::optional< Ref > (defined in dict::Linear< K, V >) | dict::Linear< K, V > | inline |
getData() (defined in dict::Linear< K, V >) | dict::Linear< K, V > | inline |
keys() -> math::MutPtrVector< K > (defined in dict::Linear< K, V >) | dict::Linear< K, V > | inline |
keys() const -> math::PtrVector< K > (defined in dict::Linear< K, V >) | dict::Linear< K, V > | inline |
operator[](inparam_t< K > key) -> V & (defined in dict::Linear< K, V >) | dict::Linear< K, V > | inline |
size() const -> ptrdiff_t (defined in dict::Linear< K, V >) | dict::Linear< K, V > | inline |
values() -> math::MutPtrVector< V > (defined in dict::Linear< K, V >) | dict::Linear< K, V > | inline |
values() const -> math::PtrVector< V > (defined in dict::Linear< K, V >) | dict::Linear< K, V > | inline |
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
This is the complete list of members for dict::OrderedMap< K, V >, including all inherited members.
+
+ LoopModels
+
+ |
+
+Public Member Functions | |
+constexpr | OrderedMap (alloc::Arena<> *alloc) |
+ | OrderedMap (const OrderedMap &)=default |
+ | OrderedMap (OrderedMap &&) noexcept=default |
+constexpr auto | operator= (const OrderedMap &) -> OrderedMap &=default |
+constexpr auto | operator= (OrderedMap &&) noexcept -> OrderedMap &=default |
+constexpr auto | find (const K &key) |
+constexpr auto | begin () const |
+constexpr auto | end () const |
+constexpr auto | begin () |
+constexpr auto | end () |
+constexpr auto | rbegin () const |
+constexpr auto | rend () const |
+constexpr auto | rbegin () |
+constexpr auto | rend () |
+constexpr auto | operator[] (const K &key) -> V & |
+constexpr auto | size () const |
+constexpr auto | empty () const |
+constexpr auto | back () -> auto & |
+constexpr auto | back () const -> auto & |
+constexpr auto | front () -> auto & |
+constexpr auto | front () const -> auto & |
+constexpr void | insert (const K &key, const V &value) |
+constexpr void | grow (int i) |
+constexpr void | insert (containers::Pair< K, V > &&value) |
+constexpr void | clear () |
+auto | count (const K &key) const -> size_t |
+auto | contains (const K &key) const -> bool |
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
This is the complete list of members for lp::LoopBlock, including all inherited members.
+clear() (defined in lp::LoopBlock) | lp::LoopBlock | inline |
getAllocator() -> Arena<> * (defined in lp::LoopBlock) | lp::LoopBlock | inline |
getDependencies() -> IR::Dependencies & (defined in lp::LoopBlock) | lp::LoopBlock | inline |
getDependencies() const -> poly::Dependencies & (defined in lp::LoopBlock) | lp::LoopBlock | inline |
LoopBlock(IR::Dependencies &deps_, alloc::Arena<> &allocator_) (defined in lp::LoopBlock) | lp::LoopBlock | inline |
optimize(IR::Cache &cache, IR::TreeResult tr) -> OptimizationResult (defined in lp::LoopBlock) | lp::LoopBlock | inline |
+ LoopModels
+
+ |
+
+Classes | |
struct | OptimizationResult |
+Public Member Functions | |
+constexpr | LoopBlock (IR::Dependencies &deps_, alloc::Arena<> &allocator_) |
+auto | optimize (IR::Cache &cache, IR::TreeResult tr) -> OptimizationResult |
+void | clear () |
+constexpr auto | getAllocator () -> Arena<> * |
+constexpr auto | getDependencies () -> IR::Dependencies & |
+constexpr auto | getDependencies () const -> poly::Dependencies & |
A loop block is a block of the program that may include multiple loops. These loops are either all executed (note iteration count may be 0, or loops may be in rotated form and the guard prevents execution; this is okay and counts as executed for our purposes here ), or none of them are. That is, the LoopBlock does not contain divergent control flow, or guards unrelated to loop bounds. The loops within a LoopBlock are optimized together, so we can consider optimizations such as reordering or fusing them together as a set.
+Initially, the LoopBlock
is initialized as a set of Read
and Write
s, without any dependence polyhedra. Then, it builds DependencePolyhedra
. These can be used to construct an ILP.
That is: fields that must be provided/filled:
NOTE: w/ respect to index linearization (e.g., going from Cartesian indexing to linear indexing), the current behavior will be to fully delinearize as a preprocessing step. Linear indexing may be used later as an optimization. This means that not only do we want to delinearize for (n = 0; n < N; ++n){ for (m = 0; m < M; ++m){ C(m + n*M) } } we would also want to delinearize for (i = 0; i < M*N; ++i){ C(i) } into for (n = 0; n < N; ++n){ for (m = 0; m < M; ++m){ C(m, n) } } and then relinearize as an optimization later. Then we can compare fully delinearized loop accesses. Should be in same block: s = 0 for (i = eachindex(x)){ s += x[i]; // Omega = [0, _, 0] } m = s / length(x); // Omega = [1] for (i = eachindex(y)){ f(m, ...); // Omega = [2, _, 0] }
+
+ LoopModels
+
+ |
+
This is the complete list of members for lp::ScheduleGraph, including all inherited members.
+getVertices(ScheduledNode *nodes) -> utils::ListRange< ScheduledNode, utils::GetNext, utils::Identity > (defined in lp::ScheduleGraph) | lp::ScheduleGraph | inlinestatic |
getVertices(const ScheduledNode *nodes) -> utils::ListRange< const ScheduledNode, utils::GetNext, utils::Identity > (defined in lp::ScheduleGraph) | lp::ScheduleGraph | inlinestatic |
inNeighbors(ScheduledNode *v) const (defined in lp::ScheduleGraph) | lp::ScheduleGraph | inline |
outNeighbors(ScheduledNode *v) const (defined in lp::ScheduleGraph) | lp::ScheduleGraph | inline |
ScheduleGraph(poly::Dependencies &deps_, unsigned depth) (defined in lp::ScheduleGraph) | lp::ScheduleGraph | inline |
VertexType typedef (defined in lp::ScheduleGraph) | lp::ScheduleGraph |
+ LoopModels
+
+ |
+
+Public Types | |
+using | VertexType = ScheduledNode |
+Public Member Functions | |
+constexpr | ScheduleGraph (poly::Dependencies &deps_, unsigned depth) |
+auto | outNeighbors (ScheduledNode *v) const |
+auto | inNeighbors (ScheduledNode *v) const |
+Static Public Member Functions | |
+static constexpr auto | getVertices (ScheduledNode *nodes) -> utils::ListRange< ScheduledNode, utils::GetNext, utils::Identity > |
+static constexpr auto | getVertices (const ScheduledNode *nodes) -> utils::ListRange< const ScheduledNode, utils::GetNext, utils::Identity > |
+ LoopModels
+
+ |
+
This is the complete list of members for lp::ScheduledNode, including all inherited members.
+addToStack() (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
calcGraphMaxDepth() const -> int (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
construct(Arena<> *alloc, Addr *store, poly::Loop *L) -> ScheduledNode * (defined in lp::ScheduledNode) | lp::ScheduledNode | inlinestatic |
eachAddr() (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
fuse(ScheduledNode *n) -> ScheduledNode * | lp::ScheduledNode | inline |
getAllVertices() (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getComponents() -> utils::ListRange< ScheduledNode, Component, utils::Identity > (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getComponents() const -> utils::ListRange< const ScheduledNode, Component, utils::Identity > (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getFusionOmega(ptrdiff_t i) const -> int64_t (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getFusionOmega(ptrdiff_t i) -> int64_t & (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getFusionOmega() const -> PtrVector< int64_t > (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getFusionOmega() -> MutPtrVector< int64_t > (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getLoopNest() const -> poly::Loop * (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getLoopOffsets() -> MutPtrVector< int64_t > (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getNext() -> ScheduledNode * (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getNext() const -> const ScheduledNode * (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getNextComponent() -> ScheduledNode * (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getNextComponent() const -> const ScheduledNode * (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getNumLoops() const -> ptrdiff_t (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getOffset() const -> int64_t * (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getOffsetOmega(ptrdiff_t i) const -> int64_t (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getOffsetOmega(ptrdiff_t i) -> int64_t & (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getOffsetOmega() const -> PtrVector< int64_t > (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getOffsetOmega() -> MutPtrVector< int64_t > (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getOmegaOffset() const -> ptrdiff_t (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getOrigNext() -> ScheduledNode * (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getPhi() -> MutSquarePtrMatrix< int64_t > | lp::ScheduledNode | inline |
getPhi() const -> SquarePtrMatrix< int64_t > | lp::ScheduledNode | inline |
getPhiOffset() const -> ptrdiff_t (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getPhiOffsetRange() const -> math::Range< ptrdiff_t, ptrdiff_t > (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getSchedule() -> poly::AffineSchedule (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getSchedule(ptrdiff_t d) const -> PtrVector< int64_t > | lp::ScheduledNode | inline |
getSchedule(ptrdiff_t d) -> MutPtrVector< int64_t > (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getStore() -> Addr * (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getStore() const -> const Addr * (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getVertices() -> utils::ListRange< ScheduledNode, utils::GetNext, utils::Identity > (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
getVertices() const -> utils::ListRange< const ScheduledNode, utils::GetNext, utils::Identity > (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
hasActiveEdges(poly::Dependencies &dep, int depth0) const -> bool (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
hasActiveInEdges(poly::Dependencies &dep, int depth0) const -> bool (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
hasActiveOutEdges(poly::Dependencies &dep, int depth0) const -> bool (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
index() -> uint16_t & (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
inNeighbors(poly::Dependencies &dep) (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
inNeighbors(poly::Dependencies &dep, unsigned depth) (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
inputEdgeIds(poly::Dependencies &dep) const (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
inputEdgeIds(poly::Dependencies &dep, int depth) const (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
inputEdges(poly::Dependencies &dep) (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
inputEdges(poly::Dependencies &dep, int depth0) (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
localAddr() (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
localAddr() const (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
lowLink() -> uint16_t & (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
onStack() const -> bool (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
operator<< (defined in lp::ScheduledNode) | lp::ScheduledNode | friend |
outNeighbors(poly::Dependencies &dep) (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
outNeighbors(poly::Dependencies &dep, unsigned depth) (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
outputEdgeIds(poly::Dependencies &dep) const (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
outputEdgeIds(poly::Dependencies dep, int depth) const (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
outputEdges(poly::Dependencies &dep) (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
outputEdges(poly::Dependencies &dep, int depth0) (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
phiIsScheduled(int d) const -> bool (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
removeFromStack() (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
resetPhiOffset() (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
schedulePhi(DensePtrMatrix< int64_t > indMat, ptrdiff_t r) (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
setNext(ScheduledNode *n) -> ScheduledNode * (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
setNextComponent(ScheduledNode *n) -> ScheduledNode * (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
setOffsets(int64_t *o) (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
setOrigNext(ScheduledNode *n) -> ScheduledNode * (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
unschedulePhi() (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
unVisit() (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
updateOmegaOffset(int o) -> int (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
updatePhiOffset(int p) -> int (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
visit() (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
visited() const -> bool (defined in lp::ScheduledNode) | lp::ScheduledNode | inline |
+ LoopModels
+
+ |
+
+Classes | |
struct | Component |
struct | DepFilter |
struct | DepIDs |
struct | Deps |
struct | GetEdge |
struct | GetStore |
struct | InNode |
struct | IsIdActive |
struct | NextAddr |
struct | NextAddrRange |
struct | OrigNext |
struct | OutNode |
+Public Member Functions | |
+constexpr auto | index () -> uint16_t & |
+constexpr auto | lowLink () -> uint16_t & |
+constexpr auto | onStack () const -> bool |
+constexpr void | addToStack () |
+constexpr void | removeFromStack () |
+constexpr auto | visited () const -> bool |
+constexpr void | visit () |
+constexpr auto | unVisit () |
+constexpr auto | setNext (ScheduledNode *n) -> ScheduledNode * |
+constexpr auto | setOrigNext (ScheduledNode *n) -> ScheduledNode * |
+constexpr auto | getNext () -> ScheduledNode * |
+constexpr auto | getNext () const -> const ScheduledNode * |
constexpr auto | fuse (ScheduledNode *n) -> ScheduledNode * |
+constexpr auto | getNextComponent () -> ScheduledNode * |
+constexpr auto | getNextComponent () const -> const ScheduledNode * |
+constexpr auto | setNextComponent (ScheduledNode *n) -> ScheduledNode * |
+constexpr auto | getLoopOffsets () -> MutPtrVector< int64_t > |
+constexpr void | setOffsets (int64_t *o) |
+constexpr auto | getStore () -> Addr * |
+constexpr auto | getStore () const -> const Addr * |
+constexpr auto | getVertices () -> utils::ListRange< ScheduledNode, utils::GetNext, utils::Identity > |
+constexpr auto | getVertices () const -> utils::ListRange< const ScheduledNode, utils::GetNext, utils::Identity > |
+constexpr auto | getOrigNext () -> ScheduledNode * |
+constexpr auto | getAllVertices () |
+constexpr auto | getComponents () -> utils::ListRange< ScheduledNode, Component, utils::Identity > |
+constexpr auto | getComponents () const -> utils::ListRange< const ScheduledNode, Component, utils::Identity > |
+constexpr auto | localAddr () |
+constexpr auto | localAddr () const |
+constexpr auto | eachAddr () |
+auto | inNeighbors (poly::Dependencies &dep) |
+auto | outNeighbors (poly::Dependencies &dep) |
+auto | inputEdgeIds (poly::Dependencies &dep) const |
+auto | outputEdgeIds (poly::Dependencies &dep) const |
+auto | inputEdgeIds (poly::Dependencies &dep, int depth) const |
+auto | outputEdgeIds (poly::Dependencies dep, int depth) const |
+auto | inputEdges (poly::Dependencies &dep) |
+auto | outputEdges (poly::Dependencies &dep) |
+auto | inputEdges (poly::Dependencies &dep, int depth0) |
+auto | outputEdges (poly::Dependencies &dep, int depth0) |
+auto | outNeighbors (poly::Dependencies &dep, unsigned depth) |
+auto | inNeighbors (poly::Dependencies &dep, unsigned depth) |
+auto | hasActiveInEdges (poly::Dependencies &dep, int depth0) const -> bool |
+auto | hasActiveOutEdges (poly::Dependencies &dep, int depth0) const -> bool |
+auto | hasActiveEdges (poly::Dependencies &dep, int depth0) const -> bool |
+constexpr auto | getSchedule () -> poly::AffineSchedule |
+constexpr auto | getLoopNest () const -> poly::Loop * |
+constexpr auto | getOffset () const -> int64_t * |
+constexpr auto | getNumLoops () const -> ptrdiff_t |
+constexpr auto | phiIsScheduled (int d) const -> bool |
+constexpr auto | updatePhiOffset (int p) -> int |
+constexpr auto | updateOmegaOffset (int o) -> int |
+constexpr auto | getPhiOffset () const -> ptrdiff_t |
+constexpr auto | getPhiOffsetRange () const -> math::Range< ptrdiff_t, ptrdiff_t > |
+constexpr auto | getPhi () -> MutSquarePtrMatrix< int64_t > |
numLoops x numLoops | |
+constexpr auto | getPhi () const -> SquarePtrMatrix< int64_t > |
numLoops x numLoops | |
+constexpr auto | getSchedule (ptrdiff_t d) const -> PtrVector< int64_t > |
getSchedule, loops are always indexed from outer to inner | |
+constexpr auto | getSchedule (ptrdiff_t d) -> MutPtrVector< int64_t > |
+constexpr auto | getFusionOmega (ptrdiff_t i) const -> int64_t |
+constexpr auto | getOffsetOmega (ptrdiff_t i) const -> int64_t |
+constexpr auto | getFusionOmega (ptrdiff_t i) -> int64_t & |
+constexpr auto | getOffsetOmega (ptrdiff_t i) -> int64_t & |
+constexpr auto | getFusionOmega () const -> PtrVector< int64_t > |
+constexpr auto | getOffsetOmega () const -> PtrVector< int64_t > |
+constexpr auto | getFusionOmega () -> MutPtrVector< int64_t > |
+constexpr auto | getOffsetOmega () -> MutPtrVector< int64_t > |
+constexpr void | schedulePhi (DensePtrMatrix< int64_t > indMat, ptrdiff_t r) |
+constexpr void | unschedulePhi () |
+constexpr auto | getOmegaOffset () const -> ptrdiff_t |
+void | resetPhiOffset () |
+constexpr auto | calcGraphMaxDepth () const -> int |
+Static Public Member Functions | |
+static auto | construct (Arena<> *alloc, Addr *store, poly::Loop *L) -> ScheduledNode * |
+Friends | |
+auto | operator<< (std::ostream &os, const ScheduledNode &node) -> std::ostream & |
ScheduledNode Represents a set of memory accesses that are optimized together in the LP. These instructions are all connected directly by through registers. E.g., A[i] = B[i] + C[i]
is a single node because we load from B[i]
and C[i]
into registers, compute, and A[i]
; When splitting LoopBlock graphs, these graphs will have edges between them that we drop. This is only a problem if we merge graphs later.
Addr chains here are formed using next
+
|
+ +inlineconstexpr | +
fuse; difference between setNext
is that this assumes both have next
s Note, this is expensive: O(N) in size, because we don't keep an end
...
+ LoopModels
+
+ |
+
This is the complete list of members for poly::DepPoly, including all inherited members.
+checkSat(Arena<> alloc, Valid< const poly::Loop > xLoop, const int64_t *xOff, DensePtrMatrix< int64_t > xPhi, Valid< const poly::Loop > yLoop, const int64_t *yOff, DensePtrMatrix< int64_t > yPhi) -> bool | poly::DepPoly | inline |
copy(Arena<> *alloc) const -> Valid< DepPoly > (defined in poly::DepPoly) | poly::DepPoly | inline |
decrementNumConstraints() (defined in poly::DepPoly) | poly::DepPoly | inline |
dependence(Valid< Arena<> > alloc, Valid< const IR::Addr > aix, Valid< const IR::Addr > aiy) -> DepPoly * (defined in poly::DepPoly) | poly::DepPoly | inlinestatic |
DepPoly(int nd0, int nd1, int nds, int td, int conCap, int eqConCap) (defined in poly::DepPoly) | poly::DepPoly | inlineexplicit |
farkasPair(Arena<> *alloc) const -> std::array< math::Simplex *, 2 > (defined in poly::DepPoly) | poly::DepPoly | inline |
fillSyms(llvm::MutableArrayRef< const llvm::SCEV * > s, std::array< llvm::ArrayRef< const llvm::SCEV * >, 2 > sa, math::Vector< unsigned > &map) (defined in poly::DepPoly) | poly::DepPoly | inlinestatic |
findFirstNonEqual(PtrVector< int64_t > x, PtrVector< int64_t > y) -> ptrdiff_t (defined in poly::DepPoly) | poly::DepPoly | inlinestatic |
getA() -> MutDensePtrMatrix< int64_t > (defined in poly::DepPoly) | poly::DepPoly | inline |
getA() const -> DensePtrMatrix< int64_t > (defined in poly::DepPoly) | poly::DepPoly | inline |
getA(Row<> r, Col<> c) -> int64_t & (defined in poly::DepPoly) | poly::DepPoly | inline |
getA(Row<> r, Col<> c) const -> int64_t (defined in poly::DepPoly) | poly::DepPoly | inline |
getCompTimeEqOffset(ptrdiff_t i) const -> std::optional< int64_t > (defined in poly::DepPoly) | poly::DepPoly | inline |
getCompTimeInEqOffset(ptrdiff_t i) const -> std::optional< int64_t > (defined in poly::DepPoly) | poly::DepPoly | inline |
getDim0() const -> int (defined in poly::DepPoly) | poly::DepPoly | inline |
getDim1() const -> int (defined in poly::DepPoly) | poly::DepPoly | inline |
getE() -> MutDensePtrMatrix< int64_t > (defined in poly::DepPoly) | poly::DepPoly | inline |
getE() const -> DensePtrMatrix< int64_t > (defined in poly::DepPoly) | poly::DepPoly | inline |
getE(Row<> r, Col<> c) -> int64_t & (defined in poly::DepPoly) | poly::DepPoly | inline |
getE(Row<> r, Col<> c) const -> int64_t (defined in poly::DepPoly) | poly::DepPoly | inline |
getEqSymbols(ptrdiff_t i) const -> PtrVector< int64_t > (defined in poly::DepPoly) | poly::DepPoly | inline |
getInEqSymbols(ptrdiff_t i) const -> PtrVector< int64_t > (defined in poly::DepPoly) | poly::DepPoly | inline |
getNullStep() -> math::MutPtrVector< int64_t > (defined in poly::DepPoly) | poly::DepPoly | inline |
getNullStep(ptrdiff_t i) const -> int64_t (defined in poly::DepPoly) | poly::DepPoly | inline |
getNullStep() const -> PtrVector< int64_t > (defined in poly::DepPoly) | poly::DepPoly | inline |
getNumCon() const -> int (defined in poly::DepPoly) | poly::DepPoly | inline |
getNumDynSym() const -> int (defined in poly::DepPoly) | poly::DepPoly | inline |
getNumEqCon() const -> int (defined in poly::DepPoly) | poly::DepPoly | inline |
getNumLambda() const -> int (defined in poly::DepPoly) | poly::DepPoly | inline |
getNumOmegaCoef() -> int (defined in poly::DepPoly) | poly::DepPoly | inlinestatic |
getNumPhiCoef() const -> int (defined in poly::DepPoly) | poly::DepPoly | inline |
getNumScheduleCoef() const -> int (defined in poly::DepPoly) | poly::DepPoly | inline |
getNumSymbols() const -> int (defined in poly::DepPoly) | poly::DepPoly | inline |
getNumVar() const -> int (defined in poly::DepPoly) | poly::DepPoly | inline |
getSymbols(ptrdiff_t i) -> math::MutPtrVector< int64_t > (defined in poly::DepPoly) | poly::DepPoly | inline |
getSyms() -> math::MutPtrVector< IR::Value * > (defined in poly::DepPoly) | poly::DepPoly | inline |
getSyms() const -> PtrVector< IR::Value * > (defined in poly::DepPoly) | poly::DepPoly | inline |
getTimeDim() const -> int (defined in poly::DepPoly) | poly::DepPoly | inline |
mergeMap(math::Vector< unsigned > &map, math::PtrVector< IR::Value * > s0, math::PtrVector< IR::Value * > s1) -> unsigned | poly::DepPoly | inlinestatic |
neededBytes() const -> size_t (defined in poly::DepPoly) | poly::DepPoly | inline |
nullSpace(Valid< const IR::Addr > x, Valid< const IR::Addr > y) -> math::DenseMatrix< int64_t > (defined in poly::DepPoly) | poly::DepPoly | inlinestatic |
nullSpace(Valid< const IR::Addr > x) -> math::DenseMatrix< int64_t > (defined in poly::DepPoly) | poly::DepPoly | inlinestatic |
operator<< (defined in poly::DepPoly) | poly::DepPoly | friend |
self(Arena<> *alloc, Valid< const IR::Addr > ai) -> Valid< DepPoly > (defined in poly::DepPoly) | poly::DepPoly | inlinestatic |
setNumConstraints(int con) (defined in poly::DepPoly) | poly::DepPoly | inline |
setNumEqConstraints(int con) (defined in poly::DepPoly) | poly::DepPoly | inline |
setTimeDim(int dim) (defined in poly::DepPoly) | poly::DepPoly | inline |
symbolIndex(math::PtrVector< IR::Value * > s, IR::Value *v) -> Optional< unsigned > (defined in poly::DepPoly) | poly::DepPoly | inlinestatic |
symbolIndex(IR::Value *v) -> Optional< unsigned > (defined in poly::DepPoly) | poly::DepPoly | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+constexpr | DepPoly (int nd0, int nd1, int nds, int td, int conCap, int eqConCap) |
+constexpr auto | getTimeDim () const -> int |
+constexpr void | setTimeDim (int dim) |
+constexpr auto | getDim0 () const -> int |
+constexpr auto | getDim1 () const -> int |
+constexpr auto | getNumDynSym () const -> int |
+constexpr auto | getNumCon () const -> int |
+constexpr auto | getNumEqCon () const -> int |
+constexpr auto | getNumVar () const -> int |
+constexpr auto | getNumPhiCoef () const -> int |
+constexpr auto | getNumScheduleCoef () const -> int |
+constexpr auto | getNumLambda () const -> int |
+constexpr auto | getNumSymbols () const -> int |
+constexpr void | setNumConstraints (int con) |
+constexpr void | setNumEqConstraints (int con) |
+constexpr void | decrementNumConstraints () |
+constexpr auto | getA () -> MutDensePtrMatrix< int64_t > |
+constexpr auto | getE () -> MutDensePtrMatrix< int64_t > |
+constexpr auto | getNullStep () -> math::MutPtrVector< int64_t > |
+constexpr auto | getNullStep (ptrdiff_t i) const -> int64_t |
+auto | getSyms () -> math::MutPtrVector< IR::Value * > |
+auto | getA () const -> DensePtrMatrix< int64_t > |
+auto | getA (Row<> r, Col<> c) -> int64_t & |
+auto | getA (Row<> r, Col<> c) const -> int64_t |
+auto | getE () const -> DensePtrMatrix< int64_t > |
+auto | getE (Row<> r, Col<> c) -> int64_t & |
+auto | getE (Row<> r, Col<> c) const -> int64_t |
+auto | getNullStep () const -> PtrVector< int64_t > |
+auto | getSyms () const -> PtrVector< IR::Value * > |
+auto | getSymbols (ptrdiff_t i) -> math::MutPtrVector< int64_t > |
+auto | getInEqSymbols (ptrdiff_t i) const -> PtrVector< int64_t > |
+auto | getEqSymbols (ptrdiff_t i) const -> PtrVector< int64_t > |
+auto | getCompTimeInEqOffset (ptrdiff_t i) const -> std::optional< int64_t > |
+auto | getCompTimeEqOffset (ptrdiff_t i) const -> std::optional< int64_t > |
+auto | symbolIndex (IR::Value *v) -> Optional< unsigned > |
+constexpr auto | neededBytes () const -> size_t |
+auto | copy (Arena<> *alloc) const -> Valid< DepPoly > |
+auto | farkasPair (Arena<> *alloc) const -> std::array< math::Simplex *, 2 > |
auto | checkSat (Arena<> alloc, Valid< const poly::Loop > xLoop, const int64_t *xOff, DensePtrMatrix< int64_t > xPhi, Valid< const poly::Loop > yLoop, const int64_t *yOff, DensePtrMatrix< int64_t > yPhi) -> bool |
![]() | |
+constexpr auto | getA () -> MutDensePtrMatrix< int64_t > |
+constexpr auto | getA () const -> DensePtrMatrix< int64_t > |
+constexpr auto | getE () |
+constexpr auto | getE () const |
+constexpr void | truncNumInEqCon (Row<> r) |
+constexpr void | truncNumEqCon (Row<> r) |
+constexpr auto | initializeComparator (alloc::Mallocator< int64_t > alloc={}) -> comparator::LinearSymbolicComparator |
+constexpr auto | initializeComparator (Arena<> *alloc) -> comparator::PtrSymbolicComparator |
+constexpr auto | calcIsEmpty () -> bool |
+constexpr auto | calcIsEmpty (Arena<> alloc) -> bool |
+constexpr auto | getNumCon () const -> int |
+constexpr void | setNumConstraints (int numCon) |
+constexpr void | setNumEqConstraints (int numCon) |
+constexpr void | decrementNumConstraints () |
+constexpr auto | isNonNegative () const -> bool |
+constexpr void | pruneBounds (Arena<> alloc) |
+constexpr void | pruneBounds () |
+constexpr void | eraseConstraint (ptrdiff_t constraint) |
+constexpr void | pruneBoundsCore (Arena<> *alloc) |
+constexpr void | pruneBoundsUnchecked (math::Alloc< int64_t > auto &alloc) |
+constexpr auto | getNumSymbols () const -> unsigned |
+constexpr auto | getNumDynamic () const -> ptrdiff_t |
+constexpr auto | getNumVar () const -> ptrdiff_t |
+constexpr auto | getNumInequalityConstraints () const -> int |
+constexpr auto | getNumEqualityConstraints () const -> int |
+constexpr void | dropEmptyConstraints () |
+void | dump () const |
+auto | isEmpty () const -> bool |
+void | truncateVars (ptrdiff_t numVar) |
+Static Public Member Functions | |
+static constexpr auto | getNumOmegaCoef () -> int |
+static constexpr auto | findFirstNonEqual (PtrVector< int64_t > x, PtrVector< int64_t > y) -> ptrdiff_t |
+static auto | nullSpace (Valid< const IR::Addr > x, Valid< const IR::Addr > y) -> math::DenseMatrix< int64_t > |
+static auto | nullSpace (Valid< const IR::Addr > x) -> math::DenseMatrix< int64_t > |
+static auto | symbolIndex (math::PtrVector< IR::Value * > s, IR::Value *v) -> Optional< unsigned > |
static auto | mergeMap (math::Vector< unsigned > &map, math::PtrVector< IR::Value * > s0, math::PtrVector< IR::Value * > s1) -> unsigned |
+static void | fillSyms (llvm::MutableArrayRef< const llvm::SCEV * > s, std::array< llvm::ArrayRef< const llvm::SCEV * >, 2 > sa, math::Vector< unsigned > &map) |
+static auto | dependence (Valid< Arena<> > alloc, Valid< const IR::Addr > aix, Valid< const IR::Addr > aiy) -> DepPoly * |
+static auto | self (Arena<> *alloc, Valid< const IR::Addr > ai) -> Valid< DepPoly > |
+Friends | |
+auto | operator<< (std::ostream &os, const DepPoly &p) -> std::ostream & |
DepPoly is a Polyhedra with equality constraints, representing the overlapping iterations between two array accesses Given memory accesses 0. C0*i0, over polyhedra A0 * i0 + b0 >= 0
i
equals the number of loops in the nest. b
may contain dynamic symbols. We match them between b0 and b1, (adding 0s as necessary), so that b0 = b0_c + B0 * s b1 = b1_c + B1 * s where s is the vector of dynamic symbols.Additionally, we may have some number of time dimensions corresponding to repeated memory accesses to the same address. E.g.,
for (int i = 0; i < N; ++i) + for (int j = 0; j < N; ++j) + for (int k = 0; k < N; ++k) + C[i,j] += A[i,k]*B[k,j]; +
We repeatedly access C
across k
. We support arbitrary (so long as indexing is affine) repeat accesses to the same address; this is just a trivial (matrix multiply) example.
Example: for i = 1:N, j = 1:i A[i,j] = foo(A[i,i]) labels: 0 1
+Dependence Poly: 1 <= i_0 <= N 1 <= j_0 <= i_0 1 <= i_1 <= N 1 <= j_1 <= i_1 i_0 == i_1 j_0 == i_1
+
+
|
+ +inline | +
Returns true
if the array accesses are guaranteed independent conditioning on partial schedules xPhi and yPhi How this works: We create a new dependency polyhedra, and set the schedules xPhi
and yPhi
equal to one another, in addition to the equalities imposed by the need for the addresses to be equal. If that polyhedra is empty, then conditioning on these schedules, no intersection is left.
+
|
+ +inlinestatic | +
Returns a map of s1's content's to s0's Values >= s0.size() are new symbols
+ +
+ LoopModels
+
+ |
+
This is the complete list of members for poly::Dependencies, including all inherited members.
+activeFilter(int depth0) (defined in poly::Dependencies) | poly::Dependencies | inline |
check(Valid< Arena<> > alloc, Valid< IR::Addr > x, Valid< IR::Addr > y) (defined in poly::Dependencies) | poly::Dependencies | inline |
clear() (defined in poly::Dependencies) | poly::Dependencies | inline |
copyDependencies(IR::Addr *src, IR::Addr *dst) (defined in poly::Dependencies) | poly::Dependencies | inline |
Dependencies()=default (defined in poly::Dependencies) | poly::Dependencies | |
Dependencies(ptrdiff_t len) (defined in poly::Dependencies) | poly::Dependencies | inline |
Dependencies(const Dependencies &) noexcept=delete (defined in poly::Dependencies) | poly::Dependencies | |
Dependencies(Dependencies &&) noexcept=default (defined in poly::Dependencies) | poly::Dependencies | |
determinePeelDepth(IR::Loop *L, ID id) -> utils::Optional< size_t > (defined in poly::Dependencies) | poly::Dependencies | inline |
dump() (defined in poly::Dependencies) | poly::Dependencies | inline |
get(ID i) -> Dependence | poly::Dependencies | inline |
getEdgeTransform() (defined in poly::Dependencies) | poly::Dependencies | inline |
getMeta(ID id) const -> uint8_t (defined in poly::Dependencies) | poly::Dependencies | inline |
inEdges() -> MutPtrVector< int32_t > (defined in poly::Dependencies) | poly::Dependencies | inline |
inEdges() const -> PtrVector< int32_t > (defined in poly::Dependencies) | poly::Dependencies | inline |
input(ptrdiff_t id) -> IR::Addr *& (defined in poly::Dependencies) | poly::Dependencies | inline |
input(ptrdiff_t id) const -> IR::Addr * (defined in poly::Dependencies) | poly::Dependencies | inline |
inputAddrs(const IR::Addr *A) (defined in poly::Dependencies) | poly::Dependencies | inline |
inputAddrs(const IR::Addr *A, int depth0) (defined in poly::Dependencies) | poly::Dependencies | inline |
inputAddrTransform() (defined in poly::Dependencies) | poly::Dependencies | inline |
inputEdgeIDs(int32_t id) const -> utils::VForwardRange (defined in poly::Dependencies) | poly::Dependencies | inline |
inputEdgeIDs(const IR::Addr *A) -> utils::VForwardRange (defined in poly::Dependencies) | poly::Dependencies | inline |
inputEdgeIDs(const IR::Addr *A, int depth0) (defined in poly::Dependencies) | poly::Dependencies | inline |
inputEdges(int32_t id) (defined in poly::Dependencies) | poly::Dependencies | inline |
inputEdges(const IR::Addr *A) (defined in poly::Dependencies) | poly::Dependencies | inline |
inputEdges(const IR::Addr *A, int depth0) (defined in poly::Dependencies) | poly::Dependencies | inline |
insertDependencies(IR::Addr *in, IR::Addr *out, int32_t idx) -> std::array< ID, 2 > (defined in poly::Dependencies) | poly::Dependencies | inline |
insertDependencies(MutPtrVector< int32_t > insertids) -> int (defined in poly::Dependencies) | poly::Dependencies | inline |
operator=(Dependencies &&other) noexcept -> Dependencies & (defined in poly::Dependencies) | poly::Dependencies | inline |
operator[](ID i) -> Dependence (defined in poly::Dependencies) | poly::Dependencies | inline |
outEdges() -> MutPtrVector< int32_t > (defined in poly::Dependencies) | poly::Dependencies | inline |
outEdges() const -> PtrVector< int32_t > (defined in poly::Dependencies) | poly::Dependencies | inline |
output(ptrdiff_t id) -> IR::Addr *& (defined in poly::Dependencies) | poly::Dependencies | inline |
output(ptrdiff_t id) const -> IR::Addr * (defined in poly::Dependencies) | poly::Dependencies | inline |
outputAddrs(const IR::Addr *A) (defined in poly::Dependencies) | poly::Dependencies | inline |
outputAddrs(const IR::Addr *A, int depth0) (defined in poly::Dependencies) | poly::Dependencies | inline |
outputAddrTransform() (defined in poly::Dependencies) | poly::Dependencies | inline |
outputEdgeIDs(int32_t id) const -> utils::VForwardRange (defined in poly::Dependencies) | poly::Dependencies | inline |
outputEdgeIDs(const IR::Addr *A) -> utils::VForwardRange (defined in poly::Dependencies) | poly::Dependencies | inline |
outputEdgeIDs(const IR::Addr *A, int depth0) (defined in poly::Dependencies) | poly::Dependencies | inline |
outputEdges(int32_t id) (defined in poly::Dependencies) | poly::Dependencies | inline |
outputEdges(const IR::Addr *A) (defined in poly::Dependencies) | poly::Dependencies | inline |
outputEdges(const IR::Addr *A, int depth0) (defined in poly::Dependencies) | poly::Dependencies | inline |
registerEligible(ID id) const -> bool (defined in poly::Dependencies) | poly::Dependencies | inline |
registerEligibleFilter() const (defined in poly::Dependencies) | poly::Dependencies | inline |
reload(Arena<> *alloc, Valid< IR::Addr > store) -> Valid< IR::Addr > (defined in poly::Dependencies) | poly::Dependencies | inline |
removeEdge(ID id) | poly::Dependencies | inline |
removeEdge(ID id, IR::Addr *in, IR::Addr *out) (defined in poly::Dependencies) | poly::Dependencies | inline |
removeInEdge(int32_t id) (defined in poly::Dependencies) | poly::Dependencies | inline |
removeOutEdge(int32_t id) (defined in poly::Dependencies) | poly::Dependencies | inline |
size() const noexcept -> ptrdiff_t (defined in poly::Dependencies) | poly::Dependencies | inline |
unhoistableOutputs(const IR::Addr *A, int depth0) (defined in poly::Dependencies) | poly::Dependencies | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+ | Dependencies (ptrdiff_t len) |
+ | Dependencies (const Dependencies &) noexcept=delete |
+constexpr | Dependencies (Dependencies &&) noexcept=default |
+constexpr auto | operator= (Dependencies &&other) noexcept -> Dependencies & |
+constexpr auto | size () const noexcept -> ptrdiff_t |
+constexpr void | clear () |
constexpr void | removeEdge (ID id) |
+constexpr void | removeEdge (ID id, IR::Addr *in, IR::Addr *out) |
+constexpr void | removeOutEdge (int32_t id) |
+constexpr void | removeInEdge (int32_t id) |
+constexpr auto | operator[] (ID i) -> Dependence |
+constexpr auto | get (ID i) -> Dependence |
Like operator[] , but maybe nicer to use with pointers? | |
+void | check (Valid< Arena<> > alloc, Valid< IR::Addr > x, Valid< IR::Addr > y) |
+auto | reload (Arena<> *alloc, Valid< IR::Addr > store) -> Valid< IR::Addr > |
+constexpr auto | outEdges () -> MutPtrVector< int32_t > |
+constexpr auto | inEdges () -> MutPtrVector< int32_t > |
+constexpr auto | outEdges () const -> PtrVector< int32_t > |
+constexpr auto | inEdges () const -> PtrVector< int32_t > |
+constexpr auto | output (ptrdiff_t id) -> IR::Addr *& |
+constexpr auto | input (ptrdiff_t id) -> IR::Addr *& |
+constexpr auto | output (ptrdiff_t id) const -> IR::Addr * |
+constexpr auto | input (ptrdiff_t id) const -> IR::Addr * |
+constexpr auto | inputEdgeIDs (int32_t id) const -> utils::VForwardRange |
+constexpr auto | outputEdgeIDs (int32_t id) const -> utils::VForwardRange |
+constexpr auto | getEdgeTransform () |
+constexpr auto | inputEdges (int32_t id) |
+constexpr auto | outputEdges (int32_t id) |
+constexpr auto | activeFilter (int depth0) |
+constexpr auto | inputAddrTransform () |
+constexpr auto | outputAddrTransform () |
+constexpr auto | getMeta (ID id) const -> uint8_t |
+constexpr auto | registerEligible (ID id) const -> bool |
+constexpr auto | registerEligibleFilter () const |
+constexpr auto | insertDependencies (IR::Addr *in, IR::Addr *out, int32_t idx) -> std::array< ID, 2 > |
+auto | insertDependencies (MutPtrVector< int32_t > insertids) -> int |
+auto | determinePeelDepth (IR::Loop *L, ID id) -> utils::Optional< size_t > |
+DEBUGUSED void | dump () |
+auto | inputEdges (const IR::Addr *A) |
+auto | outputEdges (const IR::Addr *A) |
+auto | inputEdgeIDs (const IR::Addr *A) -> utils::VForwardRange |
+auto | outputEdgeIDs (const IR::Addr *A) -> utils::VForwardRange |
+auto | inputEdgeIDs (const IR::Addr *A, int depth0) |
+auto | outputEdgeIDs (const IR::Addr *A, int depth0) |
+auto | inputEdges (const IR::Addr *A, int depth0) |
+auto | outputEdges (const IR::Addr *A, int depth0) |
+auto | inputAddrs (const IR::Addr *A) |
+auto | inputAddrs (const IR::Addr *A, int depth0) |
+auto | outputAddrs (const IR::Addr *A) |
+auto | outputAddrs (const IR::Addr *A, int depth0) |
+auto | unhoistableOutputs (const IR::Addr *A, int depth0) |
+void | copyDependencies (IR::Addr *src, IR::Addr *dst) |
+
|
+ +inlineconstexpr | +
TODO: remove revTimeEdge?
+ +
+ LoopModels
+
+ |
+
This is the complete list of members for poly::Loop, including all inherited members.
+addZeroLowerBounds() (defined in poly::Loop) | poly::Loop | inline |
allocate(Arena<> *alloc, llvm::Loop *L, unsigned numCon, unsigned numLoops, unsigned numDynSym, bool nonNegative) -> Valid< Loop > (defined in poly::Loop) | poly::Loop | inlinestatic |
allocate(Arena<> *alloc, llvm::Loop *L, unsigned numCon, unsigned numLoops, math::PtrVector< IR::Value * > syms, bool nonNegative) -> Valid< Loop > (defined in poly::Loop) | poly::Loop | inlinestatic |
clear() (defined in poly::Loop) | poly::Loop | inline |
construct(IR::Cache &cache, llvm::Loop *L, const llvm::SCEV *BT, IR::LLVMIRBuilder LB, llvm::OptimizationRemarkEmitter *ORE=nullptr) -> Valid< Loop > (defined in poly::Loop) | poly::Loop | inlinestatic |
copy(Arena<> *alloc) const -> Valid< Loop > (defined in poly::Loop) | poly::Loop | inline |
decrementNumConstraints() (defined in poly::Loop) | poly::Loop | inline |
dump(std::ostream &os, Arena<> *alloc) const (defined in poly::Loop) | poly::Loop | inline |
dump() const (defined in poly::Loop) | poly::Loop | inline |
dyn_loop_est (defined in poly::Loop) | poly::Loop | static |
eraseConstraint(ptrdiff_t c) (defined in poly::Loop) | poly::Loop | inline |
getA() -> MutDensePtrMatrix< int64_t > | poly::Loop | inline |
getA() const -> DensePtrMatrix< int64_t > | poly::Loop | inline |
getLLVMLoop() const -> llvm::Loop * (defined in poly::Loop) | poly::Loop | inline |
getNumCon() const -> ptrdiff_t (defined in poly::Loop) | poly::Loop | inline |
getNumLoops() const -> ptrdiff_t (defined in poly::Loop) | poly::Loop | inline |
getNumSymbols() const -> ptrdiff_t (defined in poly::Loop) | poly::Loop | inline |
getOuterA(ptrdiff_t subLoop) -> MutPtrMatrix< int64_t > (defined in poly::Loop) | poly::Loop | inline |
getOuterA(ptrdiff_t subLoop) const -> PtrMatrix< int64_t > (defined in poly::Loop) | poly::Loop | inline |
getProgVars(ptrdiff_t j) const -> PtrVector< int64_t > (defined in poly::Loop) | poly::Loop | inline |
getSyms() -> MutPtrVector< IR::Value * > (defined in poly::Loop) | poly::Loop | inline |
getSyms() const -> PtrVector< IR::Value * > (defined in poly::Loop) | poly::Loop | inline |
isNonNegative() const -> bool (defined in poly::Loop) | poly::Loop | inline |
Loop(const Loop &)=delete (defined in poly::Loop) | poly::Loop | |
Loop(llvm::Loop *loop, unsigned _numConstraints, unsigned _numLoops, unsigned _numDynSymbols, bool _nonNegative) (defined in poly::Loop) | poly::Loop | inlineexplicit |
operator<< (defined in poly::Loop) | poly::Loop | friend |
printBound(std::ostream &os, int64_t sign, ptrdiff_t numVarMinus1, ptrdiff_t numConst, ptrdiff_t j) const (defined in poly::Loop) | poly::Loop | inline |
printBound(std::ostream &os, int64_t sign) const (defined in poly::Loop) | poly::Loop | inline |
printBounds(std::ostream &os) const (defined in poly::Loop) | poly::Loop | inline |
printBoundShort(std::ostream &os, int64_t sign, ptrdiff_t numVarMinus1, ptrdiff_t numConst, int64_t allAj, ptrdiff_t numRow, bool separateLines) const (defined in poly::Loop) | poly::Loop | inline |
printSymbol(std::ostream &os, PtrVector< int64_t > x, int64_t mul) const -> bool (defined in poly::Loop) | poly::Loop | inline |
removeInnerMost(Arena<> *alloc) const -> Valid< Loop > | poly::Loop | inline |
removeLoop(Arena<> *alloc, ptrdiff_t v) const -> Loop * (defined in poly::Loop) | poly::Loop | inline |
removeOuterMost(IR::Cache &cache, ptrdiff_t numToRemove, IR::LLVMIRBuilder LB, llvm::SCEVExpander &scevexpdr) (defined in poly::Loop) | poly::Loop | inline |
rotate(Arena<> *alloc, DensePtrMatrix< int64_t > R, const int64_t *offsets) const -> Valid< Loop > | poly::Loop | inline |
rotate(Arena<> *alloc, DensePtrMatrix< int64_t > R, const int64_t *offsets) -> Valid< Loop > (defined in poly::Loop) | poly::Loop | inline |
setNumConstraints(ptrdiff_t numCon) (defined in poly::Loop) | poly::Loop | inline |
setNumEqConstraints(ptrdiff_t) (defined in poly::Loop) | poly::Loop | inlinestatic |
tripCount(ptrdiff_t depth1) const -> containers::Pair< bool, uint32_t > | poly::Loop | inline |
truncateConstraints(ptrdiff_t newNumConstraints) (defined in poly::Loop) | poly::Loop | inline |
truncNumInEqCon(Row<> r) (defined in poly::Loop) | poly::Loop | inline |
zeroExtraItersUponExtending(Arena<> alloc, ptrdiff_t _i, bool extendLower) const -> bool (defined in poly::Loop) | poly::Loop | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+ | Loop (const Loop &)=delete |
+constexpr auto | isNonNegative () const -> bool |
auto | tripCount (ptrdiff_t depth1) const -> containers::Pair< bool, uint32_t > |
auto | rotate (Arena<> *alloc, DensePtrMatrix< int64_t > R, const int64_t *offsets) const -> Valid< Loop > |
+constexpr auto | getLLVMLoop () const -> llvm::Loop * |
+constexpr auto | rotate (Arena<> *alloc, DensePtrMatrix< int64_t > R, const int64_t *offsets) -> Valid< Loop > |
+auto | removeInnerMost (Arena<> *alloc) const -> Valid< Loop > |
When/Why would we want to use this??? | |
+constexpr void | truncateConstraints (ptrdiff_t newNumConstraints) |
+constexpr void | clear () |
+void | removeOuterMost (IR::Cache &cache, ptrdiff_t numToRemove, IR::LLVMIRBuilder LB, llvm::SCEVExpander &scevexpdr) |
+void | addZeroLowerBounds () |
+constexpr auto | getProgVars (ptrdiff_t j) const -> PtrVector< int64_t > |
+auto | copy (Arena<> *alloc) const -> Valid< Loop > |
+auto | removeLoop (Arena<> *alloc, ptrdiff_t v) const -> Loop * |
+constexpr void | eraseConstraint (ptrdiff_t c) |
+auto | zeroExtraItersUponExtending (Arena<> alloc, ptrdiff_t _i, bool extendLower) const -> bool |
+auto | printSymbol (std::ostream &os, PtrVector< int64_t > x, int64_t mul) const -> bool |
+constexpr void | setNumConstraints (ptrdiff_t numCon) |
+constexpr void | decrementNumConstraints () |
+void | printBound (std::ostream &os, int64_t sign, ptrdiff_t numVarMinus1, ptrdiff_t numConst, ptrdiff_t j) const |
+void | printBoundShort (std::ostream &os, int64_t sign, ptrdiff_t numVarMinus1, ptrdiff_t numConst, int64_t allAj, ptrdiff_t numRow, bool separateLines) const |
+void | printBound (std::ostream &os, int64_t sign) const |
+void | printBounds (std::ostream &os) const |
+void | dump (std::ostream &os, Arena<> *alloc) const |
+void | dump () const |
+constexpr auto | getNumCon () const -> ptrdiff_t |
constexpr auto | getA () -> MutDensePtrMatrix< int64_t > |
constexpr auto | getA () const -> DensePtrMatrix< int64_t > |
+constexpr auto | getOuterA (ptrdiff_t subLoop) -> MutPtrMatrix< int64_t > |
+constexpr auto | getOuterA (ptrdiff_t subLoop) const -> PtrMatrix< int64_t > |
+auto | getSyms () -> MutPtrVector< IR::Value * > |
+auto | getSyms () const -> PtrVector< IR::Value * > |
+constexpr auto | getNumLoops () const -> ptrdiff_t |
+constexpr auto | getNumSymbols () const -> ptrdiff_t |
+constexpr void | truncNumInEqCon (Row<> r) |
+constexpr | Loop (llvm::Loop *loop, unsigned _numConstraints, unsigned _numLoops, unsigned _numDynSymbols, bool _nonNegative) |
![]() | |
+constexpr auto | getA () -> MutDensePtrMatrix< int64_t > |
+constexpr auto | getA () const -> DensePtrMatrix< int64_t > |
+constexpr auto | getE () |
+constexpr auto | getE () const |
+constexpr void | truncNumInEqCon (Row<> r) |
+constexpr void | truncNumEqCon (Row<> r) |
+constexpr auto | initializeComparator (alloc::Mallocator< int64_t > alloc={}) -> comparator::LinearSymbolicComparator |
+constexpr auto | initializeComparator (Arena<> *alloc) -> comparator::PtrSymbolicComparator |
+constexpr auto | calcIsEmpty () -> bool |
+constexpr auto | calcIsEmpty (Arena<> alloc) -> bool |
+constexpr auto | getNumCon () const -> int |
+constexpr void | setNumConstraints (int numCon) |
+constexpr void | setNumEqConstraints (int numCon) |
+constexpr void | decrementNumConstraints () |
+constexpr auto | isNonNegative () const -> bool |
+constexpr void | pruneBounds (Arena<> alloc) |
+constexpr void | pruneBounds () |
+constexpr void | eraseConstraint (ptrdiff_t constraint) |
+constexpr void | pruneBoundsCore (Arena<> *alloc) |
+constexpr void | pruneBoundsUnchecked (math::Alloc< int64_t > auto &alloc) |
+constexpr auto | getNumSymbols () const -> unsigned |
+constexpr auto | getNumDynamic () const -> ptrdiff_t |
+constexpr auto | getNumVar () const -> ptrdiff_t |
+constexpr auto | getNumInequalityConstraints () const -> int |
+constexpr auto | getNumEqualityConstraints () const -> int |
+constexpr void | dropEmptyConstraints () |
+void | dump () const |
+auto | isEmpty () const -> bool |
+void | truncateVars (ptrdiff_t numVar) |
+Static Public Member Functions | |
+static auto | construct (IR::Cache &cache, llvm::Loop *L, const llvm::SCEV *BT, IR::LLVMIRBuilder LB, llvm::OptimizationRemarkEmitter *ORE=nullptr) -> Valid< Loop > |
+static constexpr void | setNumEqConstraints (ptrdiff_t) |
+static auto | allocate (Arena<> *alloc, llvm::Loop *L, unsigned numCon, unsigned numLoops, unsigned numDynSym, bool nonNegative) -> Valid< Loop > |
+static auto | allocate (Arena<> *alloc, llvm::Loop *L, unsigned numCon, unsigned numLoops, math::PtrVector< IR::Value * > syms, bool nonNegative) -> Valid< Loop > |
+Static Public Attributes | |
+static constexpr uint32_t | dyn_loop_est = 1024 |
+Friends | |
+auto | operator<< (std::ostream &os, const Loop &aln) -> std::ostream & |
+
|
+ +inlineconstexpr | +
returns the A
where A * [1 dynamic symbols in loop bounds indvars] >= 0
, i
are loop indvars Number of rows indicate number of constraints, columns are /// returns the A
where A * i >= 0
, i
are loop indvars Number of rows indicate number of constraints, columns are 1 (constant) + numDynSymbols + number of loops
+
|
+ +inlineconstexpr | +
returns the A
where A * [1 dynamic symbols in loop bounds indvars] >= 0
, i
are loop indvars Number of rows indicate number of constraints, columns are /// returns the A
where A * i >= 0
, i
are loop indvars Number of rows indicate number of constraints, columns are 1 (constant) + numDynSymbols + number of loops
+
|
+ +inline | +
A.rotate( R ) A(_,const) + A(_,var)*var >= 0 this method applies rotation matrix R A(_,const) + (A(_,var)*R)*(R^{-1}*var) >= 0 So that our new loop nest has matrix [A(_,const) (A(_,var)*R)] while the new ‘var’ is (R^{-1}*var)
offset the loops by offsets
, e.g. if we have offsets[0] = 2, then the first loop is shifted by 2. this shifting is applied before rotation.
+
|
+ +inline | +
Gives a very rough trip count estimate (second return value) with a boolean first arg indicating whether it is exact or estimated. The estimation approach here can be seriously improved. Currently, if not exact, it simply returns dyn_loop_est
.
+ LoopModels
+
+ |
+
This is the complete list of members for prettyprinters.StrongIntegerPrinter, including all inherited members.
+__init__(self, val) (defined in prettyprinters.StrongIntegerPrinter) | prettyprinters.StrongIntegerPrinter | |
to_string(self) (defined in prettyprinters.StrongIntegerPrinter) | prettyprinters.StrongIntegerPrinter | |
val (defined in prettyprinters.StrongIntegerPrinter) | prettyprinters.StrongIntegerPrinter |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+ | __init__ (self, val) |
+ | to_string (self) |
+Public Attributes | |
+ | val |
Print an strongly typed integer
+ LoopModels
+
+ |
+
This is the complete list of members for utils::VCycleIterator, including all inherited members.
+operator!=(const VCycleIterator &other) const noexcept -> bool (defined in utils::VCycleIterator) | utils::VCycleIterator | inline |
operator*() const noexcept -> int32_t (defined in utils::VCycleIterator) | utils::VCycleIterator | inline |
operator++() noexcept -> VCycleIterator & (defined in utils::VCycleIterator) | utils::VCycleIterator | inline |
operator++(int) noexcept -> VCycleIterator (defined in utils::VCycleIterator) | utils::VCycleIterator | inline |
operator-(const VCycleIterator &other) const noexcept -> ptrdiff_t (defined in utils::VCycleIterator) | utils::VCycleIterator | inline |
operator=(const VCycleIterator &) noexcept -> VCycleIterator &=default (defined in utils::VCycleIterator) | utils::VCycleIterator | |
operator=(VCycleIterator &&) noexcept -> VCycleIterator &=default (defined in utils::VCycleIterator) | utils::VCycleIterator | |
operator==(const VCycleIterator &other) const noexcept -> bool (defined in utils::VCycleIterator) | utils::VCycleIterator | inline |
operator==(End) const -> bool (defined in utils::VCycleIterator) | utils::VCycleIterator | inline |
value_type typedef (defined in utils::VCycleIterator) | utils::VCycleIterator | |
VCycleIterator() noexcept=default (defined in utils::VCycleIterator) | utils::VCycleIterator | |
VCycleIterator(const int32_t *data_, int32_t start_) noexcept (defined in utils::VCycleIterator) | utils::VCycleIterator | inline |
VCycleIterator(const VCycleIterator &) noexcept=default (defined in utils::VCycleIterator) | utils::VCycleIterator | |
VCycleIterator(VCycleIterator &&) noexcept=default (defined in utils::VCycleIterator) | utils::VCycleIterator |
+ LoopModels
+
+ |
+
+Public Types | |
+using | value_type = int32_t |
+Public Member Functions | |
+constexpr | VCycleIterator (const int32_t *data_, int32_t start_) noexcept |
+constexpr auto | operator* () const noexcept -> int32_t |
+constexpr auto | operator++ () noexcept -> VCycleIterator & |
+constexpr auto | operator++ (int) noexcept -> VCycleIterator |
+constexpr auto | operator== (const VCycleIterator &other) const noexcept -> bool |
+constexpr auto | operator!= (const VCycleIterator &other) const noexcept -> bool |
+constexpr auto | operator== (End) const -> bool |
+constexpr auto | operator- (const VCycleIterator &other) const noexcept -> ptrdiff_t |
+constexpr | VCycleIterator (const VCycleIterator &) noexcept=default |
+constexpr | VCycleIterator (VCycleIterator &&) noexcept=default |
+constexpr auto | operator= (const VCycleIterator &) noexcept -> VCycleIterator &=default |
+constexpr auto | operator= (VCycleIterator &&) noexcept -> VCycleIterator &=default |
+ LoopModels
+
+ |
+
This is the complete list of members for utils::VCycleRange, including all inherited members.
+begin() const noexcept -> VCycleIterator (defined in utils::VCycleRange) | utils::VCycleRange | inline |
end() noexcept -> End (defined in utils::VCycleRange) | utils::VCycleRange | inlinestatic |
VCycleRange(math::PtrVector< int32_t > data_, int32_t start_) noexcept (defined in utils::VCycleRange) | utils::VCycleRange | inline |
VCycleRange(const int32_t *data_, int32_t start_) noexcept (defined in utils::VCycleRange) | utils::VCycleRange | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+constexpr | VCycleRange (math::PtrVector< int32_t > data_, int32_t start_) noexcept |
+constexpr | VCycleRange (const int32_t *data_, int32_t start_) noexcept |
+constexpr auto | begin () const noexcept -> VCycleIterator |
+Static Public Member Functions | |
+static constexpr auto | end () noexcept -> End |
+ LoopModels
+
+ |
+
This is the complete list of members for utils::VForwardIterator, including all inherited members.
+operator!=(const VForwardIterator &other) const noexcept -> bool (defined in utils::VForwardIterator) | utils::VForwardIterator | inline |
operator*() const noexcept -> int32_t (defined in utils::VForwardIterator) | utils::VForwardIterator | inline |
operator++() noexcept -> VForwardIterator & (defined in utils::VForwardIterator) | utils::VForwardIterator | inline |
operator++(int) noexcept -> VForwardIterator (defined in utils::VForwardIterator) | utils::VForwardIterator | inline |
operator-(const VForwardIterator &other) const noexcept -> ptrdiff_t (defined in utils::VForwardIterator) | utils::VForwardIterator | inline |
operator=(const VForwardIterator &) noexcept -> VForwardIterator &=default (defined in utils::VForwardIterator) | utils::VForwardIterator | |
operator=(VForwardIterator &&) noexcept -> VForwardIterator &=default (defined in utils::VForwardIterator) | utils::VForwardIterator | |
operator==(const VForwardIterator &other) const noexcept -> bool (defined in utils::VForwardIterator) | utils::VForwardIterator | inline |
operator==(End) const -> bool (defined in utils::VForwardIterator) | utils::VForwardIterator | inline |
value_type typedef (defined in utils::VForwardIterator) | utils::VForwardIterator | |
VForwardIterator() noexcept=default (defined in utils::VForwardIterator) | utils::VForwardIterator | |
VForwardIterator(const int32_t *data, int32_t start) noexcept (defined in utils::VForwardIterator) | utils::VForwardIterator | inline |
VForwardIterator(const VForwardIterator &) noexcept=default (defined in utils::VForwardIterator) | utils::VForwardIterator | |
VForwardIterator(VForwardIterator &&) noexcept=default (defined in utils::VForwardIterator) | utils::VForwardIterator |
+ LoopModels
+
+ |
+
+Public Types | |
+using | value_type = int32_t |
+Public Member Functions | |
+constexpr | VForwardIterator (const int32_t *data, int32_t start) noexcept |
+constexpr auto | operator* () const noexcept -> int32_t |
+constexpr auto | operator++ () noexcept -> VForwardIterator & |
+constexpr auto | operator++ (int) noexcept -> VForwardIterator |
+constexpr auto | operator== (const VForwardIterator &other) const noexcept -> bool |
+constexpr auto | operator!= (const VForwardIterator &other) const noexcept -> bool |
+constexpr auto | operator== (End) const -> bool |
+constexpr auto | operator- (const VForwardIterator &other) const noexcept -> ptrdiff_t |
+constexpr | VForwardIterator (const VForwardIterator &) noexcept=default |
+constexpr | VForwardIterator (VForwardIterator &&) noexcept=default |
+constexpr auto | operator= (const VForwardIterator &) noexcept -> VForwardIterator &=default |
+constexpr auto | operator= (VForwardIterator &&) noexcept -> VForwardIterator &=default |
VForwardIterator is safe with respect to removing the current iteration from the list. However, behavior is undefined if you remove or move the next element.
+
+ LoopModels
+
+ |
+
This is the complete list of members for utils::VForwardRange, including all inherited members.
+begin() const noexcept -> VForwardIterator (defined in utils::VForwardRange) | utils::VForwardRange | inline |
end() noexcept -> End (defined in utils::VForwardRange) | utils::VForwardRange | inlinestatic |
VForwardRange()=default (defined in utils::VForwardRange) | utils::VForwardRange | |
VForwardRange(math::PtrVector< int32_t > data, int32_t start) noexcept (defined in utils::VForwardRange) | utils::VForwardRange | inline |
VForwardRange(const int32_t *data, int32_t start) noexcept (defined in utils::VForwardRange) | utils::VForwardRange | inline |
+ LoopModels
+
+ |
+
+Public Member Functions | |
+constexpr | VForwardRange (math::PtrVector< int32_t > data, int32_t start) noexcept |
+constexpr | VForwardRange (const int32_t *data, int32_t start) noexcept |
+constexpr auto | begin () const noexcept -> VForwardIterator |
+Static Public Member Functions | |
+static constexpr auto | end () noexcept -> End |
VForwardRange is safe with respect to removing the current iteration from the list. However, behavior is undefined if you remove or move the next element.
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
▼Ncomparator | |
RComparator | |
▼Ngraph | |
RAbstractPtrGraph | |
RAbstractRange | |
RAbstractGraphCore | |
RAbstractIndexGraph | |
RLoadOrStoreInst |
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+Files | |
Comparators.cxx | |
Dependence.cxx | |
DependencyPolyhedra.cxx | |
Loops.cxx | |
Polyhedra.cxx | |
Schedule.cxx | |
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+Directories | |
Backends | |
Dicts | |
Frontends | |
Graphs | |
IR | |
LinearProgramming | |
Optimize | |
Polyhedra | |
Support | |
Target | |
+Files | |
RemarkAnalysis.cxx | |
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
▼ mod | |
▼ Dicts | |
Dict.cxx | |
Linear.cxx | |
MapVector.cxx | |
Trie.cxx | |
▼ Graphs | |
Graphs.cxx | |
IndexGraphs.cxx | |
▼ IR | |
Address.cxx | |
Array.cxx | |
BBPredPath.cxx | |
Cache.cxx | |
ControlFlowMerging.cxx | |
Instruction.cxx | |
InstructionCost.cxx | |
IR.cxx | |
Node.cxx | |
OrthogonalAxes.cxx | |
Phi.cxx | |
Predicate.cxx | |
TreeResult.cxx | |
Users.cxx | |
▼ LinearProgramming | |
LoopBlock.cxx | |
ScheduledNode.cxx | |
▼ Optimize | |
BBCosts.cxx | |
CacheOptimization.cxx | |
Cost.cxx | |
CostFunction.cxx | |
CostModeling.cxx | |
IRGraph.cxx | |
LeakyReluCost.cxx | |
Legality.cxx | |
LoopTransform.cxx | |
MemoryCost.cxx | |
MicroKernelOptimization.cxx | |
RegisterLife.cxx | |
RegisterUse.cxx | |
Unrolls.cxx | |
▼ Polyhedra | |
Comparators.cxx | |
Dependence.cxx | |
DependencyPolyhedra.cxx | |
Loops.cxx | |
Polyhedra.cxx | |
Schedule.cxx | |
▼ Support | |
Iterators.cxx | |
LLVMUtils.cxx | |
OStream.cxx | |
Permutation.cxx | |
▼ Target | |
Host.cxx | |
Machine.cxx | |
RemarkAnalysis.cxx | |
▼ test | |
TestUtilities.cxx |
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+
+ LoopModels
+
+ |
+