/* { dg-do compile } */
/* { dg-options "-O2 -w" } */
/* { dg-skip-if "too many arguments in function call" { bpf-*-* } } */

/* 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,   }
,   {
   }
,   {
   }
,   {
   }
, };
