From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 103216 invoked by alias); 30 Jul 2018 11:37:00 -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 103205 invoked by uid 89); 30 Jul 2018 11:36:59 -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=Pure, 15000000000, gsi, Hybrid 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, 30 Jul 2018 11:36:58 +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 D28BAED1 for ; Mon, 30 Jul 2018 04:36:56 -0700 (PDT) Received: from localhost (unknown [10.32.98.51]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 5AC9B3F802 for ; Mon, 30 Jul 2018 04:36:56 -0700 (PDT) From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, richard.sandiford@arm.com Subject: [01/11] Schedule SLP earlier References: <874lghez1a.fsf@arm.com> Date: Mon, 30 Jul 2018 11:37:00 -0000 In-Reply-To: <874lghez1a.fsf@arm.com> (Richard Sandiford's message of "Mon, 30 Jul 2018 12:36:01 +0100") Message-ID: <87zhy9dkfd.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: 2018-07/txt/msg01822.txt.bz2 vect_transform_loop used to call vect_schedule_slp lazily when it came across the first SLP statement, but it seems easier to do it before the main loop. 2018-07-30 Richard Sandiford gcc/ * tree-vect-loop.c (vect_transform_loop_stmt): Remove slp_scheduled argument. (vect_transform_loop): Update calls accordingly. Schedule SLP instances before the main loop, if any exist. Index: gcc/tree-vect-loop.c =================================================================== --- gcc/tree-vect-loop.c 2018-07-30 12:32:15.000000000 +0100 +++ gcc/tree-vect-loop.c 2018-07-30 12:32:16.190624704 +0100 @@ -8199,14 +8199,12 @@ scale_profile_for_vect_loop (struct loop } /* Vectorize STMT_INFO if relevant, inserting any new instructions before GSI. - When vectorizing STMT_INFO as a store, set *SEEN_STORE to its stmt_vec_info. - *SLP_SCHEDULE is a running record of whether we have called - vect_schedule_slp. */ + When vectorizing STMT_INFO as a store, set *SEEN_STORE to its + stmt_vec_info. */ static void vect_transform_loop_stmt (loop_vec_info loop_vinfo, stmt_vec_info stmt_info, - gimple_stmt_iterator *gsi, - stmt_vec_info *seen_store, bool *slp_scheduled) + gimple_stmt_iterator *gsi, stmt_vec_info *seen_store) { struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo); poly_uint64 vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo); @@ -8237,24 +8235,10 @@ vect_transform_loop_stmt (loop_vec_info dump_printf_loc (MSG_NOTE, vect_location, "multiple-types.\n"); } - /* SLP. Schedule all the SLP instances when the first SLP stmt is - reached. */ - if (slp_vect_type slptype = STMT_SLP_TYPE (stmt_info)) - { - - if (!*slp_scheduled) - { - *slp_scheduled = true; - - DUMP_VECT_SCOPE ("scheduling SLP instances"); - - vect_schedule_slp (loop_vinfo); - } - - /* Hybrid SLP stmts must be vectorized in addition to SLP. */ - if (slptype == pure_slp) - return; - } + /* Pure SLP statements have already been vectorized. We still need + to apply loop vectorization to hybrid SLP statements. */ + if (PURE_SLP_STMT (stmt_info)) + return; if (dump_enabled_p ()) dump_printf_loc (MSG_NOTE, vect_location, "transform statement.\n"); @@ -8284,7 +8268,6 @@ vect_transform_loop (loop_vec_info loop_ tree niters_vector_mult_vf = NULL_TREE; poly_uint64 vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo); unsigned int lowest_vf = constant_lower_bound (vf); - bool slp_scheduled = false; gimple *stmt; bool check_profitability = false; unsigned int th; @@ -8390,6 +8373,14 @@ vect_transform_loop (loop_vec_info loop_ /* This will deal with any possible peeling. */ vect_prepare_for_masked_peels (loop_vinfo); + /* Schedule the SLP instances first, then handle loop vectorization + below. */ + if (!loop_vinfo->slp_instances.is_empty ()) + { + DUMP_VECT_SCOPE ("scheduling SLP instances"); + vect_schedule_slp (loop_vinfo); + } + /* FORNOW: the vectorizer supports only loops which body consist of one basic block (header + empty latch). When the vectorizer will support more involved loop forms, the order by which the BBs are @@ -8468,16 +8459,15 @@ vect_transform_loop (loop_vec_info loop_ stmt_vec_info pat_stmt_info = loop_vinfo->lookup_stmt (gsi_stmt (subsi)); vect_transform_loop_stmt (loop_vinfo, pat_stmt_info, - &si, &seen_store, - &slp_scheduled); + &si, &seen_store); } stmt_vec_info pat_stmt_info = STMT_VINFO_RELATED_STMT (stmt_info); vect_transform_loop_stmt (loop_vinfo, pat_stmt_info, &si, - &seen_store, &slp_scheduled); + &seen_store); } vect_transform_loop_stmt (loop_vinfo, stmt_info, &si, - &seen_store, &slp_scheduled); + &seen_store); } gsi_next (&si); if (seen_store)