[gcc r10-9253] tree-optimization/98221 - fix wrong unpack operation used for big-endian

Richard Biener rguenth@gcc.gnu.org
Tue Jan 12 09:51:50 GMT 2021


https://gcc.gnu.org/g:ecab0d9106a317073f5891f161f031078d835b2f

commit r10-9253-gecab0d9106a317073f5891f161f031078d835b2f
Author: Andreas Krebbel <krebbel@gcc.gnu.org>
Date:   Mon Jan 11 10:59:43 2021 +0100

    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>
    
            PR tree-optimization/98221
            * tree-ssa-forwprop.c (simplify_vector_constructor): For
            big-endian, use UNPACK[_FLOAT]_HI.
    
    (cherry picked from commit 300a3ce5c5695eb1a7c0476e9d1b45420a463248)

Diff:
---
 gcc/tree-ssa-forwprop.c | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index e1477df3182..3161d2e39ff 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])))


More information about the Gcc-cvs mailing list