From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by sourceware.org (Postfix) with ESMTPS id B837D3842AFC for ; Thu, 30 Jun 2022 14:29:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org B837D3842AFC Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.cz Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 71AAB1F975; Thu, 30 Jun 2022 14:29:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1656599348; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=ki9m18aQ6nz/3PoU2qiouXl9rPIxylkbI9kChXjysP8=; b=Uh/k7yu/TUI9i/+3ABfFvMl46WzHFn0ESQUsXZVNTlABoJkyr6EFxMYFPXbi9AA6FEV0Ac aJTzWmrmeo4TDqRMhK7FQVnVQ02dL2W1aFmsUjn7uTE0hVbk2sc7RctayBoZxpzNJe5sP1 2GWntqm5+4Lh6zNeRidN6cMF5gv+yjs= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1656599348; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=ki9m18aQ6nz/3PoU2qiouXl9rPIxylkbI9kChXjysP8=; b=Erjc3ikdiNH0jkYYJMqKw9Q6owXZUiYLHU43VDorx4RMHQ/w5dJPN2V8B3zmdOsRGlx8+1 u4ZoDcSOPgdNUABA== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 5CFE013A5C; Thu, 30 Jun 2022 14:29:08 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 6dvVFTSzvWLeagAAMHmgww (envelope-from ); Thu, 30 Jun 2022 14:29:08 +0000 Message-ID: <1a717e7d-f0c7-14d8-d0cf-8d3e4f7ecbd2@suse.cz> Date: Thu, 30 Jun 2022 16:29:08 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.10.0 From: =?UTF-8?Q?Martin_Li=c5=a1ka?= Subject: [PATCH] if-to-switch: properly allow side effects only for first condition To: gcc-patches@gcc.gnu.org Content-Language: en-US Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, 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-List-Received-Date: Thu, 30 Jun 2022 14:29:11 -0000 Properly allow side effects only for a first BB in a condition chain. Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Ready to be installed? Thanks, Martin PR tree-optimization/106126 gcc/ChangeLog: * gimple-if-to-switch.cc (struct condition_info): Save has_side_effect. (find_conditions): Parse all BBs. (pass_if_to_switch::execute): Allow only side effects for first BB. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/pr106126.c: New test. --- gcc/gimple-if-to-switch.cc | 20 +++++++++++--------- gcc/testsuite/gcc.dg/tree-ssa/pr106126.c | 12 ++++++++++++ 2 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr106126.c diff --git a/gcc/gimple-if-to-switch.cc b/gcc/gimple-if-to-switch.cc index 70daae2003c..4441206c481 100644 --- a/gcc/gimple-if-to-switch.cc +++ b/gcc/gimple-if-to-switch.cc @@ -61,9 +61,11 @@ struct condition_info { typedef auto_vec> mapping_vec; - condition_info (gcond *cond): m_cond (cond), m_bb (gimple_bb (cond)), - m_forwarder_bb (NULL), m_ranges (), m_true_edge (NULL), m_false_edge (NULL), - m_true_edge_phi_mapping (), m_false_edge_phi_mapping () + condition_info (gcond *cond, bool has_side_effect): m_cond (cond), + m_bb (gimple_bb (cond)), m_forwarder_bb (NULL), m_ranges (), + m_true_edge (NULL), m_false_edge (NULL), + m_true_edge_phi_mapping (), m_false_edge_phi_mapping (), + m_has_side_effect (has_side_effect) { m_ranges.create (0); } @@ -80,6 +82,7 @@ struct condition_info edge m_false_edge; mapping_vec m_true_edge_phi_mapping; mapping_vec m_false_edge_phi_mapping; + bool m_has_side_effect; }; /* Recond PHI mapping for an original edge E and save these into vector VEC. */ @@ -389,16 +392,11 @@ find_conditions (basic_block bb, if (cond == NULL) return; - /* An empty conditions_in_bbs indicates we are processing the first - basic-block then no need check side effect. */ - if (!conditions_in_bbs->is_empty () && !no_side_effect_bb (bb)) - return; - tree lhs = gimple_cond_lhs (cond); tree rhs = gimple_cond_rhs (cond); tree_code code = gimple_cond_code (cond); - condition_info *info = new condition_info (cond); + condition_info *info = new condition_info (cond, !no_side_effect_bb (bb)); gassign *def; if (code == NE_EXPR @@ -536,6 +534,10 @@ pass_if_to_switch::execute (function *fun) if ((*info2)->m_false_edge != e) break; + /* Only the first BB in a chain can have a side effect. */ + if (info->m_has_side_effect) + break; + chain->m_entries.safe_push (*info2); bitmap_set_bit (seen_bbs, e->src->index); info = *info2; diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr106126.c b/gcc/testsuite/gcc.dg/tree-ssa/pr106126.c new file mode 100644 index 00000000000..2f0fd44164b --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr106126.c @@ -0,0 +1,12 @@ +/* PR tree-optimization/106126 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +char *var_1; +void pool_conda_matchspec() { + for (; var_1 && *var_1 && + *var_1 != '<' && *var_1 != '>' && + *var_1 != '!' && *var_1 != '~';) + if (*var_1 >= 'A' && *var_1 <= 'Z') + *var_1 += 'A'; +} -- 2.36.1