From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 48672 invoked by alias); 3 Jul 2015 17:13:45 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 48660 invoked by uid 89); 3 Jul 2015 17:13:45 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.5 required=5.0 tests=AWL,BAYES_50,KAM_LAZY_DOMAIN_SECURITY,RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: mx2.suse.de Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (CAMELLIA256-SHA encrypted) ESMTPS; Fri, 03 Jul 2015 17:13:43 +0000 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 8F650AAF2; Fri, 3 Jul 2015 17:13:40 +0000 (UTC) User-Agent: K-9 Mail for Android In-Reply-To: <20150703140626.GN10247@tucnak.redhat.com> References: <20150703132147.GD10139@redhat.com> <20150703140626.GN10247@tucnak.redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Subject: Re: RFC: Add ADDR_EXPR lowering (PR tree-optimization/66718) From: Richard Biener Date: Fri, 03 Jul 2015 17:13:00 -0000 To: Jakub Jelinek CC: Marek Polacek ,GCC Patches Message-ID: X-SW-Source: 2015-07/txt/msg00223.txt.bz2 On July 3, 2015 4:06:26 PM GMT+02:00, Jakub Jelinek wrote: >On Fri, Jul 03, 2015 at 03:41:29PM +0200, Richard Biener wrote: >> > The fallout (at least on x86_64) is surprisingly small, i.e. none, >just >> > gcc.dg/vect/pr59984.c test (using -fopenmp-simd) ICEs, but that is >due >> > to a bug in the vectorizer. Jakub has a patch and knows the >details. >> > As the test shows, we're now able to vectorize ADDR_EXPR of >non-invariants >> > (that was the motivation of this pass). > >Here is the fix for that. > >The problem is that for simd clone calls, if they have void return >type, >STMT_VINFO_VECTYPE is NULL. If vectorize_simd_clone_call succeeds, >that is fine, but if it doesn't, we can fall into all the other >vectorizable_* functions, and some of them compute some variables >IMHO prematurely. It doesn't make sense to compute nunits/ncopies >etc. if stmt isn't even an assignment etc. >So, this patch adjusts the few routines that had this problem, >so that we check is_gimple_assign and gimple_assign_rhs_code or >whatever >is the quick GIMPLE test those functions use to find if stmt is of >interest >to them, and only when it is, compute whatever they need later. >As NULL STMT_VINFO_VECTYPE can happen only for calls, all these >functions >don't ICE anymore. > >Ok for trunk if it passes bootstrap/regtest? OK. Thanks, Richard. >In the pr59984.c testcase, with Marek's patch and this patch, one loop >in >test is already vectorized (the ICE was on the other one), I'll work on >recognizing multiples of GOMP_SIMD_LANE () as linear next, so that we >vectorize also the loop with bar. Without Marek's patch we weren't >vectorizing any of the two loops. > >2015-07-03 Jakub Jelinek > > PR tree-optimization/66718 > * tree-vect-stmts.c (vectorizable_assignment, vectorizable_store, > vectorizable_load, vectorizable_condition): Move vectype, > nunits, ncopies computation after checking what kind of statement > stmt is. > >--- gcc/tree-vect-stmts.c.jj 2015-06-30 14:08:45.000000000 +0200 >+++ gcc/tree-vect-stmts.c 2015-07-03 14:06:28.843573210 +0200 >@@ -4043,13 +4043,11 @@ vectorizable_assignment (gimple stmt, gi > tree scalar_dest; > tree op; > stmt_vec_info stmt_info = vinfo_for_stmt (stmt); >- tree vectype = STMT_VINFO_VECTYPE (stmt_info); > loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info); > tree new_temp; > tree def; > gimple def_stmt; >enum vect_def_type dt[2] = {vect_unknown_def_type, >vect_unknown_def_type}; >- unsigned int nunits = TYPE_VECTOR_SUBPARTS (vectype); > int ncopies; > int i, j; > vec vec_oprnds = vNULL; >@@ -4060,16 +4058,6 @@ vectorizable_assignment (gimple stmt, gi > enum tree_code code; > tree vectype_in; > >- /* Multiple types in SLP are handled by creating the appropriate >number of >- vectorized stmts for each SLP node. Hence, NCOPIES is always 1 in >- case of SLP. */ >- if (slp_node || PURE_SLP_STMT (stmt_info)) >- ncopies = 1; >- else >- ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits; >- >- gcc_assert (ncopies >= 1); >- > if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo) > return false; > >@@ -4095,6 +4083,19 @@ vectorizable_assignment (gimple stmt, gi > if (code == VIEW_CONVERT_EXPR) > op = TREE_OPERAND (op, 0); > >+ tree vectype = STMT_VINFO_VECTYPE (stmt_info); >+ unsigned int nunits = TYPE_VECTOR_SUBPARTS (vectype); >+ >+ /* Multiple types in SLP are handled by creating the appropriate >number of >+ vectorized stmts for each SLP node. Hence, NCOPIES is always 1 in >+ case of SLP. */ >+ if (slp_node || PURE_SLP_STMT (stmt_info)) >+ ncopies = 1; >+ else >+ ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits; >+ >+ gcc_assert (ncopies >= 1); >+ > if (!vect_is_simple_use_1 (op, stmt, loop_vinfo, bb_vinfo, > &def_stmt, &def, &dt[0], &vectype_in)) > { >@@ -5006,7 +5007,6 @@ vectorizable_store (gimple stmt, gimple_ > tree vec_oprnd = NULL_TREE; > stmt_vec_info stmt_info = vinfo_for_stmt (stmt); >struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info), *first_dr >= NULL; >- tree vectype = STMT_VINFO_VECTYPE (stmt_info); > tree elem_type; > loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info); > struct loop *loop = NULL; >@@ -5020,7 +5020,6 @@ vectorizable_store (gimple stmt, gimple_ > tree dataref_ptr = NULL_TREE; > tree dataref_offset = NULL_TREE; > gimple ptr_incr = NULL; >- unsigned int nunits = TYPE_VECTOR_SUBPARTS (vectype); > int ncopies; > int j; > gimple next_stmt, first_stmt = NULL; >@@ -5039,28 +5038,6 @@ vectorizable_store (gimple stmt, gimple_ > bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info); > tree aggr_type; > >- if (loop_vinfo) >- loop = LOOP_VINFO_LOOP (loop_vinfo); >- >- /* Multiple types in SLP are handled by creating the appropriate >number of >- vectorized stmts for each SLP node. Hence, NCOPIES is always 1 in >- case of SLP. */ >- if (slp || PURE_SLP_STMT (stmt_info)) >- ncopies = 1; >- else >- ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits; >- >- gcc_assert (ncopies >= 1); >- >- /* FORNOW. This restriction should be relaxed. */ >- if (loop && nested_in_vect_loop_p (loop, stmt) && ncopies > 1) >- { >- if (dump_enabled_p ()) >- dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, >- "multiple types in nested loop.\n"); >- return false; >- } >- > if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo) > return false; > >@@ -5086,6 +5063,32 @@ vectorizable_store (gimple stmt, gimple_ > return false; > > gcc_assert (gimple_assign_single_p (stmt)); >+ >+ tree vectype = STMT_VINFO_VECTYPE (stmt_info); >+ unsigned int nunits = TYPE_VECTOR_SUBPARTS (vectype); >+ >+ if (loop_vinfo) >+ loop = LOOP_VINFO_LOOP (loop_vinfo); >+ >+ /* Multiple types in SLP are handled by creating the appropriate >number of >+ vectorized stmts for each SLP node. Hence, NCOPIES is always 1 in >+ case of SLP. */ >+ if (slp || PURE_SLP_STMT (stmt_info)) >+ ncopies = 1; >+ else >+ ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits; >+ >+ gcc_assert (ncopies >= 1); >+ >+ /* FORNOW. This restriction should be relaxed. */ >+ if (loop && nested_in_vect_loop_p (loop, stmt) && ncopies > 1) >+ { >+ if (dump_enabled_p ()) >+ dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, >+ "multiple types in nested loop.\n"); >+ return false; >+ } >+ > op = gimple_assign_rhs1 (stmt); > if (!vect_is_simple_use (op, stmt, loop_vinfo, bb_vinfo, &def_stmt, > &def, &dt)) >@@ -5834,7 +5837,6 @@ vectorizable_load (gimple stmt, gimple_s > struct loop *containing_loop = (gimple_bb (stmt))->loop_father; > bool nested_in_vect_loop = false; >struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info), *first_dr >= NULL; >- tree vectype = STMT_VINFO_VECTYPE (stmt_info); > tree elem_type; > tree new_temp; > machine_mode mode; >@@ -5844,7 +5846,6 @@ vectorizable_load (gimple stmt, gimple_s > tree dataref_ptr = NULL_TREE; > tree dataref_offset = NULL_TREE; > gimple ptr_incr = NULL; >- int nunits = TYPE_VECTOR_SUBPARTS (vectype); > int ncopies; > int i, j, group_size = -1, group_gap_adj; > tree msq = NULL_TREE, lsq; >@@ -5872,6 +5873,37 @@ vectorizable_load (gimple stmt, gimple_s > int gather_scale = 1; > enum vect_def_type gather_dt = vect_unknown_def_type; > >+ if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo) >+ return false; >+ >+ if (STMT_VINFO_DEF_TYPE (stmt_info) != vect_internal_def) >+ return false; >+ >+ /* Is vectorizable load? */ >+ if (!is_gimple_assign (stmt)) >+ return false; >+ >+ scalar_dest = gimple_assign_lhs (stmt); >+ if (TREE_CODE (scalar_dest) != SSA_NAME) >+ return false; >+ >+ code = gimple_assign_rhs_code (stmt); >+ if (code != ARRAY_REF >+ && code != BIT_FIELD_REF >+ && code != INDIRECT_REF >+ && code != COMPONENT_REF >+ && code != IMAGPART_EXPR >+ && code != REALPART_EXPR >+ && code != MEM_REF >+ && TREE_CODE_CLASS (code) != tcc_declaration) >+ return false; >+ >+ if (!STMT_VINFO_DATA_REF (stmt_info)) >+ return false; >+ >+ tree vectype = STMT_VINFO_VECTYPE (stmt_info); >+ int nunits = TYPE_VECTOR_SUBPARTS (vectype); >+ > if (loop_vinfo) > { > loop = LOOP_VINFO_LOOP (loop_vinfo); >@@ -5914,34 +5946,6 @@ vectorizable_load (gimple stmt, gimple_s > return false; > } > >- if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo) >- return false; >- >- if (STMT_VINFO_DEF_TYPE (stmt_info) != vect_internal_def) >- return false; >- >- /* Is vectorizable load? */ >- if (!is_gimple_assign (stmt)) >- return false; >- >- scalar_dest = gimple_assign_lhs (stmt); >- if (TREE_CODE (scalar_dest) != SSA_NAME) >- return false; >- >- code = gimple_assign_rhs_code (stmt); >- if (code != ARRAY_REF >- && code != BIT_FIELD_REF >- && code != INDIRECT_REF >- && code != COMPONENT_REF >- && code != IMAGPART_EXPR >- && code != REALPART_EXPR >- && code != MEM_REF >- && TREE_CODE_CLASS (code) != tcc_declaration) >- return false; >- >- if (!STMT_VINFO_DATA_REF (stmt_info)) >- return false; >- > elem_type = TREE_TYPE (vectype); > mode = TYPE_MODE (vectype); > >@@ -7021,7 +7025,6 @@ vectorizable_condition (gimple stmt, gim > tree vec_dest = NULL_TREE; > tree cond_expr, then_clause, else_clause; > stmt_vec_info stmt_info = vinfo_for_stmt (stmt); >- tree vectype = STMT_VINFO_VECTYPE (stmt_info); > tree comp_vectype = NULL_TREE; > tree vec_cond_lhs = NULL_TREE, vec_cond_rhs = NULL_TREE; > tree vec_then_clause = NULL_TREE, vec_else_clause = NULL_TREE; >@@ -7030,7 +7033,6 @@ vectorizable_condition (gimple stmt, gim > loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info); > tree def; > enum vect_def_type dt, dts[4]; >- int nunits = TYPE_VECTOR_SUBPARTS (vectype); > int ncopies; > enum tree_code code; > stmt_vec_info prev_stmt_info = NULL; >@@ -7042,15 +7044,6 @@ vectorizable_condition (gimple stmt, gim > vec vec_oprnds3 = vNULL; > tree vec_cmp_type; > >- if (slp_node || PURE_SLP_STMT (stmt_info)) >- ncopies = 1; >- else >- ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits; >- >- gcc_assert (ncopies >= 1); >- if (reduc_index && ncopies > 1) >- return false; /* FORNOW */ >- > if (reduc_index && STMT_SLP_TYPE (stmt_info)) > return false; > >@@ -7080,6 +7073,18 @@ vectorizable_condition (gimple stmt, gim > if (code != COND_EXPR) > return false; > >+ tree vectype = STMT_VINFO_VECTYPE (stmt_info); >+ int nunits = TYPE_VECTOR_SUBPARTS (vectype); >+ >+ if (slp_node || PURE_SLP_STMT (stmt_info)) >+ ncopies = 1; >+ else >+ ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits; >+ >+ gcc_assert (ncopies >= 1); >+ if (reduc_index && ncopies > 1) >+ return false; /* FORNOW */ >+ > cond_expr = gimple_assign_rhs1 (stmt); > then_clause = gimple_assign_rhs2 (stmt); > else_clause = gimple_assign_rhs3 (stmt); > > > Jakub