aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2017-11-27 11:33:06 +0100
committerMartin Jambor <jamborm@gcc.gnu.org>2017-11-27 11:33:06 +0100
commitbe025a2d99772df9ccea1b8b0aba5833bd8fc32c (patch)
tree1547c19540eafc5952a48ec76d071d3aea9f10a3
parent8cb715989f978104108606d65233838105fd41eb (diff)
downloadgcc-be025a2d99772df9ccea1b8b0aba5833bd8fc32c.zip
gcc-be025a2d99772df9ccea1b8b0aba5833bd8fc32c.tar.gz
gcc-be025a2d99772df9ccea1b8b0aba5833bd8fc32c.tar.bz2
[PR 81248] Fix ipa-sra size check
2017-11-27 Martin Jambor <mjambor@suse.cz> PR tree-optimization/81248 * tree-sra.c (splice_param_accesses): Remove size check. (decide_one_param_reduction): Fix size check. * gimple-pretty-print.c (dump_profile): Silence warning. * params.def (PARAM_IPA_SRA_PTR_GROWTH_FACTOR): Adjust description. testsuite/ * g++.dg/ipa/pr81248.C: New test. * gcc.dg/tree-ssa/ssa-pre-31.c: Disable IPA-SRA. * gcc/testsuite/gcc.dg/ipa/ipcp-cstagg-2.c: Likewise. From-SVN: r255163
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/gimple-pretty-print.c2
-rw-r--r--gcc/params.def4
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/ipa/pr81248.C40
-rw-r--r--gcc/testsuite/gcc.dg/ipa/ipcp-cstagg-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-31.c2
-rw-r--r--gcc/tree-sra.c55
8 files changed, 84 insertions, 36 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 75a860e..cfb1393 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2017-11-27 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/81248
+ * tree-sra.c (splice_param_accesses): Remove size check.
+ (decide_one_param_reduction): Fix size check.
+ * gimple-pretty-print.c (dump_profile): Silence warning.
+ * params.def (PARAM_IPA_SRA_PTR_GROWTH_FACTOR): Adjust description.
+
2017-11-27 Jakub Jelinek <jakub@redhat.com>
PR debug/81307
diff --git a/gcc/gimple-pretty-print.c b/gcc/gimple-pretty-print.c
index 55c623e..8bcc4e3 100644
--- a/gcc/gimple-pretty-print.c
+++ b/gcc/gimple-pretty-print.c
@@ -84,7 +84,7 @@ debug_gimple_stmt (gimple *gs)
static const char *
dump_profile (profile_count &count)
{
- char *buf;
+ char *buf = NULL;
if (!count.initialized_p ())
return "";
if (count.ipa_p ())
diff --git a/gcc/params.def b/gcc/params.def
index 89915d4..93bd2cf 100644
--- a/gcc/params.def
+++ b/gcc/params.def
@@ -971,8 +971,8 @@ DEFPARAM (PARAM_MIN_NONDEBUG_INSN_UID,
DEFPARAM (PARAM_IPA_SRA_PTR_GROWTH_FACTOR,
"ipa-sra-ptr-growth-factor",
- "Maximum allowed growth of size of new parameters ipa-sra replaces "
- "a pointer to an aggregate with.",
+ "Maximum allowed growth of number and total size of new parameters "
+ "that ipa-sra replaces a pointer to an aggregate with.",
2, 0, 0)
DEFPARAM (PARAM_TM_MAX_AGGREGATE_SIZE,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1c09306..0b0bac7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2017-11-27 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/81248
+ * g++.dg/ipa/pr81248.C: New test.
+ * gcc.dg/tree-ssa/ssa-pre-31.c: Disable IPA-SRA.
+ * gcc/testsuite/gcc.dg/ipa/ipcp-cstagg-2.c: Likewise.
+
2017-11-27 Jakub Jelinek <jakub@redhat.com>
* g++.dg/ubsan/null-8.C (bar): New function.
diff --git a/gcc/testsuite/g++.dg/ipa/pr81248.C b/gcc/testsuite/g++.dg/ipa/pr81248.C
new file mode 100644
index 0000000..d55d2e7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/pr81248.C
@@ -0,0 +1,40 @@
+// { dg-do compile }
+// { dg-options "-O2 -std=c++17 -fdump-tree-eipa_sra" }
+
+
+#include <type_traits>
+
+typedef unsigned char __uint8_t;
+typedef __uint8_t uint8_t;
+
+
+struct A {
+ A() = default;
+ A(const A& o) = default;
+ A(const volatile A& o) : m1(o.m1) {}
+ uint8_t m1{0};
+};
+
+volatile uint8_t v;
+
+template<typename T>
+void f(const T& x) __attribute__((noinline));
+template<typename T>
+void f(const T& x) {
+ if constexpr(std::is_same<std::remove_cv_t<T>, A>::value) {
+ v = x.m1;
+ }
+ else {
+ v = x;
+ }
+}
+
+uint8_t n1;
+A n2;
+
+int main() {
+ f(n1);
+ f(n2);
+}
+
+// { dg-final { scan-tree-dump-times "Adjusting call" 2 "eipa_sra" } }
diff --git a/gcc/testsuite/gcc.dg/ipa/ipcp-cstagg-2.c b/gcc/testsuite/gcc.dg/ipa/ipcp-cstagg-2.c
index f820140..c1b6f0f 100644
--- a/gcc/testsuite/gcc.dg/ipa/ipcp-cstagg-2.c
+++ b/gcc/testsuite/gcc.dg/ipa/ipcp-cstagg-2.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O3 -fdump-ipa-cp-details" } */
+/* { dg-options "-O3 -fdump-ipa-cp-details -fno-ipa-sra" } */
typedef struct S
{
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-31.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-31.c
index 0dface5..6a33b94 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-31.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-31.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-pre" } */
+/* { dg-options "-O2 -fdump-tree-pre -fno-ipa-sra" } */
typedef struct {
unsigned int key;
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index db490b2..866cff0 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -4453,7 +4453,7 @@ static struct access *
splice_param_accesses (tree parm, bool *ro_grp)
{
int i, j, access_count, group_count;
- int agg_size, total_size = 0;
+ int total_size = 0;
struct access *access, *res, **prev_acc_ptr = &res;
vec<access_p> *access_vec;
@@ -4520,13 +4520,6 @@ splice_param_accesses (tree parm, bool *ro_grp)
i = j;
}
- if (POINTER_TYPE_P (TREE_TYPE (parm)))
- agg_size = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (TREE_TYPE (parm))));
- else
- agg_size = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (parm)));
- if (total_size >= agg_size)
- return NULL;
-
gcc_assert (group_count > 0);
return res;
}
@@ -4537,7 +4530,7 @@ splice_param_accesses (tree parm, bool *ro_grp)
static int
decide_one_param_reduction (struct access *repr)
{
- int total_size, cur_parm_size, agg_size, new_param_count, parm_size_limit;
+ HOST_WIDE_INT total_size, cur_parm_size;
bool by_ref;
tree parm;
@@ -4546,15 +4539,9 @@ decide_one_param_reduction (struct access *repr)
gcc_assert (cur_parm_size > 0);
if (POINTER_TYPE_P (TREE_TYPE (parm)))
- {
- by_ref = true;
- agg_size = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (TREE_TYPE (parm))));
- }
+ by_ref = true;
else
- {
- by_ref = false;
- agg_size = cur_parm_size;
- }
+ by_ref = false;
if (dump_file)
{
@@ -4567,7 +4554,7 @@ decide_one_param_reduction (struct access *repr)
}
total_size = 0;
- new_param_count = 0;
+ int new_param_count = 0;
for (; repr; repr = repr->next_grp)
{
@@ -4595,22 +4582,28 @@ decide_one_param_reduction (struct access *repr)
gcc_assert (new_param_count > 0);
- if (optimize_function_for_size_p (cfun))
- parm_size_limit = cur_parm_size;
- else
- parm_size_limit = (PARAM_VALUE (PARAM_IPA_SRA_PTR_GROWTH_FACTOR)
- * cur_parm_size);
-
- if (total_size < agg_size
- && total_size <= parm_size_limit)
+ if (!by_ref)
{
- if (dump_file)
- fprintf (dump_file, " ....will be split into %i components\n",
- new_param_count);
- return new_param_count;
+ if (total_size >= cur_parm_size)
+ return 0;
}
else
- return 0;
+ {
+ int parm_num_limit;
+ if (optimize_function_for_size_p (cfun))
+ parm_num_limit = 1;
+ else
+ parm_num_limit = PARAM_VALUE (PARAM_IPA_SRA_PTR_GROWTH_FACTOR);
+
+ if (new_param_count > parm_num_limit
+ || total_size > (parm_num_limit * cur_parm_size))
+ return 0;
+ }
+
+ if (dump_file)
+ fprintf (dump_file, " ....will be split into %i components\n",
+ new_param_count);
+ return new_param_count;
}
/* The order of the following enums is important, we need to do extra work for