https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78035
Bug ID: 78035 Summary: Inconsistency between address comparison and alias analysis Product: gcc Version: 7.0 Status: UNCONFIRMED Keywords: missed-optimization, wrong-code Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: rguenth at gcc dot gnu.org CC: hubicka at gcc dot gnu.org Target Milestone: --- Consider extern int a; extern int b; extern int c; int foo(int choose_a) { int *p; if (choose_a) p = &a; else p = &b; return p != &c; } int bar () { return &a != &c; } where trunk optimizes foo to return 1 while leaving the address comparison in bar alone. This is because for bar we end up invoking symtab_node::equal_address_to which considers symbol interposition while for simplifying foo we look at alias info (points-to) which considers a, b and c distinct objects. Either we are being too conservative in bar or we have a possible wrong-code issue in foo considering the very same points-to information is also used for alias analysis (and obviously direct accesses to a and b are not considered aliasing either).