re PR tree-optimization/45722 (FAIL: gcc.c-torture/execute/20040709-2.c execution...
authorEric Botcazou <ebotcazou@adacore.com>
Sun, 14 Nov 2010 11:24:47 +0000 (11:24 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sun, 14 Nov 2010 11:24:47 +0000 (11:24 +0000)
PR tree-optimization/45722
* tree-sra.c (build_ref_for_model): Always build a COMPONENT_REF if
this is a reference to a component.
* ipa-prop.c (ipa_get_member_ptr_load_param): Accept COMPONENT_REF.
(ipa_note_param_call): Adjust comment.

From-SVN: r166731

gcc/ChangeLog
gcc/ipa-prop.c
gcc/tree-sra.c

index d1aef39f17525057f82ad2f77b6080913de08436..d4793931a3721c8214a458720ffd4d071d6726e6 100644 (file)
@@ -1,3 +1,11 @@
+2010-11-14  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR tree-optimization/45722
+       * tree-sra.c (build_ref_for_model): Always build a COMPONENT_REF if
+       this is a reference to a component.
+       * ipa-prop.c (ipa_get_member_ptr_load_param): Accept COMPONENT_REF.
+       (ipa_note_param_call): Adjust comment.
+
 2010-11-14  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * config/mips/mips.c (machine_function): Remove
index 473f483ad3dc38fc0d201071ab6900c0b4d7aecc..7c7df56e6f497ae973250d3dc1d91e06ada68292 100644 (file)
@@ -918,10 +918,15 @@ ipa_compute_jump_functions (struct cgraph_node *node,
 static tree
 ipa_get_member_ptr_load_param (tree rhs, bool use_delta)
 {
-  tree rec, ref_offset, fld_offset;
-  tree ptr_field;
-  tree delta_field;
+  tree rec, ref_field, ref_offset, fld, fld_offset, ptr_field, delta_field;
 
+  if (TREE_CODE (rhs) == COMPONENT_REF)
+    {
+      ref_field = TREE_OPERAND (rhs, 1);
+      rhs = TREE_OPERAND (rhs, 0);
+    }
+  else
+    ref_field = NULL_TREE;
   if (TREE_CODE (rhs) != MEM_REF)
     return NULL_TREE;
   rec = TREE_OPERAND (rhs, 0);
@@ -933,6 +938,20 @@ ipa_get_member_ptr_load_param (tree rhs, bool use_delta)
     return NULL_TREE;
 
   ref_offset = TREE_OPERAND (rhs, 1);
+
+  if (ref_field)
+    {
+      if (integer_nonzerop (ref_offset))
+       return NULL_TREE;
+
+      if (use_delta)
+       fld = delta_field;
+      else
+       fld = ptr_field;
+
+      return ref_field == fld ? rec : NULL_TREE;
+    }
+
   if (use_delta)
     fld_offset = byte_position (delta_field);
   else
@@ -1004,11 +1023,16 @@ ipa_note_param_call (struct cgraph_node *node, int param_index, gimple stmt,
    pattern of such a call.  An example of such a pattern is the gimple dump
    below, the call is on the last line:
 
+     <bb 2>:
+       f$__delta_5 = f.__delta;
+       f$__pfn_24 = f.__pfn;
+
+   or
      <bb 2>:
        f$__delta_5 = MEM[(struct  *)&f];
        f$__pfn_24 = MEM[(struct  *)&f + 4B];
 
-     ...
+   and a few lines below:
 
      <bb 5>
        D.2496_3 = (int) f$__pfn_24;
index be1b45e6b9ca0db20b068dbf9eab5dc757c9f2eb..88199f131aee08df1b8c71d41c6f10eca8249ace 100644 (file)
@@ -1391,7 +1391,7 @@ build_ref_for_offset (location_t loc, tree base, HOST_WIDE_INT offset,
 
 /* Construct a memory reference to a part of an aggregate BASE at the given
    OFFSET and of the same type as MODEL.  In case this is a reference to a
-   bit-field, the function will replicate the last component_ref of model's
+   component, the function will replicate the last COMPONENT_REF of model's
    expr to access it.  GSI and INSERT_AFTER have the same meaning as in
    build_ref_for_offset.  */
 
@@ -1400,12 +1400,9 @@ build_ref_for_model (location_t loc, tree base, HOST_WIDE_INT offset,
                     struct access *model, gimple_stmt_iterator *gsi,
                     bool insert_after)
 {
-  if (TREE_CODE (model->expr) == COMPONENT_REF
-      && DECL_BIT_FIELD (TREE_OPERAND (model->expr, 1)))
+  if (TREE_CODE (model->expr) == COMPONENT_REF)
     {
-      /* This access represents a bit-field.  */
       tree t, exp_type;
-
       offset -= int_bit_position (TREE_OPERAND (model->expr, 1));
       exp_type = TREE_TYPE (TREE_OPERAND (model->expr, 0));
       t = build_ref_for_offset (loc, base, offset, exp_type, gsi, insert_after);