1
#include <isl_ast_private.h>
2
#include <isl_list_private.h>
7
#include <isl_list_templ.c>
12
#include <isl_list_templ.c>
14
isl_ctx *isl_ast_print_options_get_ctx(
15
__isl_keep isl_ast_print_options *options)
17
return options ? options->ctx : NULL;
20
__isl_give isl_ast_print_options *isl_ast_print_options_alloc(isl_ctx *ctx)
22
isl_ast_print_options *options;
24
options = isl_calloc_type(ctx, isl_ast_print_options);
35
__isl_give isl_ast_print_options *isl_ast_print_options_dup(
36
__isl_keep isl_ast_print_options *options)
39
isl_ast_print_options *dup;
44
ctx = isl_ast_print_options_get_ctx(options);
45
dup = isl_ast_print_options_alloc(ctx);
49
dup->print_for = options->print_for;
50
dup->print_for_user = options->print_for_user;
51
dup->print_user = options->print_user;
52
dup->print_user_user = options->print_user_user;
57
__isl_give isl_ast_print_options *isl_ast_print_options_cow(
58
__isl_take isl_ast_print_options *options)
63
if (options->ref == 1)
66
return isl_ast_print_options_dup(options);
69
__isl_give isl_ast_print_options *isl_ast_print_options_copy(
70
__isl_keep isl_ast_print_options *options)
79
void *isl_ast_print_options_free(__isl_take isl_ast_print_options *options)
84
if (--options->ref > 0)
87
isl_ctx_deref(options->ctx);
93
/* Set the print_user callback of "options" to "print_user".
95
* If this callback is set, then it used to print user nodes in the AST.
96
* Otherwise, the expression associated to the user node is printed.
98
__isl_give isl_ast_print_options *isl_ast_print_options_set_print_user(
99
__isl_take isl_ast_print_options *options,
100
__isl_give isl_printer *(*print_user)(__isl_take isl_printer *p,
101
__isl_take isl_ast_print_options *options,
102
__isl_keep isl_ast_node *node, void *user),
105
options = isl_ast_print_options_cow(options);
109
options->print_user = print_user;
110
options->print_user_user = user;
115
/* Set the print_for callback of "options" to "print_for".
117
* If this callback is set, then it used to print for nodes in the AST.
119
__isl_give isl_ast_print_options *isl_ast_print_options_set_print_for(
120
__isl_take isl_ast_print_options *options,
121
__isl_give isl_printer *(*print_for)(__isl_take isl_printer *p,
122
__isl_take isl_ast_print_options *options,
123
__isl_keep isl_ast_node *node, void *user),
126
options = isl_ast_print_options_cow(options);
130
options->print_for = print_for;
131
options->print_for_user = user;
136
__isl_give isl_ast_expr *isl_ast_expr_copy(__isl_keep isl_ast_expr *expr)
145
__isl_give isl_ast_expr *isl_ast_expr_dup(__isl_keep isl_ast_expr *expr)
154
ctx = isl_ast_expr_get_ctx(expr);
155
switch (expr->type) {
156
case isl_ast_expr_int:
157
dup = isl_ast_expr_alloc_int(ctx, expr->u.i);
159
case isl_ast_expr_id:
160
dup = isl_ast_expr_from_id(isl_id_copy(expr->u.id));
162
case isl_ast_expr_op:
163
dup = isl_ast_expr_alloc_op(ctx,
164
expr->u.op.op, expr->u.op.n_arg);
167
for (i = 0; i < expr->u.op.n_arg; ++i)
169
isl_ast_expr_copy(expr->u.op.args[i]);
171
case isl_ast_expr_error:
181
__isl_give isl_ast_expr *isl_ast_expr_cow(__isl_take isl_ast_expr *expr)
189
return isl_ast_expr_dup(expr);
192
void *isl_ast_expr_free(__isl_take isl_ast_expr *expr)
202
isl_ctx_deref(expr->ctx);
204
switch (expr->type) {
205
case isl_ast_expr_int:
206
isl_int_clear(expr->u.i);
208
case isl_ast_expr_id:
209
isl_id_free(expr->u.id);
211
case isl_ast_expr_op:
212
for (i = 0; i < expr->u.op.n_arg; ++i)
213
isl_ast_expr_free(expr->u.op.args[i]);
214
free(expr->u.op.args);
216
case isl_ast_expr_error:
224
isl_ctx *isl_ast_expr_get_ctx(__isl_keep isl_ast_expr *expr)
226
return expr ? expr->ctx : NULL;
229
enum isl_ast_expr_type isl_ast_expr_get_type(__isl_keep isl_ast_expr *expr)
231
return expr ? expr->type : isl_ast_expr_error;
234
int isl_ast_expr_get_int(__isl_keep isl_ast_expr *expr, isl_int *v)
238
if (expr->type != isl_ast_expr_int)
239
isl_die(isl_ast_expr_get_ctx(expr), isl_error_invalid,
240
"expression not an int", return -1);
241
isl_int_set(*v, expr->u.i);
245
__isl_give isl_id *isl_ast_expr_get_id(__isl_keep isl_ast_expr *expr)
249
if (expr->type != isl_ast_expr_id)
250
isl_die(isl_ast_expr_get_ctx(expr), isl_error_invalid,
251
"expression not an identifier", return NULL);
253
return isl_id_copy(expr->u.id);
256
enum isl_ast_op_type isl_ast_expr_get_op_type(__isl_keep isl_ast_expr *expr)
259
return isl_ast_op_error;
260
if (expr->type != isl_ast_expr_op)
261
isl_die(isl_ast_expr_get_ctx(expr), isl_error_invalid,
262
"expression not an operation", return isl_ast_op_error);
263
return expr->u.op.op;
266
int isl_ast_expr_get_op_n_arg(__isl_keep isl_ast_expr *expr)
270
if (expr->type != isl_ast_expr_op)
271
isl_die(isl_ast_expr_get_ctx(expr), isl_error_invalid,
272
"expression not an operation", return -1);
273
return expr->u.op.n_arg;
276
__isl_give isl_ast_expr *isl_ast_expr_get_op_arg(__isl_keep isl_ast_expr *expr,
281
if (expr->type != isl_ast_expr_op)
282
isl_die(isl_ast_expr_get_ctx(expr), isl_error_invalid,
283
"expression not an operation", return NULL);
284
if (pos < 0 || pos >= expr->u.op.n_arg)
285
isl_die(isl_ast_expr_get_ctx(expr), isl_error_invalid,
286
"index out of bounds", return NULL);
288
return isl_ast_expr_copy(expr->u.op.args[pos]);
291
/* Replace the argument at position "pos" of "expr" by "arg".
293
__isl_give isl_ast_expr *isl_ast_expr_set_op_arg(__isl_take isl_ast_expr *expr,
294
int pos, __isl_take isl_ast_expr *arg)
296
expr = isl_ast_expr_cow(expr);
299
if (expr->type != isl_ast_expr_op)
300
isl_die(isl_ast_expr_get_ctx(expr), isl_error_invalid,
301
"expression not an operation", goto error);
302
if (pos < 0 || pos >= expr->u.op.n_arg)
303
isl_die(isl_ast_expr_get_ctx(expr), isl_error_invalid,
304
"index out of bounds", goto error);
306
isl_ast_expr_free(expr->u.op.args[pos]);
307
expr->u.op.args[pos] = arg;
311
isl_ast_expr_free(arg);
312
return isl_ast_expr_free(expr);
315
/* Create a new operation expression of operation type "op",
316
* with "n_arg" as yet unspecified arguments.
318
__isl_give isl_ast_expr *isl_ast_expr_alloc_op(isl_ctx *ctx,
319
enum isl_ast_op_type op, int n_arg)
323
expr = isl_calloc_type(ctx, isl_ast_expr);
330
expr->type = isl_ast_expr_op;
332
expr->u.op.n_arg = n_arg;
333
expr->u.op.args = isl_calloc_array(ctx, isl_ast_expr *, n_arg);
335
if (!expr->u.op.args)
336
return isl_ast_expr_free(expr);
341
/* Create a new id expression representing "id".
343
__isl_give isl_ast_expr *isl_ast_expr_from_id(__isl_take isl_id *id)
351
ctx = isl_id_get_ctx(id);
352
expr = isl_calloc_type(ctx, isl_ast_expr);
354
return isl_id_free(id);
359
expr->type = isl_ast_expr_id;
365
/* Create a new integer expression representing "i".
367
__isl_give isl_ast_expr *isl_ast_expr_alloc_int_si(isl_ctx *ctx, int i)
371
expr = isl_calloc_type(ctx, isl_ast_expr);
378
expr->type = isl_ast_expr_int;
380
isl_int_init(expr->u.i);
381
isl_int_set_si(expr->u.i, i);
386
/* Create a new integer expression representing "i".
388
__isl_give isl_ast_expr *isl_ast_expr_alloc_int(isl_ctx *ctx, isl_int i)
392
expr = isl_calloc_type(ctx, isl_ast_expr);
399
expr->type = isl_ast_expr_int;
401
isl_int_init(expr->u.i);
402
isl_int_set(expr->u.i, i);
407
/* Create an expression representing the negation of "arg".
409
__isl_give isl_ast_expr *isl_ast_expr_neg(__isl_take isl_ast_expr *arg)
412
isl_ast_expr *expr = NULL;
417
ctx = isl_ast_expr_get_ctx(arg);
418
expr = isl_ast_expr_alloc_op(ctx, isl_ast_op_minus, 1);
422
expr->u.op.args[0] = arg;
426
isl_ast_expr_free(arg);
430
/* Create an expression representing the binary operation "type"
431
* applied to "expr1" and "expr2".
433
__isl_give isl_ast_expr *isl_ast_expr_alloc_binary(enum isl_ast_op_type type,
434
__isl_take isl_ast_expr *expr1, __isl_take isl_ast_expr *expr2)
437
isl_ast_expr *expr = NULL;
439
if (!expr1 || !expr2)
442
ctx = isl_ast_expr_get_ctx(expr1);
443
expr = isl_ast_expr_alloc_op(ctx, type, 2);
447
expr->u.op.args[0] = expr1;
448
expr->u.op.args[1] = expr2;
452
isl_ast_expr_free(expr1);
453
isl_ast_expr_free(expr2);
457
/* Create an expression representing the sum of "expr1" and "expr2".
459
__isl_give isl_ast_expr *isl_ast_expr_add(__isl_take isl_ast_expr *expr1,
460
__isl_take isl_ast_expr *expr2)
462
return isl_ast_expr_alloc_binary(isl_ast_op_add, expr1, expr2);
465
/* Create an expression representing the difference of "expr1" and "expr2".
467
__isl_give isl_ast_expr *isl_ast_expr_sub(__isl_take isl_ast_expr *expr1,
468
__isl_take isl_ast_expr *expr2)
470
return isl_ast_expr_alloc_binary(isl_ast_op_sub, expr1, expr2);
473
/* Create an expression representing the product of "expr1" and "expr2".
475
__isl_give isl_ast_expr *isl_ast_expr_mul(__isl_take isl_ast_expr *expr1,
476
__isl_take isl_ast_expr *expr2)
478
return isl_ast_expr_alloc_binary(isl_ast_op_mul, expr1, expr2);
481
/* Create an expression representing the quotient of "expr1" and "expr2".
483
__isl_give isl_ast_expr *isl_ast_expr_div(__isl_take isl_ast_expr *expr1,
484
__isl_take isl_ast_expr *expr2)
486
return isl_ast_expr_alloc_binary(isl_ast_op_div, expr1, expr2);
489
/* Create an expression representing the conjunction of "expr1" and "expr2".
491
__isl_give isl_ast_expr *isl_ast_expr_and(__isl_take isl_ast_expr *expr1,
492
__isl_take isl_ast_expr *expr2)
494
return isl_ast_expr_alloc_binary(isl_ast_op_and, expr1, expr2);
497
/* Create an expression representing the disjunction of "expr1" and "expr2".
499
__isl_give isl_ast_expr *isl_ast_expr_or(__isl_take isl_ast_expr *expr1,
500
__isl_take isl_ast_expr *expr2)
502
return isl_ast_expr_alloc_binary(isl_ast_op_or, expr1, expr2);
505
isl_ctx *isl_ast_node_get_ctx(__isl_keep isl_ast_node *node)
507
return node ? node->ctx : NULL;
510
enum isl_ast_node_type isl_ast_node_get_type(__isl_keep isl_ast_node *node)
512
return node ? node->type : isl_ast_node_error;
515
__isl_give isl_ast_node *isl_ast_node_alloc(isl_ctx *ctx,
516
enum isl_ast_node_type type)
520
node = isl_calloc_type(ctx, isl_ast_node);
532
/* Create an if node with the given guard.
534
* The then body needs to be filled in later.
536
__isl_give isl_ast_node *isl_ast_node_alloc_if(__isl_take isl_ast_expr *guard)
543
node = isl_ast_node_alloc(isl_ast_expr_get_ctx(guard), isl_ast_node_if);
546
node->u.i.guard = guard;
550
isl_ast_expr_free(guard);
554
/* Create a for node with the given iterator.
556
* The remaining fields need to be filled in later.
558
__isl_give isl_ast_node *isl_ast_node_alloc_for(__isl_take isl_id *id)
566
ctx = isl_id_get_ctx(id);
567
node = isl_ast_node_alloc(ctx, isl_ast_node_for);
571
node->u.f.iterator = isl_ast_expr_from_id(id);
572
if (!node->u.f.iterator)
573
return isl_ast_node_free(node);
578
/* Create a user node evaluating "expr".
580
__isl_give isl_ast_node *isl_ast_node_alloc_user(__isl_take isl_ast_expr *expr)
588
ctx = isl_ast_expr_get_ctx(expr);
589
node = isl_ast_node_alloc(ctx, isl_ast_node_user);
593
node->u.e.expr = expr;
597
isl_ast_expr_free(expr);
601
/* Create a block node with the given children.
603
__isl_give isl_ast_node *isl_ast_node_alloc_block(
604
__isl_take isl_ast_node_list *list)
612
ctx = isl_ast_node_list_get_ctx(list);
613
node = isl_ast_node_alloc(ctx, isl_ast_node_block);
617
node->u.b.children = list;
621
isl_ast_node_list_free(list);
625
/* Represent the given list of nodes as a single node, either by
626
* extract the node from a single element list or by creating
627
* a block node with the list of nodes as children.
629
__isl_give isl_ast_node *isl_ast_node_from_ast_node_list(
630
__isl_take isl_ast_node_list *list)
634
if (isl_ast_node_list_n_ast_node(list) != 1)
635
return isl_ast_node_alloc_block(list);
637
node = isl_ast_node_list_get_ast_node(list, 0);
638
isl_ast_node_list_free(list);
643
__isl_give isl_ast_node *isl_ast_node_copy(__isl_keep isl_ast_node *node)
652
__isl_give isl_ast_node *isl_ast_node_dup(__isl_keep isl_ast_node *node)
659
dup = isl_ast_node_alloc(isl_ast_node_get_ctx(node), node->type);
663
switch (node->type) {
664
case isl_ast_node_if:
665
dup->u.i.guard = isl_ast_expr_copy(node->u.i.guard);
666
dup->u.i.then = isl_ast_node_copy(node->u.i.then);
667
dup->u.i.else_node = isl_ast_node_copy(node->u.i.else_node);
668
if (!dup->u.i.guard || !dup->u.i.then ||
669
(node->u.i.else_node && !dup->u.i.else_node))
670
return isl_ast_node_free(dup);
672
case isl_ast_node_for:
673
dup->u.f.iterator = isl_ast_expr_copy(node->u.f.iterator);
674
dup->u.f.init = isl_ast_expr_copy(node->u.f.init);
675
dup->u.f.cond = isl_ast_expr_copy(node->u.f.cond);
676
dup->u.f.inc = isl_ast_expr_copy(node->u.f.inc);
677
dup->u.f.body = isl_ast_node_copy(node->u.f.body);
678
if (!dup->u.f.iterator || !dup->u.f.init || !dup->u.f.cond ||
679
!dup->u.f.inc || !dup->u.f.body)
680
return isl_ast_node_free(dup);
682
case isl_ast_node_block:
683
dup->u.b.children = isl_ast_node_list_copy(node->u.b.children);
684
if (!dup->u.b.children)
685
return isl_ast_node_free(dup);
687
case isl_ast_node_user:
688
dup->u.e.expr = isl_ast_expr_copy(node->u.e.expr);
690
return isl_ast_node_free(dup);
692
case isl_ast_node_error:
699
__isl_give isl_ast_node *isl_ast_node_cow(__isl_take isl_ast_node *node)
707
return isl_ast_node_dup(node);
710
void *isl_ast_node_free(__isl_take isl_ast_node *node)
718
switch (node->type) {
719
case isl_ast_node_if:
720
isl_ast_expr_free(node->u.i.guard);
721
isl_ast_node_free(node->u.i.then);
722
isl_ast_node_free(node->u.i.else_node);
724
case isl_ast_node_for:
725
isl_ast_expr_free(node->u.f.iterator);
726
isl_ast_expr_free(node->u.f.init);
727
isl_ast_expr_free(node->u.f.cond);
728
isl_ast_expr_free(node->u.f.inc);
729
isl_ast_node_free(node->u.f.body);
731
case isl_ast_node_block:
732
isl_ast_node_list_free(node->u.b.children);
734
case isl_ast_node_user:
735
isl_ast_expr_free(node->u.e.expr);
737
case isl_ast_node_error:
741
isl_id_free(node->annotation);
742
isl_ctx_deref(node->ctx);
748
/* Replace the body of the for node "node" by "body".
750
__isl_give isl_ast_node *isl_ast_node_for_set_body(
751
__isl_take isl_ast_node *node, __isl_take isl_ast_node *body)
753
node = isl_ast_node_cow(node);
756
if (node->type != isl_ast_node_for)
757
isl_die(isl_ast_node_get_ctx(node), isl_error_invalid,
758
"not a for node", goto error);
760
isl_ast_node_free(node->u.f.body);
761
node->u.f.body = body;
765
isl_ast_node_free(node);
766
isl_ast_node_free(body);
770
__isl_give isl_ast_node *isl_ast_node_for_get_body(
771
__isl_keep isl_ast_node *node)
775
if (node->type != isl_ast_node_for)
776
isl_die(isl_ast_node_get_ctx(node), isl_error_invalid,
777
"not a for node", return NULL);
778
return isl_ast_node_copy(node->u.f.body);
781
/* Mark the given for node as being degenerate.
783
__isl_give isl_ast_node *isl_ast_node_for_mark_degenerate(
784
__isl_take isl_ast_node *node)
786
node = isl_ast_node_cow(node);
789
node->u.f.degenerate = 1;
793
int isl_ast_node_for_is_degenerate(__isl_keep isl_ast_node *node)
797
if (node->type != isl_ast_node_for)
798
isl_die(isl_ast_node_get_ctx(node), isl_error_invalid,
799
"not a for node", return -1);
800
return node->u.f.degenerate;
803
__isl_give isl_ast_expr *isl_ast_node_for_get_iterator(
804
__isl_keep isl_ast_node *node)
808
if (node->type != isl_ast_node_for)
809
isl_die(isl_ast_node_get_ctx(node), isl_error_invalid,
810
"not a for node", return NULL);
811
return isl_ast_expr_copy(node->u.f.iterator);
814
__isl_give isl_ast_expr *isl_ast_node_for_get_init(
815
__isl_keep isl_ast_node *node)
819
if (node->type != isl_ast_node_for)
820
isl_die(isl_ast_node_get_ctx(node), isl_error_invalid,
821
"not a for node", return NULL);
822
return isl_ast_expr_copy(node->u.f.init);
825
/* Return the condition expression of the given for node.
827
* If the for node is degenerate, then the condition is not explicitly
828
* stored in the node. Instead, it is constructed as
832
__isl_give isl_ast_expr *isl_ast_node_for_get_cond(
833
__isl_keep isl_ast_node *node)
837
if (node->type != isl_ast_node_for)
838
isl_die(isl_ast_node_get_ctx(node), isl_error_invalid,
839
"not a for node", return NULL);
840
if (!node->u.f.degenerate)
841
return isl_ast_expr_copy(node->u.f.cond);
843
return isl_ast_expr_alloc_binary(isl_ast_op_le,
844
isl_ast_expr_copy(node->u.f.iterator),
845
isl_ast_expr_copy(node->u.f.init));
848
/* Return the increment of the given for node.
850
* If the for node is degenerate, then the increment is not explicitly
851
* stored in the node. We simply return "1".
853
__isl_give isl_ast_expr *isl_ast_node_for_get_inc(
854
__isl_keep isl_ast_node *node)
858
if (node->type != isl_ast_node_for)
859
isl_die(isl_ast_node_get_ctx(node), isl_error_invalid,
860
"not a for node", return NULL);
861
if (!node->u.f.degenerate)
862
return isl_ast_expr_copy(node->u.f.inc);
863
return isl_ast_expr_alloc_int_si(isl_ast_node_get_ctx(node), 1);
866
/* Replace the then branch of the if node "node" by "child".
868
__isl_give isl_ast_node *isl_ast_node_if_set_then(
869
__isl_take isl_ast_node *node, __isl_take isl_ast_node *child)
871
node = isl_ast_node_cow(node);
874
if (node->type != isl_ast_node_if)
875
isl_die(isl_ast_node_get_ctx(node), isl_error_invalid,
876
"not an if node", goto error);
878
isl_ast_node_free(node->u.i.then);
879
node->u.i.then = child;
883
isl_ast_node_free(node);
884
isl_ast_node_free(child);
888
__isl_give isl_ast_node *isl_ast_node_if_get_then(
889
__isl_keep isl_ast_node *node)
893
if (node->type != isl_ast_node_if)
894
isl_die(isl_ast_node_get_ctx(node), isl_error_invalid,
895
"not an if node", return NULL);
896
return isl_ast_node_copy(node->u.i.then);
899
int isl_ast_node_if_has_else(
900
__isl_keep isl_ast_node *node)
904
if (node->type != isl_ast_node_if)
905
isl_die(isl_ast_node_get_ctx(node), isl_error_invalid,
906
"not an if node", return -1);
907
return node->u.i.else_node != NULL;
910
__isl_give isl_ast_node *isl_ast_node_if_get_else(
911
__isl_keep isl_ast_node *node)
915
if (node->type != isl_ast_node_if)
916
isl_die(isl_ast_node_get_ctx(node), isl_error_invalid,
917
"not an if node", return NULL);
918
return isl_ast_node_copy(node->u.i.else_node);
921
__isl_give isl_ast_expr *isl_ast_node_if_get_cond(
922
__isl_keep isl_ast_node *node)
926
if (node->type != isl_ast_node_if)
927
isl_die(isl_ast_node_get_ctx(node), isl_error_invalid,
928
"not a guard node", return NULL);
929
return isl_ast_expr_copy(node->u.i.guard);
932
__isl_give isl_ast_node_list *isl_ast_node_block_get_children(
933
__isl_keep isl_ast_node *node)
937
if (node->type != isl_ast_node_block)
938
isl_die(isl_ast_node_get_ctx(node), isl_error_invalid,
939
"not a block node", return NULL);
940
return isl_ast_node_list_copy(node->u.b.children);
943
__isl_give isl_ast_expr *isl_ast_node_user_get_expr(
944
__isl_keep isl_ast_node *node)
949
return isl_ast_expr_copy(node->u.e.expr);
952
__isl_give isl_id *isl_ast_node_get_annotation(__isl_keep isl_ast_node *node)
954
return node ? isl_id_copy(node->annotation) : NULL;
957
/* Replace node->annotation by "annotation".
959
__isl_give isl_ast_node *isl_ast_node_set_annotation(
960
__isl_take isl_ast_node *node, __isl_take isl_id *annotation)
962
node = isl_ast_node_cow(node);
963
if (!node || !annotation)
966
isl_id_free(node->annotation);
967
node->annotation = annotation;
971
isl_id_free(annotation);
972
return isl_ast_node_free(node);
975
/* Textual C representation of the various operators.
977
static char *op_str[] = {
978
[isl_ast_op_and] = "&&",
979
[isl_ast_op_and_then] = "&&",
980
[isl_ast_op_or] = "||",
981
[isl_ast_op_or_else] = "||",
982
[isl_ast_op_max] = "max",
983
[isl_ast_op_min] = "min",
984
[isl_ast_op_minus] = "-",
985
[isl_ast_op_add] = "+",
986
[isl_ast_op_sub] = "-",
987
[isl_ast_op_mul] = "*",
988
[isl_ast_op_pdiv_q] = "/",
989
[isl_ast_op_pdiv_r] = "%",
990
[isl_ast_op_div] = "/",
991
[isl_ast_op_eq] = "==",
992
[isl_ast_op_le] = "<=",
993
[isl_ast_op_ge] = ">=",
994
[isl_ast_op_lt] = "<",
995
[isl_ast_op_gt] = ">"
998
/* Precedence in C of the various operators.
999
* Based on http://en.wikipedia.org/wiki/Operators_in_C_and_C++
1000
* Lowest value means highest precedence.
1002
static int op_prec[] = {
1003
[isl_ast_op_and] = 13,
1004
[isl_ast_op_and_then] = 13,
1005
[isl_ast_op_or] = 14,
1006
[isl_ast_op_or_else] = 14,
1007
[isl_ast_op_max] = 2,
1008
[isl_ast_op_min] = 2,
1009
[isl_ast_op_minus] = 3,
1010
[isl_ast_op_add] = 6,
1011
[isl_ast_op_sub] = 6,
1012
[isl_ast_op_mul] = 5,
1013
[isl_ast_op_div] = 5,
1014
[isl_ast_op_fdiv_q] = 2,
1015
[isl_ast_op_pdiv_q] = 5,
1016
[isl_ast_op_pdiv_r] = 5,
1017
[isl_ast_op_cond] = 15,
1018
[isl_ast_op_select] = 15,
1019
[isl_ast_op_eq] = 9,
1020
[isl_ast_op_le] = 8,
1021
[isl_ast_op_ge] = 8,
1022
[isl_ast_op_lt] = 8,
1023
[isl_ast_op_gt] = 8,
1024
[isl_ast_op_call] = 2
1027
/* Is the operator left-to-right associative?
1029
static int op_left[] = {
1030
[isl_ast_op_and] = 1,
1031
[isl_ast_op_and_then] = 1,
1032
[isl_ast_op_or] = 1,
1033
[isl_ast_op_or_else] = 1,
1034
[isl_ast_op_max] = 1,
1035
[isl_ast_op_min] = 1,
1036
[isl_ast_op_minus] = 0,
1037
[isl_ast_op_add] = 1,
1038
[isl_ast_op_sub] = 1,
1039
[isl_ast_op_mul] = 1,
1040
[isl_ast_op_div] = 1,
1041
[isl_ast_op_fdiv_q] = 1,
1042
[isl_ast_op_pdiv_q] = 1,
1043
[isl_ast_op_pdiv_r] = 1,
1044
[isl_ast_op_cond] = 0,
1045
[isl_ast_op_select] = 0,
1046
[isl_ast_op_eq] = 1,
1047
[isl_ast_op_le] = 1,
1048
[isl_ast_op_ge] = 1,
1049
[isl_ast_op_lt] = 1,
1050
[isl_ast_op_gt] = 1,
1051
[isl_ast_op_call] = 1
1054
static int is_and(enum isl_ast_op_type op)
1056
return op == isl_ast_op_and || op == isl_ast_op_and_then;
1059
static int is_or(enum isl_ast_op_type op)
1061
return op == isl_ast_op_or || op == isl_ast_op_or_else;
1064
static int is_add_sub(enum isl_ast_op_type op)
1066
return op == isl_ast_op_add || op == isl_ast_op_sub;
1069
static int is_div_mod(enum isl_ast_op_type op)
1071
return op == isl_ast_op_div || op == isl_ast_op_pdiv_r;
1074
/* Do we need/want parentheses around "expr" as a subexpression of
1075
* an "op" operation? If "left" is set, then "expr" is the left-most
1078
* We only need parentheses if "expr" represents an operation.
1080
* If op has a higher precedence than expr->u.op.op, then we need
1082
* If op and expr->u.op.op have the same precedence, but the operations
1083
* are performed in an order that is different from the associativity,
1084
* then we need parentheses.
1086
* An and inside an or technically does not require parentheses,
1087
* but some compilers complain about that, so we add them anyway.
1089
* Computations such as "a / b * c" and "a % b + c" can be somewhat
1090
* difficult to read, so we add parentheses for those as well.
1092
static int sub_expr_need_parens(enum isl_ast_op_type op,
1093
__isl_keep isl_ast_expr *expr, int left)
1095
if (expr->type != isl_ast_expr_op)
1098
if (op_prec[expr->u.op.op] > op_prec[op])
1100
if (op_prec[expr->u.op.op] == op_prec[op] && left != op_left[op])
1103
if (is_or(op) && is_and(expr->u.op.op))
1105
if (op == isl_ast_op_mul && expr->u.op.op != isl_ast_op_mul &&
1106
op_prec[expr->u.op.op] == op_prec[op])
1108
if (is_add_sub(op) && is_div_mod(expr->u.op.op))
1114
/* Print "expr" as a subexpression of an "op" operation.
1115
* If "left" is set, then "expr" is the left-most operand.
1117
static __isl_give isl_printer *print_sub_expr(__isl_take isl_printer *p,
1118
enum isl_ast_op_type op, __isl_keep isl_ast_expr *expr, int left)
1122
need_parens = sub_expr_need_parens(op, expr, left);
1125
p = isl_printer_print_str(p, "(");
1126
p = isl_printer_print_ast_expr(p, expr);
1128
p = isl_printer_print_str(p, ")");
1132
/* Print a min or max reduction "expr".
1134
static __isl_give isl_printer *print_min_max(__isl_take isl_printer *p,
1135
__isl_keep isl_ast_expr *expr)
1139
for (i = 1; i < expr->u.op.n_arg; ++i) {
1140
p = isl_printer_print_str(p, op_str[expr->u.op.op]);
1141
p = isl_printer_print_str(p, "(");
1143
p = isl_printer_print_ast_expr(p, expr->u.op.args[0]);
1144
for (i = 1; i < expr->u.op.n_arg; ++i) {
1145
p = isl_printer_print_str(p, ", ");
1146
p = isl_printer_print_ast_expr(p, expr->u.op.args[i]);
1147
p = isl_printer_print_str(p, ")");
1153
/* Print a function call "expr".
1155
* The first argument represents the function to be called.
1157
static __isl_give isl_printer *print_call(__isl_take isl_printer *p,
1158
__isl_keep isl_ast_expr *expr)
1162
p = isl_printer_print_ast_expr(p, expr->u.op.args[0]);
1163
p = isl_printer_print_str(p, "(");
1164
for (i = 1; i < expr->u.op.n_arg; ++i) {
1166
p = isl_printer_print_str(p, ", ");
1167
p = isl_printer_print_ast_expr(p, expr->u.op.args[i]);
1169
p = isl_printer_print_str(p, ")");
1174
/* Print "expr" to "p".
1176
* If we are printing in isl format, then we also print an indication
1177
* of the size of the expression (if it was computed).
1179
__isl_give isl_printer *isl_printer_print_ast_expr(__isl_take isl_printer *p,
1180
__isl_keep isl_ast_expr *expr)
1185
return isl_printer_free(p);
1187
switch (expr->type) {
1188
case isl_ast_expr_op:
1189
if (expr->u.op.op == isl_ast_op_call) {
1190
p = print_call(p, expr);
1193
if (expr->u.op.n_arg == 1) {
1194
p = isl_printer_print_str(p, op_str[expr->u.op.op]);
1195
p = print_sub_expr(p, expr->u.op.op,
1196
expr->u.op.args[0], 0);
1199
if (expr->u.op.op == isl_ast_op_fdiv_q) {
1200
p = isl_printer_print_str(p, "floord(");
1201
p = isl_printer_print_ast_expr(p, expr->u.op.args[0]);
1202
p = isl_printer_print_str(p, ", ");
1203
p = isl_printer_print_ast_expr(p, expr->u.op.args[1]);
1204
p = isl_printer_print_str(p, ")");
1207
if (expr->u.op.op == isl_ast_op_max ||
1208
expr->u.op.op == isl_ast_op_min) {
1209
p = print_min_max(p, expr);
1212
if (expr->u.op.op == isl_ast_op_cond ||
1213
expr->u.op.op == isl_ast_op_select) {
1214
p = isl_printer_print_ast_expr(p, expr->u.op.args[0]);
1215
p = isl_printer_print_str(p, " ? ");
1216
p = isl_printer_print_ast_expr(p, expr->u.op.args[1]);
1217
p = isl_printer_print_str(p, " : ");
1218
p = isl_printer_print_ast_expr(p, expr->u.op.args[2]);
1221
if (expr->u.op.n_arg != 2)
1222
isl_die(isl_printer_get_ctx(p), isl_error_internal,
1223
"operation should have two arguments",
1225
p = print_sub_expr(p, expr->u.op.op, expr->u.op.args[0], 1);
1226
p = isl_printer_print_str(p, " ");
1227
p = isl_printer_print_str(p, op_str[expr->u.op.op]);
1228
p = isl_printer_print_str(p, " ");
1229
p = print_sub_expr(p, expr->u.op.op, expr->u.op.args[1], 0);
1231
case isl_ast_expr_id:
1232
p = isl_printer_print_str(p, isl_id_get_name(expr->u.id));
1234
case isl_ast_expr_int:
1235
p = isl_printer_print_isl_int(p, expr->u.i);
1237
case isl_ast_expr_error:
1243
isl_printer_free(p);
1247
/* Print "node" to "p" in "isl format".
1249
static __isl_give isl_printer *print_ast_node_isl(__isl_take isl_printer *p,
1250
__isl_keep isl_ast_node *node)
1252
p = isl_printer_print_str(p, "(");
1253
switch (node->type) {
1254
case isl_ast_node_for:
1255
if (node->u.f.degenerate) {
1256
p = isl_printer_print_ast_expr(p, node->u.f.init);
1258
p = isl_printer_print_str(p, "init: ");
1259
p = isl_printer_print_ast_expr(p, node->u.f.init);
1260
p = isl_printer_print_str(p, ", ");
1261
p = isl_printer_print_str(p, "cond: ");
1262
p = isl_printer_print_ast_expr(p, node->u.f.cond);
1263
p = isl_printer_print_str(p, ", ");
1264
p = isl_printer_print_str(p, "inc: ");
1265
p = isl_printer_print_ast_expr(p, node->u.f.inc);
1267
if (node->u.f.body) {
1268
p = isl_printer_print_str(p, ", ");
1269
p = isl_printer_print_str(p, "body: ");
1270
p = isl_printer_print_ast_node(p, node->u.f.body);
1273
case isl_ast_node_user:
1274
p = isl_printer_print_ast_expr(p, node->u.e.expr);
1276
case isl_ast_node_if:
1277
p = isl_printer_print_str(p, "guard: ");
1278
p = isl_printer_print_ast_expr(p, node->u.i.guard);
1279
if (node->u.i.then) {
1280
p = isl_printer_print_str(p, ", ");
1281
p = isl_printer_print_str(p, "then: ");
1282
p = isl_printer_print_ast_node(p, node->u.i.then);
1284
if (node->u.i.else_node) {
1285
p = isl_printer_print_str(p, ", ");
1286
p = isl_printer_print_str(p, "else: ");
1287
p = isl_printer_print_ast_node(p, node->u.i.else_node);
1290
case isl_ast_node_block:
1291
p = isl_printer_print_ast_node_list(p, node->u.b.children);
1296
p = isl_printer_print_str(p, ")");
1300
/* Do we need to print a block around the body "node" of a for or if node?
1302
* If the node is a block, then we need to print a block.
1303
* Also if the node is a degenerate for then we will print it as
1304
* an assignment followed by the body of the for loop, so we need a block
1307
static int need_block(__isl_keep isl_ast_node *node)
1309
if (node->type == isl_ast_node_block)
1311
if (node->type == isl_ast_node_for && node->u.f.degenerate)
1316
static __isl_give isl_printer *print_ast_node_c(__isl_take isl_printer *p,
1317
__isl_keep isl_ast_node *node,
1318
__isl_keep isl_ast_print_options *options, int in_block);
1319
static __isl_give isl_printer *print_if_c(__isl_take isl_printer *p,
1320
__isl_keep isl_ast_node *node,
1321
__isl_keep isl_ast_print_options *options, int new_line);
1323
/* Print the body "node" of a for or if node.
1324
* If "else_node" is set, then it is printed as well.
1326
* We first check if we need to print out a block.
1327
* We always print out a block if there is an else node to make
1328
* sure that the else node is matched to the correct if node.
1330
* If the else node is itself an if, then we print it as
1334
* Otherwise the else node is printed as
1339
static __isl_give isl_printer *print_body_c(__isl_take isl_printer *p,
1340
__isl_keep isl_ast_node *node, __isl_keep isl_ast_node *else_node,
1341
__isl_keep isl_ast_print_options *options)
1344
return isl_printer_free(p);
1346
if (!else_node && !need_block(node)) {
1347
p = isl_printer_end_line(p);
1348
p = isl_printer_indent(p, 2);
1349
p = isl_ast_node_print(node, p,
1350
isl_ast_print_options_copy(options));
1351
p = isl_printer_indent(p, -2);
1355
p = isl_printer_print_str(p, " {");
1356
p = isl_printer_end_line(p);
1357
p = isl_printer_indent(p, 2);
1358
p = print_ast_node_c(p, node, options, 1);
1359
p = isl_printer_indent(p, -2);
1360
p = isl_printer_start_line(p);
1361
p = isl_printer_print_str(p, "}");
1363
if (else_node->type == isl_ast_node_if) {
1364
p = isl_printer_print_str(p, " else ");
1365
p = print_if_c(p, else_node, options, 0);
1367
p = isl_printer_print_str(p, " else");
1368
p = print_body_c(p, else_node, NULL, options);
1371
p = isl_printer_end_line(p);
1376
/* Print the for node "node".
1378
* If the for node is degenerate, it is printed as
1380
* type iterator = init;
1383
* Otherwise, it is printed as
1385
* for (type iterator = init; cond; iterator += inc)
1388
* "in_block" is set if we are currently inside a block.
1389
* We simply pass it along to print_ast_node_c in case of a degenerate
1392
static __isl_give isl_printer *print_for_c(__isl_take isl_printer *p,
1393
__isl_keep isl_ast_node *node,
1394
__isl_keep isl_ast_print_options *options, int in_block)
1400
type = isl_options_get_ast_iterator_type(isl_printer_get_ctx(p));
1401
if (!node->u.f.degenerate) {
1402
id = isl_ast_expr_get_id(node->u.f.iterator);
1403
name = isl_id_get_name(id);
1405
p = isl_printer_start_line(p);
1406
p = isl_printer_print_str(p, "for (");
1407
p = isl_printer_print_str(p, type);
1408
p = isl_printer_print_str(p, " ");
1409
p = isl_printer_print_str(p, name);
1410
p = isl_printer_print_str(p, " = ");
1411
p = isl_printer_print_ast_expr(p, node->u.f.init);
1412
p = isl_printer_print_str(p, "; ");
1413
p = isl_printer_print_ast_expr(p, node->u.f.cond);
1414
p = isl_printer_print_str(p, "; ");
1415
p = isl_printer_print_str(p, name);
1416
p = isl_printer_print_str(p, " += ");
1417
p = isl_printer_print_ast_expr(p, node->u.f.inc);
1418
p = isl_printer_print_str(p, ")");
1419
p = print_body_c(p, node->u.f.body, NULL, options);
1421
id = isl_ast_expr_get_id(node->u.f.iterator);
1422
name = isl_id_get_name(id);
1424
p = isl_printer_start_line(p);
1425
p = isl_printer_print_str(p, type);
1426
p = isl_printer_print_str(p, " ");
1427
p = isl_printer_print_str(p, name);
1428
p = isl_printer_print_str(p, " = ");
1429
p = isl_printer_print_ast_expr(p, node->u.f.init);
1430
p = isl_printer_print_str(p, ";");
1431
p = isl_printer_end_line(p);
1432
p = print_ast_node_c(p, node->u.f.body, options, in_block);
1438
/* Print the if node "node".
1439
* If "new_line" is set then the if node should be printed on a new line.
1441
static __isl_give isl_printer *print_if_c(__isl_take isl_printer *p,
1442
__isl_keep isl_ast_node *node,
1443
__isl_keep isl_ast_print_options *options, int new_line)
1446
p = isl_printer_start_line(p);
1447
p = isl_printer_print_str(p, "if (");
1448
p = isl_printer_print_ast_expr(p, node->u.i.guard);
1449
p = isl_printer_print_str(p, ")");
1450
p = print_body_c(p, node->u.i.then, node->u.i.else_node, options);
1455
/* Print the "node" to "p".
1457
* "in_block" is set if we are currently inside a block.
1458
* If so, we do not print a block around the children of a block node.
1459
* We do this to avoid an extra block around the body of a degenerate
1462
static __isl_give isl_printer *print_ast_node_c(__isl_take isl_printer *p,
1463
__isl_keep isl_ast_node *node,
1464
__isl_keep isl_ast_print_options *options, int in_block)
1466
switch (node->type) {
1467
case isl_ast_node_for:
1468
if (options->print_for)
1469
return options->print_for(p,
1470
isl_ast_print_options_copy(options),
1471
node, options->print_for_user);
1472
p = print_for_c(p, node, options, in_block);
1474
case isl_ast_node_if:
1475
p = print_if_c(p, node, options, 1);
1477
case isl_ast_node_block:
1479
p = isl_printer_start_line(p);
1480
p = isl_printer_print_str(p, "{");
1481
p = isl_printer_end_line(p);
1482
p = isl_printer_indent(p, 2);
1484
p = isl_ast_node_list_print(node->u.b.children, p, options);
1486
p = isl_printer_indent(p, -2);
1487
p = isl_printer_start_line(p);
1488
p = isl_printer_print_str(p, "}");
1489
p = isl_printer_end_line(p);
1492
case isl_ast_node_user:
1493
if (options->print_user)
1494
return options->print_user(p,
1495
isl_ast_print_options_copy(options),
1496
node, options->print_user_user);
1497
p = isl_printer_start_line(p);
1498
p = isl_printer_print_ast_expr(p, node->u.e.expr);
1499
p = isl_printer_print_str(p, ";");
1500
p = isl_printer_end_line(p);
1502
case isl_ast_node_error:
1508
/* Print the for node "node" to "p".
1510
__isl_give isl_printer *isl_ast_node_for_print(__isl_keep isl_ast_node *node,
1511
__isl_take isl_printer *p, __isl_take isl_ast_print_options *options)
1513
if (!node || !options)
1515
if (node->type != isl_ast_node_for)
1516
isl_die(isl_ast_node_get_ctx(node), isl_error_invalid,
1517
"not a for node", goto error);
1518
p = print_for_c(p, node, options, 0);
1519
isl_ast_print_options_free(options);
1522
isl_ast_print_options_free(options);
1523
isl_printer_free(p);
1527
/* Print the if node "node" to "p".
1529
__isl_give isl_printer *isl_ast_node_if_print(__isl_keep isl_ast_node *node,
1530
__isl_take isl_printer *p, __isl_take isl_ast_print_options *options)
1532
if (!node || !options)
1534
if (node->type != isl_ast_node_if)
1535
isl_die(isl_ast_node_get_ctx(node), isl_error_invalid,
1536
"not an if node", goto error);
1537
p = print_if_c(p, node, options, 1);
1538
isl_ast_print_options_free(options);
1541
isl_ast_print_options_free(options);
1542
isl_printer_free(p);
1546
/* Print "node" to "p".
1548
__isl_give isl_printer *isl_ast_node_print(__isl_keep isl_ast_node *node,
1549
__isl_take isl_printer *p, __isl_take isl_ast_print_options *options)
1551
if (!options || !node)
1553
p = print_ast_node_c(p, node, options, 0);
1554
isl_ast_print_options_free(options);
1557
isl_ast_print_options_free(options);
1558
isl_printer_free(p);
1562
/* Print "node" to "p".
1564
__isl_give isl_printer *isl_printer_print_ast_node(__isl_take isl_printer *p,
1565
__isl_keep isl_ast_node *node)
1568
isl_ast_print_options *options;
1573
format = isl_printer_get_output_format(p);
1575
case ISL_FORMAT_ISL:
1576
p = print_ast_node_isl(p, node);
1579
options = isl_ast_print_options_alloc(isl_printer_get_ctx(p));
1580
p = isl_ast_node_print(node, p, options);
1583
isl_die(isl_printer_get_ctx(p), isl_error_unsupported,
1584
"output format not supported for ast_node",
1585
return isl_printer_free(p));
1591
/* Print the list of nodes "list" to "p".
1593
__isl_give isl_printer *isl_ast_node_list_print(
1594
__isl_keep isl_ast_node_list *list, __isl_take isl_printer *p,
1595
__isl_keep isl_ast_print_options *options)
1599
if (!p || !list || !options)
1600
return isl_printer_free(p);
1602
for (i = 0; i < list->n; ++i)
1603
p = print_ast_node_c(p, list->p[i], options, 1);
1608
#define ISL_AST_MACRO_FLOORD (1 << 0)
1609
#define ISL_AST_MACRO_MIN (1 << 1)
1610
#define ISL_AST_MACRO_MAX (1 << 2)
1611
#define ISL_AST_MACRO_ALL (ISL_AST_MACRO_FLOORD | \
1612
ISL_AST_MACRO_MIN | \
1615
/* If "expr" contains an isl_ast_op_min, isl_ast_op_max or isl_ast_op_fdiv_q
1616
* then set the corresponding bit in "macros".
1618
static int ast_expr_required_macros(__isl_keep isl_ast_expr *expr, int macros)
1622
if (macros == ISL_AST_MACRO_ALL)
1625
if (expr->type != isl_ast_expr_op)
1628
if (expr->u.op.op == isl_ast_op_min)
1629
macros |= ISL_AST_MACRO_MIN;
1630
if (expr->u.op.op == isl_ast_op_max)
1631
macros |= ISL_AST_MACRO_MAX;
1632
if (expr->u.op.op == isl_ast_op_fdiv_q)
1633
macros |= ISL_AST_MACRO_FLOORD;
1635
for (i = 0; i < expr->u.op.n_arg; ++i)
1636
macros = ast_expr_required_macros(expr->u.op.args[i], macros);
1641
static int ast_node_list_required_macros(__isl_keep isl_ast_node_list *list,
1644
/* If "node" contains an isl_ast_op_min, isl_ast_op_max or isl_ast_op_fdiv_q
1645
* then set the corresponding bit in "macros".
1647
static int ast_node_required_macros(__isl_keep isl_ast_node *node, int macros)
1649
if (macros == ISL_AST_MACRO_ALL)
1652
switch (node->type) {
1653
case isl_ast_node_for:
1654
macros = ast_expr_required_macros(node->u.f.init, macros);
1655
if (!node->u.f.degenerate) {
1656
macros = ast_expr_required_macros(node->u.f.cond,
1658
macros = ast_expr_required_macros(node->u.f.inc,
1661
macros = ast_node_required_macros(node->u.f.body, macros);
1663
case isl_ast_node_if:
1664
macros = ast_expr_required_macros(node->u.i.guard, macros);
1665
macros = ast_node_required_macros(node->u.i.then, macros);
1666
if (node->u.i.else_node)
1667
macros = ast_node_required_macros(node->u.i.else_node,
1670
case isl_ast_node_block:
1671
macros = ast_node_list_required_macros(node->u.b.children,
1674
case isl_ast_node_user:
1675
macros = ast_expr_required_macros(node->u.e.expr, macros);
1677
case isl_ast_node_error:
1684
/* If "list" contains an isl_ast_op_min, isl_ast_op_max or isl_ast_op_fdiv_q
1685
* then set the corresponding bit in "macros".
1687
static int ast_node_list_required_macros(__isl_keep isl_ast_node_list *list,
1692
for (i = 0; i < list->n; ++i)
1693
macros = ast_node_required_macros(list->p[i], macros);
1698
/* Print a macro definition for the operator "type".
1700
__isl_give isl_printer *isl_ast_op_type_print_macro(
1701
enum isl_ast_op_type type, __isl_take isl_printer *p)
1704
case isl_ast_op_min:
1705
p = isl_printer_start_line(p);
1706
p = isl_printer_print_str(p,
1707
"#define min(x,y) ((x) < (y) ? (x) : (y))");
1708
p = isl_printer_end_line(p);
1710
case isl_ast_op_max:
1711
p = isl_printer_start_line(p);
1712
p = isl_printer_print_str(p,
1713
"#define max(x,y) ((x) > (y) ? (x) : (y))");
1714
p = isl_printer_end_line(p);
1716
case isl_ast_op_fdiv_q:
1717
p = isl_printer_start_line(p);
1718
p = isl_printer_print_str(p,
1719
"#define floord(n,d) "
1720
"(((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))");
1721
p = isl_printer_end_line(p);
1730
/* Call "fn" for each type of operation that appears in "node"
1731
* and that requires a macro definition.
1733
int isl_ast_node_foreach_ast_op_type(__isl_keep isl_ast_node *node,
1734
int (*fn)(enum isl_ast_op_type type, void *user), void *user)
1741
macros = ast_node_required_macros(node, 0);
1743
if (macros & ISL_AST_MACRO_MIN && fn(isl_ast_op_min, user) < 0)
1745
if (macros & ISL_AST_MACRO_MAX && fn(isl_ast_op_max, user) < 0)
1747
if (macros & ISL_AST_MACRO_FLOORD && fn(isl_ast_op_fdiv_q, user) < 0)
1753
static int ast_op_type_print_macro(enum isl_ast_op_type type, void *user)
1755
isl_printer **p = user;
1757
*p = isl_ast_op_type_print_macro(type, *p);
1762
/* Print macro definitions for all the macros used in the result
1763
* of printing "node.
1765
__isl_give isl_printer *isl_ast_node_print_macros(
1766
__isl_keep isl_ast_node *node, __isl_take isl_printer *p)
1768
if (isl_ast_node_foreach_ast_op_type(node,
1769
&ast_op_type_print_macro, &p) < 0)
1770
return isl_printer_free(p);