https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
Bug ID: 99696 Summary: lto looks past aliases to initializers Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: rth at gcc dot gnu.org Target Milestone: --- The following is a c-ish version of const int y = init(); which no longer works with gcc 11. The intended advantage to the program from which this is extracted is that references to Y may be cse'd across calls. IMO this should work fine with LTO, so long as it does not apply the constant initializer optimization to const variables that are aliased. Compile: gcc -O2 -flto y?.c --- y1.c --- #include <assert.h> extern const int y; int main(void) { assert(y == 1); return 0; } --- y2.c --- static int x; extern const int y __attribute__((alias("x"))); static void __attribute__((constructor)) init(void) { x = 1; }