From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 76955 invoked by alias); 7 Jan 2019 13:27:36 -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 76942 invoked by uid 89); 7 Jan 2019 13:27:35 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-11.9 required=5.0 tests=BAYES_00,GIT_PATCH_2,GIT_PATCH_3,SPF_PASS autolearn=ham version=3.3.2 spammy=cherry, 88567 X-HELO: foss.arm.com Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 07 Jan 2019 13:27:33 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 3B4D880D for ; Mon, 7 Jan 2019 05:27:32 -0800 (PST) Received: from localhost (unknown [10.32.98.35]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B3A3D3F5AF for ; Mon, 7 Jan 2019 05:27:31 -0800 (PST) From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, richard.sandiford@arm.com Subject: Fix ICE in get_initial_defs_for_reduction (PR 88567) Date: Mon, 07 Jan 2019 13:27:00 -0000 Message-ID: <877efgmwcd.fsf@arm.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-SW-Source: 2019-01/txt/msg00296.txt.bz2 The use of "j" in: init = permute_results[number_of_vectors - j - 1]; was out-of-sync with the new flat loop structure. Now that all that reversing is gone, we can just use the result of duplicate_and_interleave directly. The other cases shouldn't be affected by postponing the insertion of ctor_seq, since gimple_build* appends to the seq without clearing it first (unlike some of the gimplify routines). The ICE is already covered by gcc.dg/vect/pr63379.c. Tested on aarch64-linux-gnu (with and without SVE), aarch64_be-elf and x86_64-linux-gnu. OK to install? Richard 2019-01-07 Richard Sandiford gcc/ PR middle-end/88567 * tree-vect-loop.c (get_initial_defs_for_reduction): Pass the output vector directly to duplicate_and_interleave instead of going through a temporary. Postpone insertion of ctor_seq to the end of the loop. Index: gcc/tree-vect-loop.c =================================================================== --- gcc/tree-vect-loop.c 2019-01-04 11:39:26.674251052 +0000 +++ gcc/tree-vect-loop.c 2019-01-07 13:23:22.924449595 +0000 @@ -4103,7 +4103,6 @@ get_initial_defs_for_reduction (slp_tree unsigned int group_size = stmts.length (); unsigned int i; struct loop *loop; - auto_vec permute_results; vector_type = STMT_VINFO_VECTYPE (stmt_vinfo); @@ -4138,6 +4137,7 @@ get_initial_defs_for_reduction (slp_tree bool constant_p = true; tree_vector_builder elts (vector_type, nunits, 1); elts.quick_grow (nunits); + gimple_seq ctor_seq = NULL; for (j = 0; j < nunits * number_of_vectors; ++j) { tree op; @@ -4163,7 +4163,6 @@ get_initial_defs_for_reduction (slp_tree if (number_of_places_left_in_vector == 0) { - gimple_seq ctor_seq = NULL; tree init; if (constant_p && !neutral_op ? multiple_p (TYPE_VECTOR_SUBPARTS (vector_type), nunits) @@ -4189,16 +4188,11 @@ get_initial_defs_for_reduction (slp_tree else { /* First time round, duplicate ELTS to fill the - required number of vectors, then cherry pick the - appropriate result for each iteration. */ - if (vec_oprnds->is_empty ()) - duplicate_and_interleave (&ctor_seq, vector_type, elts, - number_of_vectors, - permute_results); - init = permute_results[number_of_vectors - j - 1]; + required number of vectors. */ + duplicate_and_interleave (&ctor_seq, vector_type, elts, + number_of_vectors, *vec_oprnds); + break; } - if (ctor_seq != NULL) - gsi_insert_seq_on_edge_immediate (pe, ctor_seq); vec_oprnds->quick_push (init); number_of_places_left_in_vector = nunits; @@ -4207,6 +4201,8 @@ get_initial_defs_for_reduction (slp_tree constant_p = true; } } + if (ctor_seq != NULL) + gsi_insert_seq_on_edge_immediate (pe, ctor_seq); }