tree-sra.c (sra_walk_expr): Disable scalarization if on the LHS and not a full access.
authorEric Botcazou <ebotcazou@gcc.gnu.org>
Sun, 20 Apr 2008 17:53:58 +0000 (17:53 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sun, 20 Apr 2008 17:53:58 +0000 (17:53 +0000)
* tree-sra.c (sra_walk_expr) <VIEW_CONVERT_EXPR>: Disable
scalarization if on the LHS and not a full access.

From-SVN: r134487

gcc/ChangeLog
gcc/tree-sra.c

index d96a8e621c1075444574836642845a27cba18f09..a760e7ff4d5544449cb07676b101254d921c6587 100644 (file)
@@ -1,9 +1,14 @@
+2008-04-20  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * tree-sra.c (sra_walk_expr) <VIEW_CONVERT_EXPR>: Disable
+       scalarization if on the LHS and not a full access.
+
 2008-04-20  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
 
-       * Makefile.in (s-gtyp-input): Remove tmp-gi.list before writing
-       it.
+       * Makefile.in (s-gtyp-input): Remove tmp-gi.list before writing it.
 
 2008-04-18  Rafael Espindola  <espindola@google.com>
+
        * tree-vrp.c (find_case_label_index): Fix the binary search.
        (find_case_label_range): New.
        (vrp_visit_switch_stmt): Use find_case_label_range.
index 752f87da947573f1ddce4b41b7e183d48cca8581..78a100f38d756fb29af44486f70581e48b0915ef 100644 (file)
@@ -855,18 +855,28 @@ sra_walk_expr (tree *expr_p, block_stmt_iterator *bsi, bool is_output,
            if (elt)
              elt->is_vector_lhs = true;
          }
+
        /* A bit field reference (access to *multiple* fields simultaneously)
-          is not currently scalarized.  Consider this an access to the
-          complete outer element, to which walk_tree will bring us next.  */
-         
+          is not currently scalarized.  Consider this an access to the full
+          outer element, to which walk_tree will bring us next.  */
        goto use_all;
 
-      case VIEW_CONVERT_EXPR:
       case NOP_EXPR:
-       /* Similarly, a view/nop explicitly wants to look at an object in a
+       /* Similarly, a nop explicitly wants to look at an object in a
           type other than the one we've scalarized.  */
        goto use_all;
 
+      case VIEW_CONVERT_EXPR:
+       /* Likewise for a view conversion, but with an additional twist:
+          it can be on the LHS and, in this case, an access to the full
+          outer element would mean a killing def.  So we need to punt
+          if we haven't already a full access to the current element,
+          because we cannot pretend to have a killing def if we only
+          have a partial access at some level.  */
+       if (is_output && !use_all_p && inner != expr)
+         disable_scalarization = true;
+       goto use_all;
+
       case WITH_SIZE_EXPR:
        /* This is a transparent wrapper.  The entire inner expression really
           is being used.  */