Hi! This patch adds priority clause parsing to #pragma omp taskloop, and passes it through to GOMP_task (new argument, in hopefully backward compatible way) and GOMP_taskloop (we don't care about ABI here for now).
So, for priorities hopefully the only task left is write support in the library to choose preferrably higher priority tasks over lower priority ones. 2015-06-18 Jakub Jelinek <ja...@redhat.com> * omp-builtins.def (BUILT_IN_GOMP_TASK, BUILT_IN_GOMP_TASKLOOP, BUILT_IN_GOMP_TASKLOOP_ULL): Add priority argument (BT_INT). * gcc/builtin-types.def (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_BOOL_UINT_PTR, BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_LONG_LONG_LONG, BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_ULL_ULL_ULL): Removed. (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_BOOL_UINT_PTR_INT, BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_INT_LONG_LONG_LONG, BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_INT_ULL_ULL_ULL): New. * omp-low.c (expand_task_call): Add priority argument to GOMP_task* calls. Or in GOMP_TASK_FLAG_PRIORITY into flags if priority is present for GOMP_task call. gcc/c/ * c-parser.c (OMP_TASKLOOP_CLAUSE_MASK): Add priority clause. gcc/cp/ * parser.c (OMP_TASKLOOP_CLAUSE_MASK): Add priority clause. gcc/c-family/ * c-omp.c (c_omp_split_clauses): Split OMP_CLAUSE_PRIORITY to OMP_TASKLOOP. * c-common.c (DEF_FUNCTION_TYPE_9, DEF_FUNCTION_TYPE_11): Define. (DEF_FUNCTION_TYPE_10): Fix up a pasto. gcc/fortran/ * types.def (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_BOOL_UINT_PTR, BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_LONG_LONG_LONG, BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_ULL_ULL_ULL): Removed. (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_BOOL_UINT_PTR_INT, BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_INT_LONG_LONG_LONG, BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_INT_ULL_ULL_ULL): New. * gcc/fortran/f95-lang.c (DEF_FUNCTION_TYPE_9, DEF_FUNCTION_TYPE_11): Define. gcc/jit/ * jit-builtins.c (DEF_FUNCTION_TYPE_9, DEF_FUNCTION_TYPE_11): Define. (DEF_FUNCTION_TYPE_10): Fix up a pasto. gcc/lto/ * lto-lang.c (DEF_FUNCTION_TYPE_9, DEF_FUNCTION_TYPE_11): Define. (DEF_FUNCTION_TYPE_10): Fix up a pasto. gcc/testsuite/ * c-c++-common/gomp/priority-1.c: New test. include/ * gomp-constants.h (GOMP_TASK_FLAG_PRIORITY): Define. libgomp/ * libgomp_g.h (GOMP_task): Add priority argument to the prototype. (GOMP_taskloop, GOMP_taskloop_ull): New prototypes. * task.c (GOMP_task): Add priority argument. * taskloop.c (GOMP_taskloop): Likewise. --- gcc/gcc/omp-builtins.def.jj 2015-05-06 17:12:46.000000000 +0200 +++ gcc/gcc/omp-builtins.def 2015-06-17 18:51:36.924974446 +0200 @@ -233,13 +233,13 @@ DEF_GOMP_BUILTIN (BUILT_IN_GOMP_ORDERED_ DEF_GOMP_BUILTIN (BUILT_IN_GOMP_PARALLEL, "GOMP_parallel", BT_FN_VOID_OMPFN_PTR_UINT_UINT, ATTR_NOTHROW_LIST) DEF_GOMP_BUILTIN (BUILT_IN_GOMP_TASK, "GOMP_task", - BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_BOOL_UINT_PTR, + BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_BOOL_UINT_PTR_INT, ATTR_NOTHROW_LIST) DEF_GOMP_BUILTIN (BUILT_IN_GOMP_TASKLOOP, "GOMP_taskloop", - BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_LONG_LONG_LONG, + BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_INT_LONG_LONG_LONG, ATTR_NOTHROW_LIST) DEF_GOMP_BUILTIN (BUILT_IN_GOMP_TASKLOOP_ULL, "GOMP_taskloop_ull", - BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_ULL_ULL_ULL, + BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_INT_ULL_ULL_ULL, ATTR_NOTHROW_LIST) DEF_GOMP_BUILTIN (BUILT_IN_GOMP_SECTIONS_START, "GOMP_sections_start", BT_FN_UINT_UINT, ATTR_NOTHROW_LEAF_LIST) --- gcc/gcc/builtin-types.def.jj 2015-05-06 18:03:20.000000000 +0200 +++ gcc/gcc/builtin-types.def 2015-06-17 19:32:21.238604389 +0200 @@ -541,19 +541,20 @@ DEF_FUNCTION_TYPE_7 (BT_FN_VOID_INT_OMPF DEF_FUNCTION_TYPE_8 (BT_FN_VOID_OMPFN_PTR_UINT_LONG_LONG_LONG_LONG_UINT, BT_VOID, BT_PTR_FN_VOID_PTR, BT_PTR, BT_UINT, BT_LONG, BT_LONG, BT_LONG, BT_LONG, BT_UINT) -DEF_FUNCTION_TYPE_8 (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_BOOL_UINT_PTR, + +DEF_FUNCTION_TYPE_9 (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_BOOL_UINT_PTR_INT, BT_VOID, BT_PTR_FN_VOID_PTR, BT_PTR, BT_PTR_FN_VOID_PTR_PTR, BT_LONG, BT_LONG, - BT_BOOL, BT_UINT, BT_PTR) + BT_BOOL, BT_UINT, BT_PTR, BT_INT) -DEF_FUNCTION_TYPE_10 (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_LONG_LONG_LONG, +DEF_FUNCTION_TYPE_11 (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_INT_LONG_LONG_LONG, BT_VOID, BT_PTR_FN_VOID_PTR, BT_PTR, BT_PTR_FN_VOID_PTR_PTR, BT_LONG, BT_LONG, - BT_UINT, BT_LONG, BT_LONG, BT_LONG, BT_LONG) -DEF_FUNCTION_TYPE_10 (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_ULL_ULL_ULL, + BT_UINT, BT_LONG, BT_INT, BT_LONG, BT_LONG, BT_LONG) +DEF_FUNCTION_TYPE_11 (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_INT_ULL_ULL_ULL, BT_VOID, BT_PTR_FN_VOID_PTR, BT_PTR, BT_PTR_FN_VOID_PTR_PTR, BT_LONG, BT_LONG, - BT_UINT, BT_LONG, + BT_UINT, BT_LONG, BT_INT, BT_ULONGLONG, BT_ULONGLONG, BT_ULONGLONG) DEF_FUNCTION_TYPE_VAR_0 (BT_FN_VOID_VAR, BT_VOID) --- gcc/gcc/omp-low.c.jj 2015-06-17 12:10:30.000000000 +0200 +++ gcc/gcc/omp-low.c 2015-06-17 19:43:08.903751563 +0200 @@ -5788,6 +5788,7 @@ expand_task_call (struct omp_region *reg tree mergeable = find_omp_clause (clauses, OMP_CLAUSE_MERGEABLE); tree depend = find_omp_clause (clauses, OMP_CLAUSE_DEPEND); tree finalc = find_omp_clause (clauses, OMP_CLAUSE_FINAL); + tree priority = find_omp_clause (clauses, OMP_CLAUSE_PRIORITY); unsigned int iflags = (untied ? GOMP_TASK_FLAG_UNTIED : 0) @@ -5835,6 +5836,8 @@ expand_task_call (struct omp_region *reg iflags |= GOMP_TASK_FLAG_NOGROUP; ull = fd.iter_type == long_long_unsigned_type_node; } + else if (priority) + iflags |= GOMP_TASK_FLAG_PRIORITY; tree flags = build_int_cst (unsigned_type_node, iflags); @@ -5868,6 +5871,11 @@ expand_task_call (struct omp_region *reg depend = OMP_CLAUSE_DECL (depend); else depend = build_int_cst (ptr_type_node, 0); + if (priority) + priority = fold_convert (integer_type_node, + OMP_CLAUSE_PRIORITY_EXPR (priority)); + else + priority = integer_zero_node; gsi = gsi_last_bb (bb); tree t = gimple_omp_task_data_arg (entry_stmt); @@ -5886,16 +5894,16 @@ expand_task_call (struct omp_region *reg t = build_call_expr (ull ? builtin_decl_explicit (BUILT_IN_GOMP_TASKLOOP_ULL) : builtin_decl_explicit (BUILT_IN_GOMP_TASKLOOP), - 10, t1, t2, t3, + 11, t1, t2, t3, gimple_omp_task_arg_size (entry_stmt), gimple_omp_task_arg_align (entry_stmt), flags, - num_tasks, startvar, endvar, step); + num_tasks, priority, startvar, endvar, step); else t = build_call_expr (builtin_decl_explicit (BUILT_IN_GOMP_TASK), - 8, t1, t2, t3, + 9, t1, t2, t3, gimple_omp_task_arg_size (entry_stmt), gimple_omp_task_arg_align (entry_stmt), cond, flags, - depend); + depend, priority); force_gimple_operand_gsi (&gsi, t, true, NULL_TREE, false, GSI_CONTINUE_LINKING); --- gcc/gcc/c/c-parser.c.jj 2015-06-12 16:42:16.000000000 +0200 +++ gcc/gcc/c/c-parser.c 2015-06-17 18:42:18.872500625 +0200 @@ -15420,7 +15420,8 @@ c_parser_omp_declare (c_parser *parser, | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FINAL) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MERGEABLE) \ - | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOGROUP)) + | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOGROUP) \ + | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIORITY)) static tree c_parser_omp_taskloop (location_t loc, c_parser *parser, --- gcc/gcc/cp/parser.c.jj 2015-06-12 16:42:16.000000000 +0200 +++ gcc/gcc/cp/parser.c 2015-06-17 18:42:48.617046175 +0200 @@ -33170,7 +33170,8 @@ cp_parser_omp_declare (cp_parser *parser | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FINAL) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MERGEABLE) \ - | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOGROUP)) + | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOGROUP) \ + | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIORITY)) static tree cp_parser_omp_taskloop (cp_parser *parser, cp_token *pragma_tok, --- gcc/gcc/c-family/c-omp.c.jj 2015-06-16 09:02:03.000000000 +0200 +++ gcc/gcc/c-family/c-omp.c 2015-06-17 18:43:49.844110720 +0200 @@ -786,6 +786,7 @@ c_omp_split_clauses (location_t loc, enu case OMP_CLAUSE_UNTIED: case OMP_CLAUSE_MERGEABLE: case OMP_CLAUSE_NOGROUP: + case OMP_CLAUSE_PRIORITY: s = C_OMP_CLAUSE_SPLIT_TASKLOOP; break; /* Duplicate this to all of taskloop, distribute, for and simd. */ --- gcc/gcc/c-family/c-common.c.jj 2015-05-19 18:56:45.000000000 +0200 +++ gcc/gcc/c-family/c-common.c 2015-06-17 18:58:15.124888223 +0200 @@ -5431,8 +5431,12 @@ enum c_builtin_type ARG6, ARG7) NAME, #define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ ARG6, ARG7, ARG8) NAME, +#define DEF_FUNCTION_TYPE_9(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7, ARG8, ARG9) NAME, #define DEF_FUNCTION_TYPE_10(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ ARG6, ARG7, ARG8, ARG9, ARG10) NAME, +#define DEF_FUNCTION_TYPE_11(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7, ARG8, ARG9, ARG10, ARG11) NAME, #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME, #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME, #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME, @@ -5456,7 +5460,9 @@ enum c_builtin_type #undef DEF_FUNCTION_TYPE_6 #undef DEF_FUNCTION_TYPE_7 #undef DEF_FUNCTION_TYPE_8 +#undef DEF_FUNCTION_TYPE_9 #undef DEF_FUNCTION_TYPE_10 +#undef DEF_FUNCTION_TYPE_11 #undef DEF_FUNCTION_TYPE_VAR_0 #undef DEF_FUNCTION_TYPE_VAR_1 #undef DEF_FUNCTION_TYPE_VAR_2 @@ -5545,10 +5551,18 @@ c_define_builtins (tree va_list_ref_type ARG6, ARG7, ARG8) \ def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ ARG7, ARG8); +#define DEF_FUNCTION_TYPE_9(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7, ARG8, ARG9) \ + def_fn_type (ENUM, RETURN, 0, 9, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ + ARG7, ARG8, ARG9); #define DEF_FUNCTION_TYPE_10(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ ARG6, ARG7, ARG8, ARG9, ARG10) \ - def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ + def_fn_type (ENUM, RETURN, 0, 10, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ ARG7, ARG8, ARG9, ARG10); +#define DEF_FUNCTION_TYPE_11(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7, ARG8, ARG9, ARG10, ARG11) \ + def_fn_type (ENUM, RETURN, 0, 11, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ + ARG7, ARG8, ARG9, ARG10, ARG11); #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \ def_fn_type (ENUM, RETURN, 1, 0); #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \ @@ -5583,7 +5597,9 @@ c_define_builtins (tree va_list_ref_type #undef DEF_FUNCTION_TYPE_6 #undef DEF_FUNCTION_TYPE_7 #undef DEF_FUNCTION_TYPE_8 +#undef DEF_FUNCTION_TYPE_9 #undef DEF_FUNCTION_TYPE_10 +#undef DEF_FUNCTION_TYPE_11 #undef DEF_FUNCTION_TYPE_VAR_0 #undef DEF_FUNCTION_TYPE_VAR_1 #undef DEF_FUNCTION_TYPE_VAR_2 --- gcc/gcc/fortran/types.def.jj 2015-05-06 18:12:22.000000000 +0200 +++ gcc/gcc/fortran/types.def 2015-06-17 19:33:54.167190681 +0200 @@ -206,19 +206,20 @@ DEF_FUNCTION_TYPE_7 (BT_FN_VOID_INT_OMPF DEF_FUNCTION_TYPE_8 (BT_FN_VOID_OMPFN_PTR_UINT_LONG_LONG_LONG_LONG_UINT, BT_VOID, BT_PTR_FN_VOID_PTR, BT_PTR, BT_UINT, BT_LONG, BT_LONG, BT_LONG, BT_LONG, BT_UINT) -DEF_FUNCTION_TYPE_8 (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_BOOL_UINT_PTR, + +DEF_FUNCTION_TYPE_9 (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_BOOL_UINT_PTR_INT, BT_VOID, BT_PTR_FN_VOID_PTR, BT_PTR, BT_PTR_FN_VOID_PTR_PTR, BT_LONG, BT_LONG, - BT_BOOL, BT_UINT, BT_PTR) + BT_BOOL, BT_UINT, BT_PTR, BT_INT) -DEF_FUNCTION_TYPE_10 (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_LONG_LONG_LONG, +DEF_FUNCTION_TYPE_11 (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_INT_LONG_LONG_LONG, BT_VOID, BT_PTR_FN_VOID_PTR, BT_PTR, BT_PTR_FN_VOID_PTR_PTR, BT_LONG, BT_LONG, - BT_UINT, BT_LONG, BT_LONG, BT_LONG, BT_LONG) -DEF_FUNCTION_TYPE_10 (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_ULL_ULL_ULL, + BT_UINT, BT_LONG, BT_INT, BT_LONG, BT_LONG, BT_LONG) +DEF_FUNCTION_TYPE_11 (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_UINT_LONG_INT_ULL_ULL_ULL, BT_VOID, BT_PTR_FN_VOID_PTR, BT_PTR, BT_PTR_FN_VOID_PTR_PTR, BT_LONG, BT_LONG, - BT_UINT, BT_LONG, + BT_UINT, BT_LONG, BT_INT, BT_ULONGLONG, BT_ULONGLONG, BT_ULONGLONG) DEF_FUNCTION_TYPE_VAR_0 (BT_FN_VOID_VAR, BT_VOID) --- gcc/gcc/fortran/f95-lang.c.jj 2015-05-06 18:13:32.000000000 +0200 +++ gcc/gcc/fortran/f95-lang.c 2015-06-17 19:35:32.540694141 +0200 @@ -671,8 +671,12 @@ gfc_init_builtin_functions (void) ARG6, ARG7) NAME, #define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ ARG6, ARG7, ARG8) NAME, +#define DEF_FUNCTION_TYPE_9(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7, ARG8, ARG9) NAME, #define DEF_FUNCTION_TYPE_10(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ ARG6, ARG7, ARG8, ARG9, ARG10) NAME, +#define DEF_FUNCTION_TYPE_11(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7, ARG8, ARG9, ARG10, ARG11) NAME, #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME, #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME, #define DEF_FUNCTION_TYPE_VAR_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ @@ -691,7 +695,9 @@ gfc_init_builtin_functions (void) #undef DEF_FUNCTION_TYPE_6 #undef DEF_FUNCTION_TYPE_7 #undef DEF_FUNCTION_TYPE_8 +#undef DEF_FUNCTION_TYPE_9 #undef DEF_FUNCTION_TYPE_10 +#undef DEF_FUNCTION_TYPE_11 #undef DEF_FUNCTION_TYPE_VAR_0 #undef DEF_FUNCTION_TYPE_VAR_2 #undef DEF_FUNCTION_TYPE_VAR_7 @@ -1126,6 +1132,20 @@ gfc_init_builtin_functions (void) builtin_types[(int) ARG7], \ builtin_types[(int) ARG8], \ NULL_TREE); +#define DEF_FUNCTION_TYPE_9(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7, ARG8, ARG9) \ + builtin_types[(int) ENUM] \ + = build_function_type_list (builtin_types[(int) RETURN], \ + builtin_types[(int) ARG1], \ + builtin_types[(int) ARG2], \ + builtin_types[(int) ARG3], \ + builtin_types[(int) ARG4], \ + builtin_types[(int) ARG5], \ + builtin_types[(int) ARG6], \ + builtin_types[(int) ARG7], \ + builtin_types[(int) ARG8], \ + builtin_types[(int) ARG9], \ + NULL_TREE); #define DEF_FUNCTION_TYPE_10(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, \ ARG5, ARG6, ARG7, ARG8, ARG9, ARG10) \ builtin_types[(int) ENUM] \ @@ -1141,6 +1161,22 @@ gfc_init_builtin_functions (void) builtin_types[(int) ARG9], \ builtin_types[(int) ARG10], \ NULL_TREE); +#define DEF_FUNCTION_TYPE_11(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, \ + ARG5, ARG6, ARG7, ARG8, ARG9, ARG10, ARG11)\ + builtin_types[(int) ENUM] \ + = build_function_type_list (builtin_types[(int) RETURN], \ + builtin_types[(int) ARG1], \ + builtin_types[(int) ARG2], \ + builtin_types[(int) ARG3], \ + builtin_types[(int) ARG4], \ + builtin_types[(int) ARG5], \ + builtin_types[(int) ARG6], \ + builtin_types[(int) ARG7], \ + builtin_types[(int) ARG8], \ + builtin_types[(int) ARG9], \ + builtin_types[(int) ARG10], \ + builtin_types[(int) ARG11], \ + NULL_TREE); #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \ builtin_types[(int) ENUM] \ = build_varargs_function_type_list (builtin_types[(int) RETURN], \ --- gcc/gcc/jit/jit-builtins.c.jj 2015-05-14 09:03:36.000000000 +0200 +++ gcc/gcc/jit/jit-builtins.c 2015-06-17 19:17:35.898135165 +0200 @@ -306,11 +306,20 @@ builtins_manager::make_type (enum jit_bu ARG6, ARG7, ARG8) \ case ENUM: return make_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, \ ARG4, ARG5, ARG6, ARG7, ARG8); +#define DEF_FUNCTION_TYPE_9(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7, ARG8, ARG9) \ + case ENUM: return make_fn_type (ENUM, RETURN, 0, 9, ARG1, ARG2, ARG3, \ + ARG4, ARG5, ARG6, ARG7, ARG8, ARG9); #define DEF_FUNCTION_TYPE_10(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ ARG6, ARG7, ARG8, ARG9, ARG10) \ - case ENUM: return make_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, \ + case ENUM: return make_fn_type (ENUM, RETURN, 0, 10, ARG1, ARG2, ARG3, \ ARG4, ARG5, ARG6, ARG7, ARG8, ARG9, \ ARG10); +#define DEF_FUNCTION_TYPE_11(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7, ARG8, ARG9, ARG10, ARG11) \ + case ENUM: return make_fn_type (ENUM, RETURN, 0, 11, ARG1, ARG2, ARG3, \ + ARG4, ARG5, ARG6, ARG7, ARG8, ARG9, \ + ARG10, ARG11); #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \ case ENUM: return make_fn_type (ENUM, RETURN, 1, 0); #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \ @@ -349,7 +358,9 @@ builtins_manager::make_type (enum jit_bu #undef DEF_FUNCTION_TYPE_6 #undef DEF_FUNCTION_TYPE_7 #undef DEF_FUNCTION_TYPE_8 +#undef DEF_FUNCTION_TYPE_9 #undef DEF_FUNCTION_TYPE_10 +#undef DEF_FUNCTION_TYPE_11 #undef DEF_FUNCTION_TYPE_VAR_0 #undef DEF_FUNCTION_TYPE_VAR_1 #undef DEF_FUNCTION_TYPE_VAR_2 --- gcc/gcc/lto/lto-lang.c.jj 2015-05-06 18:08:47.000000000 +0200 +++ gcc/gcc/lto/lto-lang.c 2015-06-17 19:16:12.238414944 +0200 @@ -170,8 +170,12 @@ enum lto_builtin_type ARG6, ARG7) NAME, #define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ ARG6, ARG7, ARG8) NAME, +#define DEF_FUNCTION_TYPE_9(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7, ARG8, ARG9) NAME, #define DEF_FUNCTION_TYPE_10(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ ARG6, ARG7, ARG8, ARG9, ARG10) NAME, +#define DEF_FUNCTION_TYPE_11(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7, ARG8, ARG9, ARG10, ARG11) NAME, #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME, #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME, #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME, @@ -195,7 +199,9 @@ enum lto_builtin_type #undef DEF_FUNCTION_TYPE_6 #undef DEF_FUNCTION_TYPE_7 #undef DEF_FUNCTION_TYPE_8 +#undef DEF_FUNCTION_TYPE_9 #undef DEF_FUNCTION_TYPE_10 +#undef DEF_FUNCTION_TYPE_11 #undef DEF_FUNCTION_TYPE_VAR_0 #undef DEF_FUNCTION_TYPE_VAR_1 #undef DEF_FUNCTION_TYPE_VAR_2 @@ -676,10 +682,18 @@ lto_define_builtins (tree va_list_ref_ty ARG6, ARG7, ARG8) \ def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ ARG7, ARG8); +#define DEF_FUNCTION_TYPE_9(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7, ARG8, ARG9) \ + def_fn_type (ENUM, RETURN, 0, 9, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ + ARG7, ARG8, ARG9); #define DEF_FUNCTION_TYPE_10(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ ARG6, ARG7, ARG8, ARG9, ARG10) \ - def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ + def_fn_type (ENUM, RETURN, 0, 10, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ ARG7, ARG8, ARG9, ARG10); +#define DEF_FUNCTION_TYPE_11(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7, ARG8, ARG9, ARG10, ARG11) \ + def_fn_type (ENUM, RETURN, 0, 11, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ + ARG7, ARG8, ARG9, ARG10, ARG11); #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \ def_fn_type (ENUM, RETURN, 1, 0); #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \ @@ -714,7 +728,9 @@ lto_define_builtins (tree va_list_ref_ty #undef DEF_FUNCTION_TYPE_6 #undef DEF_FUNCTION_TYPE_7 #undef DEF_FUNCTION_TYPE_8 +#undef DEF_FUNCTION_TYPE_9 #undef DEF_FUNCTION_TYPE_10 +#undef DEF_FUNCTION_TYPE_11 #undef DEF_FUNCTION_TYPE_VAR_0 #undef DEF_FUNCTION_TYPE_VAR_1 #undef DEF_FUNCTION_TYPE_VAR_2 --- gcc/gcc/testsuite/c-c++-common/gomp/priority-1.c.jj 2015-06-17 19:46:59.495243612 +0200 +++ gcc/gcc/testsuite/c-c++-common/gomp/priority-1.c 2015-06-17 19:45:40.000000000 +0200 @@ -0,0 +1,26 @@ +void bar (void); + +void +foo (int x, unsigned long long y) +{ + #pragma omp task + bar (); + #pragma omp taskloop + for (int i = 0; i < 10; i++) + bar (); + #pragma omp task + bar (); + #pragma omp taskloop + for (unsigned long long int i = 0; i < y; i++) + bar (); + #pragma omp task priority (1) + bar (); + #pragma omp taskloop priority (1) + for (int i = 0; i < 10; i++) + bar (); + #pragma omp task priority (x + 1) + bar (); + #pragma omp taskloop priority (x + 1) + for (unsigned long long int i = 0; i < y; i++) + bar (); +} --- gcc/include/gomp-constants.h.jj 2015-06-11 11:24:32.000000000 +0200 +++ gcc/include/gomp-constants.h 2015-06-17 18:45:33.345529378 +0200 @@ -134,6 +134,7 @@ enum gomp_map_kind #define GOMP_TASK_FLAG_FINAL (1 << 1) #define GOMP_TASK_FLAG_MERGEABLE (1 << 2) #define GOMP_TASK_FLAG_DEPEND (1 << 3) +#define GOMP_TASK_FLAG_PRIORITY (1 << 4) #define GOMP_TASK_FLAG_UP (1 << 8) #define GOMP_TASK_FLAG_GRAINSIZE (1 << 9) #define GOMP_TASK_FLAG_IF (1 << 10) --- gcc/libgomp/libgomp_g.h.jj 2015-04-24 12:30:39.000000000 +0200 +++ gcc/libgomp/libgomp_g.h 2015-06-17 19:54:26.026458905 +0200 @@ -180,7 +180,15 @@ extern bool GOMP_cancellation_point (int /* task.c */ extern void GOMP_task (void (*) (void *), void *, void (*) (void *, void *), - long, long, bool, unsigned, void **); + long, long, bool, unsigned, void **, int); +extern void GOMP_taskloop (void (*) (void *), void *, + void (*) (void *, void *), long, long, unsigned, + unsigned long, int, long, long, long); +extern void GOMP_taskloop_ull (void (*) (void *), void *, + void (*) (void *, void *), long, long, + unsigned, unsigned long, int, + unsigned long long, unsigned long long, + unsigned long long); extern void GOMP_taskwait (void); extern void GOMP_taskyield (void); extern void GOMP_taskgroup_start (void); --- gcc/libgomp/task.c.jj 2015-05-21 11:12:09.000000000 +0200 +++ gcc/libgomp/task.c 2015-06-17 19:20:33.512418122 +0200 @@ -115,7 +115,7 @@ static void gomp_task_maybe_wait_for_dep void GOMP_task (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *), long arg_size, long arg_align, bool if_clause, unsigned flags, - void **depend) + void **depend, int priority) { struct gomp_thread *thr = gomp_thread (); struct gomp_team *team = thr->ts.team; @@ -136,6 +136,11 @@ GOMP_task (void (*fn) (void *), void *da || (thr->task->taskgroup && thr->task->taskgroup->cancelled))) return; + if ((flags & GOMP_TASK_FLAG_PRIORITY) == 0) + priority = 0; + /* FIXME, use priority. */ + (void) priority; + if (!if_clause || team == NULL || (thr->task && thr->task->final_task) || team->task_count > 64 * team->nthreads) --- gcc/libgomp/taskloop.c.jj 2015-05-21 11:12:09.000000000 +0200 +++ gcc/libgomp/taskloop.c 2015-06-17 19:21:21.779679756 +0200 @@ -33,7 +33,7 @@ void GOMP_taskloop (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *), long arg_size, long arg_align, unsigned flags, - unsigned long num_tasks, + unsigned long num_tasks, int priority, TYPE start, TYPE end, TYPE step) { struct gomp_thread *thr = gomp_thread (); @@ -155,6 +155,9 @@ GOMP_taskloop (void (*fn) (void *), void else ialias_call (GOMP_taskgroup_start) (); + /* FIXME, use priority. */ + (void) priority; + if ((flags & GOMP_TASK_FLAG_IF) == 0 || team == NULL || (thr->task && thr->task->final_task) || team->task_count + num_tasks > 64 * team->nthreads) Jakub