2005-10-06 Daniel Berlin <dberlin@dberlin.org>
authordberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 6 Oct 2005 19:38:00 +0000 (19:38 +0000)
committerdberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 6 Oct 2005 19:38:00 +0000 (19:38 +0000)
Fix PR tree-optimization/22488
* tree-ssa-structalias.c (check_for_overlaps): New function.
(create_variable_info_for): Use it.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@105052 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/g++.dg/tree-ssa/pr22488.C [new file with mode: 0644]
gcc/tree-ssa-structalias.c

index 7f7da32..16aeadb 100644 (file)
@@ -1,3 +1,9 @@
+2005-10-06  Daniel Berlin  <dberlin@dberlin.org>
+       
+       Fix PR tree-optimization/22488
+       * tree-ssa-structalias.c (check_for_overlaps): New function.
+       (create_variable_info_for): Use it.
+
 2005-10-06  Richard Henderson  <rth@redhat.com>
 
        PR debug/24070
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr22488.C b/gcc/testsuite/g++.dg/tree-ssa/pr22488.C
new file mode 100644 (file)
index 0000000..9063b06
--- /dev/null
@@ -0,0 +1,33 @@
+// PR tree-optimization/22488
+// This testcase is really a C++ FE bug in represnting virtual inheritance
+// It gives the appearance to the middle end that the fields exist twice
+// which resulted in a very confused structure analyzer
+// { dg-do compile }
+// { dg-options "-O" }
+struct X
+{
+    int i0, i1;
+      char c;
+};
+
+struct A
+{
+    int i;
+      char c0, c1;
+
+        virtual ~A();
+};
+
+struct B : virtual A {};
+
+struct C : B
+{
+    X x;
+
+      void bar(X y) { x = y; }
+};
+
+void foo()
+{
+    C().bar(X());
+}
index 890006a..f6ac3ca 100644 (file)
@@ -3020,6 +3020,26 @@ make_constraint_to_anything (varinfo_t vi)
   process_constraint (new_constraint (lhs, rhs));
 }
 
+
+/* Return true if FIELDSTACK contains fields that overlap. 
+   FIELDSTACK is assumed to be sorted by offset.  */
+
+static bool
+check_for_overlaps (VEC (fieldoff_s,heap) *fieldstack)
+{
+  fieldoff_s *fo = NULL;
+  unsigned int i;
+  unsigned int lastoffset = ~0;
+
+  for (i = 0; VEC_iterate (fieldoff_s, fieldstack, i, fo); i++)
+    {
+      if (fo->offset == lastoffset)
+       return true;
+      lastoffset = fo->offset;
+    }
+  return false;
+}
+
 /* Create a varinfo structure for NAME and DECL, and add it to VARMAP.
    This will also create any varinfo structures necessary for fields
    of DECL.  */
@@ -3104,8 +3124,16 @@ create_variable_info_for (tree decl, const char *name)
         which will make notokay = true.  In that case, we are going to return
         without creating varinfos for the fields anyway, so sorting them is a
         waste to boot.  */
-      if (!notokay)    
-       sort_fieldstack (fieldstack);
+      if (!notokay)
+       {       
+         sort_fieldstack (fieldstack);
+         /* Due to some C++ FE issues, like PR 22488, we might end up
+            what appear to be overlapping fields even though they,
+            in reality, do not overlap.  Until the C++ FE is fixed,
+            we will simply disable field-sensitivity for these cases.  */
+         notokay = check_for_overlaps (fieldstack);
+       }
+      
       
       if (VEC_length (fieldoff_s, fieldstack) != 0)
        fo = VEC_index (fieldoff_s, fieldstack, 0);