Created attachment 37789 [details] Reproducer Hello, Attached testcase produces ICE when compiled as following: gcc -S -O2 -march=skylake-avx512 repro.i -ftree-vectorize I observe the ICE since 02.02.2016 /nfs/ims/home/kyukhin/repro.i:2:1: internal compiler error: tree check: expected vector_type, have integer_type in co\ nst_unop, at fold-const.c:1665 fn1() { ^~~ 0xda1f9c tree_check_failed(tree_node const*, char const*, int, char const*, ...) /export/users/gnutester/stability/svn/trunk/gcc/tree.c:9637 0x860742 tree_check(tree_node*, char const*, int, char const*, tree_code) /export/users/gnutester/stability/svn/trunk/gcc/tree.h:3006 0x860742 const_unop(tree_code, tree_node*, tree_node*) /export/users/gnutester/stability/svn/trunk/gcc/fold-const.c:1665 0xe7f639 gimple_resimplify1(gimple**, code_helper*, tree_node*, tree_node**, tree_node* (*)(tree_node*)) /export/users/gnutester/stability/svn/trunk/gcc/gimple-match-head.c:85 0xee84b3 gimple_simplify(gimple*, code_helper*, tree_node**, gimple**, tree_node* (*)(tree_node*), tree_node* (*)(tre\ e_node*)) /export/users/gnutester/stability/svn/trunk/gcc/gimple-match-head.c:622 0x8a0933 gimple_fold_stmt_to_constant_1(gimple*, tree_node* (*)(tree_node*), tree_node* (*)(tree_node*)) /export/users/gnutester/stability/svn/trunk/gcc/gimple-fold.c:4981 0xc409d2 back_propagate_equivalences /export/users/gnutester/stability/svn/trunk/gcc/tree-ssa-dom.c:881 0xc409d2 record_temporary_equivalences(edge_def*, const_and_copies*, avail_exprs_stack*) /export/users/gnutester/stability/svn/trunk/gcc/tree-ssa-dom.c:963 0xd0663a thread_through_normal_block /export/users/gnutester/stability/svn/trunk/gcc/tree-ssa-threadedge.c:858 0xd07a22 thread_across_edge(gcond*, edge_def*, bool, const_and_copies*, avail_exprs_stack*, tree_node* (*)(gimple*, g\ imple*, avail_exprs_stack*)) /export/users/gnutester/stability/svn/trunk/gcc/tree-ssa-threadedge.c:1005 0xc404c0 dom_opt_dom_walker::thread_across_edge(edge_def*) /export/users/gnutester/stability/svn/trunk/gcc/tree-ssa-dom.c:989 0xc406eb dom_opt_dom_walker::after_dom_children(basic_block_def*) /export/users/gnutester/stability/svn/trunk/gcc/tree-ssa-dom.c:1423 0x11a47a7 dom_walker::walk(basic_block_def*) /export/users/gnutester/stability/svn/trunk/gcc/domwalk.c:307 0xc432a0 execute /export/users/gnutester/stability/svn/trunk/gcc/tree-ssa-dom.c:614 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <http://gcc.gnu.org/bugs.html> for instructions. I suspect scalar masks.
Looks like it is r233068.
We have VEC_UNPACK_HI_EXPR of 'int' type on { 0, 0, ... } vect_patt_45.15_139 = [vec_unpack_hi_expr] mask__39.12_136; _139 is of type int.
(In reply to Richard Biener from comment #2) > We have VEC_UNPACK_HI_EXPR of 'int' type on { 0, 0, ... } > > vect_patt_45.15_139 = [vec_unpack_hi_expr] mask__39.12_136; > > > _139 is of type int. For multi-step conversion we get a type by mode: intermediate_mode = insn_data[icode1].operand[0].mode; intermediate_type = lang_hooks.types.type_for_mode (intermediate_mode, TYPE_UNSIGNED (prev_type)); We can never get boolean vector like this. We may introduce a target hook to get boolean vector by mode or just compute it from the previous vectype. This patch fixes ICE for the testcase: diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 9678d7c..1434d98 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -9000,9 +9000,19 @@ supportable_widening_operation (enum tree_code code, gimple *stmt, for (i = 0; i < MAX_INTERM_CVT_STEPS; i++) { intermediate_mode = insn_data[icode1].operand[0].mode; - intermediate_type - = lang_hooks.types.type_for_mode (intermediate_mode, - TYPE_UNSIGNED (prev_type)); + if (VECTOR_BOOLEAN_TYPE_P (prev_type)) + { + intermediate_type + = build_truth_vector_type (TYPE_VECTOR_SUBPARTS (prev_type) / 2, + current_vector_size); + if (intermediate_mode != TYPE_MODE (intermediate_type) + return false; + } + else + intermediate_type + = lang_hooks.types.type_for_mode (intermediate_mode, + TYPE_UNSIGNED (prev_type)); + optab3 = optab_for_tree_code (c1, intermediate_type, optab_default); optab4 = optab_for_tree_code (c2, intermediate_type, optab_default); Similar change is is required for narrowing case.
Author: ienkovich Date: Tue Mar 1 11:17:44 2016 New Revision: 233850 URL: https://gcc.gnu.org/viewcvs?rev=233850&root=gcc&view=rev Log: gcc/ PR tree-optimization/69956 * tree-vect-stmts.c (supportable_widening_operation): Support multi-step conversion of boolean vectors. (supportable_narrowing_operation): Likewise. gcc/testsuite/ PR tree-optimization/69956 * gcc.dg/pr69956.c: New test. Added: trunk/gcc/testsuite/gcc.dg/pr69956.c Modified: trunk/gcc/ChangeLog trunk/gcc/testsuite/ChangeLog trunk/gcc/tree-vect-stmts.c
Fixed