https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66430
Bug ID: 66430 Summary: IPA CP alignment information is not used for expression simplification Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: ipa Assignee: unassigned at gcc dot gnu.org Reporter: miyuki at gcc dot gnu.org Target Milestone: --- Consider the following example: static int __attribute__((noinline)) foo(char *p) { return (unsigned long)p % 8; } int bar() { char *data = __builtin_malloc(64); return foo(data + 5) + ((unsigned long)(data + 5) % 8); } When this code is compiled at -O3, alignment of "data" is propagated to foo: $ cat align_test.c.060i.cp [...snip...] IPA lattices after all propagation: Lattices: Node: bar/1: Node: foo/0: param [0]: VARIABLE ctxs: VARIABLE Alignment 8, misalignment 5 AGGS VARIABLE [...snip...] Modification phase of node foo/0 Adjusting alignment of param 0 to 8, misalignment to 5 [...snip...] But it is not used: $ cat align_test.c.191t.optimized ;; Function foo (foo, funcdef_no=0, decl_uid=1831, cgraph_uid=0, symbol_order=0) foo (char * p) { long int p.0_2; int _3; int _4; <bb 2>: p.0_2 = (long int) p_1(D); _3 = (int) p.0_2; _4 = _3 & 7; return _4; } ;; Function bar (bar, funcdef_no=1, decl_uid=1833, cgraph_uid=1, symbol_order=1) bar () { char * data; char * _4; int _5; unsigned int _6; unsigned int _7; int _8; <bb 2>: data_3 = __builtin_malloc (64); _4 = data_3 + 5; _5 = foo (_4); _6 = (unsigned int) _5; _7 = _6 + 5; _8 = (int) _7; return _8; } Notice, that in function bar the same expression is folded into constant.