From: Martin Jambor Date: Mon, 13 Jan 2020 18:13:46 +0000 (+0100) Subject: IPA: Avoid segfault in devirtualization_time_bonus (PR 93223) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8472660b98a31b32b7d030c2cdc4d41d326364d5;p=gcc.git IPA: Avoid segfault in devirtualization_time_bonus (PR 93223) 2020-01-13 Martin Jambor PR ipa/93223 * ipa-cp.c (devirtualization_time_bonus): Check whether isummary is NULL. testsuite/ * g++.dg/ipa/pr93223.C: New test. --- diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 612f3d0a89b..17da1d8e8a7 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -3158,7 +3158,7 @@ devirtualization_time_bonus (struct cgraph_node *node, if (avail < AVAIL_AVAILABLE) continue; isummary = ipa_fn_summaries->get (callee); - if (!isummary->inlinable) + if (!isummary || !isummary->inlinable) continue; int size = ipa_size_summaries->get (callee)->size; diff --git a/gcc/testsuite/g++.dg/ipa/pr93223.C b/gcc/testsuite/g++.dg/ipa/pr93223.C new file mode 100644 index 00000000000..87f98b5e244 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr93223.C @@ -0,0 +1,62 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -std=gnu++14" } */ + +template +bool run(const int item_count, + Function && process_range, + const int max_parallelism, + int* progress = nullptr) +{ + if (max_parallelism <= 1) + { + if (progress == nullptr) + { + return process_range(0); + } + else + { + auto result = true; + for (int i = 0; i != item_count && result; ++i) + { + (*progress)++; + result = process_range(i); + } + return result; + } + } + + if (max_parallelism > 10) + { + if (progress == nullptr) + { + return process_range(0); + } + else + { + auto result = true; + for (int i = 0; i != item_count && result; ++i) + { + (*progress)++; + result = process_range(i); + } + return result; + } + } + return false; +} + +namespace +{ +__attribute__((optimize(0))) bool worker_fun(const int) +{ + return true; +} +} + +void demo(int n) +{ + for (int i = 0; i < n; ++i) + { + run(n, &worker_fun, n); + } +}