00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 #ifdef _KEEP_RCS_ID
00058
00059 static char *rcs_id = "$Source: /scratch/mee/2.4-65/kpro64-pending/be/whirl2c/SCCS/s.wn2c_pragma.cxx $ $Revision: 1.2 $";
00060 #endif
00061
00062 #include "alloca.h"
00063 #include "whirl2c_common.h"
00064 #include "w2cf_parentize.h"
00065 #include "pf_cg.h"
00066 #include "region_util.h"
00067 #include "PUinfo.h"
00068 #include "wn2c.h"
00069 #include "st2c.h"
00070 #include "ty2c.h"
00071 #include "tcon2c.h"
00072 #include "wn2c_pragma.h"
00073
00074
00075 extern BOOL Run_w2fc_early;
00076 extern BOOL W2C_Emit_Omp;
00077
00078
00079 #define WN_pragma_nest(wn) WN_pragma_arg1(wn)
00080 #define WN_max_nest_level(wn) WN_pragma_arg2(wn)
00081 #define WN_mp_schedtype(wn) (WN_PRAGMA_SCHEDTYPE_KIND)WN_pragma_arg1(wn)
00082
00083 #define EMIT_ARG_NUMBERS1(tokens, val1) \
00084 Append_Arg_Numbers((tokens), (val1), -1)
00085
00086 #define EMIT_ARG_NUMBERS2(tokens, val1, val2) \
00087 Append_Arg_Numbers((tokens), (val1), (val2))
00088
00089 #define PARENTHESIZE_ARG_NUMBERS1(tokens, val1) \
00090 Append_Token_Special((tokens), '('); \
00091 EMIT_ARG_NUMBERS1((tokens), (val1)); \
00092 Append_Token_Special((tokens), ')')
00093
00094 #define PARENTHESIZE_ARG_NUMBERS2(tokens, val1, val2) \
00095 Append_Token_Special((tokens), '('); \
00096 EMIT_ARG_NUMBERS2((tokens), (val1), (val2)); \
00097 Append_Token_Special((tokens), ')')
00098
00099
00100 typedef struct Array_Distribution
00101 {
00102 INT current_dimension;
00103 const WN *base;
00104 const WN *cyclic_expr;
00105 const WN *dimension_bound;
00106 } ARRAY_DISTRIBUTION;
00107
00108
00109 #define MAX_PRAGMAS_TO_SKIP 50
00110 static struct Set_Of_Pragmas_To_Skip
00111 {
00112 INT start, end;
00113 const WN *array[MAX_PRAGMAS_TO_SKIP];
00114 } Pragmas_To_Skip = {0, 0,
00115 {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
00116 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
00117 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
00118 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
00119 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}};
00120
00121
00122 typedef struct Local_Preg
00123 {
00124 const ST *st;
00125 PREG_IDX preg_idx;
00126 } LOCAL_PREG;
00127
00128
00129 static const WN *WN2C_Prompf_Subsection = NULL;
00130
00131
00132
00133
00134
00135 static void WN2C_Stmt_Newline(TOKEN_BUFFER tokens, SRCPOS srcpos);
00136
00137 inline BOOL
00138 WN2C_is_omp(const WN *pragma)
00139 {
00140 return (WN_pragma_omp(pragma) ||
00141 (W2C_Emit_Omp && WN_pragma_compiler_generated(pragma)));
00142 }
00143
00144
00145 static void
00146 WN2C_Append_Prompf_Flag_Newline(TOKEN_BUFFER tokens)
00147 {
00148 UINT current_indent = Current_Indentation();
00149
00150 Set_Current_Indentation(0);
00151 Append_Indented_Newline(tokens, 1);
00152 Set_Current_Indentation(current_indent);
00153 }
00154
00155
00156 static void
00157 WN2C_Start_Prompf_Construct(TOKEN_BUFFER tokens, const WN *pragma)
00158 {
00159 INT32 construct_id = WN_MAP32_Get(*W2C_Construct_Map, pragma);
00160
00161 WN2C_Append_Prompf_Flag_Newline(tokens);
00162 Append_Token_String(tokens, "/*$SGI");
00163 Append_Token_String(tokens, "start");
00164 Append_Token_String(tokens, Number_as_String(construct_id, "%llu"));
00165 Append_Token_String(tokens, "*/");
00166 }
00167
00168
00169 static void
00170 WN2C_End_Prompf_Construct(TOKEN_BUFFER tokens, const WN *pragma)
00171 {
00172 INT32 construct_id = WN_MAP32_Get(*W2C_Construct_Map, pragma);
00173
00174 WN2C_Append_Prompf_Flag_Newline(tokens);
00175 Append_Token_String(tokens, "/*$SGI");
00176 Append_Token_String(tokens, "end");
00177 Append_Token_String(tokens, Number_as_String(construct_id, "%llu"));
00178 Append_Token_String(tokens, "*/");
00179 }
00180
00181
00182
00183
00184
00185
00186 static void
00187 WN2C_Stmt_Newline(TOKEN_BUFFER tokens,
00188 SRCPOS srcpos)
00189 {
00190 if (W2C_Emit_Linedirs)
00191 Append_Srcpos_Directive(tokens, srcpos);
00192 Append_Indented_Newline(tokens, 1);
00193 if (W2C_File[W2C_LOC_FILE] != NULL)
00194 Append_Srcpos_Map(tokens, srcpos);
00195 }
00196
00197
00198 static void
00199 WN2C_Append_Pragma_Newline(TOKEN_BUFFER tokens, SRCPOS srcpos)
00200 {
00201 UINT current_indent = Current_Indentation();
00202
00203 Set_Current_Indentation(0);
00204 WN2C_Stmt_Newline(tokens, srcpos);
00205 Append_Token_String(tokens, "#pragma");
00206 Set_Current_Indentation(current_indent);
00207 }
00208
00209
00210 inline void
00211 Append_Clause_Newline(TOKEN_BUFFER tokens, CONTEXT context)
00212 {
00213 if (!CONTEXT_omp(context))
00214 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
00215 }
00216
00217
00218 static void
00219 Append_Reduction_Operator(TOKEN_BUFFER tokens, OPERATOR op)
00220 {
00221
00222
00223
00224
00225 const char * p;
00226
00227 switch(op)
00228 {
00229 case OPR_ADD:
00230 p = "+";
00231 break;
00232
00233 case OPR_SUB:
00234 p = "-";
00235 break;
00236
00237 case OPR_MPY:
00238 p = "*";
00239 break;
00240
00241 case OPR_BAND:
00242 p = "&";
00243 break;
00244
00245 case OPR_BIOR:
00246 p = "|";
00247 break;
00248
00249 case OPR_BXOR:
00250 p = "^";
00251 break;
00252
00253 case OPR_LAND:
00254 p = "&&";
00255 break;
00256
00257 case OPR_LIOR:
00258 p = "||";
00259 break;
00260
00261 default:
00262 p = "?" ;
00263 }
00264 Append_Token_String(tokens, p);
00265 Append_Token_Special(tokens,':');
00266 }
00267
00268
00269 static BOOL
00270 Preg_Is_In_Clause_List(const WN *clause_list, const ST *preg_st, PREG_IDX preg_idx)
00271 {
00272
00273
00274
00275
00276 BOOL found = FALSE;
00277
00278 while (!found && clause_list != NULL)
00279 {
00280 switch (WN_pragma(clause_list))
00281 {
00282 case WN_PRAGMA_LOCAL:
00283 case WN_PRAGMA_LASTLOCAL:
00284 case WN_PRAGMA_SHARED:
00285 case WN_PRAGMA_FIRSTPRIVATE:
00286 case WN_PRAGMA_REDUCTION:
00287 if (WN_operator(clause_list) != OPR_XPRAGMA &&
00288 WN_st(clause_list) == preg_st &&
00289 WN_pragma_arg1(clause_list) == preg_idx)
00290 {
00291 found = TRUE;
00292 }
00293 break;
00294 default:
00295 break;
00296 }
00297 clause_list = WN_next(clause_list);
00298 }
00299 return found;
00300 }
00301
00302
00303 static void
00304 Get_Implicit_Locals(WN_PRAGMA_ID kind,
00305 const WN *wn,
00306 const WN *clauses,
00307 LOCAL_PREG **ptr_to_local_list,
00308 UINT *next_local,
00309 UINT *max_locals)
00310 {
00311
00312
00313
00314 OPERATOR opr = WN_operator(wn);
00315 const ST *st;
00316 PREG_IDX preg_idx;
00317
00318
00319
00320 switch (opr)
00321 {
00322 case OPR_LDA:
00323 st = WN_st(wn);
00324 preg_idx = WN_lda_offset(wn);
00325 break;
00326 case OPR_LDID:
00327 st = WN_st(wn);
00328 preg_idx = WN_load_offset(wn);
00329 break;
00330 case OPR_STID:
00331 st = WN_st(wn);
00332 preg_idx = WN_store_offset(wn);
00333 break;
00334 default:
00335 st = NULL;
00336 preg_idx = 0;
00337 }
00338
00339
00340
00341 if (st != NULL &&
00342 ST_sym_class(st) == CLASS_PREG &&
00343 !Preg_Is_In_Clause_List(clauses, st, preg_idx))
00344 {
00345
00346
00347 INT i;
00348 BOOL found = FALSE;
00349 LOCAL_PREG *local_list = *ptr_to_local_list;
00350
00351 for (i = 0; !found && i < *next_local; i++)
00352 if (local_list[i].st == st && local_list[i].preg_idx == preg_idx)
00353 found = TRUE;
00354
00355 if (!found)
00356 {
00357 if (*next_local >= *max_locals)
00358 {
00359
00360
00361
00362 *max_locals += 200;
00363 local_list = TYPE_ALLOC_N(LOCAL_PREG, *max_locals);
00364
00365
00366
00367 if (*ptr_to_local_list != NULL)
00368 {
00369 for (i = 0; i < *next_local; i++)
00370 local_list[i] = (*ptr_to_local_list)[i];
00371 FREE(*ptr_to_local_list);
00372 }
00373 *ptr_to_local_list = local_list;
00374 }
00375
00376 local_list[*next_local].st = st;
00377 local_list[*next_local].preg_idx = preg_idx;
00378 (*next_local)++;
00379 }
00380 }
00381
00382
00383
00384 if (!OPCODE_is_leaf(WN_opcode(wn)))
00385 {
00386 if (opr == OPR_REGION)
00387 {
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403 Get_Implicit_Locals(kind, WN_region_body(wn), clauses,
00404 ptr_to_local_list, next_local, max_locals);
00405 }
00406 else if (opr == OPR_BLOCK)
00407 {
00408 const WN *kid = WN_first(wn);
00409 while (kid)
00410 {
00411 Get_Implicit_Locals(kind, kid, clauses,
00412 ptr_to_local_list, next_local, max_locals);
00413 kid = WN_next(kid);
00414 }
00415 }
00416 else
00417 {
00418 INT kidno;
00419 const WN *kid;
00420 for (kidno=0; kidno < WN_kid_count(wn); kidno++)
00421 {
00422 kid = WN_kid (wn, kidno);
00423 if (kid)
00424 {
00425 Get_Implicit_Locals(kind, kid, clauses,
00426 ptr_to_local_list, next_local, max_locals);
00427 }
00428 }
00429 }
00430 }
00431 }
00432
00433
00434 static void
00435 Append_Implicit_Locals(TOKEN_BUFFER tokens,
00436 WN_PRAGMA_ID region_kind,
00437 const WN *region_body,
00438 const WN *region_clauses,
00439 CONTEXT context)
00440 {
00441
00442
00443
00444 LOCAL_PREG *local_list = NULL;
00445 UINT i, number_of_locals = 0, max_number_of_locals = 0;
00446
00447
00448
00449 Get_Implicit_Locals(region_kind, region_body, region_clauses,
00450 &local_list, &number_of_locals, &max_number_of_locals);
00451
00452
00453
00454 if (number_of_locals > 0)
00455 {
00456 Append_Clause_Newline(tokens, context);
00457 if (CONTEXT_omp(context))
00458 Append_Token_String(tokens, "private");
00459 else
00460 Append_Token_String(tokens, "local");
00461 Append_Token_Special(tokens, '(');
00462 for (i = 0; i < number_of_locals; i++)
00463 {
00464 if (i > 0)
00465 Append_Token_Special(tokens, ',');
00466
00467 ST2C_Use_Preg(tokens,
00468 ST_type(local_list[i].st),
00469 local_list[i].preg_idx,
00470 context);
00471 }
00472 Append_Token_Special(tokens, ')');
00473 }
00474
00475 if (local_list != NULL)
00476 FREE(local_list);
00477 }
00478
00479
00480 static void
00481 WN2C_Value_Reference(TOKEN_BUFFER tokens,
00482 const WN * expression,
00483 BOOL prepend)
00484 {
00485 CONTEXT context = INIT_CONTEXT;
00486 TOKEN_BUFFER expr_tokens = New_Token_Buffer();
00487 TY_IDX ty = WN_Tree_Type(expression);
00488
00489
00490
00491 if (TY_Is_Pointer(ty))
00492 {
00493 TY_IDX object_ty;
00494
00495 WN2C_memref_lhs(expr_tokens,
00496 &object_ty,
00497 expression,
00498 0,
00499 ty,
00500 TY_pointed(ty),
00501 TY_mtype(TY_pointed(ty)),
00502 context);
00503 }
00504 else
00505 (void)WN2C_translate(expr_tokens, expression, context);
00506
00507 if (prepend)
00508 Prepend_And_Reclaim_Token_List(tokens, &expr_tokens);
00509 else
00510 Append_And_Reclaim_Token_List(tokens, &expr_tokens);
00511 }
00512
00513 static void
00514 WN2C_Append_Value_Reference(TOKEN_BUFFER tokens,
00515 const WN * expression,
00516 BOOL prepend = FALSE)
00517 {
00518 WN2C_Value_Reference(tokens, expression, FALSE);
00519 }
00520
00521 static void
00522 WN2C_Prepend_Value_Reference(TOKEN_BUFFER tokens,
00523 const WN * expression,
00524 BOOL prepend = FALSE)
00525 {
00526 WN2C_Value_Reference(tokens, expression, TRUE);
00527 }
00528
00529
00530 static void
00531 Append_MP_Schedtype(TOKEN_BUFFER tokens, WN_PRAGMA_SCHEDTYPE_KIND kind)
00532 {
00533 switch (kind)
00534 {
00535 case WN_PRAGMA_SCHEDTYPE_RUNTIME:
00536 Append_Token_String(tokens, "runtime");
00537 break;
00538 case WN_PRAGMA_SCHEDTYPE_SIMPLE:
00539 Append_Token_String(tokens, "simple");
00540 break;
00541 case WN_PRAGMA_SCHEDTYPE_INTERLEAVE:
00542 Append_Token_String(tokens, "interleave");
00543 break;
00544 case WN_PRAGMA_SCHEDTYPE_DYNAMIC:
00545 Append_Token_String(tokens, "dynamic");
00546 break;
00547 case WN_PRAGMA_SCHEDTYPE_GSS:
00548 Append_Token_String(tokens, "gss");
00549 break;
00550 case WN_PRAGMA_SCHEDTYPE_PSEUDOLOWERED:
00551 Append_Token_String(tokens, "pseudolowered");
00552 break;
00553 default:
00554 Is_True(FALSE,
00555 ("Unexpected MP scheduling type (%d) in Append_MP_Schedtype()",
00556 kind));
00557 break;
00558 }
00559 }
00560
00561
00562 static void
00563 Append_Arg_Numbers(TOKEN_BUFFER tokens,
00564 INT32 val1,
00565 INT32 val2)
00566 {
00567 if (val1 != -1)
00568 Append_Token_String(tokens, Number_as_String(val1, "%lld"));
00569
00570 if (val2 != -1)
00571 {
00572 Append_Token_Special(tokens, ',');
00573 Append_Token_String(tokens, Number_as_String(val2, "%lld"));
00574 }
00575 }
00576
00577
00578 static void
00579 Append_Prefetch_Attributes(TOKEN_BUFFER tokens,
00580 const WN *prefetch,
00581 INT32 size)
00582 {
00583 INT pflag = WN_prefetch_flag(prefetch);
00584
00585
00586
00587 Append_Token_Special(tokens, '=');
00588 WN2C_Append_Value_Reference(tokens, WN_kid0(prefetch));
00589
00590
00591
00592 Append_Token_Special(tokens, ',');
00593 if (PF_GET_STRIDE_1L(pflag) > 0)
00594 {
00595 if (PF_GET_STRIDE_2L(pflag) > 0)
00596 {
00597 Append_Token_String(tokens,
00598 Concat2_Strings("stride=",
00599 Concat2_Strings(Number_as_String(PF_GET_STRIDE_1L(pflag), "%lld"),
00600 Concat2_Strings(",",
00601 Number_as_String(PF_GET_STRIDE_2L(pflag), "%lld")))));
00602 Append_Token_Special(tokens, ',');
00603 Append_Token_String(tokens, "level=1,2");
00604 }
00605 else
00606 {
00607 Append_Token_String(tokens,
00608 Concat2_Strings("stride=",
00609 Number_as_String(PF_GET_STRIDE_1L(pflag), "%lld")));
00610 Append_Token_Special(tokens, ',');
00611 Append_Token_String(tokens, "level=1");
00612 }
00613 }
00614 else if (PF_GET_STRIDE_2L(pflag) > 0)
00615 {
00616 Append_Token_String(tokens,
00617 Concat2_Strings("stride=,",
00618 Number_as_String(PF_GET_STRIDE_2L(pflag), "%lld")));
00619 Append_Token_Special(tokens, ',');
00620 Append_Token_String(tokens, "level=,2");
00621 }
00622 else
00623 {
00624 Append_Token_String(tokens, "stride=");
00625 Append_Token_Special(tokens, ',');
00626 Append_Token_String(tokens, "level=");
00627 }
00628
00629
00630
00631 Append_Token_Special(tokens, ',');
00632 if (PF_GET_READ(pflag))
00633 Append_Token_String(tokens, "kind=rd");
00634 else
00635 Append_Token_String(tokens, "kind=wr");
00636
00637
00638
00639 if (size > 0)
00640 {
00641 Append_Token_Special(tokens, ',');
00642 Append_Token_String(tokens,
00643 Concat2_Strings("size=", Number_as_String(size, "%lld")));
00644 }
00645 }
00646
00647
00648 static void
00649 Append_Distribution(TOKEN_BUFFER tokens, const WN **apragma, WN_PRAGMA_ID id)
00650 {
00651 INT32 dim, num_dims;
00652 ARRAY_DISTRIBUTION distr[MAX_PRAGMAS_TO_SKIP];
00653 const WN *wn = *apragma;
00654 CONTEXT context = INIT_CONTEXT;
00655
00656 Is_True(WN_operator(wn) == OPR_PRAGMA,
00657 ("Unexpected operator (%d) in Append_Distribution()",
00658 WN_operator(wn)));
00659
00660
00661
00662 for (num_dims = 0;
00663 (WN_operator(wn) == OPR_PRAGMA &&
00664 WN_pragma(wn) == id &&
00665 num_dims == WN_pragma_index(wn));
00666 num_dims++)
00667 {
00668
00669 distr[num_dims].current_dimension = WN_pragma_index(wn);
00670 distr[num_dims].base = wn;
00671 if (WN_pragma_distr_type(wn) == DISTRIBUTE_CYCLIC_EXPR)
00672 distr[num_dims].cyclic_expr = wn = WN_next(wn);
00673 distr[num_dims].dimension_bound = wn = WN_next(wn);
00674 wn = WN_next(wn);
00675 }
00676
00677
00678
00679
00680 if (WN_operator(wn)==OPR_STID && ST_sym_class(WN_st(wn))==CLASS_PREG)
00681 {
00682 wn = WN_next(wn);
00683 if (WN_operator(wn)==OPR_STID && ST_sym_class(WN_st(wn))==CLASS_PREG)
00684 wn = WN_next(wn);
00685 }
00686 *apragma = wn;
00687
00688
00689
00690
00691 for (dim = 0; dim < num_dims; dim++)
00692 {
00693 Append_Token_Special(tokens, '[');
00694 switch (WN_pragma_distr_type(distr[dim].base))
00695 {
00696 case DISTRIBUTE_STAR:
00697 Append_Token_Special(tokens, '*');
00698 break;
00699
00700 case DISTRIBUTE_BLOCK:
00701 Append_Token_String(tokens, "block");
00702 break;
00703
00704 case DISTRIBUTE_CYCLIC_EXPR:
00705 Append_Token_String(tokens, "cyclic");
00706 Append_Token_Special(tokens, '(');
00707 WN2C_translate(tokens, WN_kid0(distr[dim].cyclic_expr), context);
00708 Append_Token_Special(tokens, ')');
00709 break;
00710
00711 case DISTRIBUTE_CYCLIC_CONST:
00712 Append_Token_String(tokens, "cyclic");
00713 PARENTHESIZE_ARG_NUMBERS1(tokens,
00714 WN_pragma_preg(distr[dim].base));
00715 break;
00716
00717 default:
00718 Append_Token_String(tokens, "unknown_distribution");
00719 break;
00720 }
00721 Append_Token_Special(tokens, ']');
00722
00723 }
00724 }
00725
00726
00727 static void
00728 Append_A_Clause_Symbol(TOKEN_BUFFER tokens, const WN *clause, WN_OFFSET ofst)
00729 {
00730 CONTEXT context = INIT_CONTEXT;
00731 const ST *const st = WN_st(clause);
00732
00733 if (ST_sym_class(st) == CLASS_PREG)
00734 {
00735 INT32 preg_num = WN_pragma_arg1(clause);
00736
00737 ST2C_Use_Preg(tokens, ST_type(st), preg_num, context);
00738 }
00739 else
00740 {
00741 TY_IDX object_ty;
00742 const TY_IDX base_ty = ST_type(st);
00743 TOKEN_BUFFER sym_tokens = New_Token_Buffer();
00744
00745 WN2C_stid_lhs(sym_tokens,
00746 &object_ty,
00747 st,
00748 ofst,
00749 base_ty,
00750 TY_mtype(base_ty),
00751 context);
00752 Append_And_Reclaim_Token_List(tokens, &sym_tokens);
00753 }
00754 }
00755
00756
00757 static void
00758 Append_Clause_Symbols(TOKEN_BUFFER tokens,
00759 WN_PRAGMA_ID id,
00760 const WN **next)
00761 {
00762
00763
00764
00765
00766
00767
00768 const WN *clause;
00769
00770 Is_True(WN_operator(*next) == OPR_PRAGMA,
00771 ("Unexpected operator (%d) in Append_Clause_Symbols()",
00772 WN_operator(*next)));
00773
00774 Append_Token_Special(tokens, '(');
00775 for (clause = *next;
00776 (clause != NULL &&
00777 WN_operator(clause) == OPR_PRAGMA &&
00778 WN_pragma(clause) == id);
00779 clause = WN_next(clause))
00780 {
00781 if (clause != *next)
00782 Append_Token_Special(tokens, ',');
00783
00784 Append_A_Clause_Symbol(tokens, clause, 0);
00785 }
00786 Append_Token_Special(tokens, ')');
00787 *next = clause;
00788 }
00789
00790
00791 static void
00792 Append_Reduction_Clause(TOKEN_BUFFER tokens,
00793 WN_PRAGMA_ID id,
00794 const WN **next)
00795 {
00796
00797
00798
00799
00800 const WN * clause;
00801 const WN * const first_clause = *next;
00802
00803 Is_True(WN_operator(first_clause) == OPR_PRAGMA,
00804 ("Unexpected operator (%d) in Append_Reduction_Clause()",
00805 WN_operator(first_clause)));
00806
00807 Append_Token_String(tokens, "reduction (");
00808 for (clause = first_clause;
00809 (clause != NULL &&
00810 WN_operator(clause) == OPR_PRAGMA &&
00811 WN_pragma(clause) == id);
00812 clause = WN_next(clause))
00813 {
00814 if (WN2C_is_omp(clause) &&
00815 WN_pragma(clause) == WN_PRAGMA_REDUCTION &&
00816 WN_pragma_arg2(clause) != OPERATOR_UNKNOWN)
00817 {
00818 if (first_clause != clause)
00819 Append_Token_String(tokens, "), reduction (");
00820 Append_Reduction_Operator(tokens, (OPERATOR) WN_pragma_arg2(clause));
00821
00822 }
00823 else if (clause != first_clause)
00824 Append_Token_Special(tokens, ',');
00825
00826 Append_A_Clause_Symbol(tokens, clause, 0);
00827 }
00828
00829 Append_Token_Special(tokens, ')');
00830 *next = clause;
00831
00832 }
00833
00834
00835 static void
00836 Append_Clause_Expressions(TOKEN_BUFFER tokens,
00837 WN_PRAGMA_ID id,
00838 const WN **next,
00839 BOOL reverse_order = FALSE)
00840 {
00841
00842
00843
00844
00845
00846
00847 TOKEN_BUFFER clause_tokens = New_Token_Buffer();
00848 const WN * clause;
00849 const WN * const first_clause = *next;
00850
00851 Is_True(WN_operator(first_clause) == OPR_XPRAGMA,
00852 ("Unexpected operator %d in Append_Clause_Expressions()",
00853 WN_operator(first_clause)));
00854
00855 Append_Token_Special(tokens, '(');
00856 for (clause = first_clause;
00857 (clause != NULL &&
00858 WN_operator(clause) == OPR_XPRAGMA &&
00859 WN_pragma(clause) == id);
00860 clause = WN_next(clause))
00861 {
00862 if (clause != first_clause)
00863 {
00864 if (reverse_order)
00865 Prepend_Token_Special(clause_tokens, ',');
00866 else
00867 Append_Token_Special(clause_tokens, ',');
00868 }
00869
00870 if (id == WN_PRAGMA_ONTO &&
00871 WN_operator(WN_kid0(clause)) == OPR_INTCONST &&
00872 WN_const_val(WN_kid0(clause)) == 0)
00873 {
00874
00875
00876 if (reverse_order)
00877 Prepend_Token_Special(clause_tokens, '*');
00878 else
00879 Append_Token_Special(clause_tokens, '*');
00880 }
00881 else
00882 {
00883 if (reverse_order)
00884 WN2C_Prepend_Value_Reference(tokens, WN_kid0(clause));
00885 else
00886 WN2C_Append_Value_Reference(tokens, WN_kid0(clause));
00887 }
00888 }
00889 Append_And_Reclaim_Token_List(tokens, &clause_tokens);
00890 Append_Token_Special(tokens, ')');
00891 *next = clause;
00892 }
00893
00894
00895 static void
00896 Append_Array_Segment(TOKEN_BUFFER tokens,
00897 WN_PRAGMA_ID id,
00898 const WN **next)
00899 {
00900
00901
00902
00903
00904
00905
00906 const WN *clause;
00907
00908 Is_True(WN_operator(*next) == OPR_XPRAGMA,
00909 ("Unexpected operator %d in Append_Array_Segment()",
00910 WN_operator(*next)));
00911
00912 Append_Token_Special(tokens, '(');
00913 for (clause = *next;
00914 (clause != NULL &&
00915 WN_operator(clause) == OPR_XPRAGMA &&
00916 WN_pragma(clause) == id);
00917 clause = WN_next(clause))
00918 {
00919 if (clause != *next)
00920 Append_Token_Special(tokens, ',');
00921
00922 Append_A_Clause_Symbol(tokens, clause, 0);
00923 Append_Token_Special(tokens, '(');
00924 EMIT_ARG_NUMBERS1(tokens, 0);
00925 Append_Token_Special(tokens, ':');
00926 WN2C_Append_Value_Reference(tokens, WN_kid0(clause));
00927 Append_Token_Special(tokens, '-');
00928 EMIT_ARG_NUMBERS1(tokens, 1);
00929 Append_Token_Special(tokens, ')');
00930 }
00931 Append_Token_Special(tokens, ')');
00932
00933 *next = clause;
00934 }
00935
00936
00937 static void
00938 Append_Nest_Clauses(TOKEN_BUFFER tokens,
00939 const WN *nest_region,
00940 INT nest_levels,
00941 CONTEXT context)
00942 {
00943 BOOL pattern_error = FALSE;
00944 INT nest;
00945 const ST *idx_var;
00946 TY_IDX idx_ty;
00947 const WN *next_stmt = nest_region;
00948 WN_PRAGMA_ID nest_kind = WN_PRAGMA_UNDEFINED;
00949 TOKEN_BUFFER nest_tokens = New_Token_Buffer();
00950
00951 Is_True(next_stmt != NULL &&
00952 WN_operator(next_stmt) == OPR_REGION &&
00953 WN_first(WN_region_pragmas(next_stmt)) != NULL,
00954 ("Unexpected top-level structure for Append_Nest_Clauses()"));
00955
00956 nest_kind =
00957 (WN_PRAGMA_ID)WN_pragma(WN_first(WN_region_pragmas(next_stmt)));
00958
00959 Append_Clause_Newline(tokens, context);
00960 Append_Token_String(nest_tokens, "nest");
00961 Append_Token_Special(nest_tokens, '(');
00962 CONTEXT_reset(context);
00963 for (nest = 1; !pattern_error && nest <= nest_levels; nest++)
00964 {
00965
00966
00967
00968 next_stmt = WN_first(WN_region_body(next_stmt));
00969 while (next_stmt != NULL && WN_operator(next_stmt) != OPR_DO_LOOP)
00970 next_stmt = WN_next(next_stmt);
00971
00972 if (next_stmt == NULL)
00973 pattern_error = TRUE;
00974 else
00975 {
00976
00977
00978 idx_var = WN_st(WN_index(next_stmt));
00979 idx_ty = ST_type(idx_var);
00980 if (ST_sym_class(idx_var) == CLASS_PREG)
00981 {
00982 ST2C_Use_Preg(nest_tokens,
00983 idx_ty,
00984 WN_idname_offset(WN_index(next_stmt)),
00985 context);
00986 }
00987 else
00988 {
00989 TY_IDX object_ty;
00990 TOKEN_BUFFER sym_tokens = New_Token_Buffer();
00991
00992 WN2C_stid_lhs(sym_tokens,
00993 &object_ty,
00994 idx_var,
00995 WN_idname_offset(WN_index(next_stmt)),
00996 idx_ty,
00997 TY_mtype(idx_ty),
00998 context);
00999 Append_And_Reclaim_Token_List(nest_tokens, &sym_tokens);
01000 }
01001
01002
01003
01004
01005 if (nest < nest_levels)
01006 {
01007 Append_Token_Special(nest_tokens, ',');
01008
01009 next_stmt = WN_first(WN_do_body(next_stmt));
01010 while (next_stmt != NULL &&
01011 WN_operator(next_stmt) != OPR_REGION)
01012 next_stmt = WN_next(next_stmt);
01013
01014 if (next_stmt == NULL ||
01015 WN_first(WN_region_pragmas(next_stmt)) == NULL ||
01016 WN_pragma(WN_first(WN_region_pragmas(next_stmt))) !=
01017 nest_kind)
01018 pattern_error = TRUE;
01019 }
01020 }
01021 }
01022 Append_Token_Special(nest_tokens, ')');
01023
01024 if (!pattern_error)
01025 Append_And_Reclaim_Token_List(tokens, &nest_tokens);
01026 }
01027
01028
01029 static void
01030 Skip_Pragma_Clauses(const WN **clause_list,
01031 CONTEXT context)
01032 {
01033
01034
01035 const WN *clause = *clause_list;
01036 BOOL more;
01037
01038 more = (clause != NULL &&
01039 (WN_operator(clause) == OPR_PRAGMA ||
01040 WN_operator(clause) == OPR_XPRAGMA));
01041
01042 while (more)
01043 {
01044 switch (WN_pragma(clause))
01045 {
01046 case WN_PRAGMA_AFFINITY:
01047 case WN_PRAGMA_DATA_AFFINITY:
01048 case WN_PRAGMA_THREAD_AFFINITY:
01049 case WN_PRAGMA_CHUNKSIZE:
01050 case WN_PRAGMA_IF:
01051 case WN_PRAGMA_LASTLOCAL:
01052 case WN_PRAGMA_LOCAL:
01053 case WN_PRAGMA_MPSCHEDTYPE:
01054 case WN_PRAGMA_ORDERED:
01055 case WN_PRAGMA_REDUCTION:
01056 case WN_PRAGMA_SHARED:
01057 case WN_PRAGMA_ONTO:
01058 case WN_PRAGMA_LASTTHREAD:
01059 case WN_PRAGMA_MPNUM:
01060 case WN_PRAGMA_SYNC_DOACROSS:
01061 case WN_PRAGMA_FIRSTPRIVATE:
01062 case WN_PRAGMA_NOWAIT:
01063 clause = WN_next(clause);
01064 break;
01065
01066 default:
01067 more = FALSE;
01068 break;
01069 }
01070
01071 more = (more &&
01072 clause != NULL &&
01073 (WN_operator(clause) == OPR_PRAGMA ||
01074 WN_operator(clause) == OPR_XPRAGMA));
01075 }
01076
01077 *clause_list = clause;
01078 }
01079
01080
01081 static void
01082 Skip_Ignored_Clauses(const WN *following_clauses, const WN **next_clause)
01083 {
01084 BOOL skipped = TRUE;
01085
01086 while (skipped && *next_clause != following_clauses)
01087 {
01088 switch (WN_pragma(*next_clause))
01089 {
01090 case WN_PRAGMA_DATA_AFFINITY:
01091 case WN_PRAGMA_THREAD_AFFINITY:
01092 case WN_PRAGMA_MPNUM:
01093 case WN_PRAGMA_SYNC_DOACROSS:
01094 *next_clause = WN_next(*next_clause);
01095 break;
01096 default:
01097 skipped = FALSE;
01098 break;
01099 }
01100 }
01101 }
01102
01103
01104 static void
01105 Append_Pragma_Clauses(TOKEN_BUFFER tokens,
01106 const WN **clause_list,
01107 CONTEXT context)
01108 {
01109
01110
01111
01112
01113
01114
01115
01116
01117
01118 const WN *next;
01119 const WN *clause = *clause_list;
01120 const WN *wn_after_clauses = *clause_list;
01121
01122 Skip_Pragma_Clauses(&wn_after_clauses, context);
01123 while (clause != wn_after_clauses)
01124 {
01125
01126
01127 BOOL omp = CONTEXT_omp(context) || WN2C_is_omp(clause);
01128
01129 next = clause;
01130 switch (WN_pragma(clause))
01131 {
01132 case WN_PRAGMA_DATA_AFFINITY:
01133 case WN_PRAGMA_THREAD_AFFINITY:
01134 case WN_PRAGMA_MPNUM:
01135 case WN_PRAGMA_SYNC_DOACROSS:
01136 break;
01137
01138 case WN_PRAGMA_NOWAIT:
01139 Append_Clause_Newline(tokens, context);
01140 Append_Token_String(tokens, "nowait");
01141 clause = WN_next(clause);
01142 break;
01143
01144 case WN_PRAGMA_AFFINITY:
01145 Append_Clause_Newline(tokens, context);
01146 Append_Token_String(tokens, "affinity");
01147 Append_Clause_Expressions(tokens, WN_PRAGMA_AFFINITY, &clause);
01148
01149 Append_Token_Special(tokens, '=');
01150 if (WN_pragma(clause) == WN_PRAGMA_DATA_AFFINITY)
01151 Append_Token_String(tokens, "data");
01152 else if (WN_pragma(clause) == WN_PRAGMA_THREAD_AFFINITY)
01153 Append_Token_String(tokens, "thread");
01154 else
01155 Is_True(FALSE,
01156 ("Unexpected clause kind (%d) in Append_Pragma_Clauses()",
01157 WN_pragma(clause)));
01158
01159
01160
01161
01162 Append_Token_Special(tokens, '(');
01163 WN2C_Append_Value_Reference(tokens, WN_kid0(clause));
01164 Append_Token_Special(tokens, ')');
01165 clause = WN_next(clause);
01166 break;
01167
01168 case WN_PRAGMA_CHUNKSIZE:
01169 Append_Clause_Newline(tokens, context);
01170 Append_Token_String(tokens, "chunksize");
01171 Append_Clause_Expressions(tokens, WN_PRAGMA_CHUNKSIZE, &clause);
01172 break;
01173
01174 case WN_PRAGMA_IF:
01175 Append_Clause_Newline(tokens, context);
01176 Append_Token_String(tokens, "if");
01177 Append_Clause_Expressions(tokens, WN_PRAGMA_IF, &clause);
01178 break;
01179
01180 case WN_PRAGMA_LASTLOCAL:
01181 Append_Clause_Newline(tokens, context);
01182 if (omp)
01183 Append_Token_String(tokens, "lastprivate");
01184 else
01185 Append_Token_String(tokens, "lastlocal");
01186 Append_Clause_Symbols(tokens, WN_PRAGMA_LASTLOCAL, &clause);
01187 break;
01188
01189 case WN_PRAGMA_LOCAL:
01190 Append_Clause_Newline(tokens, context);
01191 if (omp)
01192 Append_Token_String(tokens, "private");
01193 else
01194 Append_Token_String(tokens, "local");
01195 if (WN_operator(clause) == OPR_XPRAGMA)
01196 {
01197 Append_Array_Segment(tokens, WN_PRAGMA_LOCAL, &clause);
01198 }
01199 else
01200 {
01201 Append_Clause_Symbols(tokens, WN_PRAGMA_LOCAL, &clause);
01202 }
01203 break;
01204
01205 case WN_PRAGMA_MPSCHEDTYPE:
01206
01207 if (omp)
01208 {
01209 Append_Clause_Newline(tokens, context);
01210 Append_Token_String(tokens, "schedule");
01211 Append_Token_Special(tokens, '(');
01212 Append_MP_Schedtype(tokens, WN_mp_schedtype(clause));
01213 if (WN_next(clause) != NULL &&
01214 WN_pragma(WN_next(clause)) == WN_PRAGMA_CHUNKSIZE)
01215 {
01216 clause = WN_next(clause);
01217 Append_Token_Special(tokens, ',');
01218 WN2C_Append_Value_Reference(tokens, WN_kid0(clause));
01219 }
01220 Append_Token_Special(tokens, ')');
01221 clause = WN_next(clause);
01222 }
01223 else
01224 {
01225 Append_Token_String(tokens, "schedtype");
01226 Append_Token_Special(tokens, '(');
01227 Append_MP_Schedtype(tokens, WN_mp_schedtype(clause));
01228 Append_Token_Special(tokens, ')');
01229 }
01230 break;
01231
01232 case WN_PRAGMA_ORDERED:
01233 Append_Clause_Newline(tokens, context);
01234 if (omp)
01235 Append_Token_String(tokens, "(ordered)");
01236 else
01237 Append_Token_String(tokens, "ordered");
01238 break;
01239
01240 case WN_PRAGMA_REDUCTION:
01241 Append_Clause_Newline(tokens, context);
01242 if (WN_operator(clause) == OPR_XPRAGMA)
01243 {
01244 Append_Token_String(tokens, "reduction");
01245 Append_Clause_Expressions(tokens, WN_PRAGMA_REDUCTION, &clause);
01246 }
01247 else
01248 {
01249 Append_Reduction_Clause(tokens, WN_PRAGMA_REDUCTION, &clause);
01250 }
01251 break;
01252
01253 case WN_PRAGMA_SHARED:
01254 Append_Clause_Newline(tokens, context);
01255 Append_Token_String(tokens, "shared");
01256 Append_Clause_Symbols(tokens, WN_PRAGMA_SHARED, &clause);
01257 break;
01258
01259 case WN_PRAGMA_ONTO:
01260 Append_Clause_Newline(tokens, context);
01261 Append_Token_String(tokens, "onto");
01262 Append_Clause_Expressions(tokens, WN_PRAGMA_ONTO, &clause);
01263 break;
01264
01265 case WN_PRAGMA_LASTTHREAD:
01266 Append_Clause_Newline(tokens, context);
01267 Append_Token_String(tokens, "lastthread");
01268 Append_Clause_Symbols(tokens, WN_PRAGMA_LASTTHREAD, &clause);
01269 break;
01270
01271 case WN_PRAGMA_FIRSTPRIVATE:
01272 Append_Token_String(tokens, "firstprivate");
01273 Append_Clause_Symbols(tokens, WN_PRAGMA_FIRSTPRIVATE, &clause);
01274 break;
01275
01276 default:
01277 Is_True(FALSE,
01278 ("Unexpected pragma id in Append_Pragma_Clauses()"));
01279 break;
01280 }
01281
01282
01283
01284
01285
01286 if (next == clause)
01287 clause = WN_next(clause);
01288
01289 Skip_Ignored_Clauses(wn_after_clauses, &clause);
01290 }
01291
01292 *clause_list = clause;
01293 }
01294
01295
01296 static void
01297 Emit_To_PUinfo_Pragmas(const WN **next, CONTEXT context)
01298 {
01299
01300
01301
01302
01303 TOKEN_BUFFER tokens = New_Token_Buffer();
01304
01305 Is_True(WN_operator(*next) == OPR_PRAGMA ||
01306 WN_operator(*next) == OPR_XPRAGMA,
01307 ("Unexpected operator (%d) in WN2C_pragma()", WN_operator(*next)));
01308
01309 switch (WN_pragma(*next))
01310 {
01311 case WN_PRAGMA_DISTRIBUTE:
01312 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01313 Append_Token_String(tokens, "distribute");
01314 Append_A_Clause_Symbol(tokens, *next, 0);
01315 Append_Distribution(tokens, next, WN_PRAGMA_DISTRIBUTE);
01316 Append_Pragma_Clauses(tokens, next, context);
01317 break;
01318
01319 case WN_PRAGMA_DISTRIBUTE_RESHAPE:
01320 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01321 Append_Token_String(tokens, "distribute reshape");
01322 Append_A_Clause_Symbol(tokens, *next, 0);
01323 Append_Distribution(tokens, next, WN_PRAGMA_DISTRIBUTE_RESHAPE);
01324 Append_Pragma_Clauses(tokens, next, context);
01325 break;
01326
01327 default:
01328 Is_True(FALSE,
01329 ("Unexpected pragma id in Emit_To_PUinfo_Pragmas()"));
01330 break;
01331 }
01332 Prepend_And_Reclaim_Token_List(PUinfo_pragmas, &tokens);
01333 }
01334
01335
01336 static const WN *
01337 Get_Enclosing_Parallel_Region(const WN *construct)
01338 {
01339 WN *found_parallel = NULL;
01340
01341 construct = W2CF_Get_Parent(construct);
01342 while (found_parallel == NULL && construct != NULL)
01343 {
01344 if (WN_operator(construct) == OPR_REGION)
01345 {
01346 WN *pragma = WN_first(WN_region_pragmas(construct));
01347 if (WN_pragma(pragma) == WN_PRAGMA_PARALLEL_BEGIN)
01348 found_parallel = pragma;
01349 }
01350 construct = W2CF_Get_Parent(construct);
01351 }
01352 return found_parallel;
01353 }
01354
01355
01356 static void
01357 WN2C_process_pragma(TOKEN_BUFFER tokens, const WN **next, CONTEXT context)
01358 {
01359
01360
01361
01362
01363 const WN *apragma = *next;
01364 const WN *this_pragma = apragma;
01365 const WN *first_clause;
01366 const WN *surrounding_region;
01367
01368 Is_True(WN_operator(apragma) == OPR_PRAGMA ||
01369 WN_operator(apragma) == OPR_XPRAGMA,
01370 ("Invalid operator for WN2C_process_pragma()"));
01371
01372
01373
01374
01375 if (WN2C_is_omp(apragma))
01376 CONTEXT_set_omp(context);
01377
01378 switch (WN_pragma(apragma))
01379 {
01380 case WN_PRAGMA_INLINE_DEPTH:
01381 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01382 Append_Token_String(tokens,"inline_depth");
01383 Append_Token_Special(tokens,'(');
01384 EMIT_ARG_NUMBERS1(tokens, WN_pragma_arg1(apragma));
01385 Append_Token_Special(tokens,')');
01386 break;
01387
01388 case WN_PRAGMA_AGGRESSIVE_INNER_LOOP_FISSION:
01389 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01390 Append_Token_String(tokens,"aggressive inner loop fission");
01391 break;
01392
01393 case WN_PRAGMA_FISSION:
01394 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01395 Append_Token_String(tokens,"fission");
01396 PARENTHESIZE_ARG_NUMBERS1(tokens, WN_pragma_arg1(apragma));
01397 break;
01398
01399 case WN_PRAGMA_FISSIONABLE:
01400 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01401 Append_Token_String(tokens,"fissionable");
01402 break;
01403
01404 case WN_PRAGMA_FUSE:
01405 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01406 Append_Token_String(tokens,"fuse");
01407 PARENTHESIZE_ARG_NUMBERS2(tokens,
01408 WN_pragma_arg1(apragma),
01409 WN_pragma_arg2(apragma));
01410 break;
01411
01412 case WN_PRAGMA_FUSEABLE:
01413 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01414 Append_Token_String(tokens,"fusable");
01415 break;
01416
01417 case WN_PRAGMA_NO_FISSION:
01418 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01419 Append_Token_String(tokens,"no fission");
01420 break;
01421
01422 case WN_PRAGMA_NO_FUSION:
01423 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01424 Append_Token_String(tokens,"no fusion");
01425 break;
01426
01427 case WN_PRAGMA_INTERCHANGE:
01428 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01429 Append_Token_String(tokens, "interchange");
01430 Append_Clause_Symbols(tokens, (WN_PRAGMA_ID)WN_pragma(apragma),
01431 &apragma);
01432 break;
01433
01434 case WN_PRAGMA_NO_INTERCHANGE:
01435 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01436 Append_Token_String(tokens, "no interchange");
01437 break;
01438
01439 case WN_PRAGMA_BLOCKING_SIZE:
01440 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01441 Append_Token_String(tokens, "blocking size");
01442 PARENTHESIZE_ARG_NUMBERS2(tokens,
01443 WN_pragma_arg1(apragma),
01444 WN_pragma_arg2(apragma));
01445 break;
01446
01447 case WN_PRAGMA_NO_BLOCKING:
01448 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01449 Append_Token_String(tokens, "no blocking");
01450 break;
01451
01452 case WN_PRAGMA_UNROLL:
01453 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01454 Append_Token_String(tokens, "unroll");
01455 PARENTHESIZE_ARG_NUMBERS2(tokens,
01456 WN_pragma_arg1(apragma),
01457 WN_pragma_arg2(apragma));
01458 break;
01459
01460 case WN_PRAGMA_BLOCKABLE:
01461 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01462 Append_Token_String(tokens, "blockable");
01463 Append_Clause_Symbols(tokens, (WN_PRAGMA_ID)WN_pragma(apragma),
01464 &apragma);
01465 break;
01466
01467 case WN_PRAGMA_PREFETCH:
01468 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01469 Append_Token_String(tokens, "prefetch");
01470 PARENTHESIZE_ARG_NUMBERS2(tokens,
01471 WN_pragma_arg1(apragma),
01472 WN_pragma_arg2(apragma));
01473 break;
01474
01475 case WN_PRAGMA_PREFETCH_MANUAL:
01476 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01477 Append_Token_String(tokens, "prefetch_manual");
01478 PARENTHESIZE_ARG_NUMBERS1(tokens, WN_pragma_arg1(apragma));
01479 break;
01480
01481 case WN_PRAGMA_PREFETCH_REF:
01482 if (WN_next(apragma) != NULL &&
01483 WN_operator(WN_next(apragma)) == OPR_PREFETCH)
01484 {
01485 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01486 Append_Token_String(tokens, "prefetch_ref");
01487 Append_Prefetch_Attributes(tokens,
01488 WN_next(apragma),
01489 WN_pragma_arg2(apragma));
01490 }
01491 break;
01492
01493 case WN_PRAGMA_PREFETCH_REF_DISABLE:
01494 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01495 Append_Token_String(tokens, "prefetch_ref_disable");
01496 Append_Token_Special(tokens, '=');
01497 Append_A_Clause_Symbol(tokens, apragma, 0);
01498 if (WN_pragma_arg2(apragma) > 0)
01499 {
01500 Append_Token_Special(tokens, ',');
01501 Append_Token_String(tokens, "size");
01502 Append_Token_Special(tokens, '=');
01503 EMIT_ARG_NUMBERS1(tokens, WN_pragma_arg2(apragma));
01504 }
01505 break;
01506
01507 case WN_PRAGMA_DISTRIBUTE:
01508 Emit_To_PUinfo_Pragmas(&apragma, context);
01509 break;
01510
01511 case WN_PRAGMA_REDISTRIBUTE:
01512 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01513 Append_Token_String(tokens, "redistribute");
01514 Append_A_Clause_Symbol(tokens, apragma, 0);
01515 Append_Distribution(tokens, &apragma, WN_PRAGMA_REDISTRIBUTE);
01516 Append_Pragma_Clauses(tokens, &apragma, context);
01517 break;
01518
01519 case WN_PRAGMA_DISTRIBUTE_RESHAPE:
01520 Emit_To_PUinfo_Pragmas(&apragma, context);
01521 break;
01522
01523 case WN_PRAGMA_DYNAMIC:
01524 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01525 Append_Token_String(tokens, "dynamic");
01526 Append_A_Clause_Symbol(tokens, apragma, 0);
01527 break;
01528
01529 case WN_PRAGMA_IVDEP:
01530 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01531 Append_Token_String(tokens, "ivdep");
01532 break;
01533
01534 case WN_PRAGMA_DOACROSS:
01535
01536
01537 if (WN_pragma_nest(apragma) <= 0 &&
01538 !Ignore_Synchronized_Construct(apragma, context))
01539 {
01540 surrounding_region = W2CF_Get_Parent(W2CF_Get_Parent(apragma));
01541 first_clause = WN_next(apragma);
01542
01543 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01544 Append_Token_String(tokens, "parallel");
01545 WN2C_Stmt_Newline(tokens, CONTEXT_srcpos(context));
01546 Append_Token_Special(tokens, '{');
01547 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01548 Append_Token_String(tokens, "pfor");
01549 if (WN_max_nest_level(apragma) > 1)
01550 Append_Nest_Clauses(tokens,
01551 surrounding_region,
01552 WN_max_nest_level(apragma),
01553 context);
01554 apragma = first_clause;
01555 Append_Pragma_Clauses(tokens, &apragma, context);
01556 Append_Implicit_Locals(tokens,
01557 WN_PRAGMA_DOACROSS,
01558 WN_region_body(surrounding_region),
01559 first_clause,
01560 context);
01561 Increment_Indentation();
01562 }
01563 else
01564 {
01565 apragma = WN_next(apragma);
01566 Skip_Pragma_Clauses(&apragma, context);
01567 }
01568 break;
01569
01570 case WN_PRAGMA_MPSCHEDTYPE:
01571
01572
01573 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01574 if (CONTEXT_omp(context))
01575 {
01576 Append_Clause_Newline(tokens, context);
01577 Append_Token_String(tokens, "schedule");
01578 Append_Token_Special(tokens, '(');
01579 Append_MP_Schedtype(tokens, WN_mp_schedtype(apragma));
01580 if (WN_next(apragma) != NULL &&
01581 WN_pragma(WN_next(apragma)) == WN_PRAGMA_CHUNKSIZE)
01582 {
01583 apragma = WN_next(apragma);
01584 Append_Token_Special(tokens, ',');
01585 WN2C_Append_Value_Reference(tokens, WN_kid0(apragma));
01586 }
01587 Append_Token_Special(tokens, ')');
01588 apragma = WN_next(apragma);
01589 }
01590 else
01591 {
01592 Append_Token_String(tokens, "mp_schedtype");
01593 Append_Token_Special(tokens, '(');
01594 Append_MP_Schedtype(tokens, WN_mp_schedtype(apragma));
01595 Append_Token_Special(tokens, ')');
01596 }
01597 break;
01598
01599 case WN_PRAGMA_BARRIER:
01600 if (W2C_Prompf_Emission)
01601 WN2C_Start_Prompf_Construct(tokens, apragma);
01602 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01603 if (CONTEXT_omp(context))
01604 Append_Token_String(tokens, "omp barrier");
01605 else
01606 Append_Token_String(tokens, "synchronize");
01607 if (W2C_Prompf_Emission)
01608 WN2C_End_Prompf_Construct(tokens, apragma);
01609 break;
01610
01611 case WN_PRAGMA_COPYIN:
01612 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01613 if (CONTEXT_omp(context))
01614 Append_Token_String(tokens, "omp copyin");
01615 else
01616 Append_Token_String(tokens, "copyin");
01617 if (WN_operator(apragma) == OPR_XPRAGMA)
01618 Append_Clause_Expressions(tokens,
01619 (WN_PRAGMA_ID)WN_pragma(apragma),
01620 &apragma);
01621 else
01622 {
01623 ST2C_use_translate(tokens, WN_st(apragma), context);
01624 }
01625 break;
01626
01627 case WN_PRAGMA_CRITICAL_SECTION_BEGIN:
01628 if (W2C_Prompf_Emission)
01629 WN2C_Start_Prompf_Construct(tokens, apragma);
01630 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01631 if (CONTEXT_omp(context))
01632 Append_Token_String(tokens, "omp critical");
01633 else
01634 Append_Token_String(tokens, "critical");
01635 if (WN_operator(apragma) == OPR_XPRAGMA)
01636 Append_Clause_Expressions(tokens,
01637 (WN_PRAGMA_ID)WN_pragma(apragma),
01638 &apragma);
01639 WN2C_Stmt_Newline(tokens, CONTEXT_srcpos(context));
01640 Append_Token_Special(tokens, '{');
01641 Increment_Indentation();
01642 break;
01643
01644 case WN_PRAGMA_CRITICAL_SECTION_END:
01645 Decrement_Indentation();
01646 WN2C_Stmt_Newline(tokens, CONTEXT_srcpos(context));
01647 Append_Token_Special(tokens, '}');
01648 if (W2C_Prompf_Emission)
01649 WN2C_End_Prompf_Construct(tokens, apragma);
01650 break;
01651
01652 case WN_PRAGMA_ORDERED_BEGIN:
01653 if (W2C_Prompf_Emission)
01654 WN2C_Start_Prompf_Construct(tokens, apragma);
01655 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01656 Append_Token_String(tokens, "omp ordered");
01657 if (WN_operator(apragma) == OPR_XPRAGMA)
01658 Append_Clause_Expressions(tokens,
01659 (WN_PRAGMA_ID)WN_pragma(apragma),
01660 &apragma);
01661 WN2C_Stmt_Newline(tokens, CONTEXT_srcpos(context));
01662 Append_Token_Special(tokens, '{');
01663 Increment_Indentation();
01664 break;
01665
01666 case WN_PRAGMA_ORDERED_END:
01667 Decrement_Indentation();
01668 WN2C_Stmt_Newline(tokens, CONTEXT_srcpos(context));
01669 Append_Token_Special(tokens, '}');
01670 if (W2C_Prompf_Emission)
01671 WN2C_End_Prompf_Construct(tokens, apragma);
01672 break;
01673
01674 case WN_PRAGMA_ATOMIC:
01675 if (W2C_Prompf_Emission)
01676 WN2C_Start_Prompf_Construct(tokens, apragma);
01677 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01678 Append_Token_String(tokens, "omp atomic");
01679 if (WN_operator(apragma) == OPR_XPRAGMA)
01680 Append_Clause_Expressions(tokens,
01681 (WN_PRAGMA_ID)WN_pragma(apragma),
01682 &apragma);
01683 if (W2C_Prompf_Emission)
01684 WN2C_End_Prompf_Construct(tokens, this_pragma);
01685 break;
01686
01687 case WN_PRAGMA_PARALLEL_BEGIN:
01688 if (!Ignore_Synchronized_Construct(apragma, context))
01689 {
01690 surrounding_region = W2CF_Get_Parent(W2CF_Get_Parent(apragma));
01691 first_clause = WN_next(apragma);
01692
01693 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01694 if (CONTEXT_omp(context))
01695 Append_Token_String(tokens, "omp parallel");
01696 else
01697 Append_Token_String(tokens, "parallel");
01698 apragma = first_clause;
01699 Append_Pragma_Clauses(tokens, &apragma, context);
01700 Append_Implicit_Locals(tokens,
01701 WN_PRAGMA_PARALLEL_BEGIN,
01702 WN_region_body(surrounding_region),
01703 first_clause,
01704 context);
01705 WN2C_Stmt_Newline(tokens, CONTEXT_srcpos(context));
01706 Append_Token_Special(tokens, '{');
01707 Increment_Indentation();
01708 }
01709 break;
01710
01711 case WN_PRAGMA_PARALLEL_DO:
01712
01713
01714 if (WN_pragma_nest(apragma) <= 0 &&
01715 !Ignore_Synchronized_Construct(apragma, context))
01716 {
01717 surrounding_region = W2CF_Get_Parent(W2CF_Get_Parent(apragma));
01718 first_clause = WN_next(apragma);
01719
01720 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01721 if (CONTEXT_omp(context))
01722 {
01723 Append_Token_String(tokens, "omp parallel for");
01724 }
01725 else
01726 {
01727 Append_Token_String(tokens, "parallel");
01728 WN2C_Stmt_Newline(tokens, CONTEXT_srcpos(context));
01729 Append_Token_Special(tokens, '{');
01730 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01731 Append_Token_String(tokens, "pfor");
01732 }
01733 if (WN_max_nest_level(apragma) > 1)
01734 Append_Nest_Clauses(tokens,
01735 surrounding_region,
01736 WN_max_nest_level(apragma),
01737 context);
01738 apragma = first_clause;
01739 Append_Pragma_Clauses(tokens, &apragma, context);
01740 Append_Implicit_Locals(tokens,
01741 WN_PRAGMA_PARALLEL_DO,
01742 WN_region_body(surrounding_region),
01743 first_clause,
01744 context);
01745
01746 if (CONTEXT_omp(context))
01747 {
01748 WN2C_Stmt_Newline(tokens, CONTEXT_srcpos(context));
01749 Append_Token_Special(tokens, '{');
01750 }
01751 Increment_Indentation();
01752 }
01753 else
01754 {
01755 apragma = WN_next(apragma);
01756 Skip_Pragma_Clauses(&apragma, context);
01757 }
01758 break;
01759
01760 case WN_PRAGMA_PDO_BEGIN:
01761
01762
01763 if (WN_pragma_nest(apragma) == 0 &&
01764 !Ignore_Synchronized_Construct(apragma, context))
01765 {
01766 surrounding_region = W2CF_Get_Parent(W2CF_Get_Parent(apragma));
01767 first_clause = WN_next(apragma);
01768
01769 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01770 if (CONTEXT_omp(context))
01771 Append_Token_String(tokens, "omp for");
01772 else
01773 Append_Token_String(tokens, "pfor");
01774 if (WN_max_nest_level(apragma) > 1)
01775 Append_Nest_Clauses(tokens,
01776 surrounding_region,
01777 WN_max_nest_level(apragma),
01778 context);
01779 apragma = first_clause;
01780 Append_Pragma_Clauses(tokens, &apragma, context);
01781
01782
01783
01784
01785
01786
01787
01788
01789
01790
01791
01792 }
01793 else
01794 {
01795 apragma = WN_next(apragma);
01796 Skip_Pragma_Clauses(&apragma, context);
01797 }
01798 break;
01799
01800 case WN_PRAGMA_PARALLEL_SECTIONS:
01801 case WN_PRAGMA_PSECTION_BEGIN:
01802 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01803 if (CONTEXT_omp(context))
01804 Append_Token_String(tokens, "omp parallel sections");
01805 else
01806 Append_Token_String(tokens, "psections");
01807 apragma = WN_next(apragma);
01808 Append_Pragma_Clauses(tokens, &apragma, context);
01809 WN2C_Stmt_Newline(tokens, CONTEXT_srcpos(context));
01810 Append_Token_Special(tokens, '{');
01811 Increment_Indentation();
01812 break;
01813
01814 case WN_PRAGMA_ENTER_GATE:
01815 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01816 Append_Token_String(tokens, "enter gate");
01817 break;
01818
01819 case WN_PRAGMA_EXIT_GATE:
01820 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01821 Append_Token_String(tokens, "exit gate");
01822 break;
01823
01824 case WN_PRAGMA_INDEPENDENT_BEGIN:
01825 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01826 Append_Token_String(tokens, "independent");
01827 apragma = WN_next(apragma);
01828 Append_Pragma_Clauses(tokens, &apragma, context);
01829 WN2C_Stmt_Newline(tokens, CONTEXT_srcpos(context));
01830 Append_Token_Special(tokens, '{');
01831 Increment_Indentation();
01832 break;
01833
01834 case WN_PRAGMA_INDEPENDENT_END:
01835 Decrement_Indentation();
01836 WN2C_Stmt_Newline(tokens, CONTEXT_srcpos(context));
01837 Append_Token_Special(tokens, '}');
01838 break;
01839
01840 case WN_PRAGMA_SECTION:
01841 if (W2C_Prompf_Emission)
01842 {
01843 if (WN2C_Prompf_Subsection != NULL)
01844 {
01845
01846
01847 WN2C_End_Prompf_Construct(tokens, WN2C_Prompf_Subsection);
01848 }
01849 WN2C_Prompf_Subsection = apragma;
01850 WN2C_Start_Prompf_Construct(tokens, apragma);
01851 }
01852 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01853 if (CONTEXT_omp(context))
01854 Append_Token_String(tokens, "omp section");
01855 else
01856 Append_Token_String(tokens, "section");
01857 break;
01858
01859 case WN_PRAGMA_SINGLE_PROCESS_BEGIN:
01860 if (!Ignore_Synchronized_Construct(apragma, context))
01861 {
01862 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01863 if (CONTEXT_omp(context))
01864 Append_Token_String(tokens, "omp single");
01865 else
01866 Append_Token_String(tokens, "one processor");
01867 apragma = WN_next(apragma);
01868 Append_Pragma_Clauses(tokens, &apragma, context);
01869 WN2C_Stmt_Newline(tokens, CONTEXT_srcpos(context));
01870 Append_Token_Special(tokens, '{');
01871 Increment_Indentation();
01872 }
01873 break;
01874
01875 case WN_PRAGMA_MASTER_BEGIN:
01876 if (!Ignore_Synchronized_Construct(apragma, context))
01877 {
01878 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01879 if (CONTEXT_omp(context))
01880 Append_Token_String(tokens, "omp master");
01881 else
01882 Append_Token_String(tokens, "master process");
01883 }
01884 break;
01885
01886 case WN_PRAGMA_NUMTHREADS:
01887
01888
01889
01890 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01891 Append_Token_String(tokens, "numthreads");
01892 Append_Clause_Expressions(tokens,
01893 (WN_PRAGMA_ID)WN_pragma(apragma),
01894 &apragma);
01895 break;
01896
01897 case WN_PRAGMA_PAGE_PLACE:
01898 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01899 Append_Token_String(tokens, "page_place");
01900 Append_Clause_Expressions(tokens,
01901 (WN_PRAGMA_ID)WN_pragma(apragma),
01902 &apragma);
01903 break;
01904
01905 case WN_PRAGMA_NORECURRENCE:
01906 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01907 Append_Token_String(tokens, "no recurrence");
01908 break;
01909
01910 case WN_PRAGMA_NEXT_SCALAR:
01911 WN2C_Append_Pragma_Newline(tokens, CONTEXT_srcpos(context));
01912 Append_Token_String(tokens, "next scalar");
01913 break;
01914
01915 default:
01916
01917
01918
01919 break;
01920
01921 }
01922
01923
01924
01925
01926
01927 if (apragma == *next)
01928 *next = WN_next(apragma);
01929 else
01930 *next = apragma;
01931
01932 }
01933
01934
01935
01936
01937
01938
01939 BOOL
01940 WN2C_Skip_Pragma_Stmt(const WN *wn)
01941 {
01942
01943
01944
01945
01946 BOOL found = (Pragmas_To_Skip.array[Pragmas_To_Skip.start] == wn);
01947
01948 if (found)
01949 {
01950 if (Pragmas_To_Skip.end - Pragmas_To_Skip.start == 1)
01951 {
01952 Pragmas_To_Skip.start = Pragmas_To_Skip.end = 0;
01953 Pragmas_To_Skip.array[0] = NULL;
01954 }
01955 else
01956 {
01957 Pragmas_To_Skip.start++;
01958 }
01959 }
01960 return found;
01961 }
01962
01963
01964 STATUS
01965 WN2C_pragma(TOKEN_BUFFER tokens, const WN *wn, CONTEXT context)
01966 {
01967 const WN *skip;
01968 const WN *next = wn;
01969
01970 Is_True(WN_operator(wn) == OPR_PRAGMA || WN_operator(wn) == OPR_XPRAGMA,
01971 ("Invalid operator for WN2C_pragma()"));
01972
01973
01974
01975
01976 if (W2C_Purple_Emission && WN_pragma(wn) == WN_PRAGMA_PREAMBLE_END)
01977 {
01978
01979
01980 Append_Indented_Newline(tokens, 1);
01981 Append_Token_String(tokens, "<#PRP_XSYM:INIT_STMT");
01982 WN2C_Append_Purple_Funcinfo(tokens);
01983 Append_Token_String(tokens, "#>");
01984 next = WN_next(wn);
01985 }
01986 else
01987 {
01988 WN2C_process_pragma(tokens, &next, context);
01989 }
01990
01991 Is_True(Pragmas_To_Skip.end == 0,
01992 ("Unexpected index for Pragmas_To_Skip in WN2C_pragma()"));
01993
01994
01995
01996
01997 for (skip = WN_next(wn); skip != next; skip = WN_next(skip))
01998 {
01999 Is_True(Pragmas_To_Skip.end < MAX_PRAGMAS_TO_SKIP,
02000 ("Too many pragmas in sequence in WN2C_pragma()"));
02001
02002 Pragmas_To_Skip.array[Pragmas_To_Skip.end++] = skip;
02003 }
02004
02005 return EMPTY_STATUS;
02006 }
02007
02008
02009 STATUS
02010 WN2C_pragma_list_begin(TOKEN_BUFFER tokens,
02011 const WN *first_pragma,
02012 CONTEXT context)
02013 {
02014 const WN *next_pragma = first_pragma;
02015
02016 while (next_pragma != NULL)
02017 {
02018 if (WN_operator(next_pragma) == OPR_PRAGMA ||
02019 WN_operator(next_pragma) == OPR_XPRAGMA)
02020 WN2C_process_pragma(tokens, &next_pragma, context);
02021 else
02022 next_pragma = WN_next(next_pragma);
02023 }
02024 return EMPTY_STATUS;
02025 }
02026
02027
02028 STATUS
02029 WN2C_pragma_list_end(TOKEN_BUFFER tokens,
02030 const WN *first_pragma,
02031 CONTEXT context)
02032 {
02033
02034
02035 while (first_pragma != NULL &&
02036 WN_operator(first_pragma) != OPR_PRAGMA &&
02037 WN_operator(first_pragma) != OPR_XPRAGMA)
02038 {
02039 first_pragma = WN_next(first_pragma);
02040 }
02041
02042 if (first_pragma != NULL)
02043 {
02044 Is_True(WN_operator(first_pragma) == OPR_PRAGMA ||
02045 WN_operator(first_pragma) == OPR_XPRAGMA,
02046 ("Unexpected operator (%d) in WN2C_pragma_list_end()",
02047 WN_operator(first_pragma)));
02048
02049 switch (WN_pragma(first_pragma))
02050 {
02051
02052 case WN_PRAGMA_PARALLEL_BEGIN:
02053 if (!Ignore_Synchronized_Construct(first_pragma, context))
02054 {
02055 Decrement_Indentation();
02056 WN2C_Stmt_Newline(tokens, CONTEXT_srcpos(context));
02057 Append_Token_Special(tokens, '}');
02058 }
02059 break;
02060
02061 case WN_PRAGMA_DOACROSS:
02062 case WN_PRAGMA_PARALLEL_DO:
02063 if (WN_pragma_nest(first_pragma) <= 0 &&
02064 !Ignore_Synchronized_Construct(first_pragma, context))
02065 {
02066 Decrement_Indentation();
02067 WN2C_Stmt_Newline(tokens, CONTEXT_srcpos(context));
02068 Append_Token_Special(tokens, '}');
02069 }
02070 break;
02071
02072 case WN_PRAGMA_PARALLEL_SECTIONS:
02073 case WN_PRAGMA_PSECTION_BEGIN:
02074 Decrement_Indentation();
02075 WN2C_Stmt_Newline(tokens, CONTEXT_srcpos(context));
02076 Append_Token_Special(tokens, '}');
02077 if (WN2C_is_omp(first_pragma))
02078 {
02079 if (WN2C_Prompf_Subsection != NULL)
02080 {
02081
02082
02083 WN2C_End_Prompf_Construct(tokens, WN2C_Prompf_Subsection);
02084 WN2C_Prompf_Subsection = NULL;
02085 }
02086 }
02087 break;
02088
02089 case WN_PRAGMA_SINGLE_PROCESS_BEGIN:
02090 if (!Ignore_Synchronized_Construct(first_pragma, context))
02091 {
02092 Decrement_Indentation();
02093 WN2C_Stmt_Newline(tokens, CONTEXT_srcpos(context));
02094 Append_Token_Special(tokens, '}');
02095 }
02096 break;
02097
02098 default:
02099 break;
02100 }
02101 }
02102 return EMPTY_STATUS;
02103 }
02104
02105
02106 BOOL
02107 Ignore_Synchronized_Construct(const WN *construct_pragma,
02108 CONTEXT context)
02109 {
02110
02111
02112
02113
02114 BOOL ignore_construct;
02115
02116 Is_True(WN_operator(construct_pragma) == OPR_PRAGMA,
02117 ("Unexpected WHIRL tree in Ignore_Synchronized_Construct"));
02118
02119 if (!Run_w2fc_early)
02120 ignore_construct = FALSE;
02121 else
02122 {
02123 if (WN_pragma(construct_pragma) != WN_PRAGMA_DOACROSS)
02124 construct_pragma = Get_Enclosing_Parallel_Region(construct_pragma);
02125
02126 if (construct_pragma == NULL)
02127 ignore_construct = FALSE;
02128 else
02129 {
02130 const WN *clause = WN_next(construct_pragma);
02131 const WN *beyond_last_clause = clause;
02132
02133 Skip_Pragma_Clauses(&beyond_last_clause, context);
02134 while (clause != beyond_last_clause &&
02135 WN_pragma(clause) != WN_PRAGMA_SYNC_DOACROSS)
02136 clause = WN_next(clause);
02137 ignore_construct = (clause != beyond_last_clause);
02138 }
02139 }
02140 return ignore_construct;
02141 }
02142