fold-const.c (fold_ternary_loc): Also fold non-constant vector CONSTRUCTORs.
authorRichard Guenther <rguenther@suse.de>
Thu, 6 Oct 2011 10:34:18 +0000 (10:34 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 6 Oct 2011 10:34:18 +0000 (10:34 +0000)
2011-10-06  Richard Guenther  <rguenther@suse.de>

* fold-const.c (fold_ternary_loc): Also fold non-constant
vector CONSTRUCTORs.  Make more efficient.
* tree-ssa-dom.c (cprop_operand): Don't handle virtual operands.
(cprop_into_stmt): Don't propagate into virtual operands.
(optimize_stmt): Really dump original statement.

From-SVN: r179597

gcc/ChangeLog
gcc/fold-const.c

index be15692b1e637860f0c877455a9edd2fd9f56071..ce0215de3048be4cb81e33554bae91910fed8100 100644 (file)
@@ -1,3 +1,11 @@
+2011-10-06  Richard Guenther  <rguenther@suse.de>
+
+       * fold-const.c (fold_ternary_loc): Also fold non-constant
+       vector CONSTRUCTORs.  Make more efficient.
+       * tree-ssa-dom.c (cprop_operand): Don't handle virtual operands.
+       (cprop_into_stmt): Don't propagate into virtual operands.
+       (optimize_stmt): Really dump original statement.
+
 2011-10-06  Nick Clifton  <nickc@redhat.com>
 
        * config/rx/rx.md (smin3): Revert previous delta.
index c3871f1075a09e4733dc0ee5434b06f9c79c64ff..404d904d3ba8d1c8ddbc6247c343c16241a246c2 100644 (file)
@@ -13647,7 +13647,7 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type,
 
     case BIT_FIELD_REF:
       if ((TREE_CODE (arg0) == VECTOR_CST
-          || (TREE_CODE (arg0) == CONSTRUCTOR && TREE_CONSTANT (arg0)))
+          || TREE_CODE (arg0) == CONSTRUCTOR)
          && type == TREE_TYPE (TREE_TYPE (arg0)))
        {
          unsigned HOST_WIDE_INT width = tree_low_cst (arg1, 1);
@@ -13659,24 +13659,17 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type,
              && (idx = idx / width)
                 < TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
            {
-             tree elements = NULL_TREE;
-
              if (TREE_CODE (arg0) == VECTOR_CST)
-               elements = TREE_VECTOR_CST_ELTS (arg0);
-             else
                {
-                 unsigned HOST_WIDE_INT idx;
-                 tree value;
-
-                 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (arg0), idx, value)
-                   elements = tree_cons (NULL_TREE, value, elements);
+                 tree elements = TREE_VECTOR_CST_ELTS (arg0);
+                 while (idx-- > 0 && elements)
+                   elements = TREE_CHAIN (elements);
+                 if (elements)
+                   return TREE_VALUE (elements);
                }
-             while (idx-- > 0 && elements)
-               elements = TREE_CHAIN (elements);
-             if (elements)
-               return TREE_VALUE (elements);
-             else
-               return build_zero_cst (type);
+             else if (idx < CONSTRUCTOR_NELTS (arg0))
+               return CONSTRUCTOR_ELT (arg0, idx)->value;
+             return build_zero_cst (type);
            }
        }