Commit be025a2d by Martin Jambor Committed by Martin Jambor

[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
parent 8cb71598
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> 2017-11-27 Jakub Jelinek <jakub@redhat.com>
PR debug/81307 PR debug/81307
...@@ -84,7 +84,7 @@ debug_gimple_stmt (gimple *gs) ...@@ -84,7 +84,7 @@ debug_gimple_stmt (gimple *gs)
static const char * static const char *
dump_profile (profile_count &count) dump_profile (profile_count &count)
{ {
char *buf; char *buf = NULL;
if (!count.initialized_p ()) if (!count.initialized_p ())
return ""; return "";
if (count.ipa_p ()) if (count.ipa_p ())
......
...@@ -971,8 +971,8 @@ DEFPARAM (PARAM_MIN_NONDEBUG_INSN_UID, ...@@ -971,8 +971,8 @@ DEFPARAM (PARAM_MIN_NONDEBUG_INSN_UID,
DEFPARAM (PARAM_IPA_SRA_PTR_GROWTH_FACTOR, DEFPARAM (PARAM_IPA_SRA_PTR_GROWTH_FACTOR,
"ipa-sra-ptr-growth-factor", "ipa-sra-ptr-growth-factor",
"Maximum allowed growth of size of new parameters ipa-sra replaces " "Maximum allowed growth of number and total size of new parameters "
"a pointer to an aggregate with.", "that ipa-sra replaces a pointer to an aggregate with.",
2, 0, 0) 2, 0, 0)
DEFPARAM (PARAM_TM_MAX_AGGREGATE_SIZE, DEFPARAM (PARAM_TM_MAX_AGGREGATE_SIZE,
......
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> 2017-11-27 Jakub Jelinek <jakub@redhat.com>
* g++.dg/ubsan/null-8.C (bar): New function. * g++.dg/ubsan/null-8.C (bar): New function.
......
// { 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" } }
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O3 -fdump-ipa-cp-details" } */ /* { dg-options "-O3 -fdump-ipa-cp-details -fno-ipa-sra" } */
typedef struct S typedef struct S
{ {
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-pre" } */ /* { dg-options "-O2 -fdump-tree-pre -fno-ipa-sra" } */
typedef struct { typedef struct {
unsigned int key; unsigned int key;
......
...@@ -4453,7 +4453,7 @@ static struct access * ...@@ -4453,7 +4453,7 @@ static struct access *
splice_param_accesses (tree parm, bool *ro_grp) splice_param_accesses (tree parm, bool *ro_grp)
{ {
int i, j, access_count, group_count; 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; struct access *access, *res, **prev_acc_ptr = &res;
vec<access_p> *access_vec; vec<access_p> *access_vec;
...@@ -4520,13 +4520,6 @@ splice_param_accesses (tree parm, bool *ro_grp) ...@@ -4520,13 +4520,6 @@ splice_param_accesses (tree parm, bool *ro_grp)
i = j; 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); gcc_assert (group_count > 0);
return res; return res;
} }
...@@ -4537,7 +4530,7 @@ splice_param_accesses (tree parm, bool *ro_grp) ...@@ -4537,7 +4530,7 @@ splice_param_accesses (tree parm, bool *ro_grp)
static int static int
decide_one_param_reduction (struct access *repr) 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; bool by_ref;
tree parm; tree parm;
...@@ -4546,15 +4539,9 @@ decide_one_param_reduction (struct access *repr) ...@@ -4546,15 +4539,9 @@ decide_one_param_reduction (struct access *repr)
gcc_assert (cur_parm_size > 0); gcc_assert (cur_parm_size > 0);
if (POINTER_TYPE_P (TREE_TYPE (parm))) if (POINTER_TYPE_P (TREE_TYPE (parm)))
{ by_ref = true;
by_ref = true;
agg_size = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (TREE_TYPE (parm))));
}
else else
{ by_ref = false;
by_ref = false;
agg_size = cur_parm_size;
}
if (dump_file) if (dump_file)
{ {
...@@ -4567,7 +4554,7 @@ decide_one_param_reduction (struct access *repr) ...@@ -4567,7 +4554,7 @@ decide_one_param_reduction (struct access *repr)
} }
total_size = 0; total_size = 0;
new_param_count = 0; int new_param_count = 0;
for (; repr; repr = repr->next_grp) for (; repr; repr = repr->next_grp)
{ {
...@@ -4595,22 +4582,28 @@ decide_one_param_reduction (struct access *repr) ...@@ -4595,22 +4582,28 @@ decide_one_param_reduction (struct access *repr)
gcc_assert (new_param_count > 0); gcc_assert (new_param_count > 0);
if (optimize_function_for_size_p (cfun)) if (!by_ref)
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 (dump_file) if (total_size >= cur_parm_size)
fprintf (dump_file, " ....will be split into %i components\n", return 0;
new_param_count);
return new_param_count;
} }
else 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 /* The order of the following enums is important, we need to do extra work for
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment