aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorFeng Xue <fxue@os.amperecomputing.com>2020-01-24 23:09:28 +0800
committerFeng Xue <fxue@os.amperecomputing.com>2020-06-01 14:10:04 +0800
commit32633ec815b4d741a9a4b1b75de235844f6d691c (patch)
treea4bef1e46c28cb3795065c55562f3534a956682b /gcc
parente7340ed74abf5f44b069210a9eb1283a2e515b15 (diff)
downloadgcc-32633ec815b4d741a9a4b1b75de235844f6d691c.zip
gcc-32633ec815b4d741a9a4b1b75de235844f6d691c.tar.gz
gcc-32633ec815b4d741a9a4b1b75de235844f6d691c.tar.bz2
Fix missed IPA-CP on by-ref argument directly passed through (PR 93429)
2020-06-01 Feng Xue <fxue@os.amperecomputing.com> gcc/ PR ipa/93429 * ipa-cp.c (propagate_aggs_across_jump_function): Check aggregate lattice for simple pass-through by-ref argument. gcc/testsuite/ PR ipa/93429 * gcc.dg/ipa/ipcp-agg-8.c: Change dump string. * gcc.dg/ipa/ipcp-agg-13.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ipa-cp.c23
-rw-r--r--gcc/testsuite/gcc.dg/ipa/ipcp-agg-13.c45
-rw-r--r--gcc/testsuite/gcc.dg/ipa/ipcp-agg-8.c5
3 files changed, 57 insertions, 16 deletions
diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
index c64e910..b0c8f40 100644
--- a/gcc/ipa-cp.c
+++ b/gcc/ipa-cp.c
@@ -2735,9 +2735,8 @@ propagate_aggs_across_jump_function (struct cgraph_edge *cs,
gcc_assert (!jfunc->agg.items);
ret |= merge_aggregate_lattices (cs, dest_plats, src_plats,
src_idx, 0);
+ return ret;
}
- else
- ret |= set_agg_lats_contain_variable (dest_plats);
}
else if (jfunc->type == IPA_JF_ANCESTOR
&& ipa_get_jf_ancestor_agg_preserved (jfunc))
@@ -2759,8 +2758,10 @@ propagate_aggs_across_jump_function (struct cgraph_edge *cs,
ret |= set_agg_lats_to_bottom (dest_plats);
else
ret |= set_agg_lats_contain_variable (dest_plats);
+ return ret;
}
- else if (jfunc->agg.items)
+
+ if (jfunc->agg.items)
{
bool pre_existing = dest_plats->aggs != NULL;
struct ipcp_agg_lattice **aglat = &dest_plats->aggs;
@@ -4988,11 +4989,7 @@ intersect_aggregates_with_edge (struct cgraph_edge *cs, int index,
else
intersect_with_agg_replacements (cs->caller, src_idx,
&inter, 0);
- }
- else
- {
- inter.release ();
- return vNULL;
+ return inter;
}
}
else
@@ -5008,11 +5005,7 @@ intersect_aggregates_with_edge (struct cgraph_edge *cs, int index,
inter = copy_plats_to_inter (src_plats, 0);
else
intersect_with_plats (src_plats, &inter, 0);
- }
- else
- {
- inter.release ();
- return vNULL;
+ return inter;
}
}
}
@@ -5043,8 +5036,10 @@ intersect_aggregates_with_edge (struct cgraph_edge *cs, int index,
else
intersect_with_plats (src_plats, &inter, delta);
}
+ return inter;
}
- else if (jfunc->agg.items)
+
+ if (jfunc->agg.items)
{
class ipa_node_params *caller_info = IPA_NODE_REF (cs->caller);
struct ipa_agg_value *item;
diff --git a/gcc/testsuite/gcc.dg/ipa/ipcp-agg-13.c b/gcc/testsuite/gcc.dg/ipa/ipcp-agg-13.c
new file mode 100644
index 0000000..47e9e53
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/ipcp-agg-13.c
@@ -0,0 +1,45 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fno-ipa-sra -fdump-ipa-cp --param ipa-cp-eval-threshold=1" } */
+
+int data;
+int fn();
+
+int __attribute__((noinline)) f1 (int *p)
+{
+ data = *p;
+ fn ();
+ return 0;
+}
+
+int __attribute__((noinline)) f2 (int *p)
+{
+ *p = *p + 1;
+ f1 (p);
+ return 1;
+}
+
+int __attribute__((noinline)) f3 (int a, int *p)
+{
+ *p = a - 2;
+ f1 (p);
+ return 1;
+}
+
+int f4 ()
+{
+ int i;
+
+ for (i = 0; i < 100; i++)
+ {
+ int v = 2;
+
+ f2 (&v);
+ f3 (6, &v);
+ }
+
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "Aggregate replacements: 0\\\[0]=2" "cp" } } */
+/* { dg-final { scan-ipa-dump "Aggregate replacements: 0\\\[0]=3" "cp" } } */
+/* { dg-final { scan-ipa-dump "Aggregate replacements: 0\\\[0]=4" "cp" } } */
diff --git a/gcc/testsuite/gcc.dg/ipa/ipcp-agg-8.c b/gcc/testsuite/gcc.dg/ipa/ipcp-agg-8.c
index a2a870d..2d9c82f 100644
--- a/gcc/testsuite/gcc.dg/ipa/ipcp-agg-8.c
+++ b/gcc/testsuite/gcc.dg/ipa/ipcp-agg-8.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O3 -fno-ipa-sra -fdump-tree-optimized-slim" } */
+/* { dg-options "-O3 -fno-ipa-sra -fdump-ipa-cp" } */
/* { dg-add-options bind_pic_locally } */
struct S
@@ -48,4 +48,5 @@ entry (int c)
foo (4, i, &s);
}
}
-/* { dg-final { scan-tree-dump "->b;" "optimized" } } */
+/* { dg-final { scan-ipa-dump "Aggregate replacements: 1\\\[32]=64, 1\\\[64]=32" "cp" } } */
+/* { dg-final { scan-ipa-dump "Aggregate replacements: 1\\\[32]=0" "cp" } } */