diff --git a/polly/docs/ReleaseNotes.rst b/polly/docs/ReleaseNotes.rst index aa039774f1c89e..ab95eae4e57edf 100644 --- a/polly/docs/ReleaseNotes.rst +++ b/polly/docs/ReleaseNotes.rst @@ -11,3 +11,8 @@ In Polly 11 the following important changes have been incorporated. branch. - Change ... + + * The LLVM option -polly-isl-arg was added to pass options to ISL's + command line option parser. For instance, + -polly-isl-arg=--schedule-algorithm=feautrier switches to the + Feautrier scheduling algorithm. diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index d8b741c11280e6..fdb06be0054659 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -157,6 +157,11 @@ static cl::opt PollyPrintInstructions( "polly-print-instructions", cl::desc("Output instructions per ScopStmt"), cl::Hidden, cl::Optional, cl::init(false), cl::cat(PollyCategory)); +static cl::list IslArgs("polly-isl-arg", + cl::value_desc("argument"), + cl::desc("Option passed to ISL"), + cl::ZeroOrMore, cl::cat(PollyCategory)); + //===----------------------------------------------------------------------===// static isl::set addRangeBoundsToSet(isl::set S, const ConstantRange &Range, @@ -1698,6 +1703,23 @@ Scop::Scop(Region &R, ScalarEvolution &ScalarEvolution, LoopInfo &LI, : IslCtx(isl_ctx_alloc(), isl_ctx_free), SE(&ScalarEvolution), DT(&DT), R(R), name(None), HasSingleExitEdge(R.getExitingBlock()), DC(DC), ORE(ORE), Affinator(this, LI), ID(ID) { + SmallVector IslArgv; + IslArgv.reserve(1 + IslArgs.size()); + + // Substitute for program name. + IslArgv.push_back(const_cast("-polly-isl-arg")); + + for (std::string &Arg : IslArgs) + IslArgv.push_back(const_cast(Arg.c_str())); + + // Abort if unknown argument is passed. + // Note that "-V" (print isl version) will always call exit(0), so we cannot + // avoid ISL aborting the program at this point. + unsigned IslParseFlags = ISL_ARG_ALL; + + isl_ctx_parse_options(IslCtx.get(), IslArgv.size(), IslArgv.data(), + IslParseFlags); + if (IslOnErrorAbort) isl_options_set_on_error(getIslCtx().get(), ISL_ON_ERROR_ABORT); buildContext(); diff --git a/polly/test/Isl/isl-args.ll b/polly/test/Isl/isl-args.ll new file mode 100644 index 00000000000000..84207983f3a0db --- /dev/null +++ b/polly/test/Isl/isl-args.ll @@ -0,0 +1,36 @@ +; RUN: opt %loadPolly -polly-scops -disable-output -polly-isl-arg=-V < %s | FileCheck %s -match-full-lines --check-prefix=VERSION +; RUN: opt %loadPolly -polly-scops -disable-output -polly-isl-arg=-h < %s | FileCheck %s -match-full-lines --check-prefix=HELP +; RUN: not opt %loadPolly -polly-scops -disable-output -polly-isl-arg=-asdf < %s 2>&1| FileCheck %s -match-full-lines --check-prefix=UNKNOWN +; RUN: opt %loadPolly -polly-scops -disable-output -polly-isl-arg=--schedule-algorithm=feautrier < %s + +; VERSION: isl-{{.*}}-IMath-32 +; HELP: Usage: -polly-isl-arg [OPTION...] +; UNKNOWN: -polly-isl-arg: unrecognized option: -asdf + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +; Any valid SCoP causing the creation of a ScopInfo object. +define void @foo_1d(float* %A) { +bb: + br label %bb1 + +bb1: ; preds = %bb6, %bb + %i.0 = phi i64 [ 0, %bb ], [ %tmp7, %bb6 ] + %exitcond = icmp ne i64 %i.0, 1024 + br i1 %exitcond, label %bb2, label %bb8 + +bb2: ; preds = %bb1 + %tmp = sitofp i64 %i.0 to float + %tmp3 = getelementptr inbounds float, float* %A, i64 %i.0 + %tmp4 = load float, float* %tmp3, align 4 + %tmp5 = fadd float %tmp4, %tmp + store float %tmp5, float* %tmp3, align 4 + br label %bb6 + +bb6: ; preds = %bb2 + %tmp7 = add nuw nsw i64 %i.0, 1 + br label %bb1 + +bb8: ; preds = %bb1 + ret void +}