1 /* { dg-do compile } */
2 /* { dg-options "-O2 -w" } */
3 /* { dg-skip-if "too many arguments in function call" { bpf-*-* } } */
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. */
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
;
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
[];
19 union tree_ann_d
*ann
;
20 __extension__
enum tree_code code
: 8;
32 typedef struct ssa_use_operand_d
{
33 struct ssa_use_operand_d
* prev
;
34 struct ssa_use_operand_d
* next
;
39 struct tree_ssa_name
{
40 struct ssa_use_operand_d imm_uses
;
43 struct tree_common common
;
44 struct tree_string string
;
45 struct tree_list list
;
47 struct tree_ssa_name ssa_name
;
49 typedef struct bitmap_head_def
*bitmap
;
50 typedef union varray_data_tag
{
56 struct varray_head_tag
{
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
;
65 struct use_optype_d
*next
;
66 struct ssa_use_operand_d use_ptr
;
68 typedef struct use_optype_d
*use_optype_p
;
69 struct ssa_operand_memory_d
{
70 char mem
[(2048 - sizeof (void *))];
72 struct stmt_operands_d
{
73 struct use_optype_d
* use_ops
;
78 typedef struct subvar
*subvar_t
;
83 unsigned modified
: 1;
84 struct stmt_operands_d operands
;
85 bitmap addresses_taken
;
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
) {
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
;
95 static __inline__
unsigned char stmt_modified_p (tree t
) {
96 stmt_ann_t ann
= stmt_ann (t
);
97 return ann
? ann
->modified
: 1;
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);
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
;
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);
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
);
120 static __inline__
void link_imm_use_stmt (ssa_use_operand_t
*linknode
, tree def
, tree stmt
) {
121 link_imm_use (linknode
, def
);
123 struct ggc_root_tab
{
125 struct opbuild_list_d
{
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__
);
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__
);
155 static __inline__
void opbuild_clear (struct opbuild_list_d
*list
) {
156 ((list
->vars
)->elements_used
= 0);
157 ((list
->next
)->elements_used
= 0);
159 static __inline__
void * ssa_operand_alloc (unsigned size
) {
161 if (operand_memory_index
+ size
>= (2048 - sizeof (void *))) {
162 ptr
= ggc_alloc_stat (sizeof (struct ssa_operand_memory_d
) );
164 ptr
= &(operand_memory
->mem
[operand_memory_index
]);
167 static __inline__
void correct_use_link (use_operand_p ptr
, tree stmt
) {
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;
178 delink_imm_use (ptr
);
179 link_imm_use (ptr
, *(ptr
->use
));
181 static __inline__
struct use_optype_d
* alloc_use (void) {
182 struct use_optype_d
*ret
;
184 free_uses
= free_uses
->next
;
186 ret
= (struct use_optype_d
*)ssa_operand_alloc (sizeof (struct use_optype_d
));
189 static __inline__
void finalize_ssa_use_ops (tree stmt
) {
191 struct use_optype_d
*old_ops
, *ptr
, *last
;
193 struct use_optype_d 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
);
205 new_i
= opbuild_next (&build_uses
, new_i
)) {
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
));
211 { use_operand_p use_p
= (&((ptr
)->use_ptr
)); delink_imm_use (use_p
); }
213 (stmt_ann (stmt
)->operands
.use_ops
) = new_list
.next
;
216 for (ptr
= (stmt_ann (stmt
)->operands
.use_ops
);
218 ptr
= ptr
->next
) x
++;
221 finalize_ssa_uses (tree stmt
) {
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));
226 finalize_ssa_use_ops (stmt
);
227 opbuild_clear (&build_uses
);
229 finalize_ssa_v_may_def_ops (tree stmt
) {
235 new_i
= opbuild_next (&build_v_may_defs
, new_i
)) {
240 get_expr_operands (tree stmt
, tree
*expr_p
, int flags
) {
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
]; }))); } { } } }
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
; }
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
];
257 const char **oconstraints
= (const char **) __builtin_alloca((noutputs
) * sizeof (const char *));
260 const char *constraint
;
261 unsigned char allows_mem
, allows_reg
, is_inout
;
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
; }
265 parse_output_constraint (&constraint
, i
, 0, 0, &allows_mem
, &allows_reg
, &is_inout
);
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
; }
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
];
279 struct ptr_info_def
*pi
= ((void *)0);
280 if (((enum tree_code
) (ptr
)->common
.code
) == SSA_NAME
&& pi
->name_mem_tag
) { }
283 note_addressable (tree var
, stmt_ann_t s_ann
) {
286 if (var_can_have_subvars (var
) && (svars
= get_subvars_for_var (var
))) bitmap_set_bit (s_ann
->addresses_taken
, var_ann (var
)->uid
);
289 const struct ggc_root_tab gt_ggc_r_gt_tree_ssa_operands_h
[] = {