From 03b9e8e48dfb02c43661102ce25d968dd4b2e09d Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 13 Jan 2014 20:16:30 +0100 Subject: [PATCH] re PR tree-optimization/59617 ([vectorizer] ICE in vectorizable_mask_load_store with AVX-512F's gathers enabled.) PR target/59617 * config/i386/i386.c (ix86_vectorize_builtin_gather): Uncomment AVX512F gather builtins. * tree-vect-stmts.c (vectorizable_mask_load_store): For now punt on gather decls with INTEGER_TYPE masktype. (vectorizable_load): For INTEGER_TYPE masktype, put the INTEGER_CST directly into the builtin rather than hoisting it before loop. From-SVN: r206585 --- gcc/ChangeLog | 8 ++++++++ gcc/config/i386/i386.c | 4 ---- gcc/tree-vect-stmts.c | 14 +++++++++++++- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4f040a72cb3..15697e5a9c7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 2014-01-13 Jakub Jelinek + PR target/59617 + * config/i386/i386.c (ix86_vectorize_builtin_gather): Uncomment + AVX512F gather builtins. + * tree-vect-stmts.c (vectorizable_mask_load_store): For now punt + on gather decls with INTEGER_TYPE masktype. + (vectorizable_load): For INTEGER_TYPE masktype, put the INTEGER_CST + directly into the builtin rather than hoisting it before loop. + PR tree-optimization/59387 * tree-scalar-evolution.c: Include gimple-fold.h and gimplify-me.h. (scev_const_prop): If folded_casts and type has undefined overflow, diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 52ad5c13ae3..ad48fc8c1b4 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -36565,9 +36565,6 @@ ix86_vectorize_builtin_gather (const_tree mem_vectype, case V8SImode: code = si ? IX86_BUILTIN_GATHERSIV8SI : IX86_BUILTIN_GATHERALTDIV8SI; break; -#if 0 - /* FIXME: Commented until vectorizer can work with (mask_type != src_type) - PR59617. */ case V8DFmode: if (TARGET_AVX512F) code = si ? IX86_BUILTIN_GATHER3ALTSIV8DF : IX86_BUILTIN_GATHER3DIV8DF; @@ -36592,7 +36589,6 @@ ix86_vectorize_builtin_gather (const_tree mem_vectype, else return NULL_TREE; break; -#endif default: return NULL_TREE; } diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index eb615986c14..cdeb4578abe 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -1813,6 +1813,17 @@ vectorizable_mask_load_store (gimple stmt, gimple_stmt_iterator *gsi, "gather index use not simple."); return false; } + + tree arglist = TYPE_ARG_TYPES (TREE_TYPE (gather_decl)); + tree masktype + = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (arglist)))); + if (TREE_CODE (masktype) == INTEGER_TYPE) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "masked gather with integer mask not supported."); + return false; + } } else if (tree_int_cst_compare (nested_in_vect_loop ? STMT_VINFO_DR_STEP (stmt_info) @@ -5761,6 +5772,7 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, { mask = build_int_cst (TREE_TYPE (masktype), -1); mask = build_vector_from_val (masktype, mask); + mask = vect_init_vector (stmt, mask, masktype, NULL); } else if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (masktype))) { @@ -5771,10 +5783,10 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, real_from_target (&r, tmp, TYPE_MODE (TREE_TYPE (masktype))); mask = build_real (TREE_TYPE (masktype), r); mask = build_vector_from_val (masktype, mask); + mask = vect_init_vector (stmt, mask, masktype, NULL); } else gcc_unreachable (); - mask = vect_init_vector (stmt, mask, masktype, NULL); scale = build_int_cst (scaletype, gather_scale);