https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69123
--- Comment #8 from H.J. Lu <hjl.tools at gmail dot com> --- A small testcase: [hjl@gnu-mic-2 i386]$ cat /tmp/x.ii struct xxx_def; typedef xxx_def *xxx; union rtxxx { const char *rt_str; xxx rt_xxx; }; struct xxx_def { union u { rtxxx fld[1]; } u; }; extern xxx bar (void); extern int foo1 (xxx); static inline xxx foo2 (xxx arg0, xxx arg1) { xxx rt; rt = bar (); (((rt)->u.fld[0]).rt_xxx) = arg0; (((rt)->u.fld[1]).rt_xxx) = arg1; return rt; } static inline xxx foo4 (const char *arg0 ) { xxx rt; rt = bar (); (((rt)->u.fld[0]).rt_str) = arg0; (((rt)->u.fld[1]).rt_xxx) = (xxx) 0; return rt; } extern xxx foo5 (long); struct address_cost_data { unsigned costs[2][2][2][2]; }; void get_address_cost (address_cost_data *data) { unsigned acost; long i; long rat, off = 0; unsigned sym_p, var_p, off_p, rat_p; xxx addr, base; xxx reg0, reg1; reg1 = bar (); addr = foo2 (reg1, (xxx) 0); rat = 1; acost = 0; reg0 = bar (); reg1 = bar (); for (i = 0; i < 16; i++) { sym_p = i & 1; var_p = (i >> 1) & 1; off_p = (i >> 2) & 1; rat_p = (i >> 3) & 1; addr = reg0; if (rat_p) addr = foo2 (addr, foo5 (rat)) ; if (var_p) addr = foo2 (addr, reg1); if (sym_p) base = foo4 (""); else if (off_p) base = foo5 (off); else base = (xxx) 0; if (base) addr = foo2 (addr, base); acost = foo1 (addr); data->costs[sym_p][var_p][off_p][rat_p] = acost; } } [hjl@gnu-mic-2 i386]$ ./cc1plus -fpreprocessed /tmp/x.ii -quiet -dumpbase x.ii -mtune=generic -march=x86-64 -auxbase x -g -O3 -version -fno-rtti -fno-exceptions -o x.s