Do not propagate self-dependent value (PR ipa/93763)
authorFeng Xue <fxue@os.amperecomputing.com>
Mon, 17 Feb 2020 09:07:04 +0000 (17:07 +0800)
committerJeff Law <law@redhat.com>
Fri, 21 Feb 2020 20:22:20 +0000 (13:22 -0700)
        PR ipa/93763
        * ipa-cp.c (self_recursively_generated_p): Mark self-dependent value as
        self-recursively generated.

gcc/ipa-cp.c
gcc/testsuite/g++.dg/ipa/pr93763.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/ipa/pr93763.c [new file with mode: 0644]

index 4f5b72e6994c6824edb14cb493b7ef0fdf5af9c2..1d0c1ac0f35b5184afe7ff69ca3b5c5b560aa4c5 100644 (file)
@@ -1897,8 +1897,8 @@ ipcp_lattice<valtype>::add_value (valtype newval, cgraph_edge *cs,
 }
 
 /* Return true, if a ipcp_value VAL is orginated from parameter value of
-   self-feeding recursive function by applying non-passthrough arithmetic
-   transformation.  */
+   self-feeding recursive function via some kind of pass-through jump
+   function.  */
 
 static bool
 self_recursively_generated_p (ipcp_value<tree> *val)
@@ -1909,10 +1909,12 @@ self_recursively_generated_p (ipcp_value<tree> *val)
     {
       cgraph_edge *cs = src->cs;
 
-      if (!src->val || cs->caller != cs->callee->function_symbol ()
-         || src->val == val)
+      if (!src->val || cs->caller != cs->callee->function_symbol ())
        return false;
 
+      if (src->val == val)
+       continue;
+
       if (!info)
        info = IPA_NODE_REF (cs->caller);
 
diff --git a/gcc/testsuite/g++.dg/ipa/pr93763.C b/gcc/testsuite/g++.dg/ipa/pr93763.C
new file mode 100644 (file)
index 0000000..6111710
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+struct search_param {
+  int total;
+};
+void search_trivial(search_param error_left) {
+  search_trivial(error_left);
+  search_param error_left2{error_left};
+  error_left2.total--;
+  search_trivial(error_left2);
+}
+void search_algo_uni(search_param error_left) { search_trivial(error_left); }
+void search_algo(search_param error_left) { search_algo_uni(error_left); }
+int main() { search_algo({}); return 0; }
diff --git a/gcc/testsuite/gcc.dg/ipa/pr93763.c b/gcc/testsuite/gcc.dg/ipa/pr93763.c
new file mode 100644 (file)
index 0000000..d117059
--- /dev/null
@@ -0,0 +1,46 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+typedef struct a a;
+struct a {
+  a *b
+} d;
+e, k, ah, al;
+f(aa) {
+  if (aa & 1)
+    goto g;
+  f(aa | 2);
+g:
+  h();
+}
+l() {
+  {
+    f(072);
+    i(e, d, 92);
+  }
+}
+ag() {
+  { i(e, d, 36); }
+}
+ai(a *m, a *n, unsigned aa) {
+  f(aa);
+  j(k, l, ah, 1);
+}
+j(int c, a m, int aj, int aa) {
+  int ak = aa;
+  { i(e, d, ak); }
+}
+i(int c, a *m, unsigned aa) {
+  {
+    {             i(c, (*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(
+*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(
+*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*m).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b)
+.b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b)
+.b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b)
+.b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b)
+.b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b, 0);
+    }
+  }
+  int am = aa;
+  ai(ag, al, am);
+}