1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297
|
/* { dg-do compile } */
/* { dg-options "-O2 -w" } */
/* This file was automatically reduced from tree-ssa-operands.c. It
contains many warnings, but it exposes a copy propagation bug that
is somewhat difficult to reproduce otherwise. */
__extension__ typedef __SIZE_TYPE__ size_t;
extern void fancy_abort (const char *, int, const char *) __attribute__ ((__noreturn__));
typedef union tree_node *tree;
enum tree_code {
TREE_LIST, ARRAY_TYPE, RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE, STRING_CST, LT_EXPR, GE_EXPR, LABEL_EXPR, ASM_EXPR, SSA_NAME, };
enum tree_code_class {
tcc_type, tcc_reference, tcc_expression };
extern const enum tree_code_class tree_code_type[];
extern const unsigned char tree_code_length[];
struct tree_common {
union tree_ann_d *ann;
__extension__ enum tree_code code : 8;
};
struct tree_string {
char str[1];
};
struct tree_list {
tree purpose;
tree value;
};
struct tree_exp {
tree operands[1];
};
typedef struct ssa_use_operand_d {
struct ssa_use_operand_d* prev;
struct ssa_use_operand_d* next;
tree stmt;
tree * use;
}
ssa_use_operand_t;
struct tree_ssa_name {
struct ssa_use_operand_d imm_uses;
};
union tree_node {
struct tree_common common;
struct tree_string string;
struct tree_list list;
struct tree_exp exp;
struct tree_ssa_name ssa_name;
};
typedef struct bitmap_head_def *bitmap;
typedef union varray_data_tag {
char c[1];
int i[1];
tree * tp[1];
}
varray_data;
struct varray_head_tag {
size_t num_elements;
size_t elements_used;
varray_data data;
};
typedef struct varray_head_tag *varray_type;
extern void varray_check_failed (varray_type, size_t, const char *, int, const char *) __attribute__ ((__noreturn__));
typedef ssa_use_operand_t *use_operand_p;
struct use_optype_d {
struct use_optype_d *next;
struct ssa_use_operand_d use_ptr;
};
typedef struct use_optype_d *use_optype_p;
struct ssa_operand_memory_d {
char mem[(2048 - sizeof (void *))];
};
struct stmt_operands_d {
struct use_optype_d * use_ops;
};
struct ptr_info_def {
tree name_mem_tag;
};
typedef struct subvar *subvar_t;
struct var_ann_d {
size_t uid;
};
struct stmt_ann_d {
unsigned modified : 1;
struct stmt_operands_d operands;
bitmap addresses_taken;
};
typedef struct var_ann_d *var_ann_t;
typedef struct stmt_ann_d *stmt_ann_t;
static __inline__ var_ann_t var_ann (tree t) {
}
static __inline__ stmt_ann_t stmt_ann (tree t) {
((void)(!(is_gimple_stmt (t)) ? fancy_abort ("/home/cygnus/dnovillo/gcc/src.ppc64/gcc/tree-flow-inline.h", 55, __FUNCTION__), 0 : 0));
return (stmt_ann_t) t->common.ann;
}
static __inline__ unsigned char stmt_modified_p (tree t) {
stmt_ann_t ann = stmt_ann (t);
return ann ? ann->modified : 1;
}
static __inline__ void delink_imm_use (ssa_use_operand_t *linknode) {
if (linknode->prev == ((void *)0)) return;
linknode->prev->next = linknode->next;
linknode->next->prev = linknode->prev;
linknode->prev = ((void *)0);
linknode->next = ((void *)0);
}
static __inline__ void link_imm_use_to_list (ssa_use_operand_t *linknode, ssa_use_operand_t *list) {
linknode->prev = list;
linknode->next = list->next;
list->next = linknode;
}
static __inline__ void link_imm_use (ssa_use_operand_t *linknode, tree def) {
ssa_use_operand_t *root;
if (!def || ((enum tree_code) (def)->common.code) != SSA_NAME) linknode->prev = ((void *)0);
else {
root = &(__extension__ ({ const tree __t = (def); if (((enum tree_code) (__t)->common.code) != (SSA_NAME)) tree_check_failed (__t, "/home/cygnus/dnovillo/gcc/src.ppc64/gcc/tree-flow-inline.h", 222, __FUNCTION__, (SSA_NAME), 0); __t; }
)->ssa_name.imm_uses);
link_imm_use_to_list (linknode, root);
}
}
static __inline__ void link_imm_use_stmt (ssa_use_operand_t *linknode, tree def, tree stmt) {
link_imm_use (linknode, def);
}
struct ggc_root_tab {
};
struct opbuild_list_d {
varray_type vars;
varray_type uid;
varray_type next;
int first;
unsigned num;
};
static struct opbuild_list_d build_uses;
static struct opbuild_list_d build_v_may_defs;
static struct ssa_operand_memory_d *operand_memory = ((void *)0);
static unsigned operand_memory_index;
static use_optype_p free_uses = ((void *)0);
static __inline__ int opbuild_next (struct opbuild_list_d *list, int prev) {
return __extension__ (*({
varray_type const _va = (list->next);
const size_t _n = (prev);
if (_n >= _va->num_elements) varray_check_failed (_va, _n, "/home/cygnus/dnovillo/gcc/src.ppc64/gcc/tree-ssa-operands.c", 323, __FUNCTION__);
&_va->data.i[_n];
}
));
}
static __inline__ tree * opbuild_elem_real (struct opbuild_list_d *list, int elem) {
return __extension__ (*({
varray_type const _va = (list->vars);
const size_t _n = (elem);
if (_n >= _va->num_elements) varray_check_failed (_va, _n, "/home/cygnus/dnovillo/gcc/src.ppc64/gcc/tree-ssa-operands.c", 332, __FUNCTION__);
&_va->data.tp[_n];
}
));
}
static __inline__ void opbuild_clear (struct opbuild_list_d *list) {
((list->vars)->elements_used = 0);
((list->next)->elements_used = 0);
}
static __inline__ void * ssa_operand_alloc (unsigned size) {
char *ptr;
if (operand_memory_index + size >= (2048 - sizeof (void *))) {
ptr = ggc_alloc_stat (sizeof (struct ssa_operand_memory_d) );
}
ptr = &(operand_memory->mem[operand_memory_index]);
return ptr;
}
static __inline__ void correct_use_link (use_operand_p ptr, tree stmt) {
use_operand_p prev;
tree root;
prev = ptr->prev;
if (prev) {
unsigned char stmt_mod = 1;
while (stmt_mod) { while (prev->stmt == stmt || prev->stmt == ((void *)0)) prev = prev->prev; if (prev->use == ((void *)0)) stmt_mod = 0; else if ((stmt_mod = stmt_modified_p (prev->stmt))) prev = prev->prev; }
if (prev->use == ((void *)0)) root = prev->stmt;
else root = *(prev->use);
if (root == *(ptr->use)) return;
}
delink_imm_use (ptr);
link_imm_use (ptr, *(ptr->use));
}
static __inline__ struct use_optype_d * alloc_use (void) {
struct use_optype_d *ret;
{
free_uses = free_uses->next;
}
ret = (struct use_optype_d *)ssa_operand_alloc (sizeof (struct use_optype_d));
return ret;
}
static __inline__ void finalize_ssa_use_ops (tree stmt) {
int new_i;
struct use_optype_d *old_ops, *ptr, *last;
tree * old_base;
struct use_optype_d new_list;
last = &new_list;
if (old_ops) old_base = ((old_ops)->use_ptr.use);
while (old_ops && new_i != -1) {
tree * new_base = opbuild_elem_real (&build_uses, (new_i));
if (old_base == new_base) { last->next = old_ops; last = old_ops; correct_use_link ((&((last)->use_ptr)), stmt); old_ops = old_ops->next; new_i = opbuild_next (&build_uses, new_i); }
else if (old_base < new_base) { use_operand_p use_p = (&((old_ops)->use_ptr)); delink_imm_use (use_p); old_ops = old_ops->next; ptr->next = free_uses; }
else { ptr = alloc_use (); (ptr)->use_ptr.use = (opbuild_elem_real (&build_uses, (new_i))); link_imm_use_stmt (&((ptr)->use_ptr), *(opbuild_elem_real (&build_uses, (new_i))), (stmt)); new_i = opbuild_next (&build_uses, new_i); }
if (old_ops) old_base = ((old_ops)->use_ptr.use);
}
for ( ;
new_i != -1;
new_i = opbuild_next (&build_uses, new_i)) {
ptr = alloc_use ();
(ptr)->use_ptr.use = (opbuild_elem_real (&build_uses, (new_i)));
link_imm_use_stmt (&((ptr)->use_ptr), *(opbuild_elem_real (&build_uses, (new_i))), (stmt));
}
{
{ use_operand_p use_p = (&((ptr)->use_ptr)); delink_imm_use (use_p); }
}
(stmt_ann (stmt)->operands.use_ops) = new_list.next;
{
unsigned x = 0;
for (ptr = (stmt_ann (stmt)->operands.use_ops);
ptr;
ptr = ptr->next) x++;
}
}
finalize_ssa_uses (tree stmt) {
{
unsigned x;
((void)(!(*(opbuild_elem_real (&build_uses, x)) != stmt) ? fancy_abort ("/home/cygnus/dnovillo/gcc/src.ppc64/gcc/tree-ssa-operands.c", 581, __FUNCTION__), 0 : 0));
}
finalize_ssa_use_ops (stmt);
opbuild_clear (&build_uses);
}
finalize_ssa_v_may_def_ops (tree stmt) {
int new_i;
{
}
for ( ;
new_i != -1;
new_i = opbuild_next (&build_v_may_defs, new_i)) {
}
{
}
}
get_expr_operands (tree stmt, tree *expr_p, int flags) {
enum tree_code code;
tree expr = *expr_p;
{
{ subvar_t svars; if (var_can_have_subvars (expr) && (svars = get_subvars_for_var (expr))) { } { } }
{ { if (code == LT_EXPR || code == GE_EXPR) { swap_tree_operands (stmt, &__extension__ (*({const tree __t = __extension__ ({ const tree __t = (expr); char const __c = tree_code_type[(int) (((enum tree_code) (__t)->common.code))]; if (!((__c) >= tcc_reference && (__c) <= tcc_expression)) tree_class_check_failed (__t, tcc_expression, "/home/cygnus/dnovillo/gcc/src.ppc64/gcc/tree-ssa-operands.c", 1435, __FUNCTION__); __t; }); const int __i = (0); if (__i < 0 || __i >= tree_code_length[(int) (((enum tree_code) (__t)->common.code))]) tree_operand_check_failed (__i, ((enum tree_code) (__t)->common.code), "/home/cygnus/dnovillo/gcc/src.ppc64/gcc/tree-ssa-operands.c", 1435, __FUNCTION__); &__t->exp.operands[__i]; })), &__extension__ (*({const tree __t = __extension__ ({ const tree __t = (expr); char const __c = tree_code_type[(int) (((enum tree_code) (__t)->common.code))]; if (!((__c) >= tcc_reference && (__c) <= tcc_expression)) tree_class_check_failed (__t, tcc_expression, "/home/cygnus/dnovillo/gcc/src.ppc64/gcc/tree-ssa-operands.c", 1436, __FUNCTION__); __t; }); const int __i = (1); if (__i < 0 || __i >= tree_code_length[(int) (((enum tree_code) (__t)->common.code))]) tree_operand_check_failed (__i, ((enum tree_code) (__t)->common.code), "/home/cygnus/dnovillo/gcc/src.ppc64/gcc/tree-ssa-operands.c", 1436, __FUNCTION__); &__t->exp.operands[__i]; }))); } { } } }
}
}
get_asm_expr_operands (tree stmt) {
int noutputs = list_length (__extension__ (*({
const tree __t = __extension__ ({ const tree __t = (__extension__ ({ const tree __t = (stmt); if (((enum tree_code) (__t)->common.code) != (ASM_EXPR)) tree_check_failed (__t, "/home/cygnus/dnovillo/gcc/src.ppc64/gcc/tree-ssa-operands.c", 1495, __FUNCTION__, (ASM_EXPR), 0); __t; })); char const __c = tree_code_type[(int) (((enum tree_code) (__t)->common.code))]; if (!((__c) >= tcc_reference && (__c) <= tcc_expression)) tree_class_check_failed (__t, tcc_expression, "/home/cygnus/dnovillo/gcc/src.ppc64/gcc/tree-ssa-operands.c", 1495, __FUNCTION__); __t; }
);
const int __i = (1);
if (__i < 0 || __i >= tree_code_length[(int) (((enum tree_code) (__t)->common.code))]) tree_operand_check_failed (__i, ((enum tree_code) (__t)->common.code), "/home/cygnus/dnovillo/gcc/src.ppc64/gcc/tree-ssa-operands.c", 1495, __FUNCTION__);
&__t->exp.operands[__i];
}
)));
const char **oconstraints = (const char **) __builtin_alloca((noutputs) * sizeof (const char *));
int i;
tree link;
const char *constraint;
unsigned char allows_mem, allows_reg, is_inout;
{
oconstraints[i] = constraint = ((const char *)(__extension__ ({ const tree __t = ((__extension__ ({ const tree __t = ((__extension__ ({ const tree __t = (link); if (((enum tree_code) (__t)->common.code) != (TREE_LIST)) tree_check_failed (__t, "/home/cygnus/dnovillo/gcc/src.ppc64/gcc/tree-ssa-operands.c", 1506, __FUNCTION__, (TREE_LIST), 0); __t; })->list.purpose)); if (((enum tree_code) (__t)->common.code) != (TREE_LIST)) tree_check_failed (__t, "/home/cygnus/dnovillo/gcc/src.ppc64/gcc/tree-ssa-operands.c", 1506, __FUNCTION__, (TREE_LIST), 0); __t; })->list.value)); if (((enum tree_code) (__t)->common.code) != (STRING_CST)) tree_check_failed (__t, "/home/cygnus/dnovillo/gcc/src.ppc64/gcc/tree-ssa-operands.c", 1506, __FUNCTION__, (STRING_CST), 0); __t; }
)->string.str));
parse_output_constraint (&constraint, i, 0, 0, &allows_mem, &allows_reg, &is_inout);
}
}
get_indirect_ref_operands (tree stmt, tree expr, int flags) {
tree *pptr = &__extension__ (*({
const tree __t = __extension__ ({ const tree __t = (expr); char const __c = tree_code_type[(int) (((enum tree_code) (__t)->common.code))]; if (!((__c) >= tcc_reference && (__c) <= tcc_expression)) tree_class_check_failed (__t, tcc_expression, "/home/cygnus/dnovillo/gcc/src.ppc64/gcc/tree-ssa-operands.c", 1591, __FUNCTION__); __t; }
);
const int __i = (0);
if (__i < 0 || __i >= tree_code_length[(int) (((enum tree_code) (__t)->common.code))]) tree_operand_check_failed (__i, ((enum tree_code) (__t)->common.code), "/home/cygnus/dnovillo/gcc/src.ppc64/gcc/tree-ssa-operands.c", 1591, __FUNCTION__);
&__t->exp.operands[__i];
}
));
tree ptr = *pptr;
{
struct ptr_info_def *pi = ((void *)0);
if (((enum tree_code) (ptr)->common.code) == SSA_NAME && pi->name_mem_tag) { }
}
}
note_addressable (tree var, stmt_ann_t s_ann) {
subvar_t svars;
{
if (var_can_have_subvars (var) && (svars = get_subvars_for_var (var))) bitmap_set_bit (s_ann->addresses_taken, var_ann (var)->uid);
}
}
const struct ggc_root_tab gt_ggc_r_gt_tree_ssa_operands_h[] = {
{
&operand_memory, }
, {
}
, {
}
, {
}
, };
|