re PR rtl-optimization/66351 (r223883 miscompiles stage2 compiler on ia64)
authorJan Hubicka <hubicka@ucw.cz>
Mon, 22 Jun 2015 07:02:50 +0000 (09:02 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 22 Jun 2015 07:02:50 +0000 (07:02 +0000)
PR ipa/66351
* ipa-polymorphic-call.c
(ipa_polymorphic_call_context::get_dynamic_type): Fix thinko when
initializing alias oracle; fix formating; set base_alias_set if it
is known.

From-SVN: r224719

gcc/ChangeLog
gcc/ipa-polymorphic-call.c

index 737178ca0ca42a31a48a537da02978933af48466..60f835ea69854060b9ab61de2f65a6a0b1abd7ab 100644 (file)
@@ -1,3 +1,11 @@
+2015-06-22  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/66351
+       * ipa-polymorphic-call.c
+       (ipa_polymorphic_call_context::get_dynamic_type): Fix thinko when
+       initializing alias oracle; fix formating; set base_alias_set if it
+       is known.
+
 2015-06-22  Mikhail Maltsev  <maltsevm@gmail.com>
 
        * auto-inc-dec.c (reverse_mem, reverse_inc): Remove.
index 0036565a844f0b21ad08f7e1aa77b424d70849b2..ac8c78ea8f1d37c38450ca563e825b07820880f4 100644 (file)
@@ -1574,13 +1574,15 @@ ipa_polymorphic_call_context::get_dynamic_type (tree instance,
                  tree base_ref = get_ref_base_and_extent
                                   (ref_exp, &offset2, &size, &max_size);
 
-                 /* Finally verify that what we found looks like read from OTR_OBJECT
-                    or from INSTANCE with offset OFFSET.  */
+                 /* Finally verify that what we found looks like read from
+                    OTR_OBJECT or from INSTANCE with offset OFFSET.  */
                  if (base_ref
                      && ((TREE_CODE (base_ref) == MEM_REF
                           && ((offset2 == instance_offset
                                && TREE_OPERAND (base_ref, 0) == instance)
-                              || (!offset2 && TREE_OPERAND (base_ref, 0) == otr_object)))
+                              || (!offset2
+                                  && TREE_OPERAND (base_ref, 0)
+                                     == otr_object)))
                          || (DECL_P (instance) && base_ref == instance
                              && offset2 == instance_offset)))
                    {
@@ -1608,9 +1610,17 @@ ipa_polymorphic_call_context::get_dynamic_type (tree instance,
   /* We look for vtbl pointer read.  */
   ao.size = POINTER_SIZE;
   ao.max_size = ao.size;
+  /* We are looking for stores to vptr pointer within the instance of
+     outer type.
+     TODO: The vptr pointer type is globally known, we probably should
+     keep it and do that even when otr_type is unknown.  */
   if (otr_type)
-    ao.ref_alias_set
-      = get_deref_alias_set (TREE_TYPE (BINFO_VTABLE (TYPE_BINFO (otr_type))));
+    {
+      ao.base_alias_set
+       = get_alias_set (outer_type ? outer_type : otr_type);
+      ao.ref_alias_set
+        = get_alias_set (TREE_TYPE (BINFO_VTABLE (TYPE_BINFO (otr_type))));
+    }
 
   if (dump_file)
     {