Mercurial > hg > CbC > CbC_gcc
diff gcc/tree-nested.c @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | 84e7813d76e9 |
children |
line wrap: on
line diff
--- a/gcc/tree-nested.c Thu Oct 25 07:37:49 2018 +0900 +++ b/gcc/tree-nested.c Thu Feb 13 11:34:05 2020 +0900 @@ -1,5 +1,5 @@ /* Nested function decomposition for GIMPLE. - Copyright (C) 2004-2018 Free Software Foundation, Inc. + Copyright (C) 2004-2020 Free Software Foundation, Inc. This file is part of GCC. @@ -169,6 +169,16 @@ return tmp_var; } +/* Like build_simple_mem_ref, but set TREE_THIS_NOTRAP on the result. */ + +static tree +build_simple_mem_ref_notrap (tree ptr) +{ + tree t = build_simple_mem_ref (ptr); + TREE_THIS_NOTRAP (t) = 1; + return t; +} + /* Take the address of EXP to be used within function CONTEXT. Mark it for addressability as necessary. */ @@ -877,7 +887,7 @@ { tree field = get_chain_field (i); - x = build_simple_mem_ref (x); + x = build_simple_mem_ref_notrap (x); x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE); x = init_tmp_var (info, x, gsi); } @@ -914,12 +924,12 @@ { tree field = get_chain_field (i); - x = build_simple_mem_ref (x); + x = build_simple_mem_ref_notrap (x); x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE); x = init_tmp_var (info, x, gsi); } - x = build_simple_mem_ref (x); + x = build_simple_mem_ref_notrap (x); } x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE); @@ -963,16 +973,16 @@ for (i = info->outer; i->context != target_context; i = i->outer) { field = get_chain_field (i); - x = build_simple_mem_ref (x); + x = build_simple_mem_ref_notrap (x); x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE); } - x = build_simple_mem_ref (x); + x = build_simple_mem_ref_notrap (x); } field = lookup_field_for_decl (i, decl, INSERT); x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE); if (use_pointer_in_frame (decl)) - x = build_simple_mem_ref (x); + x = build_simple_mem_ref_notrap (x); /* ??? We should be remapping types as well, surely. */ new_decl = build_decl (DECL_SOURCE_LOCATION (decl), @@ -1060,7 +1070,7 @@ if (use_pointer_in_frame (t)) { x = init_tmp_var (info, x, &wi->gsi); - x = build_simple_mem_ref (x); + x = build_simple_mem_ref_notrap (x); } } @@ -1190,6 +1200,8 @@ switch (OMP_CLAUSE_CODE (clause)) { case OMP_CLAUSE_REDUCTION: + case OMP_CLAUSE_IN_REDUCTION: + case OMP_CLAUSE_TASK_REDUCTION: if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause)) need_stmts = true; goto do_decl_clause; @@ -1215,6 +1227,7 @@ case OMP_CLAUSE_TO_DECLARE: case OMP_CLAUSE_LINK: case OMP_CLAUSE_USE_DEVICE_PTR: + case OMP_CLAUSE_USE_DEVICE_ADDR: case OMP_CLAUSE_IS_DEVICE_PTR: do_decl_clause: decl = OMP_CLAUSE_DECL (clause); @@ -1314,6 +1327,8 @@ convert_nonlocal_reference_op (&OMP_CLAUSE_ALIGNED_ALIGNMENT (clause), &dummy, wi); } + /* FALLTHRU */ + case OMP_CLAUSE_NONTEMPORAL: /* Like do_decl_clause, but don't add any suppression. */ decl = OMP_CLAUSE_DECL (clause); if (VAR_P (decl) @@ -1322,8 +1337,7 @@ if (decl_function_context (decl) != info->context) { OMP_CLAUSE_DECL (clause) = get_nonlocal_debug_decl (info, decl); - if (OMP_CLAUSE_CODE (clause) != OMP_CLAUSE_PRIVATE) - need_chain = true; + need_chain = true; } break; @@ -1340,11 +1354,14 @@ case OMP_CLAUSE_THREADS: case OMP_CLAUSE_SIMD: case OMP_CLAUSE_DEFAULTMAP: + case OMP_CLAUSE_ORDER: case OMP_CLAUSE_SEQ: case OMP_CLAUSE_INDEPENDENT: case OMP_CLAUSE_AUTO: case OMP_CLAUSE_IF_PRESENT: case OMP_CLAUSE_FINALIZE: + case OMP_CLAUSE__CONDTEMP_: + case OMP_CLAUSE__SCANTEMP_: break; /* The following clause belongs to the OpenACC cache directive, which @@ -1365,8 +1382,10 @@ /* The following clauses are only added during OMP lowering; nested function decomposition happens before that. */ case OMP_CLAUSE__LOOPTEMP_: + case OMP_CLAUSE__REDUCTEMP_: case OMP_CLAUSE__SIMDUID_: case OMP_CLAUSE__GRIDDIM_: + case OMP_CLAUSE__SIMT_: /* Anything else. */ default: gcc_unreachable (); @@ -1380,6 +1399,8 @@ switch (OMP_CLAUSE_CODE (clause)) { case OMP_CLAUSE_REDUCTION: + case OMP_CLAUSE_IN_REDUCTION: + case OMP_CLAUSE_TASK_REDUCTION: if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause)) { tree old_context @@ -1490,6 +1511,20 @@ } break; + case GIMPLE_OMP_TEAMS: + if (!gimple_omp_teams_host (as_a <gomp_teams *> (stmt))) + { + save_suppress = info->suppress_expansion; + convert_nonlocal_omp_clauses (gimple_omp_teams_clauses_ptr (stmt), + wi); + walk_body (convert_nonlocal_reference_stmt, + convert_nonlocal_reference_op, info, + gimple_omp_body_ptr (stmt)); + info->suppress_expansion = save_suppress; + break; + } + /* FALLTHRU */ + case GIMPLE_OMP_PARALLEL: case GIMPLE_OMP_TASK: save_suppress = info->suppress_expansion; @@ -1546,6 +1581,14 @@ info->suppress_expansion = save_suppress; break; + case GIMPLE_OMP_TASKGROUP: + save_suppress = info->suppress_expansion; + convert_nonlocal_omp_clauses (gimple_omp_taskgroup_clauses_ptr (stmt), wi); + walk_body (convert_nonlocal_reference_stmt, convert_nonlocal_reference_op, + info, gimple_omp_body_ptr (stmt)); + info->suppress_expansion = save_suppress; + break; + case GIMPLE_OMP_TARGET: if (!is_gimple_omp_offloaded (stmt)) { @@ -1586,18 +1629,10 @@ info->suppress_expansion = save_suppress; break; - case GIMPLE_OMP_TEAMS: - save_suppress = info->suppress_expansion; - convert_nonlocal_omp_clauses (gimple_omp_teams_clauses_ptr (stmt), wi); - walk_body (convert_nonlocal_reference_stmt, convert_nonlocal_reference_op, - info, gimple_omp_body_ptr (stmt)); - info->suppress_expansion = save_suppress; - break; - case GIMPLE_OMP_SECTION: case GIMPLE_OMP_MASTER: - case GIMPLE_OMP_TASKGROUP: case GIMPLE_OMP_ORDERED: + case GIMPLE_OMP_SCAN: walk_body (convert_nonlocal_reference_stmt, convert_nonlocal_reference_op, info, gimple_omp_body_ptr (stmt)); break; @@ -1634,6 +1669,21 @@ *handled_ops_p = false; return NULL_TREE; + case GIMPLE_ASSIGN: + if (gimple_clobber_p (stmt)) + { + tree lhs = gimple_assign_lhs (stmt); + if (DECL_P (lhs) + && !(TREE_STATIC (lhs) || DECL_EXTERNAL (lhs)) + && decl_function_context (lhs) != info->context) + { + gsi_replace (gsi, gimple_build_nop (), true); + break; + } + } + *handled_ops_p = false; + return NULL_TREE; + default: /* For every other statement that we are not interested in handling here, let the walker traverse the operands. */ @@ -1871,6 +1921,8 @@ switch (OMP_CLAUSE_CODE (clause)) { case OMP_CLAUSE_REDUCTION: + case OMP_CLAUSE_IN_REDUCTION: + case OMP_CLAUSE_TASK_REDUCTION: if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause)) need_stmts = true; goto do_decl_clause; @@ -1896,6 +1948,7 @@ case OMP_CLAUSE_TO_DECLARE: case OMP_CLAUSE_LINK: case OMP_CLAUSE_USE_DEVICE_PTR: + case OMP_CLAUSE_USE_DEVICE_ADDR: case OMP_CLAUSE_IS_DEVICE_PTR: do_decl_clause: decl = OMP_CLAUSE_DECL (clause); @@ -2000,6 +2053,8 @@ convert_local_reference_op (&OMP_CLAUSE_ALIGNED_ALIGNMENT (clause), &dummy, wi); } + /* FALLTHRU */ + case OMP_CLAUSE_NONTEMPORAL: /* Like do_decl_clause, but don't add any suppression. */ decl = OMP_CLAUSE_DECL (clause); if (VAR_P (decl) @@ -2031,11 +2086,14 @@ case OMP_CLAUSE_THREADS: case OMP_CLAUSE_SIMD: case OMP_CLAUSE_DEFAULTMAP: + case OMP_CLAUSE_ORDER: case OMP_CLAUSE_SEQ: case OMP_CLAUSE_INDEPENDENT: case OMP_CLAUSE_AUTO: case OMP_CLAUSE_IF_PRESENT: case OMP_CLAUSE_FINALIZE: + case OMP_CLAUSE__CONDTEMP_: + case OMP_CLAUSE__SCANTEMP_: break; /* The following clause belongs to the OpenACC cache directive, which @@ -2056,8 +2114,10 @@ /* The following clauses are only added during OMP lowering; nested function decomposition happens before that. */ case OMP_CLAUSE__LOOPTEMP_: + case OMP_CLAUSE__REDUCTEMP_: case OMP_CLAUSE__SIMDUID_: case OMP_CLAUSE__GRIDDIM_: + case OMP_CLAUSE__SIMT_: /* Anything else. */ default: gcc_unreachable (); @@ -2071,6 +2131,8 @@ switch (OMP_CLAUSE_CODE (clause)) { case OMP_CLAUSE_REDUCTION: + case OMP_CLAUSE_IN_REDUCTION: + case OMP_CLAUSE_TASK_REDUCTION: if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause)) { tree old_context @@ -2131,6 +2193,18 @@ switch (gimple_code (stmt)) { + case GIMPLE_OMP_TEAMS: + if (!gimple_omp_teams_host (as_a <gomp_teams *> (stmt))) + { + save_suppress = info->suppress_expansion; + convert_local_omp_clauses (gimple_omp_teams_clauses_ptr (stmt), wi); + walk_body (convert_local_reference_stmt, convert_local_reference_op, + info, gimple_omp_body_ptr (stmt)); + info->suppress_expansion = save_suppress; + break; + } + /* FALLTHRU */ + case GIMPLE_OMP_PARALLEL: case GIMPLE_OMP_TASK: save_suppress = info->suppress_expansion; @@ -2201,6 +2275,14 @@ info->suppress_expansion = save_suppress; break; + case GIMPLE_OMP_TASKGROUP: + save_suppress = info->suppress_expansion; + convert_local_omp_clauses (gimple_omp_taskgroup_clauses_ptr (stmt), wi); + walk_body (convert_local_reference_stmt, convert_local_reference_op, + info, gimple_omp_body_ptr (stmt)); + info->suppress_expansion = save_suppress; + break; + case GIMPLE_OMP_TARGET: if (!is_gimple_omp_offloaded (stmt)) { @@ -2254,18 +2336,10 @@ info->static_chain_added |= save_static_chain_added; break; - case GIMPLE_OMP_TEAMS: - save_suppress = info->suppress_expansion; - convert_local_omp_clauses (gimple_omp_teams_clauses_ptr (stmt), wi); - walk_body (convert_local_reference_stmt, convert_local_reference_op, - info, gimple_omp_body_ptr (stmt)); - info->suppress_expansion = save_suppress; - break; - case GIMPLE_OMP_SECTION: case GIMPLE_OMP_MASTER: - case GIMPLE_OMP_TASKGROUP: case GIMPLE_OMP_ORDERED: + case GIMPLE_OMP_SCAN: walk_body (convert_local_reference_stmt, convert_local_reference_op, info, gimple_omp_body_ptr (stmt)); break; @@ -2280,7 +2354,8 @@ if (gimple_clobber_p (stmt)) { tree lhs = gimple_assign_lhs (stmt); - if (!use_pointer_in_frame (lhs) + if (DECL_P (lhs) + && !use_pointer_in_frame (lhs) && lookup_field_for_decl (info, lhs, NO_INSERT)) { gsi_replace (gsi, gimple_build_nop (), true); @@ -2562,6 +2637,14 @@ break; } + case GIMPLE_OMP_TEAMS: + if (!gimple_omp_teams_host (as_a <gomp_teams *> (stmt))) + { + *handled_ops_p = false; + return NULL_TREE; + } + goto do_parallel; + case GIMPLE_OMP_TARGET: if (!is_gimple_omp_offloaded (stmt)) { @@ -2571,6 +2654,7 @@ /* FALLTHRU */ case GIMPLE_OMP_PARALLEL: case GIMPLE_OMP_TASK: + do_parallel: { tree save_local_var_chain = info->new_local_var_chain; walk_gimple_op (stmt, convert_tramp_reference_op, wi); @@ -2678,6 +2762,15 @@ } break; + case GIMPLE_OMP_TEAMS: + if (!gimple_omp_teams_host (as_a <gomp_teams *> (stmt))) + { + walk_body (convert_gimple_call, NULL, info, + gimple_omp_body_ptr (stmt)); + break; + } + /* FALLTHRU */ + case GIMPLE_OMP_PARALLEL: case GIMPLE_OMP_TASK: save_static_chain_added = info->static_chain_added; @@ -2753,10 +2846,10 @@ case GIMPLE_OMP_SECTIONS: case GIMPLE_OMP_SECTION: case GIMPLE_OMP_SINGLE: - case GIMPLE_OMP_TEAMS: case GIMPLE_OMP_MASTER: case GIMPLE_OMP_TASKGROUP: case GIMPLE_OMP_ORDERED: + case GIMPLE_OMP_SCAN: case GIMPLE_OMP_CRITICAL: walk_body (convert_gimple_call, NULL, info, gimple_omp_body_ptr (stmt)); break;