From: Marc Glisse Date: Mon, 20 May 2019 14:53:29 +0000 (+0200) Subject: [i386] Fold __builtin_ia32_shufpd to VEC_PERM_EXPR X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4d508751f421491052bc1d83150344e6cba30b3b;p=gcc.git [i386] Fold __builtin_ia32_shufpd to VEC_PERM_EXPR 2019-05-20 Marc Glisse PR rtl-optimization/43147 * config/i386/i386.c (ix86_gimple_fold_builtin): Handle IX86_BUILTIN_SHUFPD. From-SVN: r271422 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1cefccff4a6..5d300cab816 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-05-20 Marc Glisse + + PR rtl-optimization/43147 + * config/i386/i386.c (ix86_gimple_fold_builtin): Handle + IX86_BUILTIN_SHUFPD. + 2019-05-20 Jan Hubicka * tree-ssa-alias.c (refs_may_alias_p_2): Break out from ... diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 647d17d0a68..54607748b0b 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -17297,7 +17297,7 @@ ix86_gimple_fold_builtin (gimple_stmt_iterator *gsi) int n_args = gimple_call_num_args (stmt); enum ix86_builtins fn_code = (enum ix86_builtins) DECL_FUNCTION_CODE (fndecl); tree decl = NULL_TREE; - tree arg0, arg1; + tree arg0, arg1, arg2; enum rtx_code rcode; unsigned HOST_WIDE_INT count; bool is_vshift; @@ -17601,6 +17601,32 @@ ix86_gimple_fold_builtin (gimple_stmt_iterator *gsi) } break; + case IX86_BUILTIN_SHUFPD: + arg2 = gimple_call_arg (stmt, 2); + if (TREE_CODE (arg2) == INTEGER_CST) + { + location_t loc = gimple_location (stmt); + unsigned HOST_WIDE_INT imask = TREE_INT_CST_LOW (arg2); + arg0 = gimple_call_arg (stmt, 0); + arg1 = gimple_call_arg (stmt, 1); + tree itype = long_long_integer_type_node; + tree vtype = build_vector_type (itype, 2); /* V2DI */ + tree_vector_builder elts (vtype, 2, 1); + /* Ignore bits other than the lowest 2. */ + elts.quick_push (build_int_cst (itype, imask & 1)); + imask >>= 1; + elts.quick_push (build_int_cst (itype, 2 + (imask & 1))); + tree omask = elts.build (); + gimple *g = gimple_build_assign (gimple_call_lhs (stmt), + VEC_PERM_EXPR, + arg0, arg1, omask); + gimple_set_location (g, loc); + gsi_replace (gsi, g, false); + return true; + } + // Do not error yet, the constant could be propagated later? + break; + default: break; }