From: Andreas Krebbel Date: Mon, 11 Jan 2021 09:59:43 +0000 (+0100) Subject: tree-optimization/98221 - fix wrong unpack operation used for big-endian X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=300a3ce5c5695eb1a7c0476e9d1b45420a463248;p=gcc.git tree-optimization/98221 - fix wrong unpack operation used for big-endian 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 * tree-ssa-forwprop.c (simplify_vector_constructor): For big-endian, use UNPACK[_FLOAT]_HI. --- diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index 8a1a1237647..0706fd862de 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -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])))