From: Martin Jambor Date: Tue, 14 Jan 2020 18:05:56 +0000 (+0100) Subject: IPA: Avoid segfault in devirtualization_time_bonus (PR 93223) X-Git-Tag: releases/gcc-9.3.0~228 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b849001991c41b68407e7b0bcabf88e4ef414fff;p=thirdparty%2Fgcc.git IPA: Avoid segfault in devirtualization_time_bonus (PR 93223) 2020-01-14 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/ChangeLog b/gcc/ChangeLog index 614fdc1cab9e..861a806f8fe8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2020-01-14 Martin Jambor + + Backport from mainline + 2020-01-13 Martin Jambor + + PR ipa/93223 + * ipa-cp.c (devirtualization_time_bonus): Check whether isummary is + NULL. + 2020-01-10 Martin Jambor Backport from mainline diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 36ec54d77534..984039401005 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -2567,7 +2567,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; /* FIXME: The values below need re-considering and perhaps also diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f5c1c2040da4..12d7839b858f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2020-01-14 Martin Jambor + + Backport from mainline + 2020-01-13 Martin Jambor + + PR ipa/93223 + * g++.dg/ipa/pr93223.C: New test. + 2020-01-13 Joseph Myers Backport from mainline: diff --git a/gcc/testsuite/g++.dg/ipa/pr93223.C b/gcc/testsuite/g++.dg/ipa/pr93223.C new file mode 100644 index 000000000000..87f98b5e244b --- /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); + } +}