| /* { dg-do compile } */ |
| /* { dg-options "-O3 -g" } */ |
| |
| /* This was reduced from gcc/tree-vect-slp.c by H.J.Lu. */ |
| |
| 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; |
| } |
| } |