Bug 69956 - [6 Regression] Wrong vector type @ fold-const
Summary: [6 Regression] Wrong vector type @ fold-const
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: tree-optimization (show other bugs)
Version: 6.0
: P1 normal
Target Milestone: 6.0
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2016-02-25 11:22 UTC by Kirill Yukhin
Modified: 2016-03-01 11:38 UTC (History)
3 users (show)

See Also:
Host:
Target: i?86/x86_64
Build:
Known to work:
Known to fail:
Last reconfirmed: 2016-02-25 00:00:00


Attachments
Reproducer (89 bytes, text/plain)
2016-02-25 11:22 UTC, Kirill Yukhin
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Kirill Yukhin 2016-02-25 11:22:41 UTC
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.
Comment 1 Ilya Enkovich 2016-02-25 12:16:38 UTC
Looks like it is r233068.
Comment 2 Richard Biener 2016-02-25 12:29:24 UTC
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.
Comment 3 Ilya Enkovich 2016-02-25 13:26:00 UTC
(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.
Comment 4 Ilya Enkovich 2016-03-01 11:18:16 UTC
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
Comment 5 Ilya Enkovich 2016-03-01 11:38:10 UTC
Fixed