[polly] c7bcd72 - Revert "[Polly] Implement user-directed loop distribution/fission."
Petr Hosek via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 23 14:04:37 PDT 2021
Author: Petr Hosek
Date: 2021-09-23T14:04:25-07:00
New Revision: c7bcd72a38bcf99e03e4651ed5204d1a1f2bf695
URL: https://github.com/llvm/llvm-project/commit/c7bcd72a38bcf99e03e4651ed5204d1a1f2bf695
DIFF: https://github.com/llvm/llvm-project/commit/c7bcd72a38bcf99e03e4651ed5204d1a1f2bf695.diff
LOG: Revert "[Polly] Implement user-directed loop distribution/fission."
This reverts commit 52c30adc7dfe6334b71adf256d81f70e7b976143 which
breaks the build when NDEBUG is defined.
Added:
Modified:
polly/include/polly/DependenceInfo.h
polly/include/polly/ManualOptimizer.h
polly/include/polly/ScheduleTreeTransform.h
polly/lib/Analysis/DependenceInfo.cpp
polly/lib/Transform/ManualOptimizer.cpp
polly/lib/Transform/ScheduleOptimizer.cpp
polly/lib/Transform/ScheduleTreeTransform.cpp
Removed:
polly/test/ScheduleOptimizer/ManualOptimization/distribute_heuristic.ll
polly/test/ScheduleOptimizer/ManualOptimization/distribute_illegal_looploc.ll
polly/test/ScheduleOptimizer/ManualOptimization/distribute_illegal_pragmaloc.ll
################################################################################
diff --git a/polly/include/polly/DependenceInfo.h b/polly/include/polly/DependenceInfo.h
index 3d70ea2b74e54..a8b11191d619c 100644
--- a/polly/include/polly/DependenceInfo.h
+++ b/polly/include/polly/DependenceInfo.h
@@ -124,10 +124,6 @@ struct Dependences {
/// dependences.
bool isValidSchedule(Scop &S, const StatementToIslMapTy &NewSchedules) const;
- /// Return true of the schedule @p NewSched is a schedule for @S that does not
- /// violate any dependences.
- bool isValidSchedule(Scop &S, isl::schedule NewSched) const;
-
/// Print the stored dependence information.
void print(llvm::raw_ostream &OS) const;
diff --git a/polly/include/polly/ManualOptimizer.h b/polly/include/polly/ManualOptimizer.h
index 988926334eb1a..066eb4d84c511 100644
--- a/polly/include/polly/ManualOptimizer.h
+++ b/polly/include/polly/ManualOptimizer.h
@@ -15,13 +15,8 @@
#include "isl/isl-noexceptions.h"
-namespace llvm {
-class OptimizationRemarkEmitter;
-}
-
namespace polly {
class Scop;
-struct Dependences;
/// Apply loop-transformation metadata.
///
@@ -35,9 +30,7 @@ struct Dependences;
/// @return The transformed schedule with all mark-nodes with loop
/// transformations applied. Returns NULL in case of an error or @p
/// Sched itself if no transformation has been applied.
-isl::schedule applyManualTransformations(Scop *S, isl::schedule Sched,
- const Dependences &D,
- llvm::OptimizationRemarkEmitter *ORE);
+isl::schedule applyManualTransformations(Scop *S, isl::schedule Sched);
} // namespace polly
#endif /* POLLY_MANUALOPTIMIZER_H */
diff --git a/polly/include/polly/ScheduleTreeTransform.h b/polly/include/polly/ScheduleTreeTransform.h
index e8685313c83c4..5fd0d6ad4dd0c 100644
--- a/polly/include/polly/ScheduleTreeTransform.h
+++ b/polly/include/polly/ScheduleTreeTransform.h
@@ -178,9 +178,6 @@ isl::schedule applyFullUnroll(isl::schedule_node BandToUnroll);
/// Replace the AST band @p BandToUnroll by a partially unrolled equivalent.
isl::schedule applyPartialUnroll(isl::schedule_node BandToUnroll, int Factor);
-/// Loop-distribute the band @p BandToFission as much as possible.
-isl::schedule applyMaxFission(isl::schedule_node BandToFission);
-
/// Build the desired set of partial tile prefixes.
///
/// We build a set of partial tile prefixes, which are prefixes of the vector
diff --git a/polly/lib/Analysis/DependenceInfo.cpp b/polly/lib/Analysis/DependenceInfo.cpp
index 0ac7ff1a14c0b..709bce7ea3b60 100644
--- a/polly/lib/Analysis/DependenceInfo.cpp
+++ b/polly/lib/Analysis/DependenceInfo.cpp
@@ -636,19 +636,6 @@ void Dependences::calculateDependences(Scop &S) {
LLVM_DEBUG(dump());
}
-bool Dependences::isValidSchedule(Scop &S, isl::schedule NewSched) const {
- // TODO: Also check permutable/coincident flags as well.
-
- StatementToIslMapTy NewSchedules;
- for (auto NewMap : NewSched.get_map().get_map_list()) {
- auto Stmt = reinterpret_cast<ScopStmt *>(
- NewMap.get_tuple_id(isl::dim::in).get_user());
- NewSchedules[Stmt] = NewMap;
- }
-
- return isValidSchedule(S, NewSchedules);
-}
-
bool Dependences::isValidSchedule(
Scop &S, const StatementToIslMapTy &NewSchedule) const {
if (LegalityCheckDisabled)
diff --git a/polly/lib/Transform/ManualOptimizer.cpp b/polly/lib/Transform/ManualOptimizer.cpp
index 2c05927582e28..2a77f7d49ae22 100644
--- a/polly/lib/Transform/ManualOptimizer.cpp
+++ b/polly/lib/Transform/ManualOptimizer.cpp
@@ -11,14 +11,11 @@
//===----------------------------------------------------------------------===//
#include "polly/ManualOptimizer.h"
-#include "polly/DependenceInfo.h"
-#include "polly/Options.h"
#include "polly/ScheduleTreeTransform.h"
#include "polly/Support/ScopHelper.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Analysis/LoopInfo.h"
-#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/IR/Metadata.h"
#include "llvm/Transforms/Utils/LoopUtils.h"
@@ -28,12 +25,6 @@ using namespace polly;
using namespace llvm;
namespace {
-
-static cl::opt<bool> IgnoreDepcheck(
- "polly-pragma-ignore-depcheck",
- cl::desc("Skip the dependency check for pragma-based transformations"),
- cl::init(false), cl::ZeroOrMore, cl::cat(PollyCategory));
-
/// Same as llvm::hasUnrollTransformation(), but takes a LoopID as argument
/// instead of a Loop.
static TransformationMode hasUnrollTransformation(MDNode *LoopID) {
@@ -57,31 +48,6 @@ static TransformationMode hasUnrollTransformation(MDNode *LoopID) {
return TM_Unspecified;
}
-// Return the first DebugLoc in the list.
-static DebugLoc findFirstDebugLoc(MDNode *MD) {
- if (MD) {
- for (const MDOperand &X : drop_begin(MD->operands(), 1)) {
- Metadata *A = X.get();
- if (!isa<DILocation>(A))
- continue;
- return cast<DILocation>(A);
- }
- }
-
- return {};
-}
-
-static DebugLoc findTransformationDebugLoc(MDNode *LoopMD, StringRef Name) {
- // First find dedicated transformation location
- // (such as the location of #pragma clang loop)
- MDNode *MD = findOptionMDForLoopID(LoopMD, Name);
- if (DebugLoc K = findFirstDebugLoc(MD))
- return K;
-
- // Otherwise, fall back to the location of the loop itself
- return findFirstDebugLoc(LoopMD);
-}
-
/// Apply full or partial unrolling.
static isl::schedule applyLoopUnroll(MDNode *LoopMD,
isl::schedule_node BandToUnroll) {
@@ -112,15 +78,6 @@ static isl::schedule applyLoopUnroll(MDNode *LoopMD,
return {};
}
-static isl::schedule applyLoopFission(MDNode *LoopMD,
- isl::schedule_node BandToFission) {
- // TODO: Make it possible to selectively fission substatements.
- // TODO: Apply followup loop properties.
- // TODO: Instead of fission every statement, find the maximum set that does
- // not cause a dependency violation.
- return applyMaxFission(BandToFission);
-}
-
// Return the properties from a LoopID. Scalar properties are ignored.
static auto getLoopMDProps(MDNode *LoopMD) {
return map_range(
@@ -139,76 +96,14 @@ class SearchTransformVisitor
BaseTy &getBase() { return *this; }
const BaseTy &getBase() const { return *this; }
- polly::Scop *S;
- const Dependences *D;
- OptimizationRemarkEmitter *ORE;
-
// Set after a transformation is applied. Recursive search must be aborted
// once this happens to ensure that any new followup transformation is
// transformed in innermost-first order.
isl::schedule Result;
- /// Check wether a schedule after a transformation is legal. Return the old
- /// schedule without the transformation.
- isl::schedule
- checkDependencyViolation(llvm::MDNode *LoopMD, llvm::Value *CodeRegion,
- const isl::schedule_node &OrigBand,
- StringRef DebugLocAttr, StringRef TransPrefix,
- StringRef RemarkName, StringRef TransformationName) {
- if (D->isValidSchedule(*S, Result))
- return Result;
-
- LLVMContext &Ctx = LoopMD->getContext();
- LLVM_DEBUG(dbgs() << "Dependency violation detected\n");
-
- DebugLoc TransformLoc = findTransformationDebugLoc(LoopMD, DebugLocAttr);
-
- if (IgnoreDepcheck) {
- LLVM_DEBUG(dbgs() << "Still accepting transformation due to "
- "-polly-pragma-ignore-depcheck\n");
- if (ORE) {
- ORE->emit(
- OptimizationRemark(DEBUG_TYPE, RemarkName, TransformLoc, CodeRegion)
- << (Twine("Could not verify dependencies for ") +
- TransformationName +
- "; still applying because of -polly-pragma-ignore-depcheck")
- .str());
- }
- return Result;
- }
-
- LLVM_DEBUG(dbgs() << "Rolling back transformation\n");
-
- if (ORE) {
- ORE->emit(DiagnosticInfoOptimizationFailure(DEBUG_TYPE, RemarkName,
- TransformLoc, CodeRegion)
- << (Twine("not applying ") + TransformationName +
- ": cannot ensure semantic equivalence due to possible "
- "dependency violations")
- .str());
- }
-
- // If illegal, revert and remove the transformation to not risk re-trying
- // indefintely.
- MDNode *NewLoopMD =
- makePostTransformationMetadata(Ctx, LoopMD, {TransPrefix}, {});
- BandAttr *Attr = getBandAttr(OrigBand);
- Attr->Metadata = NewLoopMD;
-
- // Roll back old schedule.
- return OrigBand.get_schedule();
- }
-
public:
- SearchTransformVisitor(polly::Scop *S, const Dependences *D,
- OptimizationRemarkEmitter *ORE)
- : S(S), D(D), ORE(ORE) {}
-
- static isl::schedule applyOneTransformation(polly::Scop *S,
- const Dependences *D,
- OptimizationRemarkEmitter *ORE,
- const isl::schedule &Sched) {
- SearchTransformVisitor Transformer(S, D, ORE);
+ static isl::schedule applyOneTransformation(const isl::schedule &Sched) {
+ SearchTransformVisitor Transformer;
Transformer.visit(Sched);
return Transformer.Result;
}
@@ -230,14 +125,6 @@ class SearchTransformVisitor
return;
}
- // CodeRegion used but ORE to determine code hotness.
- // TODO: Works only for original loop; for transformed loops, should track
- // where the loop's body code comes from.
- Loop *Loop = Attr->OriginalLoop;
- Value *CodeRegion = nullptr;
- if (Loop)
- CodeRegion = Loop->getHeader();
-
MDNode *LoopMD = Attr->Metadata;
if (!LoopMD)
return;
@@ -259,15 +146,6 @@ class SearchTransformVisitor
Result = applyLoopUnroll(LoopMD, Band);
if (!Result.is_null())
return;
- } else if (AttrName == "llvm.loop.distribute.enable") {
- Result = applyLoopFission(LoopMD, Band);
- if (!Result.is_null())
- Result = checkDependencyViolation(
- LoopMD, CodeRegion, Band, "llvm.loop.distribute.loc",
- "llvm.loop.distribute.", "FailedRequestedFission",
- "loop fission/distribution");
- if (!Result.is_null())
- return;
}
// not a loop transformation; look for next property
@@ -284,14 +162,11 @@ class SearchTransformVisitor
} // namespace
-isl::schedule
-polly::applyManualTransformations(Scop *S, isl::schedule Sched,
- const Dependences &D,
- OptimizationRemarkEmitter *ORE) {
+isl::schedule polly::applyManualTransformations(Scop *S, isl::schedule Sched) {
// Search the loop nest for transformations until fixpoint.
while (true) {
isl::schedule Result =
- SearchTransformVisitor::applyOneTransformation(S, &D, ORE, Sched);
+ SearchTransformVisitor::applyOneTransformation(Sched);
if (Result.is_null()) {
// No (more) transformation has been found.
break;
diff --git a/polly/lib/Transform/ScheduleOptimizer.cpp b/polly/lib/Transform/ScheduleOptimizer.cpp
index 4c47b8fce76a9..355a90f65f8a2 100644
--- a/polly/lib/Transform/ScheduleOptimizer.cpp
+++ b/polly/lib/Transform/ScheduleOptimizer.cpp
@@ -55,7 +55,6 @@
#include "polly/Support/ISLOStream.h"
#include "llvm/ADT/Sequence.h"
#include "llvm/ADT/Statistic.h"
-#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/InitializePasses.h"
#include "llvm/Support/CommandLine.h"
#include "isl/options.h"
@@ -669,9 +668,7 @@ static void walkScheduleTreeForStatistics(isl::schedule Schedule, int Version) {
static bool runIslScheduleOptimizer(
Scop &S,
function_ref<const Dependences &(Dependences::AnalysisLevel)> GetDeps,
- TargetTransformInfo *TTI, OptimizationRemarkEmitter *ORE,
- isl::schedule &LastSchedule) {
-
+ TargetTransformInfo *TTI, isl::schedule &LastSchedule) {
// Skip SCoPs in case they're already optimised by PPCGCodeGeneration
if (S.isToBeSkipped())
return false;
@@ -692,8 +689,8 @@ static bool runIslScheduleOptimizer(
bool HasUserTransformation = false;
if (PragmaBasedOpts) {
- isl::schedule ManuallyTransformed = applyManualTransformations(
- &S, Schedule, GetDeps(Dependences::AL_Statement), ORE);
+ isl::schedule ManuallyTransformed =
+ applyManualTransformations(&S, Schedule);
if (ManuallyTransformed.is_null()) {
LLVM_DEBUG(dbgs() << "Error during manual optimization\n");
return false;
@@ -852,9 +849,7 @@ static bool runIslScheduleOptimizer(
walkScheduleTreeForStatistics(Schedule, 2);
}
- // Skip profitability check if user transformation(s) have been applied.
- if (!HasUserTransformation &&
- !ScheduleTreeOptimizer::isProfitableSchedule(S, Schedule))
+ if (!ScheduleTreeOptimizer::isProfitableSchedule(S, Schedule))
return false;
auto ScopStats = S.getStatistics();
@@ -883,11 +878,9 @@ bool IslScheduleOptimizerWrapperPass::runOnScop(Scop &S) {
return getAnalysis<DependenceInfo>().getDependences(
Dependences::AL_Statement);
};
- OptimizationRemarkEmitter &ORE =
- getAnalysis<OptimizationRemarkEmitterWrapperPass>().getORE();
TargetTransformInfo *TTI =
&getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F);
- return runIslScheduleOptimizer(S, getDependences, TTI, &ORE, LastSchedule);
+ return runIslScheduleOptimizer(S, getDependences, TTI, LastSchedule);
}
static void runScheduleOptimizerPrinter(raw_ostream &OS,
@@ -922,10 +915,8 @@ void IslScheduleOptimizerWrapperPass::getAnalysisUsage(
ScopPass::getAnalysisUsage(AU);
AU.addRequired<DependenceInfo>();
AU.addRequired<TargetTransformInfoWrapperPass>();
- AU.addRequired<OptimizationRemarkEmitterWrapperPass>();
AU.addPreserved<DependenceInfo>();
- AU.addPreserved<OptimizationRemarkEmitterWrapperPass>();
}
} // namespace
@@ -939,7 +930,6 @@ INITIALIZE_PASS_BEGIN(IslScheduleOptimizerWrapperPass, "polly-opt-isl",
INITIALIZE_PASS_DEPENDENCY(DependenceInfo);
INITIALIZE_PASS_DEPENDENCY(ScopInfoRegionPass);
INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass);
-INITIALIZE_PASS_DEPENDENCY(OptimizationRemarkEmitterWrapperPass);
INITIALIZE_PASS_END(IslScheduleOptimizerWrapperPass, "polly-opt-isl",
"Polly - Optimize schedule of SCoP", false, false)
@@ -951,10 +941,9 @@ runIslScheduleOptimizerUsingNPM(Scop &S, ScopAnalysisManager &SAM,
auto GetDeps = [&Deps](Dependences::AnalysisLevel) -> const Dependences & {
return Deps.getDependences(Dependences::AL_Statement);
};
- OptimizationRemarkEmitter ORE(&S.getFunction());
TargetTransformInfo *TTI = &SAR.TTI;
isl::schedule LastSchedule;
- bool Modified = runIslScheduleOptimizer(S, GetDeps, TTI, &ORE, LastSchedule);
+ bool Modified = runIslScheduleOptimizer(S, GetDeps, TTI, LastSchedule);
if (OS) {
*OS << "Printing analysis 'Polly - Optimize schedule of SCoP' for region: '"
<< S.getName() << "' in function '" << S.getFunction().getName()
diff --git a/polly/lib/Transform/ScheduleTreeTransform.cpp b/polly/lib/Transform/ScheduleTreeTransform.cpp
index f23d696bff1e8..f8ca449744740 100644
--- a/polly/lib/Transform/ScheduleTreeTransform.cpp
+++ b/polly/lib/Transform/ScheduleTreeTransform.cpp
@@ -397,10 +397,6 @@ static bool isBandWithSingleLoop(const isl::schedule_node &Node) {
}
#endif
-static bool isLeaf(const isl::schedule_node &Node) {
- return isl_schedule_node_get_type(Node.get()) == isl_schedule_node_leaf;
-}
-
/// Create an isl::id representing the output loop after a transformation.
static isl::id createGeneratedLoopAttr(isl::ctx Ctx, MDNode *FollowupLoopMD) {
// Don't need to id the followup.
@@ -732,46 +728,3 @@ isl::schedule_node polly::applyRegisterTiling(isl::schedule_node Node,
return Node.as<isl::schedule_node_band>().set_ast_build_options(
isl::union_set(Ctx, "{unroll[x]}"));
}
-
-/// Find statements and sub-loops in (possibly nested) sequences.
-static void
-collectFussionableStmts(isl::schedule_node Node,
- SmallVectorImpl<isl::schedule_node> &ScheduleStmts) {
- if (isBand(Node) || isLeaf(Node)) {
- ScheduleStmts.push_back(Node);
- return;
- }
-
- if (Node.has_children()) {
- isl::schedule_node C = Node.first_child();
- while (true) {
- collectFussionableStmts(C, ScheduleStmts);
- if (!C.has_next_sibling())
- break;
- C = C.next_sibling();
- }
- }
-}
-
-isl::schedule polly::applyMaxFission(isl::schedule_node BandToFission) {
- isl::ctx Ctx = BandToFission.ctx();
- BandToFission = removeMark(BandToFission);
- isl::schedule_node BandBody = BandToFission.child(0);
-
- SmallVector<isl::schedule_node> FissionableStmts;
- collectFussionableStmts(BandBody, FissionableStmts);
- size_t N = FissionableStmts.size();
-
- // Collect the domain for each of the statements that will get their own loop.
- isl::union_set_list DomList = isl::union_set_list(Ctx, N);
- for (size_t i = 0; i < N; ++i) {
- isl::schedule_node BodyPart = FissionableStmts[i];
- DomList = DomList.add(BodyPart.get_domain());
- }
-
- // Apply the fission by copying the entire loop, but inserting a filter for
- // the statement domains for each fissioned loop.
- isl::schedule_node Fissioned = BandToFission.insert_sequence(DomList);
-
- return Fissioned.get_schedule();
-}
diff --git a/polly/test/ScheduleOptimizer/ManualOptimization/distribute_heuristic.ll b/polly/test/ScheduleOptimizer/ManualOptimization/distribute_heuristic.ll
deleted file mode 100644
index f8c311be07c75..0000000000000
--- a/polly/test/ScheduleOptimizer/ManualOptimization/distribute_heuristic.ll
+++ /dev/null
@@ -1,51 +0,0 @@
-; RUN: opt %loadPolly -polly-opt-isl -polly-reschedule=0 -polly-pragma-based-opts=1 -analyze < %s | FileCheck %s --match-full-lines --check-prefix=ON
-; RUN: opt %loadPolly -polly-opt-isl -polly-reschedule=0 -polly-pragma-based-opts=0 -analyze < %s | FileCheck %s --match-full-lines --check-prefix=OFF
-;
-define void @func(i32 %n, double* noalias nonnull %A, double* noalias nonnull %B) {
-entry:
- br label %for
-
-for:
- %j = phi i32 [0, %entry], [%j.inc, %inc]
- %j.cmp = icmp slt i32 %j, %n
- br i1 %j.cmp, label %body, label %exit
-
- body:
- store double 42.0, double* %A
- %c = fadd double 21.0, 21.0
- store double %c, double* %B
- br label %inc
-
-inc:
- %j.inc = add nuw nsw i32 %j, 1
- br label %for, !llvm.loop !2
-
-exit:
- br label %return
-
-return:
- ret void
-}
-
-
-!2 = distinct !{!2, !5}
-!5 = !{!"llvm.loop.distribute.enable"}
-
-
-; ON: Printing analysis 'Polly - Optimize schedule of SCoP' for region: 'for => return' in function 'func':
-; ON: Calculated schedule:
-; ON-NEXT: domain: "[n] -> { Stmt_body[i0] : 0 <= i0 < n; Stmt_body_b[i0] : 0 <= i0 < n }"
-; ON-NEXT: child:
-; ON-NEXT: sequence:
-; ON-NEXT: - filter: "[n] -> { Stmt_body[i0] : 0 <= i0 < n }"
-; ON-NEXT: child:
-; ON-NEXT: schedule: "[n] -> [{ Stmt_body[i0] -> [(i0)] }]"
-; ON-NEXT: - filter: "[n] -> { Stmt_body_b[i0] : 0 <= i0 < n }"
-; ON-NEXT: child:
-; ON-NEXT: schedule: "[n] -> [{ Stmt_body_b[i0] -> [(i0)] }]"
-
-
-; OFF-LABEL: Printing analysis 'Polly - Optimize schedule of SCoP' for region: 'for => return' in function 'func':
-; OFF-NEXT: Calculated schedule:
-; OFF-NEXT: n/a
-
diff --git a/polly/test/ScheduleOptimizer/ManualOptimization/distribute_illegal_looploc.ll b/polly/test/ScheduleOptimizer/ManualOptimization/distribute_illegal_looploc.ll
deleted file mode 100644
index f464f5a367e06..0000000000000
--- a/polly/test/ScheduleOptimizer/ManualOptimization/distribute_illegal_looploc.ll
+++ /dev/null
@@ -1,109 +0,0 @@
-; RUN: opt %loadPolly -polly-opt-isl -polly-reschedule=0 -polly-pragma-based-opts=1 -disable-output < %s 2>&1 | FileCheck %s --match-full-lines
-;
-; CHECK: warning: distribute_illegal.c:2:3: not applying loop fission/distribution: cannot ensure semantic equivalence due to possible dependency violations
-;
-; void foo(double *A,double *B) {
-; for (int i = 1; i < 128; ++i) {
-; A[i] = i;
-; B[i] = A[i+1];
-; }
-; }
-
-source_filename = "distribute_illegal.c"
-target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-unknown-linux-gnu"
-
-define dso_local void @foo(double* %A, double* %B) #0 !dbg !7 {
-entry:
- call void @llvm.dbg.value(metadata double* %A, metadata !13, metadata !DIExpression()), !dbg !18
- call void @llvm.dbg.value(metadata double* %B, metadata !14, metadata !DIExpression()), !dbg !18
- call void @llvm.dbg.value(metadata i32 1, metadata !15, metadata !DIExpression()), !dbg !19
- br label %for.cond, !dbg !20
-
-for.cond:
- %i.0 = phi i32 [ 1, %entry ], [ %inc, %for.body ], !dbg !19
- call void @llvm.dbg.value(metadata i32 %i.0, metadata !15, metadata !DIExpression()), !dbg !19
- %cmp = icmp slt i32 %i.0, 128, !dbg !21
- br i1 %cmp, label %for.body, label %for.end, !dbg !23
-
-for.body:
- %conv = sitofp i32 %i.0 to double, !dbg !24
- %idxprom = sext i32 %i.0 to i64, !dbg !26
- %arrayidx = getelementptr inbounds double, double* %A, i64 %idxprom, !dbg !26
- store double %conv, double* %arrayidx, align 8, !dbg !27, !tbaa !28
-
- %add = add nsw i32 %i.0, 1, !dbg !32
- %idxprom1 = sext i32 %add to i64, !dbg !33
- %arrayidx2 = getelementptr inbounds double, double* %A, i64 %idxprom1, !dbg !33
- %0 = load double, double* %arrayidx2, align 8, !dbg !33, !tbaa !28
- %idxprom3 = sext i32 %i.0 to i64, !dbg !34
- %arrayidx4 = getelementptr inbounds double, double* %B, i64 %idxprom3, !dbg !34
- store double %0, double* %arrayidx4, align 8, !dbg !35, !tbaa !28
-
- %inc = add nsw i32 %i.0, 1, !dbg !36
- call void @llvm.dbg.value(metadata i32 %inc, metadata !15, metadata !DIExpression()), !dbg !19
- br label %for.cond, !dbg !37, !llvm.loop !38
-
-for.end:
- ret void, !dbg !41
-}
-
-declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
-
-declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #2
-
-declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #2
-
-declare void @llvm.dbg.value(metadata, metadata, metadata) #1
-
-attributes #0 = { nounwind uwtable "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
-attributes #1 = { nofree nosync nounwind readnone speculatable willreturn }
-attributes #2 = { argmemonly nofree nosync nounwind willreturn }
-
-!llvm.dbg.cu = !{!0}
-!llvm.module.flags = !{!2, !3, !4, !5}
-!llvm.ident = !{!6}
-
-!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 14.0.0 (/home/meinersbur/src/llvm-project/clang 81189783049d2b93f653c121d3731fd1732a3916)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
-!1 = !DIFile(filename: "distribute_illegal.c", directory: "/path/to")
-!2 = !{i32 7, !"Dwarf Version", i32 4}
-!3 = !{i32 2, !"Debug Info Version", i32 3}
-!4 = !{i32 1, !"wchar_size", i32 4}
-!5 = !{i32 7, !"uwtable", i32 1}
-!6 = !{!"clang version 14.0.0 (/home/meinersbur/src/llvm-project/clang 81189783049d2b93f653c121d3731fd1732a3916)"}
-!7 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !8, scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !12)
-!8 = !DISubroutineType(types: !9)
-!9 = !{null, !10, !10}
-!10 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !11, size: 64)
-!11 = !DIBasicType(name: "double", size: 64, encoding: DW_ATE_float)
-!12 = !{!13, !14, !15}
-!13 = !DILocalVariable(name: "A", arg: 1, scope: !7, file: !1, line: 1, type: !10)
-!14 = !DILocalVariable(name: "B", arg: 2, scope: !7, file: !1, line: 1, type: !10)
-!15 = !DILocalVariable(name: "i", scope: !16, file: !1, line: 2, type: !17)
-!16 = distinct !DILexicalBlock(scope: !7, file: !1, line: 2, column: 3)
-!17 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
-!18 = !DILocation(line: 0, scope: !7)
-!19 = !DILocation(line: 0, scope: !16)
-!20 = !DILocation(line: 2, column: 8, scope: !16)
-!21 = !DILocation(line: 2, column: 21, scope: !22)
-!22 = distinct !DILexicalBlock(scope: !16, file: !1, line: 2, column: 3)
-!23 = !DILocation(line: 2, column: 3, scope: !16)
-!24 = !DILocation(line: 3, column: 12, scope: !25)
-!25 = distinct !DILexicalBlock(scope: !22, file: !1, line: 2, column: 33)
-!26 = !DILocation(line: 3, column: 5, scope: !25)
-!27 = !DILocation(line: 3, column: 10, scope: !25)
-!28 = !{!29, !29, i64 0}
-!29 = !{!"double", !30, i64 0}
-!30 = !{!"omnipotent char", !31, i64 0}
-!31 = !{!"Simple C/C++ TBAA"}
-!32 = !DILocation(line: 4, column: 15, scope: !25)
-!33 = !DILocation(line: 4, column: 12, scope: !25)
-!34 = !DILocation(line: 4, column: 5, scope: !25)
-!35 = !DILocation(line: 4, column: 10, scope: !25)
-!36 = !DILocation(line: 2, column: 28, scope: !22)
-!37 = !DILocation(line: 2, column: 3, scope: !22)
-!38 = distinct !{!38, !23, !39, !40, !100}
-!39 = !DILocation(line: 5, column: 3, scope: !16)
-!40 = !{!"llvm.loop.mustprogress"}
-!41 = !DILocation(line: 6, column: 1, scope: !7)
-!100 = !{!"llvm.loop.distribute.enable"}
diff --git a/polly/test/ScheduleOptimizer/ManualOptimization/distribute_illegal_pragmaloc.ll b/polly/test/ScheduleOptimizer/ManualOptimization/distribute_illegal_pragmaloc.ll
deleted file mode 100644
index 866b81420dc1b..0000000000000
--- a/polly/test/ScheduleOptimizer/ManualOptimization/distribute_illegal_pragmaloc.ll
+++ /dev/null
@@ -1,111 +0,0 @@
-; RUN: opt %loadPolly -polly-opt-isl -polly-reschedule=0 -polly-pragma-based-opts=1 -disable-output < %s 2<&1 | FileCheck %s --match-full-lines
-;
-; CHECK: warning: distribute_illegal.c:1:42: not applying loop fission/distribution: cannot ensure semantic equivalence due to possible dependency violations
-;
-; void foo(double *A,double *B) {
-; for (int i = 1; i < 128; ++i) {
-; A[i] = i;
-; B[i] = A[i+1];
-; }
-; }
-
-source_filename = "distribute_illegal.c"
-target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-unknown-linux-gnu"
-
-define dso_local void @foo(double* %A, double* %B) #0 !dbg !7 {
-entry:
- call void @llvm.dbg.value(metadata double* %A, metadata !13, metadata !DIExpression()), !dbg !18
- call void @llvm.dbg.value(metadata double* %B, metadata !14, metadata !DIExpression()), !dbg !18
- call void @llvm.dbg.value(metadata i32 1, metadata !15, metadata !DIExpression()), !dbg !19
- br label %for.cond, !dbg !20
-
-for.cond:
- %i.0 = phi i32 [ 1, %entry ], [ %inc, %for.body ], !dbg !19
- call void @llvm.dbg.value(metadata i32 %i.0, metadata !15, metadata !DIExpression()), !dbg !19
- %cmp = icmp slt i32 %i.0, 128, !dbg !21
- br i1 %cmp, label %for.body, label %for.end, !dbg !23
-
-for.body:
- %conv = sitofp i32 %i.0 to double, !dbg !24
- %idxprom = sext i32 %i.0 to i64, !dbg !26
- %arrayidx = getelementptr inbounds double, double* %A, i64 %idxprom, !dbg !26
- store double %conv, double* %arrayidx, align 8, !dbg !27, !tbaa !28
-
- %add = add nsw i32 %i.0, 1, !dbg !32
- %idxprom1 = sext i32 %add to i64, !dbg !33
- %arrayidx2 = getelementptr inbounds double, double* %A, i64 %idxprom1, !dbg !33
- %0 = load double, double* %arrayidx2, align 8, !dbg !33, !tbaa !28
- %idxprom3 = sext i32 %i.0 to i64, !dbg !34
- %arrayidx4 = getelementptr inbounds double, double* %B, i64 %idxprom3, !dbg !34
- store double %0, double* %arrayidx4, align 8, !dbg !35, !tbaa !28
-
- %inc = add nsw i32 %i.0, 1, !dbg !36
- call void @llvm.dbg.value(metadata i32 %inc, metadata !15, metadata !DIExpression()), !dbg !19
- br label %for.cond, !dbg !37, !llvm.loop !38
-
-for.end:
- ret void, !dbg !41
-}
-
-declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
-
-declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #2
-
-declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #2
-
-declare void @llvm.dbg.value(metadata, metadata, metadata) #1
-
-attributes #0 = { nounwind uwtable "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
-attributes #1 = { nofree nosync nounwind readnone speculatable willreturn }
-attributes #2 = { argmemonly nofree nosync nounwind willreturn }
-
-!llvm.dbg.cu = !{!0}
-!llvm.module.flags = !{!2, !3, !4, !5}
-!llvm.ident = !{!6}
-
-!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 14.0.0 (/home/meinersbur/src/llvm-project/clang 81189783049d2b93f653c121d3731fd1732a3916)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
-!1 = !DIFile(filename: "distribute_illegal.c", directory: "/path/to")
-!2 = !{i32 7, !"Dwarf Version", i32 4}
-!3 = !{i32 2, !"Debug Info Version", i32 3}
-!4 = !{i32 1, !"wchar_size", i32 4}
-!5 = !{i32 7, !"uwtable", i32 1}
-!6 = !{!"clang version 14.0.0 (/home/meinersbur/src/llvm-project/clang 81189783049d2b93f653c121d3731fd1732a3916)"}
-!7 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !8, scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !12)
-!8 = !DISubroutineType(types: !9)
-!9 = !{null, !10, !10}
-!10 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !11, size: 64)
-!11 = !DIBasicType(name: "double", size: 64, encoding: DW_ATE_float)
-!12 = !{!13, !14, !15}
-!13 = !DILocalVariable(name: "A", arg: 1, scope: !7, file: !1, line: 1, type: !10)
-!14 = !DILocalVariable(name: "B", arg: 2, scope: !7, file: !1, line: 1, type: !10)
-!15 = !DILocalVariable(name: "i", scope: !16, file: !1, line: 2, type: !17)
-!16 = distinct !DILexicalBlock(scope: !7, file: !1, line: 2, column: 3)
-!17 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
-!18 = !DILocation(line: 0, scope: !7)
-!19 = !DILocation(line: 0, scope: !16)
-!20 = !DILocation(line: 2, column: 8, scope: !16)
-!21 = !DILocation(line: 2, column: 21, scope: !22)
-!22 = distinct !DILexicalBlock(scope: !16, file: !1, line: 2, column: 3)
-!23 = !DILocation(line: 2, column: 3, scope: !16)
-!24 = !DILocation(line: 3, column: 12, scope: !25)
-!25 = distinct !DILexicalBlock(scope: !22, file: !1, line: 2, column: 33)
-!26 = !DILocation(line: 3, column: 5, scope: !25)
-!27 = !DILocation(line: 3, column: 10, scope: !25)
-!28 = !{!29, !29, i64 0}
-!29 = !{!"double", !30, i64 0}
-!30 = !{!"omnipotent char", !31, i64 0}
-!31 = !{!"Simple C/C++ TBAA"}
-!32 = !DILocation(line: 4, column: 15, scope: !25)
-!33 = !DILocation(line: 4, column: 12, scope: !25)
-!34 = !DILocation(line: 4, column: 5, scope: !25)
-!35 = !DILocation(line: 4, column: 10, scope: !25)
-!36 = !DILocation(line: 2, column: 28, scope: !22)
-!37 = !DILocation(line: 2, column: 3, scope: !22)
-!38 = distinct !{!38, !23, !39, !40, !100, !101}
-!39 = !DILocation(line: 5, column: 3, scope: !16)
-!40 = !{!"llvm.loop.mustprogress"}
-!41 = !DILocation(line: 6, column: 1, scope: !7)
-!100 = !{!"llvm.loop.distribute.enable"}
-!101 = !{!"llvm.loop.distribute.loc", !102}
-!102 = !DILocation(line: 1, column: 42, scope: !16)
More information about the llvm-commits
mailing list