tree-inline.c (remap_gimple_stmt): Do not subtitute handled components to clobber...
authorJan Hubicka <jh@suse.cz>
Tue, 2 Jul 2019 08:26:16 +0000 (10:26 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 2 Jul 2019 08:26:16 +0000 (08:26 +0000)
* tree-inline.c (remap_gimple_stmt): Do not subtitute handled components
to clobber of return value.
* g++.dg/lto/pr90990_0.C: New testcase.

From-SVN: r272925

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lto/pr90990_0.C [new file with mode: 0644]
gcc/tree-inline.c

index 9d1b648..e16e877 100644 (file)
@@ -1,9 +1,13 @@
+2019-07-02  Jan Hubicka  <jh@suse.cz>
+
+       * tree-inline.c (remap_gimple_stmt): Do not subtitute handled components
+       to clobber of return value.
+
 2019-07-02  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * config/arm/cortex-a57.md (cortex_a57_neon_type): Use neon_arith_basic
        for is_neon_type instructions that have not already been categorized.
 
-
 2019-07-02  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/58483
index e3a6b79..895eb3a 100644 (file)
@@ -1,3 +1,7 @@
+2019-07-02  Jan Hubicka  <jh@suse.cz>
+
+       * g++.dg/lto/pr90990_0.C: New testcase.
+
 2019-07-02  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/58483
diff --git a/gcc/testsuite/g++.dg/lto/pr90990_0.C b/gcc/testsuite/g++.dg/lto/pr90990_0.C
new file mode 100644 (file)
index 0000000..22a5e3f
--- /dev/null
@@ -0,0 +1,31 @@
+// { dg-lto-do link }
+/* { dg-extra-ld-options {  -r -nostdlib } } */
+class A {
+public:
+  float m_floats;
+  A() {}
+};
+class B {
+public:
+  A operator[](int);
+};
+class C {
+  B m_basis;
+
+public:
+  A operator()(A) {
+    m_basis[1] = m_basis[2];
+    A a;
+    return a;
+  }
+};
+class D {
+public:
+  C m_fn1();
+};
+class F {
+  A m_pivotInB;
+  F(D &, const A &);
+};
+F::F(D &p1, const A &p2) : m_pivotInB(p1.m_fn1()(p2)) {}
+
index 450af46..42e4597 100644 (file)
@@ -1757,6 +1757,18 @@ remap_gimple_stmt (gimple *stmt, copy_body_data *id)
                return NULL;
            }
        }
+     
+      /* We do not allow CLOBBERs of handled components.  In case
+        returned value is stored via such handled component, remove
+        the clobber so stmt verifier is happy.  */
+      if (gimple_clobber_p (stmt)
+         && TREE_CODE (gimple_assign_lhs (stmt)) == RESULT_DECL)
+       {
+         tree remapped = remap_decl (gimple_assign_lhs (stmt), id);
+         if (!DECL_P (remapped)
+             && TREE_CODE (remapped) != MEM_REF)
+           return NULL;
+       }
 
       if (gimple_debug_bind_p (stmt))
        {