Hi,

On Fri, Apr 27 2018, Martin Jambor wrote:
> Hi,
>
> this is a fix for another fallout from the fix for 84149

sorry, I have mistakenly hit the send key.  Anyway, this is a fix for
another fallout from the fix for 84149, in which I have relaxed
conditions to propagate values along self recursive edges, but in the
case of aggregate values I forgot to add a check that the pass-though
jump function along the edge also preserves data passed by reference
through that pointer.

Fixed by adding the check, the pass has passed bootstrap and LTO
bootstrap and checking on x86_64-linux.  OK for trunk and the gcc 8
branch?

Thanks,

Martin



2018-04-27  Martin Jambor  <mjam...@suse.cz>

        PR ipa/85549
        * ipa-cp.c (find_aggregate_values_for_callers_subset): Make sure
        the jump function allows for passing through aggregate values.

        testsuite/
        * g++.dg/ipa/pr85549.C: New test.
---
 gcc/ipa-cp.c                       |  4 +++-
 gcc/testsuite/g++.dg/ipa/pr85549.C | 28 ++++++++++++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/ipa/pr85549.C

diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
index 1b8f335fd32..4f28a55b862 100644
--- a/gcc/ipa-cp.c
+++ b/gcc/ipa-cp.c
@@ -4372,7 +4372,9 @@ find_aggregate_values_for_callers_subset (struct 
cgraph_node *node,
        {
          struct ipa_jump_func *jfunc
            = ipa_get_ith_jump_func (IPA_EDGE_REF (cs), i);
-         if (self_recursive_pass_through_p (cs, jfunc, i))
+         if (self_recursive_pass_through_p (cs, jfunc, i)
+             && (!plats->aggs_by_ref
+                 || ipa_get_jf_pass_through_agg_preserved (jfunc)))
            continue;
          inter = intersect_aggregates_with_edge (cs, i, inter);
 
diff --git a/gcc/testsuite/g++.dg/ipa/pr85549.C 
b/gcc/testsuite/g++.dg/ipa/pr85549.C
new file mode 100644
index 00000000000..ae0336e16b7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/pr85549.C
@@ -0,0 +1,28 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+#include <vector>
+
+#define N 10
+
+static void visit(int &level, int n, int k, std::vector< int > &value) {
+  level = level + 1;
+  value[k] = level;
+  for (int i = 0 ; i < n; i++)
+    if (value[i] == 0)
+      visit(level, n, i, value);
+}
+void permutations()
+{
+  std::vector< int > value(N);
+  int level = -1;
+  visit(level, N, 0, value);
+}
+void testExtendByBox() {
+  permutations();
+}
+
+int main() {
+  testExtendByBox();
+  return 0;
+}
-- 
2.16.3

Reply via email to