tree-optimization/98221 - fix wrong unpack operation used for big-endian
authorAndreas Krebbel <krebbel@gcc.gnu.org>
Mon, 11 Jan 2021 09:59:43 +0000 (10:59 +0100)
committerRichard Biener <rguenther@suse.de>
Mon, 11 Jan 2021 10:46:31 +0000 (11:46 +0100)
The vec-abi-varargs-1.c testcase on IBM Z currently fails.

While adding an SI mode vector to a DI mode vector the first is unpacked using:

  _28 = BIT_INSERT_EXPR <{ 0, 0, 0, 0 }, _2, 0>;
  _34 = [vec_unpack_lo_expr] _28;

However, on big endian targets lo refers to the right hand side of the vector - in this case the zeroes.

2021-01-11  Andreas Krebbel  <krebbel@linux.ibm.com>

* tree-ssa-forwprop.c (simplify_vector_constructor): For
big-endian, use UNPACK[_FLOAT]_HI.

gcc/tree-ssa-forwprop.c

index 8a1a123764790401052495ee6c03177dd8c6b5eb..0706fd862de78c1841d8a62c6a19703171d15e5d 100644 (file)
@@ -2392,6 +2392,17 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
             some simple special cases via VEC_[UN]PACK[_FLOAT]_LO_EXPR.  */
          optab optab;
          tree halfvectype, dblvectype;
+         enum tree_code unpack_op;
+
+         if (!BYTES_BIG_ENDIAN)
+           unpack_op = (FLOAT_TYPE_P (TREE_TYPE (type))
+                        ? VEC_UNPACK_FLOAT_LO_EXPR
+                        : VEC_UNPACK_LO_EXPR);
+         else
+           unpack_op = (FLOAT_TYPE_P (TREE_TYPE (type))
+                        ? VEC_UNPACK_FLOAT_HI_EXPR
+                        : VEC_UNPACK_HI_EXPR);
+
          if (CONVERT_EXPR_CODE_P (conv_code)
              && (2 * TYPE_PRECISION (TREE_TYPE (TREE_TYPE (orig[0])))
                  == TYPE_PRECISION (TREE_TYPE (type)))
@@ -2405,9 +2416,7 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
                 represented as scalar bitmasks.  See PR95528.  */
              && (VECTOR_MODE_P (TYPE_MODE (dblvectype))
                  || VECTOR_BOOLEAN_TYPE_P (dblvectype))
-             && (optab = optab_for_tree_code (FLOAT_TYPE_P (TREE_TYPE (type))
-                                              ? VEC_UNPACK_FLOAT_LO_EXPR
-                                              : VEC_UNPACK_LO_EXPR,
+             && (optab = optab_for_tree_code (unpack_op,
                                               dblvectype,
                                               optab_default))
              && (optab_handler (optab, TYPE_MODE (dblvectype))
@@ -2430,11 +2439,7 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
                                    orig[0], TYPE_SIZE (dblvectype),
                                    bitsize_zero_node);
              gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
-             gimple_assign_set_rhs_with_ops (gsi,
-                                             FLOAT_TYPE_P (TREE_TYPE (type))
-                                             ? VEC_UNPACK_FLOAT_LO_EXPR
-                                             : VEC_UNPACK_LO_EXPR,
-                                             dbl);
+             gimple_assign_set_rhs_with_ops (gsi, unpack_op, dbl);
            }
          else if (CONVERT_EXPR_CODE_P (conv_code)
                   && (TYPE_PRECISION (TREE_TYPE (TREE_TYPE (orig[0])))