blob: 0546e2074a5390a483d351a55831b383bc453c30 [file] [log] [blame]
/* { 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;
}
}