Commit 50aa16c3 by Jakub Jelinek Committed by Jakub Jelinek

re PR c/81687 (Compiler drops label in OpenMP region)

	PR c/81687
	* omp-low.c (omp_copy_decl): Don't remap FORCED_LABEL or DECL_NONLOCAL
	LABEL_DECLs.
	* tree-cfg.c (move_stmt_op): Don't adjust DECL_CONTEXT of FORCED_LABEL
	or DECL_NONLOCAL labels.
	(move_stmt_r) <case GIMPLE_LABEL>: Adjust DECL_CONTEXT of FORCED_LABEL
	or DECL_NONLOCAL labels here.

	* testsuite/libgomp.c/pr81687-1.c: New test.
	* testsuite/libgomp.c/pr81687-2.c: New test.

From-SVN: r251019
parent 47ee1b7c
2017-08-09 Jakub Jelinek <jakub@redhat.com>
PR c/81687
* omp-low.c (omp_copy_decl): Don't remap FORCED_LABEL or DECL_NONLOCAL
LABEL_DECLs.
* tree-cfg.c (move_stmt_op): Don't adjust DECL_CONTEXT of FORCED_LABEL
or DECL_NONLOCAL labels.
(move_stmt_r) <case GIMPLE_LABEL>: Adjust DECL_CONTEXT of FORCED_LABEL
or DECL_NONLOCAL labels here.
2017-08-09 Will Schmidt <will_schmidt@vnet.ibm.com> 2017-08-09 Will Schmidt <will_schmidt@vnet.ibm.com>
* config/rs6000/rs6000.c (rs6000_option_override_internal): Add blurb * config/rs6000/rs6000.c (rs6000_option_override_internal): Add blurb
......
...@@ -798,6 +798,8 @@ omp_copy_decl (tree var, copy_body_data *cb) ...@@ -798,6 +798,8 @@ omp_copy_decl (tree var, copy_body_data *cb)
if (TREE_CODE (var) == LABEL_DECL) if (TREE_CODE (var) == LABEL_DECL)
{ {
if (FORCED_LABEL (var) || DECL_NONLOCAL (var))
return var;
new_var = create_artificial_label (DECL_SOURCE_LOCATION (var)); new_var = create_artificial_label (DECL_SOURCE_LOCATION (var));
DECL_CONTEXT (new_var) = current_function_decl; DECL_CONTEXT (new_var) = current_function_decl;
insert_decl_map (&ctx->cb, var, new_var); insert_decl_map (&ctx->cb, var, new_var);
......
...@@ -6718,7 +6718,15 @@ move_stmt_op (tree *tp, int *walk_subtrees, void *data) ...@@ -6718,7 +6718,15 @@ move_stmt_op (tree *tp, int *walk_subtrees, void *data)
*tp = t = out->to; *tp = t = out->to;
} }
DECL_CONTEXT (t) = p->to_context; /* For FORCED_LABELs we can end up with references from other
functions if some SESE regions are outlined. It is UB to
jump in between them, but they could be used just for printing
addresses etc. In that case, DECL_CONTEXT on the label should
be the function containing the glabel stmt with that LABEL_DECL,
rather than whatever function a reference to the label was seen
last time. */
if (!FORCED_LABEL (t) && !DECL_NONLOCAL (t))
DECL_CONTEXT (t) = p->to_context;
} }
else if (p->remap_decls_p) else if (p->remap_decls_p)
{ {
...@@ -6836,6 +6844,21 @@ move_stmt_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p, ...@@ -6836,6 +6844,21 @@ move_stmt_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p,
case GIMPLE_OMP_RETURN: case GIMPLE_OMP_RETURN:
case GIMPLE_OMP_CONTINUE: case GIMPLE_OMP_CONTINUE:
break; break;
case GIMPLE_LABEL:
{
/* For FORCED_LABEL, move_stmt_op doesn't adjust DECL_CONTEXT,
so that such labels can be referenced from other regions.
Make sure to update it when seeing a GIMPLE_LABEL though,
that is the owner of the label. */
walk_gimple_op (stmt, move_stmt_op, wi);
*handled_ops_p = true;
tree label = gimple_label_label (as_a <glabel *> (stmt));
if (FORCED_LABEL (label) || DECL_NONLOCAL (label))
DECL_CONTEXT (label) = p->to_context;
}
break;
default: default:
if (is_gimple_omp (stmt)) if (is_gimple_omp (stmt))
{ {
......
2017-08-09 Jakub Jelinek <jakub@redhat.com>
PR c/81687
* testsuite/libgomp.c/pr81687-1.c: New test.
* testsuite/libgomp.c/pr81687-2.c: New test.
2017-08-07 Jakub Jelinek <jakub@redhat.com> 2017-08-07 Jakub Jelinek <jakub@redhat.com>
PR c/69389 PR c/69389
......
/* PR c/81687 */
/* { dg-do link } */
/* { dg-additional-options "-O2" } */
extern int printf (const char *, ...);
int
main ()
{
#pragma omp parallel
{
lab1:
printf ("lab1=%p\n", (void *)(&&lab1));
}
lab2:
#pragma omp parallel
{
lab3:
printf ("lab2=%p\n", (void *)(&&lab2));
}
printf ("lab3=%p\n", (void *)(&&lab3));
return 0;
}
/* PR c/81687 */
/* { dg-do link } */
/* { dg-additional-options "-O2" } */
int
main ()
{
__label__ lab4, lab5, lab6;
volatile int l = 0;
int m = l;
void foo (int x) { if (x == 1) goto lab4; }
void bar (int x) { if (x == 2) goto lab5; }
void baz (int x) { if (x == 3) goto lab6; }
#pragma omp parallel
{
foo (m + 1);
lab4:;
}
#pragma omp task
{
bar (m + 2);
lab5:;
}
baz (m + 3);
lab6:;
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment