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 <krebbel@linux.ibm.com> * tree-ssa-forwprop.c (simplify_vector_constructor): For big-endian, use UNPACK[_FLOAT]_HI.
This commit is contained in:
parent
0c18faac3f
commit
300a3ce5c5
@ -2392,6 +2392,17 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
|
|||||||
some simple special cases via VEC_[UN]PACK[_FLOAT]_LO_EXPR. */
|
some simple special cases via VEC_[UN]PACK[_FLOAT]_LO_EXPR. */
|
||||||
optab optab;
|
optab optab;
|
||||||
tree halfvectype, dblvectype;
|
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)
|
if (CONVERT_EXPR_CODE_P (conv_code)
|
||||||
&& (2 * TYPE_PRECISION (TREE_TYPE (TREE_TYPE (orig[0])))
|
&& (2 * TYPE_PRECISION (TREE_TYPE (TREE_TYPE (orig[0])))
|
||||||
== TYPE_PRECISION (TREE_TYPE (type)))
|
== TYPE_PRECISION (TREE_TYPE (type)))
|
||||||
@ -2405,9 +2416,7 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
|
|||||||
represented as scalar bitmasks. See PR95528. */
|
represented as scalar bitmasks. See PR95528. */
|
||||||
&& (VECTOR_MODE_P (TYPE_MODE (dblvectype))
|
&& (VECTOR_MODE_P (TYPE_MODE (dblvectype))
|
||||||
|| VECTOR_BOOLEAN_TYPE_P (dblvectype))
|
|| VECTOR_BOOLEAN_TYPE_P (dblvectype))
|
||||||
&& (optab = optab_for_tree_code (FLOAT_TYPE_P (TREE_TYPE (type))
|
&& (optab = optab_for_tree_code (unpack_op,
|
||||||
? VEC_UNPACK_FLOAT_LO_EXPR
|
|
||||||
: VEC_UNPACK_LO_EXPR,
|
|
||||||
dblvectype,
|
dblvectype,
|
||||||
optab_default))
|
optab_default))
|
||||||
&& (optab_handler (optab, TYPE_MODE (dblvectype))
|
&& (optab_handler (optab, TYPE_MODE (dblvectype))
|
||||||
@ -2430,11 +2439,7 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
|
|||||||
orig[0], TYPE_SIZE (dblvectype),
|
orig[0], TYPE_SIZE (dblvectype),
|
||||||
bitsize_zero_node);
|
bitsize_zero_node);
|
||||||
gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
|
gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
|
||||||
gimple_assign_set_rhs_with_ops (gsi,
|
gimple_assign_set_rhs_with_ops (gsi, unpack_op, dbl);
|
||||||
FLOAT_TYPE_P (TREE_TYPE (type))
|
|
||||||
? VEC_UNPACK_FLOAT_LO_EXPR
|
|
||||||
: VEC_UNPACK_LO_EXPR,
|
|
||||||
dbl);
|
|
||||||
}
|
}
|
||||||
else if (CONVERT_EXPR_CODE_P (conv_code)
|
else if (CONVERT_EXPR_CODE_P (conv_code)
|
||||||
&& (TYPE_PRECISION (TREE_TYPE (TREE_TYPE (orig[0])))
|
&& (TYPE_PRECISION (TREE_TYPE (TREE_TYPE (orig[0])))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user