From patchwork Sun Dec 12 12:22:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Hubicka X-Patchwork-Id: 48847 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id CB9C8385780F for ; Sun, 12 Dec 2021 12:22:42 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CB9C8385780F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1639311762; bh=481q8Z07X3liO8fZzSpPAocUrIHoi2L9Jd5AE9D/k+o=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=gF6+acN9d7izMHXaqM1hkBipmeINB/6PEr5YJ3Dh8nqRiHf+JnnfamLOlCL2aUDE8 MH8ijve+5sEYecbOvIZrHYLj85XzOT1gsrNPygY7RpprRCunzAJhXKsp+4BwBFm3bM BNeYUegSoFc5sH4X9SU25crY9l6zJQmXrFakeWFE= 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 EBF3C385840C for ; Sun, 12 Dec 2021 12:22:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org EBF3C385840C Received: by nikam.ms.mff.cuni.cz (Postfix, from userid 16202) id 65007280E7E; Sun, 12 Dec 2021 13:22:09 +0100 (CET) Date: Sun, 12 Dec 2021 13:22:09 +0100 To: gcc-patches@gcc.gnu.org Subject: Add -fipa-strict-aliasing Message-ID: <20211212122209.GE50931@kam.mff.cuni.cz> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.10.1 (2018-07-13) X-Spam-Status: No, score=-11.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, GIT_PATCH_0, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Hi, ipa-modref is using TBAA to disambiguate memory accesses inter-procedurally. This sometimes breaks programs with TBAA violations including clang with LTO. To workaround that one can use -fno-strict-aliasing or -fno-ipa-modref which are both quite big hammers. So I added -fipa-strict-aliasing patch that controls only the TBAA based analysis in ipa-modref while keeping all other optimizations. Bootstrapped/regtested x86_64-linux, will commit it shortly. gcc/ChangeLog: 2021-12-12 Jan Hubicka * common.opt: Add -fipa-strict-aliasing. * doc/invoke.texi: Document -fipa-strict-aliasing. * ipa-modref.c (modref_access_analysis::record_access): Honor -fipa-strict-aliasing. (modref_access_analysis::record_access_lto): Likewise. diff --git a/gcc/common.opt b/gcc/common.opt index 445a53a265c..673813f34ab 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -1945,6 +1945,10 @@ fira-algorithm= Common Joined RejectNegative Enum(ira_algorithm) Var(flag_ira_algorithm) Init(IRA_ALGORITHM_CB) Optimization -fira-algorithm=[CB|priority] Set the used IRA algorithm. +fipa-strict-aliasing +Common Var(flag_ipa_strict_aliasing) Init(1) Optimization +Assume strict aliasing rules apply across function boundaries. + Enum Name(ira_algorithm) Type(enum ira_algorithm) UnknownError(unknown IRA algorithm %qs) diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 9b4371b9213..afd85afe476 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -570,7 +570,7 @@ Objective-C and Objective-C++ Dialects}. -fsingle-precision-constant -fsplit-ivs-in-unroller -fsplit-loops@gol -fsplit-paths @gol -fsplit-wide-types -fsplit-wide-types-early -fssa-backprop -fssa-phiopt @gol --fstdarg-opt -fstore-merging -fstrict-aliasing @gol +-fstdarg-opt -fstore-merging -fstrict-aliasing -fipa-strict-aliasing @gol -fthread-jumps -ftracer -ftree-bit-ccp @gol -ftree-builtin-call-dce -ftree-ccp -ftree-ch @gol -ftree-coalesce-vars -ftree-copy-prop -ftree-dce -ftree-dominator-opts @gol @@ -12423,6 +12423,15 @@ int f() @{ The @option{-fstrict-aliasing} option is enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. +@item -fipa-strict-aliasing +@opindex fipa-strict-aliasing +Constrols whether rules of @option{-fstrict-aliasing} can be applied across +function boundaries. This option is effective only in combination with +@option{-fstrict-aliasing} and does not prevent optimization across function +boundry in case function has been inlined. + +The @option{-fipa-strict-aliasing} option is enabled by default. + @item -falign-functions @itemx -falign-functions=@var{n} @itemx -falign-functions=@var{n}:@var{m} diff --git a/gcc/ipa-modref.c b/gcc/ipa-modref.c index 2c89c63baf6..d6bd9d33278 100644 --- a/gcc/ipa-modref.c +++ b/gcc/ipa-modref.c @@ -999,9 +999,11 @@ modref_access_analysis::record_access (modref_records *tt, ao_ref *ref, modref_access_node &a) { - alias_set_type base_set = !flag_strict_aliasing ? 0 + alias_set_type base_set = !flag_strict_aliasing + || !flag_ipa_strict_aliasing ? 0 : ao_ref_base_alias_set (ref); - alias_set_type ref_set = !flag_strict_aliasing ? 0 + alias_set_type ref_set = !flag_strict_aliasing + || !flag_ipa_strict_aliasing ? 0 : (ao_ref_alias_set (ref)); if (dump_file) { @@ -1021,7 +1023,7 @@ modref_access_analysis::record_access_lto (modref_records_lto *tt, ao_ref *ref, /* get_alias_set sometimes use different type to compute the alias set than TREE_TYPE (base). Do same adjustments. */ tree base_type = NULL_TREE, ref_type = NULL_TREE; - if (flag_strict_aliasing) + if (flag_strict_aliasing && flag_ipa_strict_aliasing) { tree base;