1 | /* |
2 | * Copyright 2008-2009 Katholieke Universiteit Leuven |
3 | * |
4 | * Use of this software is governed by the MIT license |
5 | * |
6 | * Written by Sven Verdoolaege, K.U.Leuven, Departement |
7 | * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium |
8 | */ |
9 | |
10 | #include <stdio.h> |
11 | #include <stdlib.h> |
12 | #include <string.h> |
13 | |
14 | #include <isl/ctx.h> |
15 | #include <isl_options_private.h> |
16 | #include <isl/ast_build.h> |
17 | #include <isl/schedule.h> |
18 | #include <isl/version.h> |
19 | |
20 | struct isl_arg_choice isl_pip_context_choice[] = { |
21 | {"gbr" , ISL_CONTEXT_GBR}, |
22 | {"lexmin" , ISL_CONTEXT_LEXMIN}, |
23 | {0} |
24 | }; |
25 | |
26 | struct isl_arg_choice isl_gbr_choice[] = { |
27 | {"never" , ISL_GBR_NEVER}, |
28 | {"once" , ISL_GBR_ONCE}, |
29 | {"always" , ISL_GBR_ALWAYS}, |
30 | {0} |
31 | }; |
32 | |
33 | struct isl_arg_choice isl_closure_choice[] = { |
34 | {"isl" , ISL_CLOSURE_ISL}, |
35 | {"box" , ISL_CLOSURE_BOX}, |
36 | {0} |
37 | }; |
38 | |
39 | static struct isl_arg_choice bound[] = { |
40 | {"bernstein" , ISL_BOUND_BERNSTEIN}, |
41 | {"range" , ISL_BOUND_RANGE}, |
42 | {0} |
43 | }; |
44 | |
45 | static struct isl_arg_choice on_error[] = { |
46 | {"warn" , ISL_ON_ERROR_WARN}, |
47 | {"continue" , ISL_ON_ERROR_CONTINUE}, |
48 | {"abort" , ISL_ON_ERROR_ABORT}, |
49 | {0} |
50 | }; |
51 | |
52 | static struct isl_arg_choice isl_schedule_algorithm_choice[] = { |
53 | {"isl" , ISL_SCHEDULE_ALGORITHM_ISL}, |
54 | {"feautrier" , ISL_SCHEDULE_ALGORITHM_FEAUTRIER}, |
55 | {0} |
56 | }; |
57 | |
58 | static struct isl_arg_flags bernstein_recurse[] = { |
59 | {"none" , ISL_BERNSTEIN_FACTORS | ISL_BERNSTEIN_INTERVALS, 0}, |
60 | {"factors" , ISL_BERNSTEIN_FACTORS | ISL_BERNSTEIN_INTERVALS, |
61 | ISL_BERNSTEIN_FACTORS}, |
62 | {"intervals" , ISL_BERNSTEIN_FACTORS | ISL_BERNSTEIN_INTERVALS, |
63 | ISL_BERNSTEIN_INTERVALS}, |
64 | {"full" , ISL_BERNSTEIN_FACTORS | ISL_BERNSTEIN_INTERVALS, |
65 | ISL_BERNSTEIN_FACTORS | ISL_BERNSTEIN_INTERVALS}, |
66 | {0} |
67 | }; |
68 | |
69 | static struct isl_arg_choice convex[] = { |
70 | {"wrap" , ISL_CONVEX_HULL_WRAP}, |
71 | {"fm" , ISL_CONVEX_HULL_FM}, |
72 | {0} |
73 | }; |
74 | |
75 | #define ISL_SCHEDULE_FUSE_MAX 0 |
76 | #define ISL_SCHEDULE_FUSE_MIN 1 |
77 | |
78 | static struct isl_arg_choice fuse[] = { |
79 | {"max" , ISL_SCHEDULE_FUSE_MAX}, |
80 | {"min" , ISL_SCHEDULE_FUSE_MIN}, |
81 | {0} |
82 | }; |
83 | |
84 | /* Callback for setting the "schedule-fuse" option. |
85 | * This (now hidden) option tries to mimic an option that was |
86 | * replaced by the schedule-serialize-sccs option. |
87 | * Setting the old option to ISL_SCHEDULE_FUSE_MIN is now |
88 | * expressed by turning on the schedule-serialize-sccs option. |
89 | */ |
90 | static int set_fuse(void *opt, unsigned val) |
91 | { |
92 | struct isl_options *options = opt; |
93 | |
94 | options->schedule_serialize_sccs = (val == ISL_SCHEDULE_FUSE_MIN); |
95 | |
96 | return 0; |
97 | } |
98 | |
99 | static struct isl_arg_choice separation_bounds[] = { |
100 | {"explicit" , ISL_AST_BUILD_SEPARATION_BOUNDS_EXPLICIT}, |
101 | {"implicit" , ISL_AST_BUILD_SEPARATION_BOUNDS_IMPLICIT}, |
102 | {0} |
103 | }; |
104 | |
105 | static void print_version(void) |
106 | { |
107 | printf(format: "%s" , isl_version()); |
108 | } |
109 | |
110 | ISL_ARGS_START(struct isl_options, isl_options_args) |
111 | ISL_ARG_CHOICE(struct isl_options, context, 0, "context" , \ |
112 | isl_pip_context_choice, ISL_CONTEXT_GBR, |
113 | "how to handle the pip context tableau" ) |
114 | ISL_ARG_CHOICE(struct isl_options, gbr, 0, "gbr" , \ |
115 | isl_gbr_choice, ISL_GBR_ALWAYS, |
116 | "how often to use generalized basis reduction" ) |
117 | ISL_ARG_CHOICE(struct isl_options, closure, 0, "closure" , \ |
118 | isl_closure_choice, ISL_CLOSURE_ISL, |
119 | "closure operation to use" ) |
120 | ISL_ARG_BOOL(struct isl_options, gbr_only_first, 0, "gbr-only-first" , 0, |
121 | "only perform basis reduction in first direction" ) |
122 | ISL_ARG_CHOICE(struct isl_options, bound, 0, "bound" , bound, |
123 | ISL_BOUND_BERNSTEIN, "algorithm to use for computing bounds" ) |
124 | ISL_ARG_CHOICE(struct isl_options, on_error, 0, "on-error" , on_error, |
125 | ISL_ON_ERROR_WARN, "how to react if an error is detected" ) |
126 | ISL_ARG_FLAGS(struct isl_options, bernstein_recurse, 0, |
127 | "bernstein-recurse" , bernstein_recurse, ISL_BERNSTEIN_FACTORS, NULL) |
128 | ISL_ARG_BOOL(struct isl_options, bernstein_triangulate, 0, |
129 | "bernstein-triangulate" , 1, |
130 | "triangulate domains during Bernstein expansion" ) |
131 | ISL_ARG_BOOL(struct isl_options, pip_symmetry, 0, "pip-symmetry" , 1, |
132 | "detect simple symmetries in PIP input" ) |
133 | ISL_ARG_CHOICE(struct isl_options, convex, 0, "convex-hull" , \ |
134 | convex, ISL_CONVEX_HULL_WRAP, "convex hull algorithm to use" ) |
135 | ISL_ARG_BOOL(struct isl_options, coalesce_bounded_wrapping, 0, |
136 | "coalesce-bounded-wrapping" , 1, "bound wrapping during coalescing" ) |
137 | ISL_ARG_BOOL(struct isl_options, coalesce_preserve_locals, 0, |
138 | "coalesce-preserve-locals" , 0, |
139 | "preserve local variables during coalescing" ) |
140 | ISL_ARG_INT(struct isl_options, schedule_max_coefficient, 0, |
141 | "schedule-max-coefficient" , "limit" , -1, "Only consider schedules " |
142 | "where the coefficients of the variable and parameter dimensions " |
143 | "do not exceed <limit>. A value of -1 allows arbitrary coefficients." ) |
144 | ISL_ARG_INT(struct isl_options, schedule_max_constant_term, 0, |
145 | "schedule-max-constant-term" , "limit" , -1, "Only consider schedules " |
146 | "where the coefficients of the constant dimension do not exceed " |
147 | "<limit>. A value of -1 allows arbitrary coefficients." ) |
148 | ISL_ARG_BOOL(struct isl_options, schedule_parametric, 0, |
149 | "schedule-parametric" , 1, "construct possibly parametric schedules" ) |
150 | ISL_ARG_BOOL(struct isl_options, schedule_outer_coincidence, 0, |
151 | "schedule-outer-coincidence" , 0, |
152 | "try to construct schedules where the outer member of each band " |
153 | "satisfies the coincidence constraints" ) |
154 | ISL_ARG_BOOL(struct isl_options, schedule_maximize_band_depth, 0, |
155 | "schedule-maximize-band-depth" , 0, |
156 | "maximize the number of scheduling dimensions in a band" ) |
157 | ISL_ARG_BOOL(struct isl_options, schedule_maximize_coincidence, 0, |
158 | "schedule-maximize-coincidence" , 0, |
159 | "maximize the number of coincident dimensions in a band" ) |
160 | ISL_ARG_BOOL(struct isl_options, schedule_split_scaled, 0, |
161 | "schedule-split-scaled" , 1, |
162 | "split non-tilable bands with scaled schedules" ) |
163 | ISL_ARG_BOOL(struct isl_options, schedule_treat_coalescing, 0, |
164 | "schedule-treat-coalescing" , 1, |
165 | "try and prevent or adjust schedules that perform loop coalescing" ) |
166 | ISL_ARG_BOOL(struct isl_options, schedule_separate_components, 0, |
167 | "schedule-separate-components" , 1, |
168 | "separate components in dependence graph" ) |
169 | ISL_ARG_BOOL(struct isl_options, schedule_whole_component, 0, |
170 | "schedule-whole-component" , 0, |
171 | "try and compute schedule for entire component first" ) |
172 | ISL_ARG_CHOICE(struct isl_options, schedule_algorithm, 0, |
173 | "schedule-algorithm" , isl_schedule_algorithm_choice, |
174 | ISL_SCHEDULE_ALGORITHM_ISL, "scheduling algorithm to use" ) |
175 | ISL_ARG_BOOL(struct isl_options, schedule_carry_self_first, 0, |
176 | "schedule-carry-self-first" , 1, "try and carry self-dependences first" ) |
177 | ISL_ARG_BOOL(struct isl_options, schedule_serialize_sccs, 0, |
178 | "schedule-serialize-sccs" , 0, |
179 | "serialize strongly connected components in dependence graph" ) |
180 | ISL_ARG_PHANTOM_USER_CHOICE_F(0, "schedule-fuse" , fuse, &set_fuse, |
181 | ISL_SCHEDULE_FUSE_MAX, "level of fusion during scheduling" , |
182 | ISL_ARG_HIDDEN) |
183 | ISL_ARG_BOOL(struct isl_options, tile_scale_tile_loops, 0, |
184 | "tile-scale-tile-loops" , 1, "scale tile loops" ) |
185 | ISL_ARG_BOOL(struct isl_options, tile_shift_point_loops, 0, |
186 | "tile-shift-point-loops" , 1, "shift point loops to start at zero" ) |
187 | ISL_ARG_STR(struct isl_options, ast_iterator_type, 0, |
188 | "ast-iterator-type" , "type" , "int" , |
189 | "type used for iterators during printing of AST" ) |
190 | ISL_ARG_BOOL(struct isl_options, ast_always_print_block, 0, |
191 | "ast-always-print-block" , 0, "print for and if bodies as a block " |
192 | "regardless of the number of statements in the body" ) |
193 | ISL_ARG_BOOL(struct isl_options, ast_print_outermost_block, 0, |
194 | "ast-print-outermost-block" , 1, "print outermost block node as a block" ) |
195 | ISL_ARG_BOOL(struct isl_options, ast_print_macro_once, 0, |
196 | "ast-print-macro-once" , 0, "only print macro definitions once" ) |
197 | ISL_ARG_BOOL(struct isl_options, ast_build_atomic_upper_bound, 0, |
198 | "ast-build-atomic-upper-bound" , 1, "generate atomic upper bounds" ) |
199 | ISL_ARG_BOOL(struct isl_options, ast_build_prefer_pdiv, 0, |
200 | "ast-build-prefer-pdiv" , 1, "prefer pdiv operation over fdiv" ) |
201 | ISL_ARG_BOOL(struct isl_options, ast_build_detect_min_max, 0, |
202 | "ast-build-detect-min-max" , 0, "detect min/max expressions" ) |
203 | ISL_ARG_BOOL(struct isl_options, ast_build_exploit_nested_bounds, 0, |
204 | "ast-build-exploit-nested-bounds" , 1, |
205 | "simplify conditions based on bounds of nested for loops" ) |
206 | ISL_ARG_BOOL(struct isl_options, ast_build_group_coscheduled, 0, |
207 | "ast-build-group-coscheduled" , 0, |
208 | "keep coscheduled domain elements together" ) |
209 | ISL_ARG_CHOICE(struct isl_options, ast_build_separation_bounds, 0, |
210 | "ast-build-separation-bounds" , separation_bounds, |
211 | ISL_AST_BUILD_SEPARATION_BOUNDS_EXPLICIT, |
212 | "bounds to use during separation" ) |
213 | ISL_ARG_BOOL(struct isl_options, ast_build_scale_strides, 0, |
214 | "ast-build-scale-strides" , 1, |
215 | "allow iterators of strided loops to be scaled down" ) |
216 | ISL_ARG_BOOL(struct isl_options, ast_build_allow_else, 0, |
217 | "ast-build-allow-else" , 1, "generate if statements with else branches" ) |
218 | ISL_ARG_BOOL(struct isl_options, ast_build_allow_or, 0, |
219 | "ast-build-allow-or" , 1, "generate if conditions with disjunctions" ) |
220 | ISL_ARG_BOOL(struct isl_options, print_stats, 0, "print-stats" , 0, |
221 | "print statistics for every isl_ctx" ) |
222 | ISL_ARG_ULONG(struct isl_options, max_operations, 0, |
223 | "max-operations" , 0, "default number of maximal operations per isl_ctx" ) |
224 | ISL_ARG_VERSION(print_version) |
225 | ISL_ARGS_END |
226 | |
227 | ISL_ARG_DEF(isl_options, struct isl_options, isl_options_args) |
228 | |
229 | ISL_ARG_CTX_DEF(isl_options, struct isl_options, isl_options_args) |
230 | |
231 | ISL_CTX_SET_CHOICE_DEF(isl_options, struct isl_options, isl_options_args, bound) |
232 | ISL_CTX_GET_CHOICE_DEF(isl_options, struct isl_options, isl_options_args, bound) |
233 | |
234 | ISL_CTX_SET_CHOICE_DEF(isl_options, struct isl_options, isl_options_args, |
235 | on_error) |
236 | ISL_CTX_GET_CHOICE_DEF(isl_options, struct isl_options, isl_options_args, |
237 | on_error) |
238 | |
239 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
240 | pip_symmetry) |
241 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
242 | pip_symmetry) |
243 | |
244 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
245 | coalesce_bounded_wrapping) |
246 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
247 | coalesce_bounded_wrapping) |
248 | |
249 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
250 | coalesce_preserve_locals) |
251 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
252 | coalesce_preserve_locals) |
253 | |
254 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
255 | gbr_only_first) |
256 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
257 | gbr_only_first) |
258 | |
259 | ISL_CTX_SET_INT_DEF(isl_options, struct isl_options, isl_options_args, |
260 | schedule_max_coefficient) |
261 | ISL_CTX_GET_INT_DEF(isl_options, struct isl_options, isl_options_args, |
262 | schedule_max_coefficient) |
263 | |
264 | ISL_CTX_SET_INT_DEF(isl_options, struct isl_options, isl_options_args, |
265 | schedule_max_constant_term) |
266 | ISL_CTX_GET_INT_DEF(isl_options, struct isl_options, isl_options_args, |
267 | schedule_max_constant_term) |
268 | |
269 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
270 | schedule_maximize_band_depth) |
271 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
272 | schedule_maximize_band_depth) |
273 | |
274 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
275 | schedule_maximize_coincidence) |
276 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
277 | schedule_maximize_coincidence) |
278 | |
279 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
280 | schedule_split_scaled) |
281 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
282 | schedule_split_scaled) |
283 | |
284 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
285 | schedule_treat_coalescing) |
286 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
287 | schedule_treat_coalescing) |
288 | |
289 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
290 | schedule_separate_components) |
291 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
292 | schedule_separate_components) |
293 | |
294 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
295 | schedule_whole_component) |
296 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
297 | schedule_whole_component) |
298 | |
299 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
300 | schedule_outer_coincidence) |
301 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
302 | schedule_outer_coincidence) |
303 | |
304 | ISL_CTX_SET_CHOICE_DEF(isl_options, struct isl_options, isl_options_args, |
305 | schedule_algorithm) |
306 | ISL_CTX_GET_CHOICE_DEF(isl_options, struct isl_options, isl_options_args, |
307 | schedule_algorithm) |
308 | |
309 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
310 | schedule_carry_self_first) |
311 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
312 | schedule_carry_self_first) |
313 | |
314 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
315 | schedule_serialize_sccs) |
316 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
317 | schedule_serialize_sccs) |
318 | |
319 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
320 | tile_scale_tile_loops) |
321 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
322 | tile_scale_tile_loops) |
323 | |
324 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
325 | tile_shift_point_loops) |
326 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
327 | tile_shift_point_loops) |
328 | |
329 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
330 | ast_build_atomic_upper_bound) |
331 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
332 | ast_build_atomic_upper_bound) |
333 | |
334 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
335 | ast_build_prefer_pdiv) |
336 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
337 | ast_build_prefer_pdiv) |
338 | |
339 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
340 | ast_build_detect_min_max) |
341 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
342 | ast_build_detect_min_max) |
343 | |
344 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
345 | ast_build_exploit_nested_bounds) |
346 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
347 | ast_build_exploit_nested_bounds) |
348 | |
349 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
350 | ast_build_group_coscheduled) |
351 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
352 | ast_build_group_coscheduled) |
353 | |
354 | ISL_CTX_SET_STR_DEF(isl_options, struct isl_options, isl_options_args, |
355 | ast_iterator_type) |
356 | ISL_CTX_GET_STR_DEF(isl_options, struct isl_options, isl_options_args, |
357 | ast_iterator_type) |
358 | |
359 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
360 | ast_always_print_block) |
361 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
362 | ast_always_print_block) |
363 | |
364 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
365 | ast_print_outermost_block) |
366 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
367 | ast_print_outermost_block) |
368 | |
369 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
370 | ast_print_macro_once) |
371 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
372 | ast_print_macro_once) |
373 | |
374 | ISL_CTX_SET_CHOICE_DEF(isl_options, struct isl_options, isl_options_args, |
375 | ast_build_separation_bounds) |
376 | ISL_CTX_GET_CHOICE_DEF(isl_options, struct isl_options, isl_options_args, |
377 | ast_build_separation_bounds) |
378 | |
379 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
380 | ast_build_scale_strides) |
381 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
382 | ast_build_scale_strides) |
383 | |
384 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
385 | ast_build_allow_else) |
386 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
387 | ast_build_allow_else) |
388 | |
389 | ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
390 | ast_build_allow_or) |
391 | ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args, |
392 | ast_build_allow_or) |
393 | |