From patchwork Tue Apr 25 15:12:50 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Hubicka X-Patchwork-Id: 1773481 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=dDdo/xEP; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4Q5QVr52x2z1yZr for ; Wed, 26 Apr 2023 01:13:24 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 88BA33858D32 for ; Tue, 25 Apr 2023 15:13:22 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 88BA33858D32 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1682435602; bh=BRAJX6fyfczZuSSyJsrtuPpPu7e3voY57GvOtbMHaOw=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=dDdo/xEPGkREDActskQkLyBcZSEb8rQx4+OpQRFYcJ6HgdszxSQevxfDTh6rxiL85 W3nqqI9e14wFFk3iCCfp36oEkhGT+XtxXoqmXA4I1QnKxOr2mAOTbcbDtoUoIj6v1M uj+tY1xzLuQe7OYltBZQPOJefTYTbDMY7M6eU8ag= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from nikam.ms.mff.cuni.cz (nikam.ms.mff.cuni.cz [195.113.20.16]) by sourceware.org (Postfix) with ESMTPS id B539A3858C20 for ; Tue, 25 Apr 2023 15:12:51 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B539A3858C20 Received: by nikam.ms.mff.cuni.cz (Postfix, from userid 16202) id B86D228A967; Tue, 25 Apr 2023 17:12:50 +0200 (CEST) Date: Tue, 25 Apr 2023 17:12:50 +0200 To: gcc-patches@gcc.gnu.org, rguenther@suse.de Subject: Unloop no longer looping loops in loop-ch Message-ID: MIME-Version: 1.0 Content-Disposition: inline X-Spam-Status: No, score=-11.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jan Hubicka via Gcc-patches From: Jan Hubicka Reply-To: Jan Hubicka Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" Hi, I noticed this after adding sanity check that the upper bound on number of iterations never drop to -1. It seems to be relatively common case (happening few hundred times in testsuite and also during bootstrap) that loop-ch duplicates enough so the loop itself no longer loops. This is later detected in loop unrolling but since we test the number of iterations anyway it seems better to do that earlier. Bootstrapped/regtested x86_64-linux, OK? Honza * cfgloopmanip.h (unloop_loops): Declare. * tree-ssa-loop-ch.cc (ch_base::copy_headers): Unloop loops that no longer loop. * tree-ssa-loop-ivcanon.cc (unloop_loops): Export; do not release vectors passed. (canonicalize_induction_variables): Release vectors here. (tree_unroll_loops_completely): Release vectors here. diff --git a/gcc/cfgloopmanip.h b/gcc/cfgloopmanip.h index c40cfeae0e3..75b2a5e9b75 100644 --- a/gcc/cfgloopmanip.h +++ b/gcc/cfgloopmanip.h @@ -43,6 +43,10 @@ extern edge create_empty_if_region_on_edge (edge, tree); extern class loop *create_empty_loop_on_edge (edge, tree, tree, tree, tree, tree *, tree *, class loop *); extern void unloop (class loop *, bool *, bitmap); +extern void unloop_loops (vec &loops_to_unloop, + vec &loops_to_unloop_nunroll, + bitmap loop_closed_ssa_invalidated, + bool *irred_invalidated); extern void copy_loop_info (class loop *loop, class loop *target); extern class loop * duplicate_loop (class loop *, class loop *, class loop * = NULL); diff --git a/gcc/gimple-fold.h b/gcc/gimple-fold.h index 2fd58db9a2e..05f1dd9b500 100644 --- a/gcc/gimple-fold.h +++ b/gcc/gimple-fold.h @@ -64,6 +64,7 @@ extern gimple_seq rewrite_to_defined_overflow (gimple *, bool = false); extern void replace_call_with_value (gimple_stmt_iterator *, tree); extern tree tree_vec_extract (gimple_stmt_iterator *, tree, tree, tree, tree); extern void gsi_replace_with_seq_vops (gimple_stmt_iterator *, gimple_seq); +extern bool can_refer_decl_in_current_unit_p (tree decl, tree from_decl); /* gimple_build, functionally matching fold_buildN, outputs stmts int the provided sequence, matching and simplifying them on-the-fly. diff --git a/gcc/tree-ssa-loop-ch.cc b/gcc/tree-ssa-loop-ch.cc index 2fad2a3d7b6..0dfad0f9bfd 100644 --- a/gcc/tree-ssa-loop-ch.cc +++ b/gcc/tree-ssa-loop-ch.cc @@ -396,6 +396,8 @@ ch_base::copy_headers (function *fun) auto_vec candidates; auto_vec > copied; + auto_vec loops_to_unloop; + auto_vec loops_to_unloop_nunroll; mark_dfs_back_edges (); gimple_ranger *ranger = new gimple_ranger; @@ -408,6 +410,14 @@ ch_base::copy_headers (function *fun) "Analyzing loop %i\n", loop->num); header = loop->header; + if (!get_max_loop_iterations_int (loop)) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, "Loop %d never loops.\n", loop->num); + loops_to_unloop.safe_push (loop); + loops_to_unloop_nunroll.safe_push (0); + continue; + } /* If the loop is already a do-while style one (either because it was written as such, or because jump threading transformed it into one), @@ -593,13 +603,6 @@ ch_base::copy_headers (function *fun) /* We possibly decreased number of itrations by 1. */ auto_vec exits = get_loop_exit_edges (loop); bool precise = (nexits == (int) exits.length ()); - if (!get_max_loop_iterations_int (loop)) - { - if (dump_file && (dump_flags & TDF_DETAILS)) - fprintf (dump_file, "Loop %d no longer loops.\n", loop->num); - /* TODO: We can unloop like in tree-ssa-loop-ivcanon. */ - precise = false; - } /* Check that loop may not terminate in other way than via basic blocks we duplicated. */ if (precise) @@ -640,7 +643,15 @@ ch_base::copy_headers (function *fun) precise = false; } } - if (precise) + if (precise + && get_max_loop_iterations_int (loop) == 1) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, "Loop %d no longer loops.\n", loop->num); + loops_to_unloop.safe_push (loop); + loops_to_unloop_nunroll.safe_push (0); + } + else if (precise) { if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, @@ -688,6 +699,13 @@ ch_base::copy_headers (function *fun) BITMAP_FREE (exit_bbs); } } + if (loops_to_unloop.length()) + { + bool irred_invalidated; + unloop_loops (loops_to_unloop, loops_to_unloop_nunroll, NULL, &irred_invalidated); + changed = true; + fprintf (stderr, "Bingo\n"); + } free (bbs); free (copied_bbs); diff --git a/gcc/tree-ssa-loop-ivcanon.cc b/gcc/tree-ssa-loop-ivcanon.cc index 9f72d534b7c..ce9712058d4 100644 --- a/gcc/tree-ssa-loop-ivcanon.cc +++ b/gcc/tree-ssa-loop-ivcanon.cc @@ -618,8 +618,10 @@ static bitmap peeled_loops; LOOP_CLOSED_SSA_INVALIDATED is used to bookkepp the case when we need to go into loop closed SSA form. */ -static void -unloop_loops (bitmap loop_closed_ssa_invalidated, +void +unloop_loops (vec &loops_to_unloop, + vec &loops_to_unloop_nunroll, + bitmap loop_closed_ssa_invalidated, bool *irred_invalidated) { while (loops_to_unloop.length ()) @@ -653,8 +655,6 @@ unloop_loops (bitmap loop_closed_ssa_invalidated, gsi = gsi_start_bb (latch_edge->dest); gsi_insert_after (&gsi, stmt, GSI_NEW_STMT); } - loops_to_unloop.release (); - loops_to_unloop_nunroll.release (); /* Remove edges in peeled copies. Given remove_path removes dominated regions we need to cope with removal of already removed paths. */ @@ -1326,7 +1326,10 @@ canonicalize_induction_variables (void) } gcc_assert (!need_ssa_update_p (cfun)); - unloop_loops (loop_closed_ssa_invalidated, &irred_invalidated); + unloop_loops (loops_to_unloop, loops_to_unloop_nunroll, + loop_closed_ssa_invalidated, &irred_invalidated); + loops_to_unloop.release (); + loops_to_unloop_nunroll.release (); if (irred_invalidated && loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)) mark_irreducible_loops (); @@ -1473,7 +1476,12 @@ tree_unroll_loops_completely (bool may_increase_size, bool unroll_outer) { unsigned i; - unloop_loops (loop_closed_ssa_invalidated, &irred_invalidated); + unloop_loops (loops_to_unloop, + loops_to_unloop_nunroll, + loop_closed_ssa_invalidated, + &irred_invalidated); + loops_to_unloop.release (); + loops_to_unloop_nunroll.release (); /* We cannot use TODO_update_ssa_no_phi because VOPS gets confused. */ if (loop_closed_ssa_invalidated