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,
--- /dev/null
+// { 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" } }
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;
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;
}
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;
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)
{
}
total_size = 0;
- new_param_count = 0;
+ int new_param_count = 0;
for (; repr; repr = repr->next_grp)
{
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