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