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