https://gcc.gnu.org/g:47e830211d39b5efb14144bbdaf8f2d83ba8375e

commit r15-9654-g47e830211d39b5efb14144bbdaf8f2d83ba8375e
Author: Richard Biener <rguent...@suse.de>
Date:   Wed May 7 10:20:55 2025 +0200

    ipa/120146 - deal with vanished varpool nodes in IPA PTA
    
    I don't understand why they vanish when still refered to, but
    lets deal with that in a conservative way.
    
            PR ipa/120146
            * tree-ssa-structalias.cc (create_variable_info_for): If
            the symtab cannot tell us whether all refs to a variable
            are explicit assume they are not.
    
            * g++.dg/ipa/pr120146.C: New testcase.
    
    (cherry picked from commit b38e3a7196d25bc8bcb1fe55da7663745cea9470)

Diff:
---
 gcc/testsuite/g++.dg/ipa/pr120146.C | 12 ++++++++++++
 gcc/tree-ssa-structalias.cc         |  4 ++--
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/gcc/testsuite/g++.dg/ipa/pr120146.C 
b/gcc/testsuite/g++.dg/ipa/pr120146.C
new file mode 100644
index 000000000000..33644b4f7a61
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/pr120146.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "-O -fipa-pta" }
+
+struct basic_ios {
+  ~basic_ios();
+};
+struct basic_istream : virtual basic_ios {};
+template <typename> struct basic_ifstream : basic_istream {
+  template <typename _Path> basic_ifstream(_Path, int);
+};
+extern template class basic_ifstream<char>;
+void CompareFiles_path2() { basic_ifstream<char>(CompareFiles_path2, 0); }
diff --git a/gcc/tree-ssa-structalias.cc b/gcc/tree-ssa-structalias.cc
index 3ad0c69930c7..deca44ae0bf3 100644
--- a/gcc/tree-ssa-structalias.cc
+++ b/gcc/tree-ssa-structalias.cc
@@ -6562,7 +6562,7 @@ create_variable_info_for (tree decl, const char *name, 
bool add_id)
          varpool_node *vnode = varpool_node::get (decl);
 
          /* For escaped variables initialize them from nonlocal.  */
-         if (!vnode->all_refs_explicit_p ())
+         if (!vnode || !vnode->all_refs_explicit_p ())
            make_copy_constraint (vi, nonlocal_id);
 
          /* While we can in theory walk references for the varpool
@@ -6581,7 +6581,7 @@ create_variable_info_for (tree decl, const char *name, 
bool add_id)
                process_constraint (new_constraint (lhs, *rhsp));
              /* If this is a variable that escapes from the unit
                 the initializer escapes as well.  */
-             if (!vnode->all_refs_explicit_p ())
+             if (!vnode || !vnode->all_refs_explicit_p ())
                {
                  lhs.var = escaped_id;
                  lhs.offset = 0;

Reply via email to