summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/attr-callback.cc9
-rw-r--r--gcc/attr-callback.h3
-rw-r--r--gcc/ipa-prop.cc3
-rw-r--r--libgomp/testsuite/libgomp.c/ipcp-cb-spec1.c5
-rw-r--r--libgomp/testsuite/libgomp.c/ipcp-cb-spec2.c3
-rw-r--r--libgomp/testsuite/libgomp.c/ipcp-cb1.c7
6 files changed, 20 insertions, 10 deletions
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" } } */