[Polly] Add -polly-isl-arg command line option.

The option is passed as argv to ISL's command line option parser.

Polly's own own command line options take precedence over options passed
as `-polly-isl-arg`. For instance,
`-polly-isl-arg=--schedule-outer-coincidence` will be ignored in favor
of `-polly-opt-outer-coincidence`.

Reviewed By: grosser

Differential Revision: https://reviews.llvm.org/D77303
This commit is contained in:
Michael Kruse 2020-04-02 10:06:17 -05:00
parent 880ec421dd
commit 4dded1a7cb
3 changed files with 63 additions and 0 deletions

View File

@ -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.

View File

@ -157,6 +157,11 @@ static cl::opt<bool> PollyPrintInstructions(
"polly-print-instructions", cl::desc("Output instructions per ScopStmt"),
cl::Hidden, cl::Optional, cl::init(false), cl::cat(PollyCategory));
static cl::list<std::string> 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<char *, 8> IslArgv;
IslArgv.reserve(1 + IslArgs.size());
// Substitute for program name.
IslArgv.push_back(const_cast<char *>("-polly-isl-arg"));
for (std::string &Arg : IslArgs)
IslArgv.push_back(const_cast<char *>(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();

View File

@ -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
}