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 <hubi...@ucw.cz> * 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;