diff --git a/gcc/attr-callback.cc b/gcc/attr-callback.cc index 04b5ad0ef11..f116f0472f3 100644 --- a/gcc/attr-callback.cc +++ b/gcc/attr-callback.cc @@ -83,6 +83,15 @@ callback_special_case_attr (tree decl) gcc_unreachable (); } +/* Returns TRUE if the callee of E has a callback attribute. */ +bool +callback_edge_callee_has_attr (cgraph_edge *e) +{ + return lookup_attribute (CALLBACK_ATTR_IDENT, + DECL_ATTRIBUTES (e->callee->decl)) + || callback_is_special_cased (e->callee->decl, e->call_stmt); +} + /* Given an instance of callback attribute, return the 0-based index of the called function in question. */ int diff --git a/gcc/attr-callback.h b/gcc/attr-callback.h index b0b08438afb..39a4fe8ac94 100644 --- a/gcc/attr-callback.h +++ b/gcc/attr-callback.h @@ -43,6 +43,9 @@ bool callback_is_special_cased (tree decl, gcall *stmt); /* Returns an attribute for a special cased function. */ tree callback_special_case_attr (tree decl); +/* Returns TRUE if the callee of E has a callback attribute. */ +bool callback_edge_callee_has_attr (cgraph_edge *e); + /* Given an instance of callback attribute, return the 0-based index of the called function in question. */ int callback_get_fn_index (tree cb_attr); diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc index 1e4b6d4548d..2debbe10de3 100644 --- a/gcc/ipa-prop.cc +++ b/gcc/ipa-prop.cc @@ -2698,7 +2698,8 @@ ipa_compute_jump_functions_for_bb (struct ipa_func_body_info *fbi, basic_block b /* We do not need to bother analyzing calls to unknown functions unless they may become known during lto/whopr. */ if (!callee->definition && !flag_lto - && !gimple_call_fnspec (cs->call_stmt).known_p ()) + && !gimple_call_fnspec (cs->call_stmt).known_p () + && !callback_edge_callee_has_attr (cs)) continue; } ipa_compute_jump_functions_for_edge (fbi, cs); diff --git a/libgomp/testsuite/libgomp.c/ipcp-cb-spec1.c b/libgomp/testsuite/libgomp.c/ipcp-cb-spec1.c index a85e62300f9..ff82f4c2f29 100644 --- a/libgomp/testsuite/libgomp.c/ipcp-cb-spec1.c +++ b/libgomp/testsuite/libgomp.c/ipcp-cb-spec1.c @@ -1,9 +1,8 @@ /* Test that GOMP_task is special cased when cpyfn is NULL. */ /* { dg-do run } */ -/* { dg-options "-O3 -fopenmp -flto -std=gnu99 -fdump-ipa-cp-details" } */ +/* { dg-options "-O3 -fopenmp -std=gnu99 -fdump-ipa-cp-details" } */ /* { dg-require-effective-target fopenmp } */ -/* { dg-require-effective-target lto } */ void test(int c) { for (int i = 0; i < c; i++) @@ -16,4 +15,4 @@ int main() { return 0; } -/* { dg-final { scan-wpa-ipa-dump "Creating a specialized node of main._omp_fn" "cp" } } */ +/* { dg-final { scan-ipa-dump "Creating a specialized node of main._omp_fn" "cp" } } */ diff --git a/libgomp/testsuite/libgomp.c/ipcp-cb-spec2.c b/libgomp/testsuite/libgomp.c/ipcp-cb-spec2.c index 01d7425c99f..30894d7d748 100644 --- a/libgomp/testsuite/libgomp.c/ipcp-cb-spec2.c +++ b/libgomp/testsuite/libgomp.c/ipcp-cb-spec2.c @@ -2,9 +2,8 @@ NULL. */ /* { dg-do run } */ -/* { dg-options "-O3 -fopenmp -flto -std=gnu99 -fdump-ipa-cp-details" } */ +/* { dg-options "-O3 -fopenmp -std=gnu99 -fdump-ipa-cp-details" } */ /* { dg-require-effective-target fopenmp } */ -/* { dg-require-effective-target lto } */ void test(int *a) { for (int i = 0; i < 100; i++) { diff --git a/libgomp/testsuite/libgomp.c/ipcp-cb1.c b/libgomp/testsuite/libgomp.c/ipcp-cb1.c index 3418b5dedab..e390f04d8cf 100644 --- a/libgomp/testsuite/libgomp.c/ipcp-cb1.c +++ b/libgomp/testsuite/libgomp.c/ipcp-cb1.c @@ -2,9 +2,8 @@ This tests the underlying callback attribute and its related edges. */ /* { dg-do run } */ -/* { dg-options "-O3 -fopenmp -flto -std=gnu99 -fdump-ipa-cp-details" } */ +/* { dg-options "-O3 -fopenmp -std=gnu99 -fdump-ipa-cp-details" } */ /* { dg-require-effective-target fopenmp } */ -/* { dg-require-effective-target lto } */ int a[100]; void test(int c) { @@ -21,5 +20,5 @@ int main() { return a[5] - 5; } -/* { dg-final { scan-wpa-ipa-dump "Creating a specialized node of test._omp_fn" "cp" } } */ -/* { dg-final { scan-wpa-ipa-dump "Aggregate replacements: 0\\\[0]=100\\(by_ref\\)" "cp" } } */ +/* { dg-final { scan-ipa-dump "Creating a specialized node of test._omp_fn" "cp" } } */ +/* { dg-final { scan-ipa-dump "Aggregate replacements: 0\\\[0]=100\\(by_ref\\)" "cp" } } */