[Polly] Fix typos discovered by codespell (#124545)
Patch created using the following command line: ```bash codespell polly --skip="*.pdf,polly/lib/External/*" --write-changes \ --ignore-words-list=couter,createor,distribues,doble,identty,indention,indx,olt,ore,padd,sais,te,theses ```
This commit is contained in:
parent
62340ff8d8
commit
5aafc6d58f
@ -27,7 +27,7 @@ executed in the so-called **Inliner cycle**, This is again a set of **Scalar
|
|||||||
Simplification** passes, a set of **Simple Loop Optimizations**, and the
|
Simplification** passes, a set of **Simple Loop Optimizations**, and the
|
||||||
**Inliner** itself. Even though these passes make up the majority of the LLVM
|
**Inliner** itself. Even though these passes make up the majority of the LLVM
|
||||||
pass pipeline, the primary goal of these passes is still canonicalization
|
pass pipeline, the primary goal of these passes is still canonicalization
|
||||||
without loosing semantic information that complicates later analysis. As part of
|
without losing semantic information that complicates later analysis. As part of
|
||||||
the inliner cycle, the LLVM inliner step-by-step tries to inline functions, runs
|
the inliner cycle, the LLVM inliner step-by-step tries to inline functions, runs
|
||||||
canonicalization passes to exploit newly exposed simplification opportunities,
|
canonicalization passes to exploit newly exposed simplification opportunities,
|
||||||
and then tries to inline the further simplified functions. Some simple loop
|
and then tries to inline the further simplified functions. Some simple loop
|
||||||
|
@ -1066,7 +1066,7 @@ HTML_STYLESHEET =
|
|||||||
# defined cascading style sheet that is included after the standard style sheets
|
# defined cascading style sheet that is included after the standard style sheets
|
||||||
# created by doxygen. Using this option one can overrule certain style aspects.
|
# created by doxygen. Using this option one can overrule certain style aspects.
|
||||||
# This is preferred over using HTML_STYLESHEET since it does not replace the
|
# This is preferred over using HTML_STYLESHEET since it does not replace the
|
||||||
# standard style sheet and is therefor more robust against future updates.
|
# standard style sheet and is therefore more robust against future updates.
|
||||||
# Doxygen will copy the style sheet file to the output directory. For an example
|
# Doxygen will copy the style sheet file to the output directory. For an example
|
||||||
# see the documentation.
|
# see the documentation.
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||||
@ -1950,7 +1950,7 @@ PREDEFINED =
|
|||||||
EXPAND_AS_DEFINED =
|
EXPAND_AS_DEFINED =
|
||||||
|
|
||||||
# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
|
# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
|
||||||
# remove all refrences to function-like macros that are alone on a line, have an
|
# remove all references to function-like macros that are alone on a line, have an
|
||||||
# all uppercase name, and do not end with a semicolon. Such function macros are
|
# all uppercase name, and do not end with a semicolon. Such function macros are
|
||||||
# typically used for boiler-plate code, and will confuse the parser if not
|
# typically used for boiler-plate code, and will confuse the parser if not
|
||||||
# removed.
|
# removed.
|
||||||
|
@ -118,7 +118,7 @@ private:
|
|||||||
|
|
||||||
/// Call fflush
|
/// Call fflush
|
||||||
///
|
///
|
||||||
/// @parma Builder The builder used to insert the code.
|
/// @param Builder The builder used to insert the code.
|
||||||
static void createFlush(PollyIRBuilder &Builder);
|
static void createFlush(PollyIRBuilder &Builder);
|
||||||
};
|
};
|
||||||
} // namespace polly
|
} // namespace polly
|
||||||
|
@ -211,7 +211,7 @@ struct DependenceAnalysis final : public AnalysisInfoMixin<DependenceAnalysis> {
|
|||||||
|
|
||||||
/// Invalidate the dependence information and recompute it when needed
|
/// Invalidate the dependence information and recompute it when needed
|
||||||
/// again.
|
/// again.
|
||||||
/// May be required when the underlaying Scop was changed in a way that
|
/// May be required when the underlying Scop was changed in a way that
|
||||||
/// would add new dependencies (e.g. between new statement instances
|
/// would add new dependencies (e.g. between new statement instances
|
||||||
/// insierted into the SCoP) or intentionally breaks existing ones. It is
|
/// insierted into the SCoP) or intentionally breaks existing ones. It is
|
||||||
/// not required when updating the schedule that conforms the existing
|
/// not required when updating the schedule that conforms the existing
|
||||||
@ -251,7 +251,7 @@ public:
|
|||||||
const Dependences &recomputeDependences(Dependences::AnalysisLevel Level);
|
const Dependences &recomputeDependences(Dependences::AnalysisLevel Level);
|
||||||
|
|
||||||
/// Invalidate the dependence information and recompute it when needed again.
|
/// Invalidate the dependence information and recompute it when needed again.
|
||||||
/// May be required when the underlaying Scop was changed in a way that would
|
/// May be required when the underlying Scop was changed in a way that would
|
||||||
/// add new dependencies (e.g. between new statement instances insierted into
|
/// add new dependencies (e.g. between new statement instances insierted into
|
||||||
/// the SCoP) or intentionally breaks existing ones. It is not required when
|
/// the SCoP) or intentionally breaks existing ones. It is not required when
|
||||||
/// updating the schedule that conforms the existing dependencies.
|
/// updating the schedule that conforms the existing dependencies.
|
||||||
|
@ -1494,7 +1494,7 @@ public:
|
|||||||
/// @param Access The access to add.
|
/// @param Access The access to add.
|
||||||
/// @param Prepend If true, will add @p Access before all other instructions
|
/// @param Prepend If true, will add @p Access before all other instructions
|
||||||
/// (instead of appending it).
|
/// (instead of appending it).
|
||||||
void addAccess(MemoryAccess *Access, bool Preprend = false);
|
void addAccess(MemoryAccess *Access, bool Prepend = false);
|
||||||
|
|
||||||
/// Remove a MemoryAccess from this statement.
|
/// Remove a MemoryAccess from this statement.
|
||||||
///
|
///
|
||||||
|
@ -50,7 +50,7 @@ public:
|
|||||||
/// Check an <nsw> AddRec for the loop @p L is cached.
|
/// Check an <nsw> AddRec for the loop @p L is cached.
|
||||||
bool hasNSWAddRecForLoop(llvm::Loop *L) const;
|
bool hasNSWAddRecForLoop(llvm::Loop *L) const;
|
||||||
|
|
||||||
/// Return the LoopInfo used by thi object.
|
/// Return the LoopInfo used by the object.
|
||||||
llvm::LoopInfo *getLI() const { return &LI; }
|
llvm::LoopInfo *getLI() const { return &LI; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -83,7 +83,7 @@ using RecordedAssumptionsTy = llvm::SmallVector<Assumption, 8>;
|
|||||||
///
|
///
|
||||||
/// This function will add the assumption to the RecordedAssumptions. This
|
/// This function will add the assumption to the RecordedAssumptions. This
|
||||||
/// collection will be added (@see addAssumption) to the assumed context once
|
/// collection will be added (@see addAssumption) to the assumed context once
|
||||||
/// all paramaters are known and the context is fully built.
|
/// all parameters are known and the context is fully built.
|
||||||
///
|
///
|
||||||
/// @param RecordedAssumption container which keeps all recorded assumptions.
|
/// @param RecordedAssumption container which keeps all recorded assumptions.
|
||||||
/// @param Kind The assumption kind describing the underlying cause.
|
/// @param Kind The assumption kind describing the underlying cause.
|
||||||
@ -132,7 +132,7 @@ using BoxedLoopsSetTy = llvm::SetVector<const llvm::Loop *>;
|
|||||||
/// isNull(), isInstruction(), isLoad(), isStore(), ..., isMemTransferInst(),
|
/// isNull(), isInstruction(), isLoad(), isStore(), ..., isMemTransferInst(),
|
||||||
/// operator bool(), operator!()
|
/// operator bool(), operator!()
|
||||||
///
|
///
|
||||||
/// The functions isa, cast, cast_or_null, dyn_cast are modeled te resemble
|
/// The functions isa, cast, cast_or_null, dyn_cast are modeled to resemble
|
||||||
/// those from llvm/Support/Casting.h. Partial template function specialization
|
/// those from llvm/Support/Casting.h. Partial template function specialization
|
||||||
/// is currently not supported in C++ such that those cannot be used directly.
|
/// is currently not supported in C++ such that those cannot be used directly.
|
||||||
/// (llvm::isa could, but then llvm:cast etc. would not have the expected
|
/// (llvm::isa could, but then llvm:cast etc. would not have the expected
|
||||||
|
@ -2522,7 +2522,7 @@ combineReductionType(MemoryAccess::ReductionType RT0,
|
|||||||
return MemoryAccess::RT_NONE;
|
return MemoryAccess::RT_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// True if @p AllAccs intersects with @p MemAccs execpt @p LoadMA and @p
|
/// True if @p AllAccs intersects with @p MemAccs except @p LoadMA and @p
|
||||||
/// StoreMA
|
/// StoreMA
|
||||||
bool hasIntersectingAccesses(isl::set AllAccs, MemoryAccess *LoadMA,
|
bool hasIntersectingAccesses(isl::set AllAccs, MemoryAccess *LoadMA,
|
||||||
MemoryAccess *StoreMA, isl::set Domain,
|
MemoryAccess *StoreMA, isl::set Domain,
|
||||||
|
@ -71,7 +71,7 @@ static Statistic RejectStatistics[] = {
|
|||||||
SCOP_STAT(LoopOnlySomeLatches, "Not all loop latches in scop"),
|
SCOP_STAT(LoopOnlySomeLatches, "Not all loop latches in scop"),
|
||||||
SCOP_STAT(FuncCall, "Function call with side effects"),
|
SCOP_STAT(FuncCall, "Function call with side effects"),
|
||||||
SCOP_STAT(NonSimpleMemoryAccess,
|
SCOP_STAT(NonSimpleMemoryAccess,
|
||||||
"Compilated access semantics (volatile or atomic)"),
|
"Complicated access semantics (volatile or atomic)"),
|
||||||
SCOP_STAT(Alias, "Base address aliasing"),
|
SCOP_STAT(Alias, "Base address aliasing"),
|
||||||
SCOP_STAT(Other, ""),
|
SCOP_STAT(Other, ""),
|
||||||
SCOP_STAT(IntToPtr, "Integer to pointer conversions"),
|
SCOP_STAT(IntToPtr, "Integer to pointer conversions"),
|
||||||
|
@ -1159,7 +1159,7 @@ bool IslNodeBuilder::preloadInvariantEquivClass(
|
|||||||
// For an equivalence class of invariant loads we pre-load the representing
|
// For an equivalence class of invariant loads we pre-load the representing
|
||||||
// element with the unified execution context. However, we have to map all
|
// element with the unified execution context. However, we have to map all
|
||||||
// elements of the class to the one preloaded load as they are referenced
|
// elements of the class to the one preloaded load as they are referenced
|
||||||
// during the code generation and therefor need to be mapped.
|
// during the code generation and therefore need to be mapped.
|
||||||
const MemoryAccessList &MAs = IAClass.InvariantAccesses;
|
const MemoryAccessList &MAs = IAClass.InvariantAccesses;
|
||||||
if (MAs.empty())
|
if (MAs.empty())
|
||||||
return true;
|
return true;
|
||||||
|
@ -46,7 +46,7 @@ static BasicBlock *splitEdge(BasicBlock *Prev, BasicBlock *Succ,
|
|||||||
// llvm::SplitCriticalEdge is more efficient than
|
// llvm::SplitCriticalEdge is more efficient than
|
||||||
// llvm::SplitBlockPredecessors, which is more general. In the future we might
|
// llvm::SplitBlockPredecessors, which is more general. In the future we might
|
||||||
// either modify llvm::SplitCriticalEdge to allow skipping the critical edge
|
// either modify llvm::SplitCriticalEdge to allow skipping the critical edge
|
||||||
// check; or Copy&Pase it here.
|
// check; or Copy&Paste it here.
|
||||||
BasicBlock *MiddleBlock = SplitBlockPredecessors(
|
BasicBlock *MiddleBlock = SplitBlockPredecessors(
|
||||||
Succ, ArrayRef<BasicBlock *>(Prev), Suffix, DT, LI);
|
Succ, ArrayRef<BasicBlock *>(Prev), Suffix, DT, LI);
|
||||||
|
|
||||||
|
@ -502,7 +502,7 @@ PWACtx SCEVAffinator::visitUDivExpr(const SCEVUDivExpr *Expr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: One can represent the dividend as piece-wise function to be more
|
// TODO: One can represent the dividend as piece-wise function to be more
|
||||||
// precise but therefor a heuristic is needed.
|
// precise but therefore a heuristic is needed.
|
||||||
|
|
||||||
// Assume a non-negative dividend.
|
// Assume a non-negative dividend.
|
||||||
takeNonNegativeAssumption(DividendPWAC, RecordedAssumptions);
|
takeNonNegativeAssumption(DividendPWAC, RecordedAssumptions);
|
||||||
|
@ -456,7 +456,7 @@ private:
|
|||||||
|
|
||||||
// FIXME: This emits a SCEV for GenSE (since GenLRepl will refer to the
|
// FIXME: This emits a SCEV for GenSE (since GenLRepl will refer to the
|
||||||
// induction variable of a generated loop), so we should not use SCEVVisitor
|
// induction variable of a generated loop), so we should not use SCEVVisitor
|
||||||
// with it. Howver, it still contains references to the SCoP region.
|
// with it. However, it still contains references to the SCoP region.
|
||||||
return visit(Evaluated);
|
return visit(Evaluated);
|
||||||
}
|
}
|
||||||
///}
|
///}
|
||||||
|
@ -1290,7 +1290,7 @@ public:
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for more than one element acces per statement instance.
|
// Check for more than one element access per statement instance.
|
||||||
// Currently we expect write accesses to be functional, eg. disallow
|
// Currently we expect write accesses to be functional, eg. disallow
|
||||||
//
|
//
|
||||||
// { Stmt[0] -> [i] : 0 <= i < 2 }
|
// { Stmt[0] -> [i] : 0 <= i < 2 }
|
||||||
|
@ -149,7 +149,7 @@ private:
|
|||||||
// transformed in innermost-first order.
|
// transformed in innermost-first order.
|
||||||
isl::schedule Result;
|
isl::schedule Result;
|
||||||
|
|
||||||
/// Check wether a schedule after a transformation is legal. Return the old
|
/// Check whether a schedule after a transformation is legal. Return the old
|
||||||
/// schedule without the transformation.
|
/// schedule without the transformation.
|
||||||
isl::schedule
|
isl::schedule
|
||||||
checkDependencyViolation(llvm::MDNode *LoopMD, llvm::Value *CodeRegion,
|
checkDependencyViolation(llvm::MDNode *LoopMD, llvm::Value *CodeRegion,
|
||||||
|
@ -1759,7 +1759,7 @@ static bool isTCPattern(isl::schedule_node Node, const Dependences *D,
|
|||||||
//
|
//
|
||||||
// For example, this covers the matrix multiplication pattern after a full
|
// For example, this covers the matrix multiplication pattern after a full
|
||||||
// run of -polly-optree and -polly-delicm, where the write access is not
|
// run of -polly-optree and -polly-delicm, where the write access is not
|
||||||
// through the original memory access, but trough a PHI node that was
|
// through the original memory access, but through a PHI node that was
|
||||||
// delicmed. Subsequently, such band nodes will be replaced by a single band
|
// delicmed. Subsequently, such band nodes will be replaced by a single band
|
||||||
// node.
|
// node.
|
||||||
//
|
//
|
||||||
|
@ -771,7 +771,7 @@ static void runIslScheduleOptimizer(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply ISL's algorithm only if not overriden by the user. Note that
|
// Apply ISL's algorithm only if not overridden by the user. Note that
|
||||||
// post-rescheduling optimizations (tiling, pattern-based, prevectorization)
|
// post-rescheduling optimizations (tiling, pattern-based, prevectorization)
|
||||||
// rely on the coincidence/permutable annotations on schedule tree bands that
|
// rely on the coincidence/permutable annotations on schedule tree bands that
|
||||||
// are added by the rescheduling analyzer. Therefore, disabling the
|
// are added by the rescheduling analyzer. Therefore, disabling the
|
||||||
|
@ -572,13 +572,13 @@ public:
|
|||||||
isl::schedule_node_band Band = RootBand;
|
isl::schedule_node_band Band = RootBand;
|
||||||
isl::ctx Ctx = Band.ctx();
|
isl::ctx Ctx = Band.ctx();
|
||||||
|
|
||||||
// Do not merge permutable band to avoid loosing the permutability property.
|
// Do not merge permutable band to avoid losing the permutability property.
|
||||||
// Cannot collapse even two permutable loops, they might be permutable
|
// Cannot collapse even two permutable loops, they might be permutable
|
||||||
// individually, but not necassarily across.
|
// individually, but not necassarily across.
|
||||||
if (unsignedFromIslSize(Band.n_member()) > 1u && Band.permutable())
|
if (unsignedFromIslSize(Band.n_member()) > 1u && Band.permutable())
|
||||||
return getBase().visitBand(Band);
|
return getBase().visitBand(Band);
|
||||||
|
|
||||||
// Find collapsable bands.
|
// Find collapsible bands.
|
||||||
SmallVector<isl::schedule_node_band> Nest;
|
SmallVector<isl::schedule_node_band> Nest;
|
||||||
int NumTotalLoops = 0;
|
int NumTotalLoops = 0;
|
||||||
isl::schedule_node Body;
|
isl::schedule_node Body;
|
||||||
@ -884,10 +884,10 @@ public:
|
|||||||
collectPotentiallyFusableBands(Child, Bands, Child);
|
collectPotentiallyFusableBands(Child, Bands, Child);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Direct children that had at least one of its decendants fused.
|
// Direct children that had at least one of its descendants fused.
|
||||||
SmallDenseSet<isl_schedule_node *, 4> ChangedDirectChildren;
|
SmallDenseSet<isl_schedule_node *, 4> ChangedDirectChildren;
|
||||||
|
|
||||||
// Fuse neigboring bands until reaching the end of candidates.
|
// Fuse neighboring bands until reaching the end of candidates.
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (i + 1 < (int)Bands.size()) {
|
while (i + 1 < (int)Bands.size()) {
|
||||||
isl::schedule Fused =
|
isl::schedule Fused =
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
; This test checks that we do not accidently mutate the debug info when
|
; This test checks that we do not accidentally mutate the debug info when
|
||||||
; inserting loop parallel metadata.
|
; inserting loop parallel metadata.
|
||||||
; RUN: opt %loadNPMPolly < %s -S -polly -passes=polly-codegen -polly-ast-detect-parallel | FileCheck %s
|
; RUN: opt %loadNPMPolly < %s -S -polly -passes=polly-codegen -polly-ast-detect-parallel | FileCheck %s
|
||||||
; CHECK-NOT: !7 = !{!7}
|
; CHECK-NOT: !7 = !{!7}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
; RegionPassManager. -polly-codegen must not reuse the -polly-ast analysis the
|
; RegionPassManager. -polly-codegen must not reuse the -polly-ast analysis the
|
||||||
; was created for the first -polly-scops pass.
|
; was created for the first -polly-scops pass.
|
||||||
; The current solution is that only the first -polly-codegen is allowed to
|
; The current solution is that only the first -polly-codegen is allowed to
|
||||||
; generate code, the second detects it is re-using an IslAst that belongs to a
|
; generate code, the second detects it is reusing an IslAst that belongs to a
|
||||||
; different ScopInfo.
|
; different ScopInfo.
|
||||||
;
|
;
|
||||||
; int a, b, c;
|
; int a, b, c;
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
; We explicitly check here that the second scop is not code generated. Later
|
; We explicitly check here that the second scop is not code generated. Later
|
||||||
; improvements may make this possible (e.g., Polly gaining support for
|
; improvements may make this possible (e.g., Polly gaining support for
|
||||||
; parameteric conditional expressions or a changed code generation order).
|
; parametric conditional expressions or a changed code generation order).
|
||||||
; However, in case this happens, we want to ensure this test case is been
|
; However, in case this happens, we want to ensure this test case is been
|
||||||
; reasoned about and updated accordingly.
|
; reasoned about and updated accordingly.
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ if.end: ; preds = %if.then, %for.end
|
|||||||
declare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i32, i1) nounwind
|
declare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i32, i1) nounwind
|
||||||
|
|
||||||
; This is a negative test. We can prove that RED[0] in the conditional after
|
; This is a negative test. We can prove that RED[0] in the conditional after
|
||||||
; the loop is dereferencable and consequently expand the SCoP from the
|
; the loop is dereferenceable and consequently expand the SCoP from the
|
||||||
; loop to include the conditional. However, during SCoP generation we realize
|
; loop to include the conditional. However, during SCoP generation we realize
|
||||||
; that, while RED[0] is invariant, it is written to as part of the same scop
|
; that, while RED[0] is invariant, it is written to as part of the same scop
|
||||||
; and can consequently not be hoisted. Hence, we invalidate the scop.
|
; and can consequently not be hoisted. Hence, we invalidate the scop.
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
; RUN: -passes=polly-codegen -S < %s | FileCheck %s
|
; RUN: -passes=polly-codegen -S < %s | FileCheck %s
|
||||||
|
|
||||||
; This test ensures that the expression N + 1 that is stored in the phi-node
|
; This test ensures that the expression N + 1 that is stored in the phi-node
|
||||||
; alloca, is directly computed and not incorrectly transfered through memory.
|
; alloca, is directly computed and not incorrectly transferred through memory.
|
||||||
|
|
||||||
; CHECK: store i64 [[REG:%.*]], ptr %res.phiops
|
; CHECK: store i64 [[REG:%.*]], ptr %res.phiops
|
||||||
; CHECK: [[REG]] = add i64 %N, 1
|
; CHECK: [[REG]] = add i64 %N, 1
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
;
|
;
|
||||||
; Check that we do not crash as described here: http://llvm.org/PR21167
|
; Check that we do not crash as described here: http://llvm.org/PR21167
|
||||||
;
|
;
|
||||||
; In case the pieceweise affine function used to create an isl_ast_expr
|
; In case the piecewise affine function used to create an isl_ast_expr
|
||||||
; had empty cases (e.g., with contradicting constraints on the
|
; had empty cases (e.g., with contradicting constraints on the
|
||||||
; parameters), it was possible that the condition of the isl_ast_expr
|
; parameters), it was possible that the condition of the isl_ast_expr
|
||||||
; select was not a comparison but a constant (thus of type i64).
|
; select was not a comparison but a constant (thus of type i64).
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
; RUN: opt %loadNPMPolly '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s
|
; RUN: opt %loadNPMPolly '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s
|
||||||
|
|
||||||
; When %b is 0, %for.body13 is an infite loop. In this case the loaded
|
; When %b is 0, %for.body13 is an infinite loop. In this case the loaded
|
||||||
; value %1 is not used anywhere.
|
; value %1 is not used anywhere.
|
||||||
; This is a problem when DeLICM tries to map %1 to %arrayidx16 because
|
; This is a problem when DeLICM tries to map %1 to %arrayidx16 because
|
||||||
; %1 has no corresponding when %b == 0 and therefore hat no location
|
; %1 has no corresponding when %b == 0 and therefore hat no location
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
;
|
;
|
||||||
; This test case has an InvalidContext such that part of the predecessors
|
; This test case has an InvalidContext such that part of the predecessors
|
||||||
; of for.body.us.i lie within the invalid context. This causes a
|
; of for.body.us.i lie within the invalid context. This causes a
|
||||||
; consistency check withing the invalid context of PR41656 to fail.
|
; consistency check within the invalid context of PR41656 to fail.
|
||||||
;
|
;
|
||||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
;
|
;
|
||||||
; PHI predecessors of statement instances can only be reliably derived in defined behaviour situations. In this case, the inner loop's counter would overflow when its upper bound (%call24) is lower than its lower bound (2). However, due to the nsw flag, this would be undefined behavior and therefore not added to any runtime-check context, but to the defined-behaviour context.
|
; PHI predecessors of statement instances can only be reliably derived in defined behaviour situations. In this case, the inner loop's counter would overflow when its upper bound (%call24) is lower than its lower bound (2). However, due to the nsw flag, this would be undefined behavior and therefore not added to any runtime-check context, but to the defined-behaviour context.
|
||||||
;
|
;
|
||||||
; Dereived from test case pr41656.ll
|
; Derived from test case pr41656.ll
|
||||||
;
|
;
|
||||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ return:
|
|||||||
; CHECK: maximal number of operations exceeded during zone analysis
|
; CHECK: maximal number of operations exceeded during zone analysis
|
||||||
|
|
||||||
; Check that even if the quota was exceeded in DeLICM, DependenceInfo is still
|
; Check that even if the quota was exceeded in DeLICM, DependenceInfo is still
|
||||||
; successfull since it uses a different operations counter.
|
; successful since it uses a different operations counter.
|
||||||
;
|
;
|
||||||
; DEP: RAW dependences:
|
; DEP: RAW dependences:
|
||||||
; DEP-NOT: n/a
|
; DEP-NOT: n/a
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s
|
; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s
|
||||||
;
|
;
|
||||||
; Verify that the outer dimension doesnt't carry reduction dependences
|
; Verify that the outer dimension doesn't carry reduction dependences
|
||||||
;
|
;
|
||||||
; CHECK-NOT:#pragma known-parallel reduction
|
; CHECK-NOT:#pragma known-parallel reduction
|
||||||
; CHECK: #pragma known-parallel
|
; CHECK: #pragma known-parallel
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s
|
; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s
|
||||||
;
|
;
|
||||||
; Verify that the outer dimension doesnt't carry reduction dependences
|
; Verify that the outer dimension doesn't carry reduction dependences
|
||||||
;
|
;
|
||||||
; CHECK-NOT:#pragma known-parallel reduction
|
; CHECK-NOT:#pragma known-parallel reduction
|
||||||
; CHECK: #pragma known-parallel
|
; CHECK: #pragma known-parallel
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s
|
; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s
|
||||||
;
|
;
|
||||||
; Verify that the outer dimension doesnt't carry reduction dependences
|
; Verify that the outer dimension doesn't carry reduction dependences
|
||||||
;
|
;
|
||||||
; CHECK-NOT:#pragma known-parallel reduction
|
; CHECK-NOT:#pragma known-parallel reduction
|
||||||
; CHECK: #pragma known-parallel
|
; CHECK: #pragma known-parallel
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
; Check that the pattern matching detects the matrix multiplication pattern
|
; Check that the pattern matching detects the matrix multiplication pattern
|
||||||
; after a full run of -polly-optree and -polly-delicm, where the write access
|
; after a full run of -polly-optree and -polly-delicm, where the write access
|
||||||
; is not through the original memory access, but trough a PHI node that was
|
; is not through the original memory access, but through a PHI node that was
|
||||||
; delicmed. This test covers the polybench 2mm and 3mm cases.
|
; delicmed. This test covers the polybench 2mm and 3mm cases.
|
||||||
;
|
;
|
||||||
; This test case generates the following schedule, which contains filters:
|
; This test case generates the following schedule, which contains filters:
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
;
|
;
|
||||||
; Check that the pattern matching detects the tensor contraction pattern
|
; Check that the pattern matching detects the tensor contraction pattern
|
||||||
; after a full run of -polly-delicm. This test case generates the following
|
; after a full run of -polly-delicm. This test case generates the following
|
||||||
; schedule, which contans two band nodes. Without DeLICM two statement are
|
; schedule, which contains two band nodes. Without DeLICM two statement are
|
||||||
; generated.
|
; generated.
|
||||||
;
|
;
|
||||||
; domain: "{ Stmt5[i0, i1, i2, i3, i4, i5] : 0 <= i0 <= 31 and 0 <= i1 <= 31 and
|
; domain: "{ Stmt5[i0, i1, i2, i3, i4, i5] : 0 <= i0 <= 31 and 0 <= i1 <= 31 and
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' < %s
|
; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' < %s
|
||||||
|
|
||||||
; This test case helps to determine wether SCEVRemoveMax::remove produces
|
; This test case helps to determine whether SCEVRemoveMax::remove produces
|
||||||
; an infinite loop and a segmentation fault, if it processes, for example,
|
; an infinite loop and a segmentation fault, if it processes, for example,
|
||||||
; '((-1 + (-1 * %b1)) umax {(-1 + (-1 * %yStart)),+,-1}<%.preheader>)'.
|
; '((-1 + (-1 * %b1)) umax {(-1 + (-1 * %yStart)),+,-1}<%.preheader>)'.
|
||||||
;
|
;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
; XFAIL: *
|
; XFAIL: *
|
||||||
|
|
||||||
; The test case stopped making sense after r310940 that added infinite loops to
|
; The test case stopped making sense after r310940 that added infinite loops to
|
||||||
; the PostDominatorTree. Infinite loops are postdominated ony by the virtual
|
; the PostDominatorTree. Infinite loops are postdominated only by the virtual
|
||||||
; root, which causes them not to appear in regions in ScopDetection anymore.
|
; root, which causes them not to appear in regions in ScopDetection anymore.
|
||||||
|
|
||||||
; RUN: opt %loadNPMPolly -pass-remarks-missed="polly-detect" -polly-allow-nonaffine-loops '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s
|
; RUN: opt %loadNPMPolly -pass-remarks-missed="polly-detect" -polly-allow-nonaffine-loops '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
; RUN: opt %loadNPMPolly -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s
|
; RUN: opt %loadNPMPolly -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s
|
||||||
; RUN: opt %loadNPMPolly -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops -polly-unprofitable-scalar-accs=true -polly-process-unprofitable=false '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=PROFIT
|
; RUN: opt %loadNPMPolly -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops -polly-unprofitable-scalar-accs=true -polly-process-unprofitable=false '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=PROFIT
|
||||||
;
|
;
|
||||||
; Verify that we over approximate the read acces of A[j] in the last statement as j is
|
; Verify that we over approximate the read access of A[j] in the last statement as j is
|
||||||
; computed in a non-affine loop we do not model.
|
; computed in a non-affine loop we do not model.
|
||||||
;
|
;
|
||||||
; CHECK: Function: f
|
; CHECK: Function: f
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
; CODE-RTC-NEXT: br i1 %{{[a-zA-Z0-9\.]*}}, label %polly.preload.exec, label %polly.preload.merge
|
; CODE-RTC-NEXT: br i1 %{{[a-zA-Z0-9\.]*}}, label %polly.preload.exec, label %polly.preload.merge
|
||||||
|
|
||||||
; Check that we don't generate a runtime check because we treat all
|
; Check that we don't generate a runtime check because we treat all
|
||||||
; parameters as dereferencable.
|
; parameters as dereferenceable.
|
||||||
; CODE-NOT: polly.preload.cond: ; preds = %polly.preload.begin
|
; CODE-NOT: polly.preload.cond: ; preds = %polly.preload.begin
|
||||||
; CODE-NOT: br i1 %{{r1:[a-zA-Z0-9]*}}, label %polly.preload.exec, label %polly.preload.merge
|
; CODE-NOT: br i1 %{{r1:[a-zA-Z0-9]*}}, label %polly.preload.exec, label %polly.preload.merge
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s
|
; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s
|
||||||
;
|
;
|
||||||
; Verify that we only have one parameter and one invariant load for all
|
; Verify that we only have one parameter and one invariant load for all
|
||||||
; three loads that occure in the region but actually access the same
|
; three loads that occur in the region but actually access the same
|
||||||
; location. Also check that the execution context is the most generic
|
; location. Also check that the execution context is the most generic
|
||||||
; one, e.g., here the universal set.
|
; one, e.g., here the universal set.
|
||||||
;
|
;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s
|
; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s
|
||||||
;
|
;
|
||||||
; Verify that we only have one parameter and one invariant load for all
|
; Verify that we only have one parameter and one invariant load for all
|
||||||
; three loads that occure in the region but actually access the same
|
; three loads that occur in the region but actually access the same
|
||||||
; location. Also check that the execution context is the most generic
|
; location. Also check that the execution context is the most generic
|
||||||
; one, e.g., here the universal set.
|
; one, e.g., here the universal set.
|
||||||
;
|
;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s
|
; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s
|
||||||
;
|
;
|
||||||
; Verfy that we do not use the GetElementPtr information to delinearize A
|
; Verify that we do not use the GetElementPtr information to delinearize A
|
||||||
; because of the cast in-between. Use the single-dimensional modeling instead.
|
; because of the cast in-between. Use the single-dimensional modeling instead.
|
||||||
;
|
;
|
||||||
; void f(short A[][2]) {
|
; void f(short A[][2]) {
|
||||||
|
@ -28,7 +28,7 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|||||||
; This test case verifies that the construction of the assumed context finishes
|
; This test case verifies that the construction of the assumed context finishes
|
||||||
; successfully. Depending on how constrained are accumulated in the assumed
|
; successfully. Depending on how constrained are accumulated in the assumed
|
||||||
; context, this test case can take even for a smaller number of arrays over a
|
; context, this test case can take even for a smaller number of arrays over a
|
||||||
; minute to complete. With the unrolling choosen in this test, an inefficient
|
; minute to complete. With the unrolling chosen in this test, an inefficient
|
||||||
; formulation of the assumption tracking cause LLVM to crash due to excessive
|
; formulation of the assumption tracking cause LLVM to crash due to excessive
|
||||||
; memory usage due to an overly large number of disjuncts being formed.
|
; memory usage due to an overly large number of disjuncts being formed.
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ return: ; preds = %for.cond
|
|||||||
; It is not possible to have a scop which accesses a scalar element that is
|
; It is not possible to have a scop which accesses a scalar element that is
|
||||||
; a global variable. All global variables are pointers containing possibly
|
; a global variable. All global variables are pointers containing possibly
|
||||||
; a single element. Hence they do not need to be handled anyways.
|
; a single element. Hence they do not need to be handled anyways.
|
||||||
; Please note that this is still required when scalar to array rewritting is
|
; Please note that this is still required when scalar to array rewriting is
|
||||||
; disabled.
|
; disabled.
|
||||||
|
|
||||||
; CHECK-LABEL: Function: use_after_scop
|
; CHECK-LABEL: Function: use_after_scop
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
; }
|
; }
|
||||||
; }
|
; }
|
||||||
;
|
;
|
||||||
; FIXME: The truncated value should be a paramter.
|
; FIXME: The truncated value should be a parameter.
|
||||||
; CHECK: Assumed Context:
|
; CHECK: Assumed Context:
|
||||||
; CHECK-NEXT: [N, tmp, M] -> { : }
|
; CHECK-NEXT: [N, tmp, M] -> { : }
|
||||||
; CHECK-NEXT: Invalid Context:
|
; CHECK-NEXT: Invalid Context:
|
||||||
|
@ -12,7 +12,7 @@ opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars \
|
|||||||
-instnamer ${LLFILE} -S -o ${LLFILE_TMP}
|
-instnamer ${LLFILE} -S -o ${LLFILE_TMP}
|
||||||
|
|
||||||
# Insert a header into the new testcase containing a sample RUN line a FIXME and
|
# Insert a header into the new testcase containing a sample RUN line a FIXME and
|
||||||
# an XFAIL. Then insert the formated C code and finally the LLVM-IR without
|
# an XFAIL. Then insert the formatted C code and finally the LLVM-IR without
|
||||||
# attributes, the module ID or the target triple.
|
# attributes, the module ID or the target triple.
|
||||||
echo '; RUN: opt %loadPolly -S < %s | FileCheck %s' > ${LLFILE}
|
echo '; RUN: opt %loadPolly -S < %s | FileCheck %s' > ${LLFILE}
|
||||||
echo ';' >> ${LLFILE}
|
echo ';' >> ${LLFILE}
|
||||||
|
@ -72,7 +72,7 @@ class IslObject:
|
|||||||
if hasattr(self.__class__, "initialized"):
|
if hasattr(self.__class__, "initialized"):
|
||||||
return
|
return
|
||||||
|
|
||||||
self.__class__.initalized = True
|
self.__class__.initialized = True
|
||||||
self.get_isl_method("read_from_str").argtypes = [Context, c_char_p, c_int]
|
self.get_isl_method("read_from_str").argtypes = [Context, c_char_p, c_int]
|
||||||
self.get_isl_method("copy").argtypes = [self.__class__]
|
self.get_isl_method("copy").argtypes = [self.__class__]
|
||||||
self.get_isl_method("copy").restype = c_int
|
self.get_isl_method("copy").restype = c_int
|
||||||
@ -204,7 +204,7 @@ class Dim(IslObject):
|
|||||||
if hasattr(self.__class__, "initialized"):
|
if hasattr(self.__class__, "initialized"):
|
||||||
return
|
return
|
||||||
|
|
||||||
self.__class__.initalized = True
|
self.__class__.initialized = True
|
||||||
self.get_isl_method("copy").argtypes = [self.__class__]
|
self.get_isl_method("copy").argtypes = [self.__class__]
|
||||||
self.get_isl_method("copy").restype = c_int
|
self.get_isl_method("copy").restype = c_int
|
||||||
self.get_isl_method("free").argtypes = [self.__class__]
|
self.get_isl_method("free").argtypes = [self.__class__]
|
||||||
|
@ -40,7 +40,7 @@ interface.</li>
|
|||||||
<li>Run-time alias checks</li>
|
<li>Run-time alias checks</li>
|
||||||
<li>Computation of no-alias information for later LLVM optimizations
|
<li>Computation of no-alias information for later LLVM optimizations
|
||||||
(vectorizer, LICM, ...)</li>
|
(vectorizer, LICM, ...)</li>
|
||||||
<li>Support for multi-dimensional arrays of parameteric size (still tested)</li>
|
<li>Support for multi-dimensional arrays of parametric size (still tested)</li>
|
||||||
<li>New assumption tracking framework</li>
|
<li>New assumption tracking framework</li>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Accesses to multi-dimensional arrays of fixed size are within bounds</li>
|
<li>Accesses to multi-dimensional arrays of fixed size are within bounds</li>
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
<div id="content">
|
<div id="content">
|
||||||
|
|
||||||
<h1>Building and Installing Polly</h1>
|
<h1>Building and Installing Polly</h1>
|
||||||
You can build Polly with <a href="https://cmake.org/">cmake</a> and your preferred geneator (e.g. Ninja, make, Visual Studio, etc.).
|
You can build Polly with <a href="https://cmake.org/">cmake</a> and your preferred generator (e.g. Ninja, make, Visual Studio, etc.).
|
||||||
|
|
||||||
<h3 id="source">Get the code</h3>
|
<h3 id="source">Get the code</h3>
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@
|
|||||||
while issues like the generation of the correct loop structure and loop
|
while issues like the generation of the correct loop structure and loop
|
||||||
bounds will be taken care of by our AST generator.
|
bounds will be taken care of by our AST generator.
|
||||||
<li><b>Polyhedral unrolling:</b> We discuss techniques that allow the
|
<li><b>Polyhedral unrolling:</b> We discuss techniques that allow the
|
||||||
unrolling of non-trivial loops in the context of parameteric loop bounds,
|
unrolling of non-trivial loops in the context of parametric loop bounds,
|
||||||
complex tile shapes and conditionally executed statements. Such unrolling
|
complex tile shapes and conditionally executed statements. Such unrolling
|
||||||
support enables the generation of predicated code e.g. in the context of
|
support enables the generation of predicated code e.g. in the context of
|
||||||
GPGPU computing.
|
GPGPU computing.
|
||||||
@ -110,7 +110,7 @@
|
|||||||
<a href="https://www.grosser.es#pub-polyhedral-AST-generation">
|
<a href="https://www.grosser.es#pub-polyhedral-AST-generation">
|
||||||
<em>Polyhedral AST generation is more than scanning polyhedra</em></a><br />
|
<em>Polyhedral AST generation is more than scanning polyhedra</em></a><br />
|
||||||
Tobias Grosser, Sven Verdoolaege, Albert Cohen<br />
|
Tobias Grosser, Sven Verdoolaege, Albert Cohen<br />
|
||||||
ACM Transations on Programming Languages and Systems (TOPLAS), 37(4),
|
ACM Transactions on Programming Languages and Systems (TOPLAS), 37(4),
|
||||||
July 2015
|
July 2015
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
@ -356,13 +356,13 @@ research tool.<br \>
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><p>Februar</p></td>
|
<td><p>February</p></td>
|
||||||
<td><p>pollycc - a script to automatically compile with
|
<td><p>pollycc - a script to automatically compile with
|
||||||
polyhedral optimizations </p></td>
|
polyhedral optimizations </p></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td><p> Januar</p></td>
|
<td><p> January</p></td>
|
||||||
<td><p> Basic OpenMP support, Alias analysis integration,
|
<td><p> Basic OpenMP support, Alias analysis integration,
|
||||||
Pluto/POCC support </p></td>
|
Pluto/POCC support </p></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
to bring features of Polly to standard -O3 optimizations.
|
to bring features of Polly to standard -O3 optimizations.
|
||||||
|
|
||||||
<h3>Register tiling to obtain fast BLAS kernels with Polly</h3>
|
<h3>Register tiling to obtain fast BLAS kernels with Polly</h3>
|
||||||
Even though Polly is already able to speep up compute kernels significantly,
|
Even though Polly is already able to speed up compute kernels significantly,
|
||||||
when comparing to the best BLAS routines we still are at least one order of
|
when comparing to the best BLAS routines we still are at least one order of
|
||||||
magnitude off. In this project you will investigate what is needed to close
|
magnitude off. In this project you will investigate what is needed to close
|
||||||
this performance gap. Earlier investigations have shown that register tiling
|
this performance gap. Earlier investigations have shown that register tiling
|
||||||
|
@ -60,7 +60,7 @@ Parallel Processing Letters 2012 22:04<br />
|
|||||||
<ul>
|
<ul>
|
||||||
<li><em>Polyhedral AST generation is more than scanning polyhedra</em><br />
|
<li><em>Polyhedral AST generation is more than scanning polyhedra</em><br />
|
||||||
Tobias Grosser, Sven Verdoolaege, Albert Cohen<br />
|
Tobias Grosser, Sven Verdoolaege, Albert Cohen<br />
|
||||||
ACM Transations on Programming Languages and Systems (TOPLAS), 37(4), July
|
ACM Transactions on Programming Languages and Systems (TOPLAS), 37(4), July
|
||||||
2015<br />
|
2015<br />
|
||||||
<a href="https://www.grosser.es#pub-polyhedral-AST-generation">Paper</a>
|
<a href="https://www.grosser.es#pub-polyhedral-AST-generation">Paper</a>
|
||||||
</li>
|
</li>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user