annotate gcc/gimple.c @ 140:4e440907fcbf

copy CbC goto flang in cfgexpand remove some CbC unnecessary code
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 14 Nov 2018 00:24:45 +0900
parents d34655255c78
children 351920fa3827
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 /* Gimple IR support functions.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3 Copyright (C) 2007-2018 Free Software Foundation, Inc.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 Contributed by Aldy Hernandez <aldyh@redhat.com>
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 This file is part of GCC.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 GCC is free software; you can redistribute it and/or modify it under
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 the terms of the GNU General Public License as published by the Free
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 Software Foundation; either version 3, or (at your option) any later
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 version.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 for more details.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 along with GCC; see the file COPYING3. If not see
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 <http://www.gnu.org/licenses/>. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 #include "config.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 #include "system.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 #include "coretypes.h"
111
kono
parents: 67
diff changeset
25 #include "backend.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 #include "tree.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 #include "gimple.h"
111
kono
parents: 67
diff changeset
28 #include "ssa.h"
kono
parents: 67
diff changeset
29 #include "cgraph.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 #include "diagnostic.h"
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
31 #include "alias.h"
111
kono
parents: 67
diff changeset
32 #include "fold-const.h"
kono
parents: 67
diff changeset
33 #include "calls.h"
kono
parents: 67
diff changeset
34 #include "stor-layout.h"
kono
parents: 67
diff changeset
35 #include "internal-fn.h"
kono
parents: 67
diff changeset
36 #include "tree-eh.h"
kono
parents: 67
diff changeset
37 #include "gimple-iterator.h"
kono
parents: 67
diff changeset
38 #include "gimple-walk.h"
kono
parents: 67
diff changeset
39 #include "gimplify.h"
kono
parents: 67
diff changeset
40 #include "target.h"
kono
parents: 67
diff changeset
41 #include "builtins.h"
kono
parents: 67
diff changeset
42 #include "selftest.h"
kono
parents: 67
diff changeset
43 #include "gimple-pretty-print.h"
kono
parents: 67
diff changeset
44 #include "stringpool.h"
kono
parents: 67
diff changeset
45 #include "attribs.h"
kono
parents: 67
diff changeset
46 #include "asan.h"
73
ce75bd9117e4 merge calls.c, cfgexpand.c, gcc.c, gimple.c, gimple.h and gimplify.c
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
47 #ifndef noCbC
117
mir3636
parents: 112
diff changeset
48 #include "c/cbc-tree.h"
73
ce75bd9117e4 merge calls.c, cfgexpand.c, gcc.c, gimple.c, gimple.h and gimplify.c
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
49 #endif
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
50
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
51 /* All the tuples have their operand vector (if present) at the very bottom
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
52 of the structure. Therefore, the offset required to find the
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
53 operands vector the size of the structure minus the size of the 1
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
54 element tree array at the end (see gimple_ops). */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
55 #define DEFGSSTRUCT(SYM, STRUCT, HAS_TREE_OP) \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
56 (HAS_TREE_OP ? sizeof (struct STRUCT) - sizeof (tree) : 0),
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
57 EXPORTED_CONST size_t gimple_ops_offset_[] = {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
58 #include "gsstruct.def"
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
59 };
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
60 #undef DEFGSSTRUCT
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
61
111
kono
parents: 67
diff changeset
62 #define DEFGSSTRUCT(SYM, STRUCT, HAS_TREE_OP) sizeof (struct STRUCT),
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
63 static const size_t gsstruct_code_size[] = {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
64 #include "gsstruct.def"
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
65 };
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
66 #undef DEFGSSTRUCT
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
67
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
68 #define DEFGSCODE(SYM, NAME, GSSCODE) NAME,
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 const char *const gimple_code_name[] = {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 #include "gimple.def"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 #undef DEFGSCODE
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
74 #define DEFGSCODE(SYM, NAME, GSSCODE) GSSCODE,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
75 EXPORTED_CONST enum gimple_statement_structure_enum gss_for_code_[] = {
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 #include "gimple.def"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 #undef DEFGSCODE
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 /* Gimple stats. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
82 uint64_t gimple_alloc_counts[(int) gimple_alloc_kind_all];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
83 uint64_t gimple_alloc_sizes[(int) gimple_alloc_kind_all];
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 /* Keep in sync with gimple.h:enum gimple_alloc_kind. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 static const char * const gimple_alloc_kind_names[] = {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 "assignments",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 "phi nodes",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 "conditionals",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 "everything else"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92
111
kono
parents: 67
diff changeset
93 /* Static gimple tuple members. */
kono
parents: 67
diff changeset
94 const enum gimple_code gassign::code_;
kono
parents: 67
diff changeset
95 const enum gimple_code gcall::code_;
kono
parents: 67
diff changeset
96 const enum gimple_code gcond::code_;
kono
parents: 67
diff changeset
97
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 /* Gimple tuple constructors.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 Note: Any constructor taking a ``gimple_seq'' as a parameter, can
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 be passed a NULL to start with an empty sequence. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 /* Set the code for statement G to CODE. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 static inline void
111
kono
parents: 67
diff changeset
106 gimple_set_code (gimple *g, enum gimple_code code)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 {
111
kono
parents: 67
diff changeset
108 g->code = code;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 /* Return the number of bytes needed to hold a GIMPLE statement with
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 code CODE. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
114 static inline size_t
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 gimple_size (enum gimple_code code)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
117 return gsstruct_code_size[gss_for_code (code)];
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 /* Allocate memory for a GIMPLE statement with code CODE and NUM_OPS
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 operands. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122
111
kono
parents: 67
diff changeset
123 gimple *
kono
parents: 67
diff changeset
124 gimple_alloc (enum gimple_code code, unsigned num_ops MEM_STAT_DECL)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 size_t size;
111
kono
parents: 67
diff changeset
127 gimple *stmt;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 size = gimple_size (code);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 if (num_ops > 0)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 size += sizeof (tree) * (num_ops - 1);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132
111
kono
parents: 67
diff changeset
133 if (GATHER_STATISTICS)
kono
parents: 67
diff changeset
134 {
kono
parents: 67
diff changeset
135 enum gimple_alloc_kind kind = gimple_alloc_kind (code);
kono
parents: 67
diff changeset
136 gimple_alloc_counts[(int) kind]++;
kono
parents: 67
diff changeset
137 gimple_alloc_sizes[(int) kind] += size;
kono
parents: 67
diff changeset
138 }
kono
parents: 67
diff changeset
139
kono
parents: 67
diff changeset
140 stmt = ggc_alloc_cleared_gimple_statement_stat (size PASS_MEM_STAT);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 gimple_set_code (stmt, code);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 gimple_set_num_ops (stmt, num_ops);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 /* Do not call gimple_set_modified here as it has other side
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 effects and this tuple is still not completely built. */
111
kono
parents: 67
diff changeset
146 stmt->modified = 1;
kono
parents: 67
diff changeset
147 gimple_init_singleton (stmt);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 return stmt;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 /* Set SUBCODE to be the code of the expression computed by statement G. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 static inline void
111
kono
parents: 67
diff changeset
155 gimple_set_subcode (gimple *g, unsigned subcode)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 /* We only have 16 bits for the RHS code. Assert that we are not
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 overflowing it. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 gcc_assert (subcode < (1 << 16));
111
kono
parents: 67
diff changeset
160 g->subcode = subcode;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 /* Build a tuple with operands. CODE is the statement to build (which
111
kono
parents: 67
diff changeset
166 must be one of the GIMPLE_WITH_OPS tuples). SUBCODE is the subcode
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
167 for the new tuple. NUM_OPS is the number of operands to allocate. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 #define gimple_build_with_ops(c, s, n) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 gimple_build_with_ops_stat (c, s, n MEM_STAT_INFO)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171
111
kono
parents: 67
diff changeset
172 static gimple *
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
173 gimple_build_with_ops_stat (enum gimple_code code, unsigned subcode,
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 unsigned num_ops MEM_STAT_DECL)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 {
111
kono
parents: 67
diff changeset
176 gimple *s = gimple_alloc (code, num_ops PASS_MEM_STAT);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 gimple_set_subcode (s, subcode);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 return s;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 /* Build a GIMPLE_RETURN statement returning RETVAL. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184
111
kono
parents: 67
diff changeset
185 greturn *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 gimple_build_return (tree retval)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 {
111
kono
parents: 67
diff changeset
188 greturn *s
kono
parents: 67
diff changeset
189 = as_a <greturn *> (gimple_build_with_ops (GIMPLE_RETURN, ERROR_MARK,
kono
parents: 67
diff changeset
190 2));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 if (retval)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 gimple_return_set_retval (s, retval);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 return s;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
196 /* Reset alias information on call S. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
197
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
198 void
111
kono
parents: 67
diff changeset
199 gimple_call_reset_alias_info (gcall *s)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
200 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
201 if (gimple_call_flags (s) & ECF_CONST)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
202 memset (gimple_call_use_set (s), 0, sizeof (struct pt_solution));
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
203 else
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
204 pt_solution_reset (gimple_call_use_set (s));
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
205 if (gimple_call_flags (s) & (ECF_CONST|ECF_PURE|ECF_NOVOPS))
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
206 memset (gimple_call_clobber_set (s), 0, sizeof (struct pt_solution));
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
207 else
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
208 pt_solution_reset (gimple_call_clobber_set (s));
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
209 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
210
111
kono
parents: 67
diff changeset
211 /* Helper for gimple_build_call, gimple_build_call_valist,
kono
parents: 67
diff changeset
212 gimple_build_call_vec and gimple_build_call_from_tree. Build the basic
kono
parents: 67
diff changeset
213 components of a GIMPLE_CALL statement to function FN with NARGS
kono
parents: 67
diff changeset
214 arguments. */
kono
parents: 67
diff changeset
215
kono
parents: 67
diff changeset
216 static inline gcall *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 gimple_build_call_1 (tree fn, unsigned nargs)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 {
111
kono
parents: 67
diff changeset
219 gcall *s
kono
parents: 67
diff changeset
220 = as_a <gcall *> (gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK,
kono
parents: 67
diff changeset
221 nargs + 3));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 if (TREE_CODE (fn) == FUNCTION_DECL)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 fn = build_fold_addr_expr (fn);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 gimple_set_op (s, 1, fn);
111
kono
parents: 67
diff changeset
225 gimple_call_set_fntype (s, TREE_TYPE (TREE_TYPE (fn)));
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
226 gimple_call_reset_alias_info (s);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 return s;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
229
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
230
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 /* Build a GIMPLE_CALL statement to function FN with the arguments
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 specified in vector ARGS. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
233
111
kono
parents: 67
diff changeset
234 gcall *
kono
parents: 67
diff changeset
235 gimple_build_call_vec (tree fn, vec<tree> args)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 unsigned i;
111
kono
parents: 67
diff changeset
238 unsigned nargs = args.length ();
kono
parents: 67
diff changeset
239 gcall *call = gimple_build_call_1 (fn, nargs);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
240
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 for (i = 0; i < nargs; i++)
111
kono
parents: 67
diff changeset
242 gimple_call_set_arg (call, i, args[i]);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
243
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 return call;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
246
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
247
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 /* Build a GIMPLE_CALL statement to function FN. NARGS is the number of
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 arguments. The ... are the arguments. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
250
111
kono
parents: 67
diff changeset
251 gcall *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 gimple_build_call (tree fn, unsigned nargs, ...)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
253 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 va_list ap;
111
kono
parents: 67
diff changeset
255 gcall *call;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
256 unsigned i;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
257
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
259
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 call = gimple_build_call_1 (fn, nargs);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
261
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 va_start (ap, nargs);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
263 for (i = 0; i < nargs; i++)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
264 gimple_call_set_arg (call, i, va_arg (ap, tree));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
265 va_end (ap);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
266
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 return call;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
268 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
269
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
270
111
kono
parents: 67
diff changeset
271 /* Build a GIMPLE_CALL statement to function FN. NARGS is the number of
kono
parents: 67
diff changeset
272 arguments. AP contains the arguments. */
kono
parents: 67
diff changeset
273
kono
parents: 67
diff changeset
274 gcall *
kono
parents: 67
diff changeset
275 gimple_build_call_valist (tree fn, unsigned nargs, va_list ap)
kono
parents: 67
diff changeset
276 {
kono
parents: 67
diff changeset
277 gcall *call;
kono
parents: 67
diff changeset
278 unsigned i;
kono
parents: 67
diff changeset
279
kono
parents: 67
diff changeset
280 gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn));
kono
parents: 67
diff changeset
281
kono
parents: 67
diff changeset
282 call = gimple_build_call_1 (fn, nargs);
kono
parents: 67
diff changeset
283
kono
parents: 67
diff changeset
284 for (i = 0; i < nargs; i++)
kono
parents: 67
diff changeset
285 gimple_call_set_arg (call, i, va_arg (ap, tree));
kono
parents: 67
diff changeset
286
kono
parents: 67
diff changeset
287 return call;
kono
parents: 67
diff changeset
288 }
kono
parents: 67
diff changeset
289
kono
parents: 67
diff changeset
290
kono
parents: 67
diff changeset
291 /* Helper for gimple_build_call_internal and gimple_build_call_internal_vec.
kono
parents: 67
diff changeset
292 Build the basic components of a GIMPLE_CALL statement to internal
kono
parents: 67
diff changeset
293 function FN with NARGS arguments. */
kono
parents: 67
diff changeset
294
kono
parents: 67
diff changeset
295 static inline gcall *
kono
parents: 67
diff changeset
296 gimple_build_call_internal_1 (enum internal_fn fn, unsigned nargs)
kono
parents: 67
diff changeset
297 {
kono
parents: 67
diff changeset
298 gcall *s
kono
parents: 67
diff changeset
299 = as_a <gcall *> (gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK,
kono
parents: 67
diff changeset
300 nargs + 3));
kono
parents: 67
diff changeset
301 s->subcode |= GF_CALL_INTERNAL;
kono
parents: 67
diff changeset
302 gimple_call_set_internal_fn (s, fn);
kono
parents: 67
diff changeset
303 gimple_call_reset_alias_info (s);
kono
parents: 67
diff changeset
304 return s;
kono
parents: 67
diff changeset
305 }
kono
parents: 67
diff changeset
306
kono
parents: 67
diff changeset
307
kono
parents: 67
diff changeset
308 /* Build a GIMPLE_CALL statement to internal function FN. NARGS is
kono
parents: 67
diff changeset
309 the number of arguments. The ... are the arguments. */
kono
parents: 67
diff changeset
310
kono
parents: 67
diff changeset
311 gcall *
kono
parents: 67
diff changeset
312 gimple_build_call_internal (enum internal_fn fn, unsigned nargs, ...)
kono
parents: 67
diff changeset
313 {
kono
parents: 67
diff changeset
314 va_list ap;
kono
parents: 67
diff changeset
315 gcall *call;
kono
parents: 67
diff changeset
316 unsigned i;
kono
parents: 67
diff changeset
317
kono
parents: 67
diff changeset
318 call = gimple_build_call_internal_1 (fn, nargs);
kono
parents: 67
diff changeset
319 va_start (ap, nargs);
kono
parents: 67
diff changeset
320 for (i = 0; i < nargs; i++)
kono
parents: 67
diff changeset
321 gimple_call_set_arg (call, i, va_arg (ap, tree));
kono
parents: 67
diff changeset
322 va_end (ap);
kono
parents: 67
diff changeset
323
kono
parents: 67
diff changeset
324 return call;
kono
parents: 67
diff changeset
325 }
kono
parents: 67
diff changeset
326
kono
parents: 67
diff changeset
327
kono
parents: 67
diff changeset
328 /* Build a GIMPLE_CALL statement to internal function FN with the arguments
kono
parents: 67
diff changeset
329 specified in vector ARGS. */
kono
parents: 67
diff changeset
330
kono
parents: 67
diff changeset
331 gcall *
kono
parents: 67
diff changeset
332 gimple_build_call_internal_vec (enum internal_fn fn, vec<tree> args)
kono
parents: 67
diff changeset
333 {
kono
parents: 67
diff changeset
334 unsigned i, nargs;
kono
parents: 67
diff changeset
335 gcall *call;
kono
parents: 67
diff changeset
336
kono
parents: 67
diff changeset
337 nargs = args.length ();
kono
parents: 67
diff changeset
338 call = gimple_build_call_internal_1 (fn, nargs);
kono
parents: 67
diff changeset
339 for (i = 0; i < nargs; i++)
kono
parents: 67
diff changeset
340 gimple_call_set_arg (call, i, args[i]);
kono
parents: 67
diff changeset
341
kono
parents: 67
diff changeset
342 return call;
kono
parents: 67
diff changeset
343 }
kono
parents: 67
diff changeset
344
kono
parents: 67
diff changeset
345
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
346 /* Build a GIMPLE_CALL statement from CALL_EXPR T. Note that T is
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
347 assumed to be in GIMPLE form already. Minimal checking is done of
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
348 this fact. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
349
111
kono
parents: 67
diff changeset
350 gcall *
kono
parents: 67
diff changeset
351 gimple_build_call_from_tree (tree t, tree fnptrtype)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
352 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
353 unsigned i, nargs;
111
kono
parents: 67
diff changeset
354 gcall *call;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
355
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
356 gcc_assert (TREE_CODE (t) == CALL_EXPR);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
357
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
358 nargs = call_expr_nargs (t);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
359
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
360 tree fndecl = NULL_TREE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
361 if (CALL_EXPR_FN (t) == NULL_TREE)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
362 call = gimple_build_call_internal_1 (CALL_EXPR_IFN (t), nargs);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
363 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
364 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
365 fndecl = get_callee_fndecl (t);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
366 call = gimple_build_call_1 (fndecl ? fndecl : CALL_EXPR_FN (t), nargs);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
367 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
368
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
369 for (i = 0; i < nargs; i++)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
370 gimple_call_set_arg (call, i, CALL_EXPR_ARG (t, i));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
371
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
372 gimple_set_block (call, TREE_BLOCK (t));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
373 gimple_set_location (call, EXPR_LOCATION (t));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
374
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
375 /* Carry all the CALL_EXPR flags to the new GIMPLE_CALL. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
376 gimple_call_set_chain (call, CALL_EXPR_STATIC_CHAIN (t));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
377 gimple_call_set_tail (call, CALL_EXPR_TAILCALL (t));
111
kono
parents: 67
diff changeset
378 gimple_call_set_must_tail (call, CALL_EXPR_MUST_TAIL_CALL (t));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
379 gimple_call_set_return_slot_opt (call, CALL_EXPR_RETURN_SLOT_OPT (t));
111
kono
parents: 67
diff changeset
380 if (fndecl
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
381 && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
111
kono
parents: 67
diff changeset
382 && ALLOCA_FUNCTION_CODE_P (DECL_FUNCTION_CODE (fndecl)))
kono
parents: 67
diff changeset
383 gimple_call_set_alloca_for_var (call, CALL_ALLOCA_FOR_VAR_P (t));
kono
parents: 67
diff changeset
384 else
kono
parents: 67
diff changeset
385 gimple_call_set_from_thunk (call, CALL_FROM_THUNK_P (t));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
386 gimple_call_set_va_arg_pack (call, CALL_EXPR_VA_ARG_PACK (t));
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
387 gimple_call_set_nothrow (call, TREE_NOTHROW (t));
111
kono
parents: 67
diff changeset
388 gimple_call_set_by_descriptor (call, CALL_EXPR_BY_DESCRIPTOR (t));
73
ce75bd9117e4 merge calls.c, cfgexpand.c, gcc.c, gimple.c, gimple.h and gimplify.c
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
389 #ifndef noCbC
140
4e440907fcbf copy CbC goto flang in cfgexpand
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 132
diff changeset
390 gimple_call_set_cbc_goto (call, CbC_IS_CbC_GOTO (t));
73
ce75bd9117e4 merge calls.c, cfgexpand.c, gcc.c, gimple.c, gimple.h and gimplify.c
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
391 #endif
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
392 gimple_set_no_warning (call, TREE_NO_WARNING (t));
111
kono
parents: 67
diff changeset
393
kono
parents: 67
diff changeset
394 if (fnptrtype)
kono
parents: 67
diff changeset
395 {
kono
parents: 67
diff changeset
396 gimple_call_set_fntype (call, TREE_TYPE (fnptrtype));
kono
parents: 67
diff changeset
397
kono
parents: 67
diff changeset
398 /* Check if it's an indirect CALL and the type has the
kono
parents: 67
diff changeset
399 nocf_check attribute. In that case propagate the information
kono
parents: 67
diff changeset
400 to the gimple CALL insn. */
kono
parents: 67
diff changeset
401 if (!fndecl)
kono
parents: 67
diff changeset
402 {
kono
parents: 67
diff changeset
403 gcc_assert (POINTER_TYPE_P (fnptrtype));
kono
parents: 67
diff changeset
404 tree fntype = TREE_TYPE (fnptrtype);
kono
parents: 67
diff changeset
405
kono
parents: 67
diff changeset
406 if (lookup_attribute ("nocf_check", TYPE_ATTRIBUTES (fntype)))
kono
parents: 67
diff changeset
407 gimple_call_set_nocf_check (call, TRUE);
kono
parents: 67
diff changeset
408 }
kono
parents: 67
diff changeset
409 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
410
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
411 return call;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
412 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
413
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
414
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
415 /* Build a GIMPLE_ASSIGN statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
416
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
417 LHS of the assignment.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
418 RHS of the assignment which can be unary or binary. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
419
111
kono
parents: 67
diff changeset
420 gassign *
kono
parents: 67
diff changeset
421 gimple_build_assign (tree lhs, tree rhs MEM_STAT_DECL)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
422 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
423 enum tree_code subcode;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
424 tree op1, op2, op3;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
425
111
kono
parents: 67
diff changeset
426 extract_ops_from_tree (rhs, &subcode, &op1, &op2, &op3);
kono
parents: 67
diff changeset
427 return gimple_build_assign (lhs, subcode, op1, op2, op3 PASS_MEM_STAT);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
428 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
429
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
430
111
kono
parents: 67
diff changeset
431 /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands
kono
parents: 67
diff changeset
432 OP1, OP2 and OP3. */
kono
parents: 67
diff changeset
433
kono
parents: 67
diff changeset
434 static inline gassign *
kono
parents: 67
diff changeset
435 gimple_build_assign_1 (tree lhs, enum tree_code subcode, tree op1,
kono
parents: 67
diff changeset
436 tree op2, tree op3 MEM_STAT_DECL)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
437 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
438 unsigned num_ops;
111
kono
parents: 67
diff changeset
439 gassign *p;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
440
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
441 /* Need 1 operand for LHS and 1 or 2 for the RHS (depending on the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
442 code). */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
443 num_ops = get_gimple_rhs_num_ops (subcode) + 1;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
444
111
kono
parents: 67
diff changeset
445 p = as_a <gassign *> (
kono
parents: 67
diff changeset
446 gimple_build_with_ops_stat (GIMPLE_ASSIGN, (unsigned)subcode, num_ops
kono
parents: 67
diff changeset
447 PASS_MEM_STAT));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
448 gimple_assign_set_lhs (p, lhs);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
449 gimple_assign_set_rhs1 (p, op1);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
450 if (op2)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
451 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
452 gcc_assert (num_ops > 2);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
453 gimple_assign_set_rhs2 (p, op2);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
454 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
455
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
456 if (op3)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
457 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
458 gcc_assert (num_ops > 3);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
459 gimple_assign_set_rhs3 (p, op3);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
460 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
461
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
462 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
463 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
464
111
kono
parents: 67
diff changeset
465 /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands
kono
parents: 67
diff changeset
466 OP1, OP2 and OP3. */
kono
parents: 67
diff changeset
467
kono
parents: 67
diff changeset
468 gassign *
kono
parents: 67
diff changeset
469 gimple_build_assign (tree lhs, enum tree_code subcode, tree op1,
kono
parents: 67
diff changeset
470 tree op2, tree op3 MEM_STAT_DECL)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
471 {
111
kono
parents: 67
diff changeset
472 return gimple_build_assign_1 (lhs, subcode, op1, op2, op3 PASS_MEM_STAT);
kono
parents: 67
diff changeset
473 }
kono
parents: 67
diff changeset
474
kono
parents: 67
diff changeset
475 /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands
kono
parents: 67
diff changeset
476 OP1 and OP2. */
kono
parents: 67
diff changeset
477
kono
parents: 67
diff changeset
478 gassign *
kono
parents: 67
diff changeset
479 gimple_build_assign (tree lhs, enum tree_code subcode, tree op1,
kono
parents: 67
diff changeset
480 tree op2 MEM_STAT_DECL)
kono
parents: 67
diff changeset
481 {
kono
parents: 67
diff changeset
482 return gimple_build_assign_1 (lhs, subcode, op1, op2, NULL_TREE
kono
parents: 67
diff changeset
483 PASS_MEM_STAT);
kono
parents: 67
diff changeset
484 }
kono
parents: 67
diff changeset
485
kono
parents: 67
diff changeset
486 /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operand OP1. */
kono
parents: 67
diff changeset
487
kono
parents: 67
diff changeset
488 gassign *
kono
parents: 67
diff changeset
489 gimple_build_assign (tree lhs, enum tree_code subcode, tree op1 MEM_STAT_DECL)
kono
parents: 67
diff changeset
490 {
kono
parents: 67
diff changeset
491 return gimple_build_assign_1 (lhs, subcode, op1, NULL_TREE, NULL_TREE
kono
parents: 67
diff changeset
492 PASS_MEM_STAT);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
493 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
494
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
495
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
496 /* Build a GIMPLE_COND statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
497
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
498 PRED is the condition used to compare LHS and the RHS.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
499 T_LABEL is the label to jump to if the condition is true.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
500 F_LABEL is the label to jump to otherwise. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
501
111
kono
parents: 67
diff changeset
502 gcond *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
503 gimple_build_cond (enum tree_code pred_code, tree lhs, tree rhs,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
504 tree t_label, tree f_label)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
505 {
111
kono
parents: 67
diff changeset
506 gcond *p;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
507
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
508 gcc_assert (TREE_CODE_CLASS (pred_code) == tcc_comparison);
111
kono
parents: 67
diff changeset
509 p = as_a <gcond *> (gimple_build_with_ops (GIMPLE_COND, pred_code, 4));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
510 gimple_cond_set_lhs (p, lhs);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
511 gimple_cond_set_rhs (p, rhs);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
512 gimple_cond_set_true_label (p, t_label);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
513 gimple_cond_set_false_label (p, f_label);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
514 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
515 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
516
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
517 /* Build a GIMPLE_COND statement from the conditional expression tree
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
518 COND. T_LABEL and F_LABEL are as in gimple_build_cond. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
519
111
kono
parents: 67
diff changeset
520 gcond *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
521 gimple_build_cond_from_tree (tree cond, tree t_label, tree f_label)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
522 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
523 enum tree_code code;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
524 tree lhs, rhs;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
525
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
526 gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
527 return gimple_build_cond (code, lhs, rhs, t_label, f_label);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
528 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
529
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
530 /* Set code, lhs, and rhs of a GIMPLE_COND from a suitable
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
531 boolean expression tree COND. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
532
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
533 void
111
kono
parents: 67
diff changeset
534 gimple_cond_set_condition_from_tree (gcond *stmt, tree cond)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
535 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
536 enum tree_code code;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
537 tree lhs, rhs;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
538
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
539 gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
540 gimple_cond_set_condition (stmt, code, lhs, rhs);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
541 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
542
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
543 /* Build a GIMPLE_LABEL statement for LABEL. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
544
111
kono
parents: 67
diff changeset
545 glabel *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
546 gimple_build_label (tree label)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
547 {
111
kono
parents: 67
diff changeset
548 glabel *p
kono
parents: 67
diff changeset
549 = as_a <glabel *> (gimple_build_with_ops (GIMPLE_LABEL, ERROR_MARK, 1));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
550 gimple_label_set_label (p, label);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
551 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
552 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
553
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
554 /* Build a GIMPLE_GOTO statement to label DEST. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
555
111
kono
parents: 67
diff changeset
556 ggoto *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
557 gimple_build_goto (tree dest)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
558 {
111
kono
parents: 67
diff changeset
559 ggoto *p
kono
parents: 67
diff changeset
560 = as_a <ggoto *> (gimple_build_with_ops (GIMPLE_GOTO, ERROR_MARK, 1));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
561 gimple_goto_set_dest (p, dest);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
562 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
563 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
564
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
565
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
566 /* Build a GIMPLE_NOP statement. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
567
111
kono
parents: 67
diff changeset
568 gimple *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
569 gimple_build_nop (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
570 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
571 return gimple_alloc (GIMPLE_NOP, 0);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
572 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
573
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
574
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
575 /* Build a GIMPLE_BIND statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
576 VARS are the variables in BODY.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
577 BLOCK is the containing block. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
578
111
kono
parents: 67
diff changeset
579 gbind *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
580 gimple_build_bind (tree vars, gimple_seq body, tree block)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
581 {
111
kono
parents: 67
diff changeset
582 gbind *p = as_a <gbind *> (gimple_alloc (GIMPLE_BIND, 0));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
583 gimple_bind_set_vars (p, vars);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
584 if (body)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
585 gimple_bind_set_body (p, body);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
586 if (block)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
587 gimple_bind_set_block (p, block);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
588 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
589 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
590
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
591 /* Helper function to set the simple fields of a asm stmt.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
592
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
593 STRING is a pointer to a string that is the asm blocks assembly code.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
594 NINPUT is the number of register inputs.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
595 NOUTPUT is the number of register outputs.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
596 NCLOBBERS is the number of clobbered registers.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
597 */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
598
111
kono
parents: 67
diff changeset
599 static inline gasm *
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
600 gimple_build_asm_1 (const char *string, unsigned ninputs, unsigned noutputs,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
601 unsigned nclobbers, unsigned nlabels)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
602 {
111
kono
parents: 67
diff changeset
603 gasm *p;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
604 int size = strlen (string);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
605
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
606 /* ASMs with labels cannot have outputs. This should have been
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
607 enforced by the front end. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
608 gcc_assert (nlabels == 0 || noutputs == 0);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
609
111
kono
parents: 67
diff changeset
610 p = as_a <gasm *> (
kono
parents: 67
diff changeset
611 gimple_build_with_ops (GIMPLE_ASM, ERROR_MARK,
kono
parents: 67
diff changeset
612 ninputs + noutputs + nclobbers + nlabels));
kono
parents: 67
diff changeset
613
kono
parents: 67
diff changeset
614 p->ni = ninputs;
kono
parents: 67
diff changeset
615 p->no = noutputs;
kono
parents: 67
diff changeset
616 p->nc = nclobbers;
kono
parents: 67
diff changeset
617 p->nl = nlabels;
kono
parents: 67
diff changeset
618 p->string = ggc_alloc_string (string, size);
kono
parents: 67
diff changeset
619
kono
parents: 67
diff changeset
620 if (GATHER_STATISTICS)
kono
parents: 67
diff changeset
621 gimple_alloc_sizes[(int) gimple_alloc_kind (GIMPLE_ASM)] += size;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
622
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
623 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
624 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
625
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
626 /* Build a GIMPLE_ASM statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
627
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
628 STRING is the assembly code.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
629 NINPUT is the number of register inputs.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
630 NOUTPUT is the number of register outputs.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
631 NCLOBBERS is the number of clobbered registers.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
632 INPUTS is a vector of the input register parameters.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
633 OUTPUTS is a vector of the output register parameters.
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
634 CLOBBERS is a vector of the clobbered register parameters.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
635 LABELS is a vector of destination labels. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
636
111
kono
parents: 67
diff changeset
637 gasm *
kono
parents: 67
diff changeset
638 gimple_build_asm_vec (const char *string, vec<tree, va_gc> *inputs,
kono
parents: 67
diff changeset
639 vec<tree, va_gc> *outputs, vec<tree, va_gc> *clobbers,
kono
parents: 67
diff changeset
640 vec<tree, va_gc> *labels)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
641 {
111
kono
parents: 67
diff changeset
642 gasm *p;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
643 unsigned i;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
644
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
645 p = gimple_build_asm_1 (string,
111
kono
parents: 67
diff changeset
646 vec_safe_length (inputs),
kono
parents: 67
diff changeset
647 vec_safe_length (outputs),
kono
parents: 67
diff changeset
648 vec_safe_length (clobbers),
kono
parents: 67
diff changeset
649 vec_safe_length (labels));
kono
parents: 67
diff changeset
650
kono
parents: 67
diff changeset
651 for (i = 0; i < vec_safe_length (inputs); i++)
kono
parents: 67
diff changeset
652 gimple_asm_set_input_op (p, i, (*inputs)[i]);
kono
parents: 67
diff changeset
653
kono
parents: 67
diff changeset
654 for (i = 0; i < vec_safe_length (outputs); i++)
kono
parents: 67
diff changeset
655 gimple_asm_set_output_op (p, i, (*outputs)[i]);
kono
parents: 67
diff changeset
656
kono
parents: 67
diff changeset
657 for (i = 0; i < vec_safe_length (clobbers); i++)
kono
parents: 67
diff changeset
658 gimple_asm_set_clobber_op (p, i, (*clobbers)[i]);
kono
parents: 67
diff changeset
659
kono
parents: 67
diff changeset
660 for (i = 0; i < vec_safe_length (labels); i++)
kono
parents: 67
diff changeset
661 gimple_asm_set_label_op (p, i, (*labels)[i]);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
662
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
663 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
664 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
665
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
666 /* Build a GIMPLE_CATCH statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
667
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
668 TYPES are the catch types.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
669 HANDLER is the exception handler. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
670
111
kono
parents: 67
diff changeset
671 gcatch *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
672 gimple_build_catch (tree types, gimple_seq handler)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
673 {
111
kono
parents: 67
diff changeset
674 gcatch *p = as_a <gcatch *> (gimple_alloc (GIMPLE_CATCH, 0));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
675 gimple_catch_set_types (p, types);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
676 if (handler)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
677 gimple_catch_set_handler (p, handler);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
678
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
679 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
680 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
681
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
682 /* Build a GIMPLE_EH_FILTER statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
683
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
684 TYPES are the filter's types.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
685 FAILURE is the filter's failure action. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
686
111
kono
parents: 67
diff changeset
687 geh_filter *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
688 gimple_build_eh_filter (tree types, gimple_seq failure)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
689 {
111
kono
parents: 67
diff changeset
690 geh_filter *p = as_a <geh_filter *> (gimple_alloc (GIMPLE_EH_FILTER, 0));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
691 gimple_eh_filter_set_types (p, types);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
692 if (failure)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
693 gimple_eh_filter_set_failure (p, failure);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
694
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
695 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
696 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
697
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
698 /* Build a GIMPLE_EH_MUST_NOT_THROW statement. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
699
111
kono
parents: 67
diff changeset
700 geh_mnt *
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
701 gimple_build_eh_must_not_throw (tree decl)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
702 {
111
kono
parents: 67
diff changeset
703 geh_mnt *p = as_a <geh_mnt *> (gimple_alloc (GIMPLE_EH_MUST_NOT_THROW, 0));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
704
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
705 gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
706 gcc_assert (flags_from_decl_or_type (decl) & ECF_NORETURN);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
707 gimple_eh_must_not_throw_set_fndecl (p, decl);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
708
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
709 return p;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
710 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
711
111
kono
parents: 67
diff changeset
712 /* Build a GIMPLE_EH_ELSE statement. */
kono
parents: 67
diff changeset
713
kono
parents: 67
diff changeset
714 geh_else *
kono
parents: 67
diff changeset
715 gimple_build_eh_else (gimple_seq n_body, gimple_seq e_body)
kono
parents: 67
diff changeset
716 {
kono
parents: 67
diff changeset
717 geh_else *p = as_a <geh_else *> (gimple_alloc (GIMPLE_EH_ELSE, 0));
kono
parents: 67
diff changeset
718 gimple_eh_else_set_n_body (p, n_body);
kono
parents: 67
diff changeset
719 gimple_eh_else_set_e_body (p, e_body);
kono
parents: 67
diff changeset
720 return p;
kono
parents: 67
diff changeset
721 }
kono
parents: 67
diff changeset
722
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
723 /* Build a GIMPLE_TRY statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
724
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
725 EVAL is the expression to evaluate.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
726 CLEANUP is the cleanup expression.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
727 KIND is either GIMPLE_TRY_CATCH or GIMPLE_TRY_FINALLY depending on
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
728 whether this is a try/catch or a try/finally respectively. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
729
111
kono
parents: 67
diff changeset
730 gtry *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
731 gimple_build_try (gimple_seq eval, gimple_seq cleanup,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
732 enum gimple_try_flags kind)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
733 {
111
kono
parents: 67
diff changeset
734 gtry *p;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
735
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
736 gcc_assert (kind == GIMPLE_TRY_CATCH || kind == GIMPLE_TRY_FINALLY);
111
kono
parents: 67
diff changeset
737 p = as_a <gtry *> (gimple_alloc (GIMPLE_TRY, 0));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
738 gimple_set_subcode (p, kind);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
739 if (eval)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
740 gimple_try_set_eval (p, eval);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
741 if (cleanup)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
742 gimple_try_set_cleanup (p, cleanup);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
743
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
744 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
745 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
746
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
747 /* Construct a GIMPLE_WITH_CLEANUP_EXPR statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
748
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
749 CLEANUP is the cleanup expression. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
750
111
kono
parents: 67
diff changeset
751 gimple *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
752 gimple_build_wce (gimple_seq cleanup)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
753 {
111
kono
parents: 67
diff changeset
754 gimple *p = gimple_alloc (GIMPLE_WITH_CLEANUP_EXPR, 0);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
755 if (cleanup)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
756 gimple_wce_set_cleanup (p, cleanup);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
757
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
758 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
759 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
760
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
761
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
762 /* Build a GIMPLE_RESX statement. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
763
111
kono
parents: 67
diff changeset
764 gresx *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
765 gimple_build_resx (int region)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
766 {
111
kono
parents: 67
diff changeset
767 gresx *p
kono
parents: 67
diff changeset
768 = as_a <gresx *> (gimple_build_with_ops (GIMPLE_RESX, ERROR_MARK, 0));
kono
parents: 67
diff changeset
769 p->region = region;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
770 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
771 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
772
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
773
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
774 /* The helper for constructing a gimple switch statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
775 INDEX is the switch's index.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
776 NLABELS is the number of labels in the switch excluding the default.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
777 DEFAULT_LABEL is the default label for the switch statement. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
778
111
kono
parents: 67
diff changeset
779 gswitch *
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
780 gimple_build_switch_nlabels (unsigned nlabels, tree index, tree default_label)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
781 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
782 /* nlabels + 1 default label + 1 index. */
111
kono
parents: 67
diff changeset
783 gcc_checking_assert (default_label);
kono
parents: 67
diff changeset
784 gswitch *p = as_a <gswitch *> (gimple_build_with_ops (GIMPLE_SWITCH,
kono
parents: 67
diff changeset
785 ERROR_MARK,
kono
parents: 67
diff changeset
786 1 + 1 + nlabels));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
787 gimple_switch_set_index (p, index);
111
kono
parents: 67
diff changeset
788 gimple_switch_set_default_label (p, default_label);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
789 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
790 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
791
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
792 /* Build a GIMPLE_SWITCH statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
793
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
794 INDEX is the switch's index.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
795 DEFAULT_LABEL is the default label
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
796 ARGS is a vector of labels excluding the default. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
797
111
kono
parents: 67
diff changeset
798 gswitch *
kono
parents: 67
diff changeset
799 gimple_build_switch (tree index, tree default_label, vec<tree> args)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
800 {
111
kono
parents: 67
diff changeset
801 unsigned i, nlabels = args.length ();
kono
parents: 67
diff changeset
802
kono
parents: 67
diff changeset
803 gswitch *p = gimple_build_switch_nlabels (nlabels, index, default_label);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
804
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
805 /* Copy the labels from the vector to the switch statement. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
806 for (i = 0; i < nlabels; i++)
111
kono
parents: 67
diff changeset
807 gimple_switch_set_label (p, i + 1, args[i]);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
808
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
809 return p;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
810 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
811
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
812 /* Build a GIMPLE_EH_DISPATCH statement. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
813
111
kono
parents: 67
diff changeset
814 geh_dispatch *
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
815 gimple_build_eh_dispatch (int region)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
816 {
111
kono
parents: 67
diff changeset
817 geh_dispatch *p
kono
parents: 67
diff changeset
818 = as_a <geh_dispatch *> (
kono
parents: 67
diff changeset
819 gimple_build_with_ops (GIMPLE_EH_DISPATCH, ERROR_MARK, 0));
kono
parents: 67
diff changeset
820 p->region = region;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
821 return p;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
822 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
823
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
824 /* Build a new GIMPLE_DEBUG_BIND statement.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
825
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
826 VAR is bound to VALUE; block and location are taken from STMT. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
827
111
kono
parents: 67
diff changeset
828 gdebug *
kono
parents: 67
diff changeset
829 gimple_build_debug_bind (tree var, tree value, gimple *stmt MEM_STAT_DECL)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
830 {
111
kono
parents: 67
diff changeset
831 gdebug *p
kono
parents: 67
diff changeset
832 = as_a <gdebug *> (gimple_build_with_ops_stat (GIMPLE_DEBUG,
kono
parents: 67
diff changeset
833 (unsigned)GIMPLE_DEBUG_BIND, 2
kono
parents: 67
diff changeset
834 PASS_MEM_STAT));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
835 gimple_debug_bind_set_var (p, var);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
836 gimple_debug_bind_set_value (p, value);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
837 if (stmt)
111
kono
parents: 67
diff changeset
838 gimple_set_location (p, gimple_location (stmt));
kono
parents: 67
diff changeset
839
kono
parents: 67
diff changeset
840 return p;
kono
parents: 67
diff changeset
841 }
kono
parents: 67
diff changeset
842
kono
parents: 67
diff changeset
843
kono
parents: 67
diff changeset
844 /* Build a new GIMPLE_DEBUG_SOURCE_BIND statement.
kono
parents: 67
diff changeset
845
kono
parents: 67
diff changeset
846 VAR is bound to VALUE; block and location are taken from STMT. */
kono
parents: 67
diff changeset
847
kono
parents: 67
diff changeset
848 gdebug *
kono
parents: 67
diff changeset
849 gimple_build_debug_source_bind (tree var, tree value,
kono
parents: 67
diff changeset
850 gimple *stmt MEM_STAT_DECL)
kono
parents: 67
diff changeset
851 {
kono
parents: 67
diff changeset
852 gdebug *p
kono
parents: 67
diff changeset
853 = as_a <gdebug *> (
kono
parents: 67
diff changeset
854 gimple_build_with_ops_stat (GIMPLE_DEBUG,
kono
parents: 67
diff changeset
855 (unsigned)GIMPLE_DEBUG_SOURCE_BIND, 2
kono
parents: 67
diff changeset
856 PASS_MEM_STAT));
kono
parents: 67
diff changeset
857
kono
parents: 67
diff changeset
858 gimple_debug_source_bind_set_var (p, var);
kono
parents: 67
diff changeset
859 gimple_debug_source_bind_set_value (p, value);
kono
parents: 67
diff changeset
860 if (stmt)
kono
parents: 67
diff changeset
861 gimple_set_location (p, gimple_location (stmt));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
862
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
863 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
864 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
865
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
866
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
867 /* Build a new GIMPLE_DEBUG_BEGIN_STMT statement in BLOCK at
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
868 LOCATION. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
869
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
870 gdebug *
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
871 gimple_build_debug_begin_stmt (tree block, location_t location
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
872 MEM_STAT_DECL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
873 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
874 gdebug *p
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
875 = as_a <gdebug *> (
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
876 gimple_build_with_ops_stat (GIMPLE_DEBUG,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
877 (unsigned)GIMPLE_DEBUG_BEGIN_STMT, 0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
878 PASS_MEM_STAT));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
879
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
880 gimple_set_location (p, location);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
881 gimple_set_block (p, block);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
882 cfun->debug_marker_count++;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
883
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
884 return p;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
885 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
886
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
887
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
888 /* Build a new GIMPLE_DEBUG_INLINE_ENTRY statement in BLOCK at
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
889 LOCATION. The BLOCK links to the inlined function. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
890
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
891 gdebug *
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
892 gimple_build_debug_inline_entry (tree block, location_t location
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
893 MEM_STAT_DECL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
894 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
895 gdebug *p
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
896 = as_a <gdebug *> (
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
897 gimple_build_with_ops_stat (GIMPLE_DEBUG,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
898 (unsigned)GIMPLE_DEBUG_INLINE_ENTRY, 0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
899 PASS_MEM_STAT));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
900
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
901 gimple_set_location (p, location);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
902 gimple_set_block (p, block);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
903 cfun->debug_marker_count++;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
904
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
905 return p;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
906 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
907
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
908
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
909 /* Build a GIMPLE_OMP_CRITICAL statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
910
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
911 BODY is the sequence of statements for which only one thread can execute.
111
kono
parents: 67
diff changeset
912 NAME is optional identifier for this critical block.
kono
parents: 67
diff changeset
913 CLAUSES are clauses for this critical block. */
kono
parents: 67
diff changeset
914
kono
parents: 67
diff changeset
915 gomp_critical *
kono
parents: 67
diff changeset
916 gimple_build_omp_critical (gimple_seq body, tree name, tree clauses)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
917 {
111
kono
parents: 67
diff changeset
918 gomp_critical *p
kono
parents: 67
diff changeset
919 = as_a <gomp_critical *> (gimple_alloc (GIMPLE_OMP_CRITICAL, 0));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
920 gimple_omp_critical_set_name (p, name);
111
kono
parents: 67
diff changeset
921 gimple_omp_critical_set_clauses (p, clauses);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
922 if (body)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
923 gimple_omp_set_body (p, body);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
924
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
925 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
926 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
927
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
928 /* Build a GIMPLE_OMP_FOR statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
929
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
930 BODY is sequence of statements inside the for loop.
111
kono
parents: 67
diff changeset
931 KIND is the `for' variant.
kono
parents: 67
diff changeset
932 CLAUSES, are any of the construct's clauses.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
933 COLLAPSE is the collapse count.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
934 PRE_BODY is the sequence of statements that are loop invariant. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
935
111
kono
parents: 67
diff changeset
936 gomp_for *
kono
parents: 67
diff changeset
937 gimple_build_omp_for (gimple_seq body, int kind, tree clauses, size_t collapse,
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
938 gimple_seq pre_body)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
939 {
111
kono
parents: 67
diff changeset
940 gomp_for *p = as_a <gomp_for *> (gimple_alloc (GIMPLE_OMP_FOR, 0));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
941 if (body)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
942 gimple_omp_set_body (p, body);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
943 gimple_omp_for_set_clauses (p, clauses);
111
kono
parents: 67
diff changeset
944 gimple_omp_for_set_kind (p, kind);
kono
parents: 67
diff changeset
945 p->collapse = collapse;
kono
parents: 67
diff changeset
946 p->iter = ggc_cleared_vec_alloc<gimple_omp_for_iter> (collapse);
kono
parents: 67
diff changeset
947
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
948 if (pre_body)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
949 gimple_omp_for_set_pre_body (p, pre_body);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
950
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
951 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
952 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
953
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
954
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
955 /* Build a GIMPLE_OMP_PARALLEL statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
956
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
957 BODY is sequence of statements which are executed in parallel.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
958 CLAUSES, are the OMP parallel construct's clauses.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
959 CHILD_FN is the function created for the parallel threads to execute.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
960 DATA_ARG are the shared data argument(s). */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
961
111
kono
parents: 67
diff changeset
962 gomp_parallel *
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
963 gimple_build_omp_parallel (gimple_seq body, tree clauses, tree child_fn,
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
964 tree data_arg)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
965 {
111
kono
parents: 67
diff changeset
966 gomp_parallel *p
kono
parents: 67
diff changeset
967 = as_a <gomp_parallel *> (gimple_alloc (GIMPLE_OMP_PARALLEL, 0));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
968 if (body)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
969 gimple_omp_set_body (p, body);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
970 gimple_omp_parallel_set_clauses (p, clauses);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
971 gimple_omp_parallel_set_child_fn (p, child_fn);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
972 gimple_omp_parallel_set_data_arg (p, data_arg);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
973
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
974 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
975 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
976
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
977
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
978 /* Build a GIMPLE_OMP_TASK statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
979
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
980 BODY is sequence of statements which are executed by the explicit task.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
981 CLAUSES, are the OMP parallel construct's clauses.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
982 CHILD_FN is the function created for the parallel threads to execute.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
983 DATA_ARG are the shared data argument(s).
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
984 COPY_FN is the optional function for firstprivate initialization.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
985 ARG_SIZE and ARG_ALIGN are size and alignment of the data block. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
986
111
kono
parents: 67
diff changeset
987 gomp_task *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
988 gimple_build_omp_task (gimple_seq body, tree clauses, tree child_fn,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
989 tree data_arg, tree copy_fn, tree arg_size,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
990 tree arg_align)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
991 {
111
kono
parents: 67
diff changeset
992 gomp_task *p = as_a <gomp_task *> (gimple_alloc (GIMPLE_OMP_TASK, 0));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
993 if (body)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
994 gimple_omp_set_body (p, body);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
995 gimple_omp_task_set_clauses (p, clauses);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
996 gimple_omp_task_set_child_fn (p, child_fn);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
997 gimple_omp_task_set_data_arg (p, data_arg);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
998 gimple_omp_task_set_copy_fn (p, copy_fn);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
999 gimple_omp_task_set_arg_size (p, arg_size);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1000 gimple_omp_task_set_arg_align (p, arg_align);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1001
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1002 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1003 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1004
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1005
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1006 /* Build a GIMPLE_OMP_SECTION statement for a sections statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1007
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1008 BODY is the sequence of statements in the section. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1009
111
kono
parents: 67
diff changeset
1010 gimple *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1011 gimple_build_omp_section (gimple_seq body)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1012 {
111
kono
parents: 67
diff changeset
1013 gimple *p = gimple_alloc (GIMPLE_OMP_SECTION, 0);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1014 if (body)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1015 gimple_omp_set_body (p, body);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1016
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1017 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1018 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1019
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1020
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1021 /* Build a GIMPLE_OMP_MASTER statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1022
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1023 BODY is the sequence of statements to be executed by just the master. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1024
111
kono
parents: 67
diff changeset
1025 gimple *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1026 gimple_build_omp_master (gimple_seq body)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1027 {
111
kono
parents: 67
diff changeset
1028 gimple *p = gimple_alloc (GIMPLE_OMP_MASTER, 0);
kono
parents: 67
diff changeset
1029 if (body)
kono
parents: 67
diff changeset
1030 gimple_omp_set_body (p, body);
kono
parents: 67
diff changeset
1031
kono
parents: 67
diff changeset
1032 return p;
kono
parents: 67
diff changeset
1033 }
kono
parents: 67
diff changeset
1034
kono
parents: 67
diff changeset
1035 /* Build a GIMPLE_OMP_GRID_BODY statement.
kono
parents: 67
diff changeset
1036
kono
parents: 67
diff changeset
1037 BODY is the sequence of statements to be executed by the kernel. */
kono
parents: 67
diff changeset
1038
kono
parents: 67
diff changeset
1039 gimple *
kono
parents: 67
diff changeset
1040 gimple_build_omp_grid_body (gimple_seq body)
kono
parents: 67
diff changeset
1041 {
kono
parents: 67
diff changeset
1042 gimple *p = gimple_alloc (GIMPLE_OMP_GRID_BODY, 0);
kono
parents: 67
diff changeset
1043 if (body)
kono
parents: 67
diff changeset
1044 gimple_omp_set_body (p, body);
kono
parents: 67
diff changeset
1045
kono
parents: 67
diff changeset
1046 return p;
kono
parents: 67
diff changeset
1047 }
kono
parents: 67
diff changeset
1048
kono
parents: 67
diff changeset
1049 /* Build a GIMPLE_OMP_TASKGROUP statement.
kono
parents: 67
diff changeset
1050
kono
parents: 67
diff changeset
1051 BODY is the sequence of statements to be executed by the taskgroup
kono
parents: 67
diff changeset
1052 construct. */
kono
parents: 67
diff changeset
1053
kono
parents: 67
diff changeset
1054 gimple *
kono
parents: 67
diff changeset
1055 gimple_build_omp_taskgroup (gimple_seq body)
kono
parents: 67
diff changeset
1056 {
kono
parents: 67
diff changeset
1057 gimple *p = gimple_alloc (GIMPLE_OMP_TASKGROUP, 0);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1058 if (body)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1059 gimple_omp_set_body (p, body);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1060
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1061 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1062 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1063
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1064
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1065 /* Build a GIMPLE_OMP_CONTINUE statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1066
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1067 CONTROL_DEF is the definition of the control variable.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1068 CONTROL_USE is the use of the control variable. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1069
111
kono
parents: 67
diff changeset
1070 gomp_continue *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1071 gimple_build_omp_continue (tree control_def, tree control_use)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1072 {
111
kono
parents: 67
diff changeset
1073 gomp_continue *p
kono
parents: 67
diff changeset
1074 = as_a <gomp_continue *> (gimple_alloc (GIMPLE_OMP_CONTINUE, 0));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1075 gimple_omp_continue_set_control_def (p, control_def);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1076 gimple_omp_continue_set_control_use (p, control_use);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1077 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1078 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1079
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1080 /* Build a GIMPLE_OMP_ORDERED statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1081
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1082 BODY is the sequence of statements inside a loop that will executed in
111
kono
parents: 67
diff changeset
1083 sequence.
kono
parents: 67
diff changeset
1084 CLAUSES are clauses for this statement. */
kono
parents: 67
diff changeset
1085
kono
parents: 67
diff changeset
1086 gomp_ordered *
kono
parents: 67
diff changeset
1087 gimple_build_omp_ordered (gimple_seq body, tree clauses)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1088 {
111
kono
parents: 67
diff changeset
1089 gomp_ordered *p
kono
parents: 67
diff changeset
1090 = as_a <gomp_ordered *> (gimple_alloc (GIMPLE_OMP_ORDERED, 0));
kono
parents: 67
diff changeset
1091 gimple_omp_ordered_set_clauses (p, clauses);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1092 if (body)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1093 gimple_omp_set_body (p, body);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1094
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1095 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1096 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1097
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1098
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1099 /* Build a GIMPLE_OMP_RETURN statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1100 WAIT_P is true if this is a non-waiting return. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1101
111
kono
parents: 67
diff changeset
1102 gimple *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1103 gimple_build_omp_return (bool wait_p)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1104 {
111
kono
parents: 67
diff changeset
1105 gimple *p = gimple_alloc (GIMPLE_OMP_RETURN, 0);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1106 if (wait_p)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1107 gimple_omp_return_set_nowait (p);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1108
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1109 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1110 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1111
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1112
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1113 /* Build a GIMPLE_OMP_SECTIONS statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1114
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1115 BODY is a sequence of section statements.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1116 CLAUSES are any of the OMP sections contsruct's clauses: private,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1117 firstprivate, lastprivate, reduction, and nowait. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1118
111
kono
parents: 67
diff changeset
1119 gomp_sections *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1120 gimple_build_omp_sections (gimple_seq body, tree clauses)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1121 {
111
kono
parents: 67
diff changeset
1122 gomp_sections *p
kono
parents: 67
diff changeset
1123 = as_a <gomp_sections *> (gimple_alloc (GIMPLE_OMP_SECTIONS, 0));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1124 if (body)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1125 gimple_omp_set_body (p, body);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1126 gimple_omp_sections_set_clauses (p, clauses);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1127
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1128 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1129 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1130
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1131
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1132 /* Build a GIMPLE_OMP_SECTIONS_SWITCH. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1133
111
kono
parents: 67
diff changeset
1134 gimple *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1135 gimple_build_omp_sections_switch (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1136 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1137 return gimple_alloc (GIMPLE_OMP_SECTIONS_SWITCH, 0);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1138 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1139
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1140
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1141 /* Build a GIMPLE_OMP_SINGLE statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1142
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1143 BODY is the sequence of statements that will be executed once.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1144 CLAUSES are any of the OMP single construct's clauses: private, firstprivate,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1145 copyprivate, nowait. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1146
111
kono
parents: 67
diff changeset
1147 gomp_single *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1148 gimple_build_omp_single (gimple_seq body, tree clauses)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1149 {
111
kono
parents: 67
diff changeset
1150 gomp_single *p
kono
parents: 67
diff changeset
1151 = as_a <gomp_single *> (gimple_alloc (GIMPLE_OMP_SINGLE, 0));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1152 if (body)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1153 gimple_omp_set_body (p, body);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1154 gimple_omp_single_set_clauses (p, clauses);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1155
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1156 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1157 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1158
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1159
111
kono
parents: 67
diff changeset
1160 /* Build a GIMPLE_OMP_TARGET statement.
kono
parents: 67
diff changeset
1161
kono
parents: 67
diff changeset
1162 BODY is the sequence of statements that will be executed.
kono
parents: 67
diff changeset
1163 KIND is the kind of the region.
kono
parents: 67
diff changeset
1164 CLAUSES are any of the construct's clauses. */
kono
parents: 67
diff changeset
1165
kono
parents: 67
diff changeset
1166 gomp_target *
kono
parents: 67
diff changeset
1167 gimple_build_omp_target (gimple_seq body, int kind, tree clauses)
kono
parents: 67
diff changeset
1168 {
kono
parents: 67
diff changeset
1169 gomp_target *p
kono
parents: 67
diff changeset
1170 = as_a <gomp_target *> (gimple_alloc (GIMPLE_OMP_TARGET, 0));
kono
parents: 67
diff changeset
1171 if (body)
kono
parents: 67
diff changeset
1172 gimple_omp_set_body (p, body);
kono
parents: 67
diff changeset
1173 gimple_omp_target_set_clauses (p, clauses);
kono
parents: 67
diff changeset
1174 gimple_omp_target_set_kind (p, kind);
kono
parents: 67
diff changeset
1175
kono
parents: 67
diff changeset
1176 return p;
kono
parents: 67
diff changeset
1177 }
kono
parents: 67
diff changeset
1178
kono
parents: 67
diff changeset
1179
kono
parents: 67
diff changeset
1180 /* Build a GIMPLE_OMP_TEAMS statement.
kono
parents: 67
diff changeset
1181
kono
parents: 67
diff changeset
1182 BODY is the sequence of statements that will be executed.
kono
parents: 67
diff changeset
1183 CLAUSES are any of the OMP teams construct's clauses. */
kono
parents: 67
diff changeset
1184
kono
parents: 67
diff changeset
1185 gomp_teams *
kono
parents: 67
diff changeset
1186 gimple_build_omp_teams (gimple_seq body, tree clauses)
kono
parents: 67
diff changeset
1187 {
kono
parents: 67
diff changeset
1188 gomp_teams *p = as_a <gomp_teams *> (gimple_alloc (GIMPLE_OMP_TEAMS, 0));
kono
parents: 67
diff changeset
1189 if (body)
kono
parents: 67
diff changeset
1190 gimple_omp_set_body (p, body);
kono
parents: 67
diff changeset
1191 gimple_omp_teams_set_clauses (p, clauses);
kono
parents: 67
diff changeset
1192
kono
parents: 67
diff changeset
1193 return p;
kono
parents: 67
diff changeset
1194 }
kono
parents: 67
diff changeset
1195
kono
parents: 67
diff changeset
1196
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1197 /* Build a GIMPLE_OMP_ATOMIC_LOAD statement. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1198
111
kono
parents: 67
diff changeset
1199 gomp_atomic_load *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1200 gimple_build_omp_atomic_load (tree lhs, tree rhs)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1201 {
111
kono
parents: 67
diff changeset
1202 gomp_atomic_load *p
kono
parents: 67
diff changeset
1203 = as_a <gomp_atomic_load *> (gimple_alloc (GIMPLE_OMP_ATOMIC_LOAD, 0));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1204 gimple_omp_atomic_load_set_lhs (p, lhs);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1205 gimple_omp_atomic_load_set_rhs (p, rhs);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1206 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1207 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1208
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1209 /* Build a GIMPLE_OMP_ATOMIC_STORE statement.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1210
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1211 VAL is the value we are storing. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1212
111
kono
parents: 67
diff changeset
1213 gomp_atomic_store *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1214 gimple_build_omp_atomic_store (tree val)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1215 {
111
kono
parents: 67
diff changeset
1216 gomp_atomic_store *p
kono
parents: 67
diff changeset
1217 = as_a <gomp_atomic_store *> (gimple_alloc (GIMPLE_OMP_ATOMIC_STORE, 0));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1218 gimple_omp_atomic_store_set_val (p, val);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1219 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1220 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1221
111
kono
parents: 67
diff changeset
1222 /* Build a GIMPLE_TRANSACTION statement. */
kono
parents: 67
diff changeset
1223
kono
parents: 67
diff changeset
1224 gtransaction *
kono
parents: 67
diff changeset
1225 gimple_build_transaction (gimple_seq body)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1226 {
111
kono
parents: 67
diff changeset
1227 gtransaction *p
kono
parents: 67
diff changeset
1228 = as_a <gtransaction *> (gimple_alloc (GIMPLE_TRANSACTION, 0));
kono
parents: 67
diff changeset
1229 gimple_transaction_set_body (p, body);
kono
parents: 67
diff changeset
1230 gimple_transaction_set_label_norm (p, 0);
kono
parents: 67
diff changeset
1231 gimple_transaction_set_label_uninst (p, 0);
kono
parents: 67
diff changeset
1232 gimple_transaction_set_label_over (p, 0);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1233 return p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1234 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1235
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1236 #if defined ENABLE_GIMPLE_CHECKING
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1237 /* Complain of a gimple type mismatch and die. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1238
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1239 void
111
kono
parents: 67
diff changeset
1240 gimple_check_failed (const gimple *gs, const char *file, int line,
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1241 const char *function, enum gimple_code code,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1242 enum tree_code subcode)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1243 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1244 internal_error ("gimple check: expected %s(%s), have %s(%s) in %s, at %s:%d",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1245 gimple_code_name[code],
111
kono
parents: 67
diff changeset
1246 get_tree_code_name (subcode),
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1247 gimple_code_name[gimple_code (gs)],
111
kono
parents: 67
diff changeset
1248 gs->subcode > 0
kono
parents: 67
diff changeset
1249 ? get_tree_code_name ((enum tree_code) gs->subcode)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1250 : "",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1251 function, trim_filename (file), line);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1252 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1253 #endif /* ENABLE_GIMPLE_CHECKING */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1254
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1255
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1256 /* Link gimple statement GS to the end of the sequence *SEQ_P. If
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1257 *SEQ_P is NULL, a new sequence is allocated. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1258
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1259 void
111
kono
parents: 67
diff changeset
1260 gimple_seq_add_stmt (gimple_seq *seq_p, gimple *gs)
kono
parents: 67
diff changeset
1261 {
kono
parents: 67
diff changeset
1262 gimple_stmt_iterator si;
kono
parents: 67
diff changeset
1263 if (gs == NULL)
kono
parents: 67
diff changeset
1264 return;
kono
parents: 67
diff changeset
1265
kono
parents: 67
diff changeset
1266 si = gsi_last (*seq_p);
kono
parents: 67
diff changeset
1267 gsi_insert_after (&si, gs, GSI_NEW_STMT);
kono
parents: 67
diff changeset
1268 }
kono
parents: 67
diff changeset
1269
kono
parents: 67
diff changeset
1270 /* Link gimple statement GS to the end of the sequence *SEQ_P. If
kono
parents: 67
diff changeset
1271 *SEQ_P is NULL, a new sequence is allocated. This function is
kono
parents: 67
diff changeset
1272 similar to gimple_seq_add_stmt, but does not scan the operands.
kono
parents: 67
diff changeset
1273 During gimplification, we need to manipulate statement sequences
kono
parents: 67
diff changeset
1274 before the def/use vectors have been constructed. */
kono
parents: 67
diff changeset
1275
kono
parents: 67
diff changeset
1276 void
kono
parents: 67
diff changeset
1277 gimple_seq_add_stmt_without_update (gimple_seq *seq_p, gimple *gs)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1278 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1279 gimple_stmt_iterator si;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1280
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1281 if (gs == NULL)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1282 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1283
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1284 si = gsi_last (*seq_p);
111
kono
parents: 67
diff changeset
1285 gsi_insert_after_without_update (&si, gs, GSI_NEW_STMT);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1286 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1287
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1288 /* Append sequence SRC to the end of sequence *DST_P. If *DST_P is
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1289 NULL, a new sequence is allocated. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1290
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1291 void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1292 gimple_seq_add_seq (gimple_seq *dst_p, gimple_seq src)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1293 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1294 gimple_stmt_iterator si;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1295 if (src == NULL)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1296 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1297
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1298 si = gsi_last (*dst_p);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1299 gsi_insert_seq_after (&si, src, GSI_NEW_STMT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1300 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1301
111
kono
parents: 67
diff changeset
1302 /* Append sequence SRC to the end of sequence *DST_P. If *DST_P is
kono
parents: 67
diff changeset
1303 NULL, a new sequence is allocated. This function is
kono
parents: 67
diff changeset
1304 similar to gimple_seq_add_seq, but does not scan the operands. */
kono
parents: 67
diff changeset
1305
kono
parents: 67
diff changeset
1306 void
kono
parents: 67
diff changeset
1307 gimple_seq_add_seq_without_update (gimple_seq *dst_p, gimple_seq src)
kono
parents: 67
diff changeset
1308 {
kono
parents: 67
diff changeset
1309 gimple_stmt_iterator si;
kono
parents: 67
diff changeset
1310 if (src == NULL)
kono
parents: 67
diff changeset
1311 return;
kono
parents: 67
diff changeset
1312
kono
parents: 67
diff changeset
1313 si = gsi_last (*dst_p);
kono
parents: 67
diff changeset
1314 gsi_insert_seq_after_without_update (&si, src, GSI_NEW_STMT);
kono
parents: 67
diff changeset
1315 }
kono
parents: 67
diff changeset
1316
kono
parents: 67
diff changeset
1317 /* Determine whether to assign a location to the statement GS. */
kono
parents: 67
diff changeset
1318
kono
parents: 67
diff changeset
1319 static bool
kono
parents: 67
diff changeset
1320 should_carry_location_p (gimple *gs)
kono
parents: 67
diff changeset
1321 {
kono
parents: 67
diff changeset
1322 /* Don't emit a line note for a label. We particularly don't want to
kono
parents: 67
diff changeset
1323 emit one for the break label, since it doesn't actually correspond
kono
parents: 67
diff changeset
1324 to the beginning of the loop/switch. */
kono
parents: 67
diff changeset
1325 if (gimple_code (gs) == GIMPLE_LABEL)
kono
parents: 67
diff changeset
1326 return false;
kono
parents: 67
diff changeset
1327
kono
parents: 67
diff changeset
1328 return true;
kono
parents: 67
diff changeset
1329 }
kono
parents: 67
diff changeset
1330
kono
parents: 67
diff changeset
1331 /* Set the location for gimple statement GS to LOCATION. */
kono
parents: 67
diff changeset
1332
kono
parents: 67
diff changeset
1333 static void
kono
parents: 67
diff changeset
1334 annotate_one_with_location (gimple *gs, location_t location)
kono
parents: 67
diff changeset
1335 {
kono
parents: 67
diff changeset
1336 if (!gimple_has_location (gs)
kono
parents: 67
diff changeset
1337 && !gimple_do_not_emit_location_p (gs)
kono
parents: 67
diff changeset
1338 && should_carry_location_p (gs))
kono
parents: 67
diff changeset
1339 gimple_set_location (gs, location);
kono
parents: 67
diff changeset
1340 }
kono
parents: 67
diff changeset
1341
kono
parents: 67
diff changeset
1342 /* Set LOCATION for all the statements after iterator GSI in sequence
kono
parents: 67
diff changeset
1343 SEQ. If GSI is pointing to the end of the sequence, start with the
kono
parents: 67
diff changeset
1344 first statement in SEQ. */
kono
parents: 67
diff changeset
1345
kono
parents: 67
diff changeset
1346 void
kono
parents: 67
diff changeset
1347 annotate_all_with_location_after (gimple_seq seq, gimple_stmt_iterator gsi,
kono
parents: 67
diff changeset
1348 location_t location)
kono
parents: 67
diff changeset
1349 {
kono
parents: 67
diff changeset
1350 if (gsi_end_p (gsi))
kono
parents: 67
diff changeset
1351 gsi = gsi_start (seq);
kono
parents: 67
diff changeset
1352 else
kono
parents: 67
diff changeset
1353 gsi_next (&gsi);
kono
parents: 67
diff changeset
1354
kono
parents: 67
diff changeset
1355 for (; !gsi_end_p (gsi); gsi_next (&gsi))
kono
parents: 67
diff changeset
1356 annotate_one_with_location (gsi_stmt (gsi), location);
kono
parents: 67
diff changeset
1357 }
kono
parents: 67
diff changeset
1358
kono
parents: 67
diff changeset
1359 /* Set the location for all the statements in a sequence STMT_P to LOCATION. */
kono
parents: 67
diff changeset
1360
kono
parents: 67
diff changeset
1361 void
kono
parents: 67
diff changeset
1362 annotate_all_with_location (gimple_seq stmt_p, location_t location)
kono
parents: 67
diff changeset
1363 {
kono
parents: 67
diff changeset
1364 gimple_stmt_iterator i;
kono
parents: 67
diff changeset
1365
kono
parents: 67
diff changeset
1366 if (gimple_seq_empty_p (stmt_p))
kono
parents: 67
diff changeset
1367 return;
kono
parents: 67
diff changeset
1368
kono
parents: 67
diff changeset
1369 for (i = gsi_start (stmt_p); !gsi_end_p (i); gsi_next (&i))
kono
parents: 67
diff changeset
1370 {
kono
parents: 67
diff changeset
1371 gimple *gs = gsi_stmt (i);
kono
parents: 67
diff changeset
1372 annotate_one_with_location (gs, location);
kono
parents: 67
diff changeset
1373 }
kono
parents: 67
diff changeset
1374 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1375
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1376 /* Helper function of empty_body_p. Return true if STMT is an empty
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1377 statement. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1378
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1379 static bool
111
kono
parents: 67
diff changeset
1380 empty_stmt_p (gimple *stmt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1381 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1382 if (gimple_code (stmt) == GIMPLE_NOP)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1383 return true;
111
kono
parents: 67
diff changeset
1384 if (gbind *bind_stmt = dyn_cast <gbind *> (stmt))
kono
parents: 67
diff changeset
1385 return empty_body_p (gimple_bind_body (bind_stmt));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1386 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1387 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1388
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1389
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1390 /* Return true if BODY contains nothing but empty statements. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1391
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1392 bool
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1393 empty_body_p (gimple_seq body)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1394 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1395 gimple_stmt_iterator i;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1396
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1397 if (gimple_seq_empty_p (body))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1398 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1399 for (i = gsi_start (body); !gsi_end_p (i); gsi_next (&i))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1400 if (!empty_stmt_p (gsi_stmt (i))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1401 && !is_gimple_debug (gsi_stmt (i)))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1402 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1403
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1404 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1405 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1406
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1407
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1408 /* Perform a deep copy of sequence SRC and return the result. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1409
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1410 gimple_seq
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1411 gimple_seq_copy (gimple_seq src)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1412 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1413 gimple_stmt_iterator gsi;
111
kono
parents: 67
diff changeset
1414 gimple_seq new_seq = NULL;
kono
parents: 67
diff changeset
1415 gimple *stmt;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1416
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1417 for (gsi = gsi_start (src); !gsi_end_p (gsi); gsi_next (&gsi))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1418 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1419 stmt = gimple_copy (gsi_stmt (gsi));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1420 gimple_seq_add_stmt (&new_seq, stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1421 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1422
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1423 return new_seq;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1424 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1425
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1426
111
kono
parents: 67
diff changeset
1427
kono
parents: 67
diff changeset
1428 /* Return true if calls C1 and C2 are known to go to the same function. */
kono
parents: 67
diff changeset
1429
kono
parents: 67
diff changeset
1430 bool
kono
parents: 67
diff changeset
1431 gimple_call_same_target_p (const gimple *c1, const gimple *c2)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1432 {
111
kono
parents: 67
diff changeset
1433 if (gimple_call_internal_p (c1))
kono
parents: 67
diff changeset
1434 return (gimple_call_internal_p (c2)
kono
parents: 67
diff changeset
1435 && gimple_call_internal_fn (c1) == gimple_call_internal_fn (c2)
kono
parents: 67
diff changeset
1436 && (!gimple_call_internal_unique_p (as_a <const gcall *> (c1))
kono
parents: 67
diff changeset
1437 || c1 == c2));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1438 else
111
kono
parents: 67
diff changeset
1439 return (gimple_call_fn (c1) == gimple_call_fn (c2)
kono
parents: 67
diff changeset
1440 || (gimple_call_fndecl (c1)
kono
parents: 67
diff changeset
1441 && gimple_call_fndecl (c1) == gimple_call_fndecl (c2)));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1442 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1443
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1444 /* Detect flags from a GIMPLE_CALL. This is just like
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1445 call_expr_flags, but for gimple tuples. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1446
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1447 int
111
kono
parents: 67
diff changeset
1448 gimple_call_flags (const gimple *stmt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1449 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1450 int flags;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1451 tree decl = gimple_call_fndecl (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1452
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1453 if (decl)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1454 flags = flags_from_decl_or_type (decl);
111
kono
parents: 67
diff changeset
1455 else if (gimple_call_internal_p (stmt))
kono
parents: 67
diff changeset
1456 flags = internal_fn_flags (gimple_call_internal_fn (stmt));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1457 else
111
kono
parents: 67
diff changeset
1458 flags = flags_from_decl_or_type (gimple_call_fntype (stmt));
kono
parents: 67
diff changeset
1459
kono
parents: 67
diff changeset
1460 if (stmt->subcode & GF_CALL_NOTHROW)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1461 flags |= ECF_NOTHROW;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1462
111
kono
parents: 67
diff changeset
1463 if (stmt->subcode & GF_CALL_BY_DESCRIPTOR)
kono
parents: 67
diff changeset
1464 flags |= ECF_BY_DESCRIPTOR;
kono
parents: 67
diff changeset
1465
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1466 return flags;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1467 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1468
111
kono
parents: 67
diff changeset
1469 /* Return the "fn spec" string for call STMT. */
kono
parents: 67
diff changeset
1470
kono
parents: 67
diff changeset
1471 static const_tree
kono
parents: 67
diff changeset
1472 gimple_call_fnspec (const gcall *stmt)
kono
parents: 67
diff changeset
1473 {
kono
parents: 67
diff changeset
1474 tree type, attr;
kono
parents: 67
diff changeset
1475
kono
parents: 67
diff changeset
1476 if (gimple_call_internal_p (stmt))
kono
parents: 67
diff changeset
1477 return internal_fn_fnspec (gimple_call_internal_fn (stmt));
kono
parents: 67
diff changeset
1478
kono
parents: 67
diff changeset
1479 type = gimple_call_fntype (stmt);
kono
parents: 67
diff changeset
1480 if (!type)
kono
parents: 67
diff changeset
1481 return NULL_TREE;
kono
parents: 67
diff changeset
1482
kono
parents: 67
diff changeset
1483 attr = lookup_attribute ("fn spec", TYPE_ATTRIBUTES (type));
kono
parents: 67
diff changeset
1484 if (!attr)
kono
parents: 67
diff changeset
1485 return NULL_TREE;
kono
parents: 67
diff changeset
1486
kono
parents: 67
diff changeset
1487 return TREE_VALUE (TREE_VALUE (attr));
kono
parents: 67
diff changeset
1488 }
kono
parents: 67
diff changeset
1489
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1490 /* Detects argument flags for argument number ARG on call STMT. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1491
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1492 int
111
kono
parents: 67
diff changeset
1493 gimple_call_arg_flags (const gcall *stmt, unsigned arg)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1494 {
111
kono
parents: 67
diff changeset
1495 const_tree attr = gimple_call_fnspec (stmt);
kono
parents: 67
diff changeset
1496
kono
parents: 67
diff changeset
1497 if (!attr || 1 + arg >= (unsigned) TREE_STRING_LENGTH (attr))
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1498 return 0;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1499
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1500 switch (TREE_STRING_POINTER (attr)[1 + arg])
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1501 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1502 case 'x':
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1503 case 'X':
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1504 return EAF_UNUSED;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1505
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1506 case 'R':
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1507 return EAF_DIRECT | EAF_NOCLOBBER | EAF_NOESCAPE;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1508
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1509 case 'r':
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1510 return EAF_NOCLOBBER | EAF_NOESCAPE;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1511
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1512 case 'W':
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1513 return EAF_DIRECT | EAF_NOESCAPE;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1514
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1515 case 'w':
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1516 return EAF_NOESCAPE;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1517
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1518 case '.':
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1519 default:
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1520 return 0;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1521 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1522 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1523
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1524 /* Detects return flags for the call STMT. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1525
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1526 int
111
kono
parents: 67
diff changeset
1527 gimple_call_return_flags (const gcall *stmt)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1528 {
111
kono
parents: 67
diff changeset
1529 const_tree attr;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1530
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1531 if (gimple_call_flags (stmt) & ECF_MALLOC)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1532 return ERF_NOALIAS;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1533
111
kono
parents: 67
diff changeset
1534 attr = gimple_call_fnspec (stmt);
kono
parents: 67
diff changeset
1535 if (!attr || TREE_STRING_LENGTH (attr) < 1)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1536 return 0;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1537
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1538 switch (TREE_STRING_POINTER (attr)[0])
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1539 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1540 case '1':
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1541 case '2':
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1542 case '3':
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1543 case '4':
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1544 return ERF_RETURNS_ARG | (TREE_STRING_POINTER (attr)[0] - '1');
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1545
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1546 case 'm':
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1547 return ERF_NOALIAS;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1548
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1549 case '.':
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1550 default:
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1551 return 0;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1552 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1553 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1554
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1555
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1556 /* Return true if call STMT is known to return a non-zero result. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1557
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1558 bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1559 gimple_call_nonnull_result_p (gcall *call)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1560 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1561 tree fndecl = gimple_call_fndecl (call);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1562 if (!fndecl)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1563 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1564 if (flag_delete_null_pointer_checks && !flag_check_new
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1565 && DECL_IS_OPERATOR_NEW (fndecl)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1566 && !TREE_NOTHROW (fndecl))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1567 return true;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1568
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1569 /* References are always non-NULL. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1570 if (flag_delete_null_pointer_checks
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1571 && TREE_CODE (TREE_TYPE (fndecl)) == REFERENCE_TYPE)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1572 return true;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1573
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1574 if (flag_delete_null_pointer_checks
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1575 && lookup_attribute ("returns_nonnull",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1576 TYPE_ATTRIBUTES (gimple_call_fntype (call))))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1577 return true;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1578 return gimple_alloca_call_p (call);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1579 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1580
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1581
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1582 /* If CALL returns a non-null result in an argument, return that arg. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1583
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1584 tree
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1585 gimple_call_nonnull_arg (gcall *call)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1586 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1587 tree fndecl = gimple_call_fndecl (call);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1588 if (!fndecl)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1589 return NULL_TREE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1590
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1591 unsigned rf = gimple_call_return_flags (call);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1592 if (rf & ERF_RETURNS_ARG)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1593 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1594 unsigned argnum = rf & ERF_RETURN_ARG_MASK;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1595 if (argnum < gimple_call_num_args (call))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1596 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1597 tree arg = gimple_call_arg (call, argnum);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1598 if (SSA_VAR_P (arg)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1599 && infer_nonnull_range_by_attribute (call, arg))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1600 return arg;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1601 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1602 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1603 return NULL_TREE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1604 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1605
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1606
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1607 /* Return true if GS is a copy assignment. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1608
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1609 bool
111
kono
parents: 67
diff changeset
1610 gimple_assign_copy_p (gimple *gs)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1611 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1612 return (gimple_assign_single_p (gs)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1613 && is_gimple_val (gimple_op (gs, 1)));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1614 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1615
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1616
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1617 /* Return true if GS is a SSA_NAME copy assignment. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1618
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1619 bool
111
kono
parents: 67
diff changeset
1620 gimple_assign_ssa_name_copy_p (gimple *gs)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1621 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1622 return (gimple_assign_single_p (gs)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1623 && TREE_CODE (gimple_assign_lhs (gs)) == SSA_NAME
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1624 && TREE_CODE (gimple_assign_rhs1 (gs)) == SSA_NAME);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1625 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1626
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1627
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1628 /* Return true if GS is an assignment with a unary RHS, but the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1629 operator has no effect on the assigned value. The logic is adapted
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1630 from STRIP_NOPS. This predicate is intended to be used in tuplifying
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1631 instances in which STRIP_NOPS was previously applied to the RHS of
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1632 an assignment.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1633
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1634 NOTE: In the use cases that led to the creation of this function
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1635 and of gimple_assign_single_p, it is typical to test for either
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1636 condition and to proceed in the same manner. In each case, the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1637 assigned value is represented by the single RHS operand of the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1638 assignment. I suspect there may be cases where gimple_assign_copy_p,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1639 gimple_assign_single_p, or equivalent logic is used where a similar
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1640 treatment of unary NOPs is appropriate. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1641
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1642 bool
111
kono
parents: 67
diff changeset
1643 gimple_assign_unary_nop_p (gimple *gs)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1644 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1645 return (is_gimple_assign (gs)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1646 && (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (gs))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1647 || gimple_assign_rhs_code (gs) == NON_LVALUE_EXPR)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1648 && gimple_assign_rhs1 (gs) != error_mark_node
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1649 && (TYPE_MODE (TREE_TYPE (gimple_assign_lhs (gs)))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1650 == TYPE_MODE (TREE_TYPE (gimple_assign_rhs1 (gs)))));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1651 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1652
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1653 /* Set BB to be the basic block holding G. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1654
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1655 void
111
kono
parents: 67
diff changeset
1656 gimple_set_bb (gimple *stmt, basic_block bb)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1657 {
111
kono
parents: 67
diff changeset
1658 stmt->bb = bb;
kono
parents: 67
diff changeset
1659
kono
parents: 67
diff changeset
1660 if (gimple_code (stmt) != GIMPLE_LABEL)
kono
parents: 67
diff changeset
1661 return;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1662
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1663 /* If the statement is a label, add the label to block-to-labels map
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1664 so that we can speed up edge creation for GIMPLE_GOTOs. */
111
kono
parents: 67
diff changeset
1665 if (cfun->cfg)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1666 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1667 tree t;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1668 int uid;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1669
111
kono
parents: 67
diff changeset
1670 t = gimple_label_label (as_a <glabel *> (stmt));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1671 uid = LABEL_DECL_UID (t);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1672 if (uid == -1)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1673 {
111
kono
parents: 67
diff changeset
1674 unsigned old_len =
kono
parents: 67
diff changeset
1675 vec_safe_length (label_to_block_map_for_fn (cfun));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1676 LABEL_DECL_UID (t) = uid = cfun->cfg->last_label_uid++;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1677 if (old_len <= (unsigned) uid)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1678 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1679 unsigned new_len = 3 * uid / 2 + 1;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1680
111
kono
parents: 67
diff changeset
1681 vec_safe_grow_cleared (label_to_block_map_for_fn (cfun),
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1682 new_len);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1683 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1684 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1685
111
kono
parents: 67
diff changeset
1686 (*label_to_block_map_for_fn (cfun))[uid] = bb;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1687 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1688 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1689
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1690
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1691 /* Modify the RHS of the assignment pointed-to by GSI using the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1692 operands in the expression tree EXPR.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1693
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1694 NOTE: The statement pointed-to by GSI may be reallocated if it
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1695 did not have enough operand slots.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1696
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1697 This function is useful to convert an existing tree expression into
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1698 the flat representation used for the RHS of a GIMPLE assignment.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1699 It will reallocate memory as needed to expand or shrink the number
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1700 of operand slots needed to represent EXPR.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1701
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1702 NOTE: If you find yourself building a tree and then calling this
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1703 function, you are most certainly doing it the slow way. It is much
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1704 better to build a new assignment or to use the function
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1705 gimple_assign_set_rhs_with_ops, which does not require an
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1706 expression tree to be built. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1707
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1708 void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1709 gimple_assign_set_rhs_from_tree (gimple_stmt_iterator *gsi, tree expr)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1710 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1711 enum tree_code subcode;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1712 tree op1, op2, op3;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1713
111
kono
parents: 67
diff changeset
1714 extract_ops_from_tree (expr, &subcode, &op1, &op2, &op3);
kono
parents: 67
diff changeset
1715 gimple_assign_set_rhs_with_ops (gsi, subcode, op1, op2, op3);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1716 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1717
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1718
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1719 /* Set the RHS of assignment statement pointed-to by GSI to CODE with
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1720 operands OP1, OP2 and OP3.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1721
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1722 NOTE: The statement pointed-to by GSI may be reallocated if it
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1723 did not have enough operand slots. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1724
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1725 void
111
kono
parents: 67
diff changeset
1726 gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *gsi, enum tree_code code,
kono
parents: 67
diff changeset
1727 tree op1, tree op2, tree op3)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1728 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1729 unsigned new_rhs_ops = get_gimple_rhs_num_ops (code);
111
kono
parents: 67
diff changeset
1730 gimple *stmt = gsi_stmt (*gsi);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1731
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1732 /* If the new CODE needs more operands, allocate a new statement. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1733 if (gimple_num_ops (stmt) < new_rhs_ops + 1)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1734 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1735 tree lhs = gimple_assign_lhs (stmt);
111
kono
parents: 67
diff changeset
1736 gimple *new_stmt = gimple_alloc (gimple_code (stmt), new_rhs_ops + 1);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1737 memcpy (new_stmt, stmt, gimple_size (gimple_code (stmt)));
111
kono
parents: 67
diff changeset
1738 gimple_init_singleton (new_stmt);
kono
parents: 67
diff changeset
1739 gsi_replace (gsi, new_stmt, false);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1740 stmt = new_stmt;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1741
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1742 /* The LHS needs to be reset as this also changes the SSA name
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1743 on the LHS. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1744 gimple_assign_set_lhs (stmt, lhs);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1745 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1746
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1747 gimple_set_num_ops (stmt, new_rhs_ops + 1);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1748 gimple_set_subcode (stmt, code);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1749 gimple_assign_set_rhs1 (stmt, op1);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1750 if (new_rhs_ops > 1)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1751 gimple_assign_set_rhs2 (stmt, op2);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1752 if (new_rhs_ops > 2)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1753 gimple_assign_set_rhs3 (stmt, op3);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1754 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1755
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1756
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1757 /* Return the LHS of a statement that performs an assignment,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1758 either a GIMPLE_ASSIGN or a GIMPLE_CALL. Returns NULL_TREE
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1759 for a call to a function that returns no value, or for a
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1760 statement other than an assignment or a call. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1761
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1762 tree
111
kono
parents: 67
diff changeset
1763 gimple_get_lhs (const gimple *stmt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1764 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1765 enum gimple_code code = gimple_code (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1766
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1767 if (code == GIMPLE_ASSIGN)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1768 return gimple_assign_lhs (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1769 else if (code == GIMPLE_CALL)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1770 return gimple_call_lhs (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1771 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1772 return NULL_TREE;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1773 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1774
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1775
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1776 /* Set the LHS of a statement that performs an assignment,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1777 either a GIMPLE_ASSIGN or a GIMPLE_CALL. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1778
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1779 void
111
kono
parents: 67
diff changeset
1780 gimple_set_lhs (gimple *stmt, tree lhs)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1781 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1782 enum gimple_code code = gimple_code (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1783
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1784 if (code == GIMPLE_ASSIGN)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1785 gimple_assign_set_lhs (stmt, lhs);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1786 else if (code == GIMPLE_CALL)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1787 gimple_call_set_lhs (stmt, lhs);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1788 else
111
kono
parents: 67
diff changeset
1789 gcc_unreachable ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1790 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1791
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1792
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1793 /* Return a deep copy of statement STMT. All the operands from STMT
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1794 are reallocated and copied using unshare_expr. The DEF, USE, VDEF
111
kono
parents: 67
diff changeset
1795 and VUSE operand arrays are set to empty in the new copy. The new
kono
parents: 67
diff changeset
1796 copy isn't part of any sequence. */
kono
parents: 67
diff changeset
1797
kono
parents: 67
diff changeset
1798 gimple *
kono
parents: 67
diff changeset
1799 gimple_copy (gimple *stmt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1800 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1801 enum gimple_code code = gimple_code (stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1802 unsigned num_ops = gimple_num_ops (stmt);
111
kono
parents: 67
diff changeset
1803 gimple *copy = gimple_alloc (code, num_ops);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1804 unsigned i;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1805
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1806 /* Shallow copy all the fields from STMT. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1807 memcpy (copy, stmt, gimple_size (code));
111
kono
parents: 67
diff changeset
1808 gimple_init_singleton (copy);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1809
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1810 /* If STMT has sub-statements, deep-copy them as well. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1811 if (gimple_has_substatements (stmt))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1812 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1813 gimple_seq new_seq;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1814 tree t;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1815
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1816 switch (gimple_code (stmt))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1817 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1818 case GIMPLE_BIND:
111
kono
parents: 67
diff changeset
1819 {
kono
parents: 67
diff changeset
1820 gbind *bind_stmt = as_a <gbind *> (stmt);
kono
parents: 67
diff changeset
1821 gbind *bind_copy = as_a <gbind *> (copy);
kono
parents: 67
diff changeset
1822 new_seq = gimple_seq_copy (gimple_bind_body (bind_stmt));
kono
parents: 67
diff changeset
1823 gimple_bind_set_body (bind_copy, new_seq);
kono
parents: 67
diff changeset
1824 gimple_bind_set_vars (bind_copy,
kono
parents: 67
diff changeset
1825 unshare_expr (gimple_bind_vars (bind_stmt)));
kono
parents: 67
diff changeset
1826 gimple_bind_set_block (bind_copy, gimple_bind_block (bind_stmt));
kono
parents: 67
diff changeset
1827 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1828 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1829
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1830 case GIMPLE_CATCH:
111
kono
parents: 67
diff changeset
1831 {
kono
parents: 67
diff changeset
1832 gcatch *catch_stmt = as_a <gcatch *> (stmt);
kono
parents: 67
diff changeset
1833 gcatch *catch_copy = as_a <gcatch *> (copy);
kono
parents: 67
diff changeset
1834 new_seq = gimple_seq_copy (gimple_catch_handler (catch_stmt));
kono
parents: 67
diff changeset
1835 gimple_catch_set_handler (catch_copy, new_seq);
kono
parents: 67
diff changeset
1836 t = unshare_expr (gimple_catch_types (catch_stmt));
kono
parents: 67
diff changeset
1837 gimple_catch_set_types (catch_copy, t);
kono
parents: 67
diff changeset
1838 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1839 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1840
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1841 case GIMPLE_EH_FILTER:
111
kono
parents: 67
diff changeset
1842 {
kono
parents: 67
diff changeset
1843 geh_filter *eh_filter_stmt = as_a <geh_filter *> (stmt);
kono
parents: 67
diff changeset
1844 geh_filter *eh_filter_copy = as_a <geh_filter *> (copy);
kono
parents: 67
diff changeset
1845 new_seq
kono
parents: 67
diff changeset
1846 = gimple_seq_copy (gimple_eh_filter_failure (eh_filter_stmt));
kono
parents: 67
diff changeset
1847 gimple_eh_filter_set_failure (eh_filter_copy, new_seq);
kono
parents: 67
diff changeset
1848 t = unshare_expr (gimple_eh_filter_types (eh_filter_stmt));
kono
parents: 67
diff changeset
1849 gimple_eh_filter_set_types (eh_filter_copy, t);
kono
parents: 67
diff changeset
1850 }
kono
parents: 67
diff changeset
1851 break;
kono
parents: 67
diff changeset
1852
kono
parents: 67
diff changeset
1853 case GIMPLE_EH_ELSE:
kono
parents: 67
diff changeset
1854 {
kono
parents: 67
diff changeset
1855 geh_else *eh_else_stmt = as_a <geh_else *> (stmt);
kono
parents: 67
diff changeset
1856 geh_else *eh_else_copy = as_a <geh_else *> (copy);
kono
parents: 67
diff changeset
1857 new_seq = gimple_seq_copy (gimple_eh_else_n_body (eh_else_stmt));
kono
parents: 67
diff changeset
1858 gimple_eh_else_set_n_body (eh_else_copy, new_seq);
kono
parents: 67
diff changeset
1859 new_seq = gimple_seq_copy (gimple_eh_else_e_body (eh_else_stmt));
kono
parents: 67
diff changeset
1860 gimple_eh_else_set_e_body (eh_else_copy, new_seq);
kono
parents: 67
diff changeset
1861 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1862 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1863
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1864 case GIMPLE_TRY:
111
kono
parents: 67
diff changeset
1865 {
kono
parents: 67
diff changeset
1866 gtry *try_stmt = as_a <gtry *> (stmt);
kono
parents: 67
diff changeset
1867 gtry *try_copy = as_a <gtry *> (copy);
kono
parents: 67
diff changeset
1868 new_seq = gimple_seq_copy (gimple_try_eval (try_stmt));
kono
parents: 67
diff changeset
1869 gimple_try_set_eval (try_copy, new_seq);
kono
parents: 67
diff changeset
1870 new_seq = gimple_seq_copy (gimple_try_cleanup (try_stmt));
kono
parents: 67
diff changeset
1871 gimple_try_set_cleanup (try_copy, new_seq);
kono
parents: 67
diff changeset
1872 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1873 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1874
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1875 case GIMPLE_OMP_FOR:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1876 new_seq = gimple_seq_copy (gimple_omp_for_pre_body (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1877 gimple_omp_for_set_pre_body (copy, new_seq);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1878 t = unshare_expr (gimple_omp_for_clauses (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1879 gimple_omp_for_set_clauses (copy, t);
111
kono
parents: 67
diff changeset
1880 {
kono
parents: 67
diff changeset
1881 gomp_for *omp_for_copy = as_a <gomp_for *> (copy);
kono
parents: 67
diff changeset
1882 omp_for_copy->iter = ggc_vec_alloc<gimple_omp_for_iter>
kono
parents: 67
diff changeset
1883 ( gimple_omp_for_collapse (stmt));
kono
parents: 67
diff changeset
1884 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1885 for (i = 0; i < gimple_omp_for_collapse (stmt); i++)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1886 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1887 gimple_omp_for_set_cond (copy, i,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1888 gimple_omp_for_cond (stmt, i));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1889 gimple_omp_for_set_index (copy, i,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1890 gimple_omp_for_index (stmt, i));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1891 t = unshare_expr (gimple_omp_for_initial (stmt, i));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1892 gimple_omp_for_set_initial (copy, i, t);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1893 t = unshare_expr (gimple_omp_for_final (stmt, i));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1894 gimple_omp_for_set_final (copy, i, t);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1895 t = unshare_expr (gimple_omp_for_incr (stmt, i));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1896 gimple_omp_for_set_incr (copy, i, t);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1897 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1898 goto copy_omp_body;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1899
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1900 case GIMPLE_OMP_PARALLEL:
111
kono
parents: 67
diff changeset
1901 {
kono
parents: 67
diff changeset
1902 gomp_parallel *omp_par_stmt = as_a <gomp_parallel *> (stmt);
kono
parents: 67
diff changeset
1903 gomp_parallel *omp_par_copy = as_a <gomp_parallel *> (copy);
kono
parents: 67
diff changeset
1904 t = unshare_expr (gimple_omp_parallel_clauses (omp_par_stmt));
kono
parents: 67
diff changeset
1905 gimple_omp_parallel_set_clauses (omp_par_copy, t);
kono
parents: 67
diff changeset
1906 t = unshare_expr (gimple_omp_parallel_child_fn (omp_par_stmt));
kono
parents: 67
diff changeset
1907 gimple_omp_parallel_set_child_fn (omp_par_copy, t);
kono
parents: 67
diff changeset
1908 t = unshare_expr (gimple_omp_parallel_data_arg (omp_par_stmt));
kono
parents: 67
diff changeset
1909 gimple_omp_parallel_set_data_arg (omp_par_copy, t);
kono
parents: 67
diff changeset
1910 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1911 goto copy_omp_body;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1912
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1913 case GIMPLE_OMP_TASK:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1914 t = unshare_expr (gimple_omp_task_clauses (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1915 gimple_omp_task_set_clauses (copy, t);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1916 t = unshare_expr (gimple_omp_task_child_fn (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1917 gimple_omp_task_set_child_fn (copy, t);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1918 t = unshare_expr (gimple_omp_task_data_arg (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1919 gimple_omp_task_set_data_arg (copy, t);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1920 t = unshare_expr (gimple_omp_task_copy_fn (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1921 gimple_omp_task_set_copy_fn (copy, t);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1922 t = unshare_expr (gimple_omp_task_arg_size (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1923 gimple_omp_task_set_arg_size (copy, t);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1924 t = unshare_expr (gimple_omp_task_arg_align (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1925 gimple_omp_task_set_arg_align (copy, t);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1926 goto copy_omp_body;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1927
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1928 case GIMPLE_OMP_CRITICAL:
111
kono
parents: 67
diff changeset
1929 t = unshare_expr (gimple_omp_critical_name
kono
parents: 67
diff changeset
1930 (as_a <gomp_critical *> (stmt)));
kono
parents: 67
diff changeset
1931 gimple_omp_critical_set_name (as_a <gomp_critical *> (copy), t);
kono
parents: 67
diff changeset
1932 t = unshare_expr (gimple_omp_critical_clauses
kono
parents: 67
diff changeset
1933 (as_a <gomp_critical *> (stmt)));
kono
parents: 67
diff changeset
1934 gimple_omp_critical_set_clauses (as_a <gomp_critical *> (copy), t);
kono
parents: 67
diff changeset
1935 goto copy_omp_body;
kono
parents: 67
diff changeset
1936
kono
parents: 67
diff changeset
1937 case GIMPLE_OMP_ORDERED:
kono
parents: 67
diff changeset
1938 t = unshare_expr (gimple_omp_ordered_clauses
kono
parents: 67
diff changeset
1939 (as_a <gomp_ordered *> (stmt)));
kono
parents: 67
diff changeset
1940 gimple_omp_ordered_set_clauses (as_a <gomp_ordered *> (copy), t);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1941 goto copy_omp_body;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1942
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1943 case GIMPLE_OMP_SECTIONS:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1944 t = unshare_expr (gimple_omp_sections_clauses (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1945 gimple_omp_sections_set_clauses (copy, t);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1946 t = unshare_expr (gimple_omp_sections_control (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1947 gimple_omp_sections_set_control (copy, t);
111
kono
parents: 67
diff changeset
1948 goto copy_omp_body;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1949
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1950 case GIMPLE_OMP_SINGLE:
111
kono
parents: 67
diff changeset
1951 {
kono
parents: 67
diff changeset
1952 gomp_single *omp_single_copy = as_a <gomp_single *> (copy);
kono
parents: 67
diff changeset
1953 t = unshare_expr (gimple_omp_single_clauses (stmt));
kono
parents: 67
diff changeset
1954 gimple_omp_single_set_clauses (omp_single_copy, t);
kono
parents: 67
diff changeset
1955 }
kono
parents: 67
diff changeset
1956 goto copy_omp_body;
kono
parents: 67
diff changeset
1957
kono
parents: 67
diff changeset
1958 case GIMPLE_OMP_TARGET:
kono
parents: 67
diff changeset
1959 {
kono
parents: 67
diff changeset
1960 gomp_target *omp_target_stmt = as_a <gomp_target *> (stmt);
kono
parents: 67
diff changeset
1961 gomp_target *omp_target_copy = as_a <gomp_target *> (copy);
kono
parents: 67
diff changeset
1962 t = unshare_expr (gimple_omp_target_clauses (omp_target_stmt));
kono
parents: 67
diff changeset
1963 gimple_omp_target_set_clauses (omp_target_copy, t);
kono
parents: 67
diff changeset
1964 t = unshare_expr (gimple_omp_target_data_arg (omp_target_stmt));
kono
parents: 67
diff changeset
1965 gimple_omp_target_set_data_arg (omp_target_copy, t);
kono
parents: 67
diff changeset
1966 }
kono
parents: 67
diff changeset
1967 goto copy_omp_body;
kono
parents: 67
diff changeset
1968
kono
parents: 67
diff changeset
1969 case GIMPLE_OMP_TEAMS:
kono
parents: 67
diff changeset
1970 {
kono
parents: 67
diff changeset
1971 gomp_teams *omp_teams_copy = as_a <gomp_teams *> (copy);
kono
parents: 67
diff changeset
1972 t = unshare_expr (gimple_omp_teams_clauses (stmt));
kono
parents: 67
diff changeset
1973 gimple_omp_teams_set_clauses (omp_teams_copy, t);
kono
parents: 67
diff changeset
1974 }
kono
parents: 67
diff changeset
1975 /* FALLTHRU */
kono
parents: 67
diff changeset
1976
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1977 case GIMPLE_OMP_SECTION:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1978 case GIMPLE_OMP_MASTER:
111
kono
parents: 67
diff changeset
1979 case GIMPLE_OMP_TASKGROUP:
kono
parents: 67
diff changeset
1980 case GIMPLE_OMP_GRID_BODY:
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1981 copy_omp_body:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1982 new_seq = gimple_seq_copy (gimple_omp_body (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1983 gimple_omp_set_body (copy, new_seq);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1984 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1985
111
kono
parents: 67
diff changeset
1986 case GIMPLE_TRANSACTION:
kono
parents: 67
diff changeset
1987 new_seq = gimple_seq_copy (gimple_transaction_body (
kono
parents: 67
diff changeset
1988 as_a <gtransaction *> (stmt)));
kono
parents: 67
diff changeset
1989 gimple_transaction_set_body (as_a <gtransaction *> (copy),
kono
parents: 67
diff changeset
1990 new_seq);
kono
parents: 67
diff changeset
1991 break;
kono
parents: 67
diff changeset
1992
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1993 case GIMPLE_WITH_CLEANUP_EXPR:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1994 new_seq = gimple_seq_copy (gimple_wce_cleanup (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1995 gimple_wce_set_cleanup (copy, new_seq);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1996 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1997
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1998 default:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1999 gcc_unreachable ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2000 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2001 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2002
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2003 /* Make copy of operands. */
111
kono
parents: 67
diff changeset
2004 for (i = 0; i < num_ops; i++)
kono
parents: 67
diff changeset
2005 gimple_set_op (copy, i, unshare_expr (gimple_op (stmt, i)));
kono
parents: 67
diff changeset
2006
kono
parents: 67
diff changeset
2007 if (gimple_has_mem_ops (stmt))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2008 {
111
kono
parents: 67
diff changeset
2009 gimple_set_vdef (copy, gimple_vdef (stmt));
kono
parents: 67
diff changeset
2010 gimple_set_vuse (copy, gimple_vuse (stmt));
kono
parents: 67
diff changeset
2011 }
kono
parents: 67
diff changeset
2012
kono
parents: 67
diff changeset
2013 /* Clear out SSA operand vectors on COPY. */
kono
parents: 67
diff changeset
2014 if (gimple_has_ops (stmt))
kono
parents: 67
diff changeset
2015 {
kono
parents: 67
diff changeset
2016 gimple_set_use_ops (copy, NULL);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2017
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2018 /* SSA operands need to be updated. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2019 gimple_set_modified (copy, true);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2020 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2021
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2022 if (gimple_debug_nonbind_marker_p (stmt))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2023 cfun->debug_marker_count++;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2024
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2025 return copy;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2026 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2027
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2028
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2029 /* Return true if statement S has side-effects. We consider a
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2030 statement to have side effects if:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2031
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2032 - It is a GIMPLE_CALL not marked with ECF_PURE or ECF_CONST.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2033 - Any of its operands are marked TREE_THIS_VOLATILE or TREE_SIDE_EFFECTS. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2034
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2035 bool
111
kono
parents: 67
diff changeset
2036 gimple_has_side_effects (const gimple *s)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2037 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2038 if (is_gimple_debug (s))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2039 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2040
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2041 /* We don't have to scan the arguments to check for
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2042 volatile arguments, though, at present, we still
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2043 do a scan to check for TREE_SIDE_EFFECTS. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2044 if (gimple_has_volatile_ops (s))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2045 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2046
111
kono
parents: 67
diff changeset
2047 if (gimple_code (s) == GIMPLE_ASM
kono
parents: 67
diff changeset
2048 && gimple_asm_volatile_p (as_a <const gasm *> (s)))
kono
parents: 67
diff changeset
2049 return true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2050
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2051 if (is_gimple_call (s))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2052 {
111
kono
parents: 67
diff changeset
2053 int flags = gimple_call_flags (s);
kono
parents: 67
diff changeset
2054
kono
parents: 67
diff changeset
2055 /* An infinite loop is considered a side effect. */
kono
parents: 67
diff changeset
2056 if (!(flags & (ECF_CONST | ECF_PURE))
kono
parents: 67
diff changeset
2057 || (flags & ECF_LOOPING_CONST_OR_PURE))
kono
parents: 67
diff changeset
2058 return true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2059
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2060 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2061 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2062
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2063 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2064 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2065
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2066 /* Helper for gimple_could_trap_p and gimple_assign_rhs_could_trap_p.
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2067 Return true if S can trap. When INCLUDE_MEM is true, check whether
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2068 the memory operations could trap. When INCLUDE_STORES is true and
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2069 S is a GIMPLE_ASSIGN, the LHS of the assignment is also checked. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2070
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2071 bool
111
kono
parents: 67
diff changeset
2072 gimple_could_trap_p_1 (gimple *s, bool include_mem, bool include_stores)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2073 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2074 tree t, div = NULL_TREE;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2075 enum tree_code op;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2076
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2077 if (include_mem)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2078 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2079 unsigned i, start = (is_gimple_assign (s) && !include_stores) ? 1 : 0;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2080
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2081 for (i = start; i < gimple_num_ops (s); i++)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2082 if (tree_could_trap_p (gimple_op (s, i)))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2083 return true;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2084 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2085
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2086 switch (gimple_code (s))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2087 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2088 case GIMPLE_ASM:
111
kono
parents: 67
diff changeset
2089 return gimple_asm_volatile_p (as_a <gasm *> (s));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2090
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2091 case GIMPLE_CALL:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2092 t = gimple_call_fndecl (s);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2093 /* Assume that calls to weak functions may trap. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2094 if (!t || !DECL_P (t) || DECL_WEAK (t))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2095 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2096 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2097
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2098 case GIMPLE_ASSIGN:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2099 t = gimple_expr_type (s);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2100 op = gimple_assign_rhs_code (s);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2101 if (get_gimple_rhs_class (op) == GIMPLE_BINARY_RHS)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2102 div = gimple_assign_rhs2 (s);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2103 return (operation_could_trap_p (op, FLOAT_TYPE_P (t),
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2104 (INTEGRAL_TYPE_P (t)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2105 && TYPE_OVERFLOW_TRAPS (t)),
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2106 div));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2107
111
kono
parents: 67
diff changeset
2108 case GIMPLE_COND:
kono
parents: 67
diff changeset
2109 t = TREE_TYPE (gimple_cond_lhs (s));
kono
parents: 67
diff changeset
2110 return operation_could_trap_p (gimple_cond_code (s),
kono
parents: 67
diff changeset
2111 FLOAT_TYPE_P (t), false, NULL_TREE);
kono
parents: 67
diff changeset
2112
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2113 default:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2114 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2115 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2116
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2117 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2118 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2119
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2120 /* Return true if statement S can trap. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2121
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2122 bool
111
kono
parents: 67
diff changeset
2123 gimple_could_trap_p (gimple *s)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2124 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2125 return gimple_could_trap_p_1 (s, true, true);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2126 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2127
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2128 /* Return true if RHS of a GIMPLE_ASSIGN S can trap. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2129
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2130 bool
111
kono
parents: 67
diff changeset
2131 gimple_assign_rhs_could_trap_p (gimple *s)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2132 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2133 gcc_assert (is_gimple_assign (s));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2134 return gimple_could_trap_p_1 (s, true, false);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2135 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2136
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2137
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2138 /* Print debugging information for gimple stmts generated. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2139
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2140 void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2141 dump_gimple_statistics (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2142 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2143 int i;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2144 uint64_t total_tuples = 0, total_bytes = 0;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2145
111
kono
parents: 67
diff changeset
2146 if (! GATHER_STATISTICS)
kono
parents: 67
diff changeset
2147 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2148 fprintf (stderr, "No GIMPLE statistics\n");
111
kono
parents: 67
diff changeset
2149 return;
kono
parents: 67
diff changeset
2150 }
kono
parents: 67
diff changeset
2151
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2152 fprintf (stderr, "\nGIMPLE statements\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2153 fprintf (stderr, "Kind Stmts Bytes\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2154 fprintf (stderr, "---------------------------------------\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2155 for (i = 0; i < (int) gimple_alloc_kind_all; ++i)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2156 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2157 fprintf (stderr, "%-20s %7" PRIu64 " %10" PRIu64 "\n",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2158 gimple_alloc_kind_names[i], gimple_alloc_counts[i],
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2159 gimple_alloc_sizes[i]);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2160 total_tuples += gimple_alloc_counts[i];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2161 total_bytes += gimple_alloc_sizes[i];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2162 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2163 fprintf (stderr, "---------------------------------------\n");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2164 fprintf (stderr, "%-20s %7" PRIu64 " %10" PRIu64 "\n", "Total",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2165 total_tuples, total_bytes);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2166 fprintf (stderr, "---------------------------------------\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2167 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2168
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2169
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2170 /* Return the number of operands needed on the RHS of a GIMPLE
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2171 assignment for an expression with tree code CODE. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2172
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2173 unsigned
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2174 get_gimple_rhs_num_ops (enum tree_code code)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2175 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2176 enum gimple_rhs_class rhs_class = get_gimple_rhs_class (code);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2177
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2178 if (rhs_class == GIMPLE_UNARY_RHS || rhs_class == GIMPLE_SINGLE_RHS)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2179 return 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2180 else if (rhs_class == GIMPLE_BINARY_RHS)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2181 return 2;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2182 else if (rhs_class == GIMPLE_TERNARY_RHS)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2183 return 3;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2184 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2185 gcc_unreachable ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2186 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2187
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2188 #define DEFTREECODE(SYM, STRING, TYPE, NARGS) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2189 (unsigned char) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2190 ((TYPE) == tcc_unary ? GIMPLE_UNARY_RHS \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2191 : ((TYPE) == tcc_binary \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2192 || (TYPE) == tcc_comparison) ? GIMPLE_BINARY_RHS \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2193 : ((TYPE) == tcc_constant \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2194 || (TYPE) == tcc_declaration \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2195 || (TYPE) == tcc_reference) ? GIMPLE_SINGLE_RHS \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2196 : ((SYM) == TRUTH_AND_EXPR \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2197 || (SYM) == TRUTH_OR_EXPR \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2198 || (SYM) == TRUTH_XOR_EXPR) ? GIMPLE_BINARY_RHS \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2199 : (SYM) == TRUTH_NOT_EXPR ? GIMPLE_UNARY_RHS \
111
kono
parents: 67
diff changeset
2200 : ((SYM) == COND_EXPR \
kono
parents: 67
diff changeset
2201 || (SYM) == WIDEN_MULT_PLUS_EXPR \
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2202 || (SYM) == WIDEN_MULT_MINUS_EXPR \
111
kono
parents: 67
diff changeset
2203 || (SYM) == DOT_PROD_EXPR \
kono
parents: 67
diff changeset
2204 || (SYM) == SAD_EXPR \
kono
parents: 67
diff changeset
2205 || (SYM) == REALIGN_LOAD_EXPR \
kono
parents: 67
diff changeset
2206 || (SYM) == VEC_COND_EXPR \
kono
parents: 67
diff changeset
2207 || (SYM) == VEC_PERM_EXPR \
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2208 || (SYM) == BIT_INSERT_EXPR) ? GIMPLE_TERNARY_RHS \
111
kono
parents: 67
diff changeset
2209 : ((SYM) == CONSTRUCTOR \
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2210 || (SYM) == OBJ_TYPE_REF \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2211 || (SYM) == ASSERT_EXPR \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2212 || (SYM) == ADDR_EXPR \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2213 || (SYM) == WITH_SIZE_EXPR \
111
kono
parents: 67
diff changeset
2214 || (SYM) == SSA_NAME) ? GIMPLE_SINGLE_RHS \
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2215 : GIMPLE_INVALID_RHS),
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2216 #define END_OF_BASE_TREE_CODES (unsigned char) GIMPLE_INVALID_RHS,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2217
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2218 const unsigned char gimple_rhs_class_table[] = {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2219 #include "all-tree.def"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2220 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2221
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2222 #undef DEFTREECODE
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2223 #undef END_OF_BASE_TREE_CODES
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2224
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2225 /* Canonicalize a tree T for use in a COND_EXPR as conditional. Returns
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2226 a canonicalized tree that is valid for a COND_EXPR or NULL_TREE, if
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2227 we failed to create one. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2228
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2229 tree
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2230 canonicalize_cond_expr_cond (tree t)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2231 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2232 /* Strip conversions around boolean operations. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2233 if (CONVERT_EXPR_P (t)
111
kono
parents: 67
diff changeset
2234 && (truth_value_p (TREE_CODE (TREE_OPERAND (t, 0)))
kono
parents: 67
diff changeset
2235 || TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0)))
kono
parents: 67
diff changeset
2236 == BOOLEAN_TYPE))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2237 t = TREE_OPERAND (t, 0);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2238
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2239 /* For !x use x == 0. */
111
kono
parents: 67
diff changeset
2240 if (TREE_CODE (t) == TRUTH_NOT_EXPR)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2241 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2242 tree top0 = TREE_OPERAND (t, 0);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2243 t = build2 (EQ_EXPR, TREE_TYPE (t),
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2244 top0, build_int_cst (TREE_TYPE (top0), 0));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2245 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2246 /* For cmp ? 1 : 0 use cmp. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2247 else if (TREE_CODE (t) == COND_EXPR
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2248 && COMPARISON_CLASS_P (TREE_OPERAND (t, 0))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2249 && integer_onep (TREE_OPERAND (t, 1))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2250 && integer_zerop (TREE_OPERAND (t, 2)))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2251 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2252 tree top0 = TREE_OPERAND (t, 0);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2253 t = build2 (TREE_CODE (top0), TREE_TYPE (t),
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2254 TREE_OPERAND (top0, 0), TREE_OPERAND (top0, 1));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2255 }
111
kono
parents: 67
diff changeset
2256 /* For x ^ y use x != y. */
kono
parents: 67
diff changeset
2257 else if (TREE_CODE (t) == BIT_XOR_EXPR)
kono
parents: 67
diff changeset
2258 t = build2 (NE_EXPR, TREE_TYPE (t),
kono
parents: 67
diff changeset
2259 TREE_OPERAND (t, 0), TREE_OPERAND (t, 1));
kono
parents: 67
diff changeset
2260
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2261 if (is_gimple_condexpr (t))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2262 return t;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2263
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2264 return NULL_TREE;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2265 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2266
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2267 /* Build a GIMPLE_CALL identical to STMT but skipping the arguments in
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2268 the positions marked by the set ARGS_TO_SKIP. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2269
111
kono
parents: 67
diff changeset
2270 gcall *
kono
parents: 67
diff changeset
2271 gimple_call_copy_skip_args (gcall *stmt, bitmap args_to_skip)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2272 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2273 int i;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2274 int nargs = gimple_call_num_args (stmt);
111
kono
parents: 67
diff changeset
2275 auto_vec<tree> vargs (nargs);
kono
parents: 67
diff changeset
2276 gcall *new_stmt;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2277
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2278 for (i = 0; i < nargs; i++)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2279 if (!bitmap_bit_p (args_to_skip, i))
111
kono
parents: 67
diff changeset
2280 vargs.quick_push (gimple_call_arg (stmt, i));
kono
parents: 67
diff changeset
2281
kono
parents: 67
diff changeset
2282 if (gimple_call_internal_p (stmt))
kono
parents: 67
diff changeset
2283 new_stmt = gimple_build_call_internal_vec (gimple_call_internal_fn (stmt),
kono
parents: 67
diff changeset
2284 vargs);
kono
parents: 67
diff changeset
2285 else
kono
parents: 67
diff changeset
2286 new_stmt = gimple_build_call_vec (gimple_call_fn (stmt), vargs);
kono
parents: 67
diff changeset
2287
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2288 if (gimple_call_lhs (stmt))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2289 gimple_call_set_lhs (new_stmt, gimple_call_lhs (stmt));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2290
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2291 gimple_set_vuse (new_stmt, gimple_vuse (stmt));
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2292 gimple_set_vdef (new_stmt, gimple_vdef (stmt));
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2293
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2294 if (gimple_has_location (stmt))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2295 gimple_set_location (new_stmt, gimple_location (stmt));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2296 gimple_call_copy_flags (new_stmt, stmt);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2297 gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2298
73
ce75bd9117e4 merge calls.c, cfgexpand.c, gcc.c, gimple.c, gimple.h and gimplify.c
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
2299 #ifndef noCbC
ce75bd9117e4 merge calls.c, cfgexpand.c, gcc.c, gimple.c, gimple.h and gimplify.c
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
2300 gimple_call_set_cbc_goto (new_stmt, gimple_call_cbc_goto_p (stmt));
ce75bd9117e4 merge calls.c, cfgexpand.c, gcc.c, gimple.c, gimple.h and gimplify.c
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
2301 #endif
ce75bd9117e4 merge calls.c, cfgexpand.c, gcc.c, gimple.c, gimple.h and gimplify.c
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
2302
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2303 gimple_set_modified (new_stmt, true);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2304
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2305 return new_stmt;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2306 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2307
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2308
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2309
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2310 /* Return true if the field decls F1 and F2 are at the same offset.
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2311
111
kono
parents: 67
diff changeset
2312 This is intended to be used on GIMPLE types only. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2313
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2314 bool
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2315 gimple_compare_field_offset (tree f1, tree f2)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2316 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2317 if (DECL_OFFSET_ALIGN (f1) == DECL_OFFSET_ALIGN (f2))
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2318 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2319 tree offset1 = DECL_FIELD_OFFSET (f1);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2320 tree offset2 = DECL_FIELD_OFFSET (f2);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2321 return ((offset1 == offset2
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2322 /* Once gimplification is done, self-referential offsets are
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2323 instantiated as operand #2 of the COMPONENT_REF built for
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2324 each access and reset. Therefore, they are not relevant
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2325 anymore and fields are interchangeable provided that they
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2326 represent the same access. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2327 || (TREE_CODE (offset1) == PLACEHOLDER_EXPR
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2328 && TREE_CODE (offset2) == PLACEHOLDER_EXPR
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2329 && (DECL_SIZE (f1) == DECL_SIZE (f2)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2330 || (TREE_CODE (DECL_SIZE (f1)) == PLACEHOLDER_EXPR
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2331 && TREE_CODE (DECL_SIZE (f2)) == PLACEHOLDER_EXPR)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2332 || operand_equal_p (DECL_SIZE (f1), DECL_SIZE (f2), 0))
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2333 && DECL_ALIGN (f1) == DECL_ALIGN (f2))
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2334 || operand_equal_p (offset1, offset2, 0))
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2335 && tree_int_cst_equal (DECL_FIELD_BIT_OFFSET (f1),
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2336 DECL_FIELD_BIT_OFFSET (f2)));
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2337 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2338
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2339 /* Fortran and C do not always agree on what DECL_OFFSET_ALIGN
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2340 should be, so handle differing ones specially by decomposing
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2341 the offset into a byte and bit offset manually. */
111
kono
parents: 67
diff changeset
2342 if (tree_fits_shwi_p (DECL_FIELD_OFFSET (f1))
kono
parents: 67
diff changeset
2343 && tree_fits_shwi_p (DECL_FIELD_OFFSET (f2)))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2344 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2345 unsigned HOST_WIDE_INT byte_offset1, byte_offset2;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2346 unsigned HOST_WIDE_INT bit_offset1, bit_offset2;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2347 bit_offset1 = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (f1));
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2348 byte_offset1 = (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f1))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2349 + bit_offset1 / BITS_PER_UNIT);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2350 bit_offset2 = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (f2));
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2351 byte_offset2 = (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f2))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2352 + bit_offset2 / BITS_PER_UNIT);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2353 if (byte_offset1 != byte_offset2)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2354 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2355 return bit_offset1 % BITS_PER_UNIT == bit_offset2 % BITS_PER_UNIT;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2356 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2357
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2358 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2359 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2360
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2361
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2362 /* Return a type the same as TYPE except unsigned or
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2363 signed according to UNSIGNEDP. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2364
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2365 static tree
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2366 gimple_signed_or_unsigned_type (bool unsignedp, tree type)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2367 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2368 tree type1;
111
kono
parents: 67
diff changeset
2369 int i;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2370
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2371 type1 = TYPE_MAIN_VARIANT (type);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2372 if (type1 == signed_char_type_node
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2373 || type1 == char_type_node
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2374 || type1 == unsigned_char_type_node)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2375 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2376 if (type1 == integer_type_node || type1 == unsigned_type_node)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2377 return unsignedp ? unsigned_type_node : integer_type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2378 if (type1 == short_integer_type_node || type1 == short_unsigned_type_node)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2379 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2380 if (type1 == long_integer_type_node || type1 == long_unsigned_type_node)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2381 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2382 if (type1 == long_long_integer_type_node
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2383 || type1 == long_long_unsigned_type_node)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2384 return unsignedp
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2385 ? long_long_unsigned_type_node
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2386 : long_long_integer_type_node;
111
kono
parents: 67
diff changeset
2387
kono
parents: 67
diff changeset
2388 for (i = 0; i < NUM_INT_N_ENTS; i ++)
kono
parents: 67
diff changeset
2389 if (int_n_enabled_p[i]
kono
parents: 67
diff changeset
2390 && (type1 == int_n_trees[i].unsigned_type
kono
parents: 67
diff changeset
2391 || type1 == int_n_trees[i].signed_type))
kono
parents: 67
diff changeset
2392 return unsignedp
kono
parents: 67
diff changeset
2393 ? int_n_trees[i].unsigned_type
kono
parents: 67
diff changeset
2394 : int_n_trees[i].signed_type;
kono
parents: 67
diff changeset
2395
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2396 #if HOST_BITS_PER_WIDE_INT >= 64
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2397 if (type1 == intTI_type_node || type1 == unsigned_intTI_type_node)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2398 return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2399 #endif
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2400 if (type1 == intDI_type_node || type1 == unsigned_intDI_type_node)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2401 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2402 if (type1 == intSI_type_node || type1 == unsigned_intSI_type_node)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2403 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2404 if (type1 == intHI_type_node || type1 == unsigned_intHI_type_node)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2405 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2406 if (type1 == intQI_type_node || type1 == unsigned_intQI_type_node)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2407 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2408
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2409 #define GIMPLE_FIXED_TYPES(NAME) \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2410 if (type1 == short_ ## NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2411 || type1 == unsigned_short_ ## NAME ## _type_node) \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2412 return unsignedp ? unsigned_short_ ## NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2413 : short_ ## NAME ## _type_node; \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2414 if (type1 == NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2415 || type1 == unsigned_ ## NAME ## _type_node) \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2416 return unsignedp ? unsigned_ ## NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2417 : NAME ## _type_node; \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2418 if (type1 == long_ ## NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2419 || type1 == unsigned_long_ ## NAME ## _type_node) \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2420 return unsignedp ? unsigned_long_ ## NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2421 : long_ ## NAME ## _type_node; \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2422 if (type1 == long_long_ ## NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2423 || type1 == unsigned_long_long_ ## NAME ## _type_node) \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2424 return unsignedp ? unsigned_long_long_ ## NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2425 : long_long_ ## NAME ## _type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2426
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2427 #define GIMPLE_FIXED_MODE_TYPES(NAME) \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2428 if (type1 == NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2429 || type1 == u ## NAME ## _type_node) \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2430 return unsignedp ? u ## NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2431 : NAME ## _type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2432
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2433 #define GIMPLE_FIXED_TYPES_SAT(NAME) \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2434 if (type1 == sat_ ## short_ ## NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2435 || type1 == sat_ ## unsigned_short_ ## NAME ## _type_node) \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2436 return unsignedp ? sat_ ## unsigned_short_ ## NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2437 : sat_ ## short_ ## NAME ## _type_node; \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2438 if (type1 == sat_ ## NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2439 || type1 == sat_ ## unsigned_ ## NAME ## _type_node) \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2440 return unsignedp ? sat_ ## unsigned_ ## NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2441 : sat_ ## NAME ## _type_node; \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2442 if (type1 == sat_ ## long_ ## NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2443 || type1 == sat_ ## unsigned_long_ ## NAME ## _type_node) \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2444 return unsignedp ? sat_ ## unsigned_long_ ## NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2445 : sat_ ## long_ ## NAME ## _type_node; \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2446 if (type1 == sat_ ## long_long_ ## NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2447 || type1 == sat_ ## unsigned_long_long_ ## NAME ## _type_node) \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2448 return unsignedp ? sat_ ## unsigned_long_long_ ## NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2449 : sat_ ## long_long_ ## NAME ## _type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2450
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2451 #define GIMPLE_FIXED_MODE_TYPES_SAT(NAME) \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2452 if (type1 == sat_ ## NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2453 || type1 == sat_ ## u ## NAME ## _type_node) \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2454 return unsignedp ? sat_ ## u ## NAME ## _type_node \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2455 : sat_ ## NAME ## _type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2456
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2457 GIMPLE_FIXED_TYPES (fract);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2458 GIMPLE_FIXED_TYPES_SAT (fract);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2459 GIMPLE_FIXED_TYPES (accum);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2460 GIMPLE_FIXED_TYPES_SAT (accum);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2461
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2462 GIMPLE_FIXED_MODE_TYPES (qq);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2463 GIMPLE_FIXED_MODE_TYPES (hq);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2464 GIMPLE_FIXED_MODE_TYPES (sq);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2465 GIMPLE_FIXED_MODE_TYPES (dq);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2466 GIMPLE_FIXED_MODE_TYPES (tq);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2467 GIMPLE_FIXED_MODE_TYPES_SAT (qq);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2468 GIMPLE_FIXED_MODE_TYPES_SAT (hq);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2469 GIMPLE_FIXED_MODE_TYPES_SAT (sq);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2470 GIMPLE_FIXED_MODE_TYPES_SAT (dq);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2471 GIMPLE_FIXED_MODE_TYPES_SAT (tq);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2472 GIMPLE_FIXED_MODE_TYPES (ha);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2473 GIMPLE_FIXED_MODE_TYPES (sa);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2474 GIMPLE_FIXED_MODE_TYPES (da);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2475 GIMPLE_FIXED_MODE_TYPES (ta);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2476 GIMPLE_FIXED_MODE_TYPES_SAT (ha);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2477 GIMPLE_FIXED_MODE_TYPES_SAT (sa);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2478 GIMPLE_FIXED_MODE_TYPES_SAT (da);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2479 GIMPLE_FIXED_MODE_TYPES_SAT (ta);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2480
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2481 /* For ENUMERAL_TYPEs in C++, must check the mode of the types, not
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2482 the precision; they have precision set to match their range, but
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2483 may use a wider mode to match an ABI. If we change modes, we may
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2484 wind up with bad conversions. For INTEGER_TYPEs in C, must check
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2485 the precision as well, so as to yield correct results for
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2486 bit-field types. C++ does not have these separate bit-field
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2487 types, and producing a signed or unsigned variant of an
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2488 ENUMERAL_TYPE may cause other problems as well. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2489 if (!INTEGRAL_TYPE_P (type)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2490 || TYPE_UNSIGNED (type) == unsignedp)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2491 return type;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2492
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2493 #define TYPE_OK(node) \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2494 (TYPE_MODE (type) == TYPE_MODE (node) \
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2495 && TYPE_PRECISION (type) == TYPE_PRECISION (node))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2496 if (TYPE_OK (signed_char_type_node))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2497 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2498 if (TYPE_OK (integer_type_node))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2499 return unsignedp ? unsigned_type_node : integer_type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2500 if (TYPE_OK (short_integer_type_node))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2501 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2502 if (TYPE_OK (long_integer_type_node))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2503 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2504 if (TYPE_OK (long_long_integer_type_node))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2505 return (unsignedp
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2506 ? long_long_unsigned_type_node
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2507 : long_long_integer_type_node);
111
kono
parents: 67
diff changeset
2508
kono
parents: 67
diff changeset
2509 for (i = 0; i < NUM_INT_N_ENTS; i ++)
kono
parents: 67
diff changeset
2510 if (int_n_enabled_p[i]
kono
parents: 67
diff changeset
2511 && TYPE_MODE (type) == int_n_data[i].m
kono
parents: 67
diff changeset
2512 && TYPE_PRECISION (type) == int_n_data[i].bitsize)
kono
parents: 67
diff changeset
2513 return unsignedp
kono
parents: 67
diff changeset
2514 ? int_n_trees[i].unsigned_type
kono
parents: 67
diff changeset
2515 : int_n_trees[i].signed_type;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2516
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2517 #if HOST_BITS_PER_WIDE_INT >= 64
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2518 if (TYPE_OK (intTI_type_node))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2519 return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2520 #endif
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2521 if (TYPE_OK (intDI_type_node))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2522 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2523 if (TYPE_OK (intSI_type_node))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2524 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2525 if (TYPE_OK (intHI_type_node))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2526 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2527 if (TYPE_OK (intQI_type_node))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2528 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2529
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2530 #undef GIMPLE_FIXED_TYPES
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2531 #undef GIMPLE_FIXED_MODE_TYPES
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2532 #undef GIMPLE_FIXED_TYPES_SAT
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2533 #undef GIMPLE_FIXED_MODE_TYPES_SAT
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2534 #undef TYPE_OK
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2535
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2536 return build_nonstandard_integer_type (TYPE_PRECISION (type), unsignedp);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2537 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2538
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2539
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2540 /* Return an unsigned type the same as TYPE in other respects. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2541
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2542 tree
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2543 gimple_unsigned_type (tree type)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2544 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2545 return gimple_signed_or_unsigned_type (true, type);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2546 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2547
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2548
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2549 /* Return a signed type the same as TYPE in other respects. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2550
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2551 tree
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2552 gimple_signed_type (tree type)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2553 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2554 return gimple_signed_or_unsigned_type (false, type);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2555 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2556
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2557
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2558 /* Return the typed-based alias set for T, which may be an expression
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2559 or a type. Return -1 if we don't do anything special. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2560
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2561 alias_set_type
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2562 gimple_get_alias_set (tree t)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2563 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2564 /* That's all the expressions we handle specially. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2565 if (!TYPE_P (t))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2566 return -1;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2567
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2568 /* For convenience, follow the C standard when dealing with
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2569 character types. Any object may be accessed via an lvalue that
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2570 has character type. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2571 if (t == char_type_node
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2572 || t == signed_char_type_node
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2573 || t == unsigned_char_type_node)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2574 return 0;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2575
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2576 /* Allow aliasing between signed and unsigned variants of the same
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2577 type. We treat the signed variant as canonical. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2578 if (TREE_CODE (t) == INTEGER_TYPE && TYPE_UNSIGNED (t))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2579 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2580 tree t1 = gimple_signed_type (t);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2581
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2582 /* t1 == t can happen for boolean nodes which are always unsigned. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2583 if (t1 != t)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2584 return get_alias_set (t1);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2585 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2586
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2587 return -1;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2588 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2589
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2590
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2591 /* Helper for gimple_ior_addresses_taken_1. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2592
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2593 static bool
111
kono
parents: 67
diff changeset
2594 gimple_ior_addresses_taken_1 (gimple *, tree addr, tree, void *data)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2595 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2596 bitmap addresses_taken = (bitmap)data;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2597 addr = get_base_address (addr);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2598 if (addr
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2599 && DECL_P (addr))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2600 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2601 bitmap_set_bit (addresses_taken, DECL_UID (addr));
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2602 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2603 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2604 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2605 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2606
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2607 /* Set the bit for the uid of all decls that have their address taken
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2608 in STMT in the ADDRESSES_TAKEN bitmap. Returns true if there
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2609 were any in this stmt. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2610
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2611 bool
111
kono
parents: 67
diff changeset
2612 gimple_ior_addresses_taken (bitmap addresses_taken, gimple *stmt)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2613 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2614 return walk_stmt_load_store_addr_ops (stmt, addresses_taken, NULL, NULL,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2615 gimple_ior_addresses_taken_1);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2616 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2617
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2618
111
kono
parents: 67
diff changeset
2619 /* Return true when STMTs arguments and return value match those of FNDECL,
kono
parents: 67
diff changeset
2620 a decl of a builtin function. */
kono
parents: 67
diff changeset
2621
kono
parents: 67
diff changeset
2622 bool
kono
parents: 67
diff changeset
2623 gimple_builtin_call_types_compatible_p (const gimple *stmt, tree fndecl)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2624 {
111
kono
parents: 67
diff changeset
2625 gcc_checking_assert (DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN);
kono
parents: 67
diff changeset
2626
kono
parents: 67
diff changeset
2627 tree ret = gimple_call_lhs (stmt);
kono
parents: 67
diff changeset
2628 if (ret
kono
parents: 67
diff changeset
2629 && !useless_type_conversion_p (TREE_TYPE (ret),
kono
parents: 67
diff changeset
2630 TREE_TYPE (TREE_TYPE (fndecl))))
kono
parents: 67
diff changeset
2631 return false;
kono
parents: 67
diff changeset
2632
kono
parents: 67
diff changeset
2633 tree targs = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
kono
parents: 67
diff changeset
2634 unsigned nargs = gimple_call_num_args (stmt);
kono
parents: 67
diff changeset
2635 for (unsigned i = 0; i < nargs; ++i)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2636 {
111
kono
parents: 67
diff changeset
2637 /* Variadic args follow. */
kono
parents: 67
diff changeset
2638 if (!targs)
kono
parents: 67
diff changeset
2639 return true;
kono
parents: 67
diff changeset
2640 tree arg = gimple_call_arg (stmt, i);
kono
parents: 67
diff changeset
2641 tree type = TREE_VALUE (targs);
kono
parents: 67
diff changeset
2642 if (!useless_type_conversion_p (type, TREE_TYPE (arg))
kono
parents: 67
diff changeset
2643 /* char/short integral arguments are promoted to int
kono
parents: 67
diff changeset
2644 by several frontends if targetm.calls.promote_prototypes
kono
parents: 67
diff changeset
2645 is true. Allow such promotion too. */
kono
parents: 67
diff changeset
2646 && !(INTEGRAL_TYPE_P (type)
kono
parents: 67
diff changeset
2647 && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
kono
parents: 67
diff changeset
2648 && targetm.calls.promote_prototypes (TREE_TYPE (fndecl))
kono
parents: 67
diff changeset
2649 && useless_type_conversion_p (integer_type_node,
kono
parents: 67
diff changeset
2650 TREE_TYPE (arg))))
kono
parents: 67
diff changeset
2651 return false;
kono
parents: 67
diff changeset
2652 targs = TREE_CHAIN (targs);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2653 }
111
kono
parents: 67
diff changeset
2654 if (targs && !VOID_TYPE_P (TREE_VALUE (targs)))
kono
parents: 67
diff changeset
2655 return false;
kono
parents: 67
diff changeset
2656 return true;
kono
parents: 67
diff changeset
2657 }
kono
parents: 67
diff changeset
2658
kono
parents: 67
diff changeset
2659 /* Return true when STMT is builtins call. */
kono
parents: 67
diff changeset
2660
kono
parents: 67
diff changeset
2661 bool
kono
parents: 67
diff changeset
2662 gimple_call_builtin_p (const gimple *stmt)
kono
parents: 67
diff changeset
2663 {
kono
parents: 67
diff changeset
2664 tree fndecl;
kono
parents: 67
diff changeset
2665 if (is_gimple_call (stmt)
kono
parents: 67
diff changeset
2666 && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
kono
parents: 67
diff changeset
2667 && DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN)
kono
parents: 67
diff changeset
2668 return gimple_builtin_call_types_compatible_p (stmt, fndecl);
kono
parents: 67
diff changeset
2669 return false;
kono
parents: 67
diff changeset
2670 }
kono
parents: 67
diff changeset
2671
kono
parents: 67
diff changeset
2672 /* Return true when STMT is builtins call to CLASS. */
kono
parents: 67
diff changeset
2673
kono
parents: 67
diff changeset
2674 bool
kono
parents: 67
diff changeset
2675 gimple_call_builtin_p (const gimple *stmt, enum built_in_class klass)
kono
parents: 67
diff changeset
2676 {
kono
parents: 67
diff changeset
2677 tree fndecl;
kono
parents: 67
diff changeset
2678 if (is_gimple_call (stmt)
kono
parents: 67
diff changeset
2679 && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
kono
parents: 67
diff changeset
2680 && DECL_BUILT_IN_CLASS (fndecl) == klass)
kono
parents: 67
diff changeset
2681 return gimple_builtin_call_types_compatible_p (stmt, fndecl);
kono
parents: 67
diff changeset
2682 return false;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2683 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2684
111
kono
parents: 67
diff changeset
2685 /* Return true when STMT is builtins call to CODE of CLASS. */
kono
parents: 67
diff changeset
2686
kono
parents: 67
diff changeset
2687 bool
kono
parents: 67
diff changeset
2688 gimple_call_builtin_p (const gimple *stmt, enum built_in_function code)
kono
parents: 67
diff changeset
2689 {
kono
parents: 67
diff changeset
2690 tree fndecl;
kono
parents: 67
diff changeset
2691 if (is_gimple_call (stmt)
kono
parents: 67
diff changeset
2692 && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2693 && fndecl_built_in_p (fndecl, code))
111
kono
parents: 67
diff changeset
2694 return gimple_builtin_call_types_compatible_p (stmt, fndecl);
kono
parents: 67
diff changeset
2695 return false;
kono
parents: 67
diff changeset
2696 }
kono
parents: 67
diff changeset
2697
kono
parents: 67
diff changeset
2698 /* If CALL is a call to a combined_fn (i.e. an internal function or
kono
parents: 67
diff changeset
2699 a normal built-in function), return its code, otherwise return
kono
parents: 67
diff changeset
2700 CFN_LAST. */
kono
parents: 67
diff changeset
2701
kono
parents: 67
diff changeset
2702 combined_fn
kono
parents: 67
diff changeset
2703 gimple_call_combined_fn (const gimple *stmt)
kono
parents: 67
diff changeset
2704 {
kono
parents: 67
diff changeset
2705 if (const gcall *call = dyn_cast <const gcall *> (stmt))
kono
parents: 67
diff changeset
2706 {
kono
parents: 67
diff changeset
2707 if (gimple_call_internal_p (call))
kono
parents: 67
diff changeset
2708 return as_combined_fn (gimple_call_internal_fn (call));
kono
parents: 67
diff changeset
2709
kono
parents: 67
diff changeset
2710 tree fndecl = gimple_call_fndecl (stmt);
kono
parents: 67
diff changeset
2711 if (fndecl
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2712 && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
111
kono
parents: 67
diff changeset
2713 && gimple_builtin_call_types_compatible_p (stmt, fndecl))
kono
parents: 67
diff changeset
2714 return as_combined_fn (DECL_FUNCTION_CODE (fndecl));
kono
parents: 67
diff changeset
2715 }
kono
parents: 67
diff changeset
2716 return CFN_LAST;
kono
parents: 67
diff changeset
2717 }
kono
parents: 67
diff changeset
2718
kono
parents: 67
diff changeset
2719 /* Return true if STMT clobbers memory. STMT is required to be a
kono
parents: 67
diff changeset
2720 GIMPLE_ASM. */
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2721
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2722 bool
111
kono
parents: 67
diff changeset
2723 gimple_asm_clobbers_memory_p (const gasm *stmt)
kono
parents: 67
diff changeset
2724 {
kono
parents: 67
diff changeset
2725 unsigned i;
kono
parents: 67
diff changeset
2726
kono
parents: 67
diff changeset
2727 for (i = 0; i < gimple_asm_nclobbers (stmt); i++)
kono
parents: 67
diff changeset
2728 {
kono
parents: 67
diff changeset
2729 tree op = gimple_asm_clobber_op (stmt, i);
kono
parents: 67
diff changeset
2730 if (strcmp (TREE_STRING_POINTER (TREE_VALUE (op)), "memory") == 0)
kono
parents: 67
diff changeset
2731 return true;
kono
parents: 67
diff changeset
2732 }
kono
parents: 67
diff changeset
2733
kono
parents: 67
diff changeset
2734 /* Non-empty basic ASM implicitly clobbers memory. */
kono
parents: 67
diff changeset
2735 if (gimple_asm_input_p (stmt) && strlen (gimple_asm_string (stmt)) != 0)
kono
parents: 67
diff changeset
2736 return true;
kono
parents: 67
diff changeset
2737
kono
parents: 67
diff changeset
2738 return false;
kono
parents: 67
diff changeset
2739 }
kono
parents: 67
diff changeset
2740
kono
parents: 67
diff changeset
2741 /* Dump bitmap SET (assumed to contain VAR_DECLs) to FILE. */
kono
parents: 67
diff changeset
2742
kono
parents: 67
diff changeset
2743 void
kono
parents: 67
diff changeset
2744 dump_decl_set (FILE *file, bitmap set)
kono
parents: 67
diff changeset
2745 {
kono
parents: 67
diff changeset
2746 if (set)
kono
parents: 67
diff changeset
2747 {
kono
parents: 67
diff changeset
2748 bitmap_iterator bi;
kono
parents: 67
diff changeset
2749 unsigned i;
kono
parents: 67
diff changeset
2750
kono
parents: 67
diff changeset
2751 fprintf (file, "{ ");
kono
parents: 67
diff changeset
2752
kono
parents: 67
diff changeset
2753 EXECUTE_IF_SET_IN_BITMAP (set, 0, i, bi)
kono
parents: 67
diff changeset
2754 {
kono
parents: 67
diff changeset
2755 fprintf (file, "D.%u", i);
kono
parents: 67
diff changeset
2756 fprintf (file, " ");
kono
parents: 67
diff changeset
2757 }
kono
parents: 67
diff changeset
2758
kono
parents: 67
diff changeset
2759 fprintf (file, "}");
kono
parents: 67
diff changeset
2760 }
kono
parents: 67
diff changeset
2761 else
kono
parents: 67
diff changeset
2762 fprintf (file, "NIL");
kono
parents: 67
diff changeset
2763 }
kono
parents: 67
diff changeset
2764
kono
parents: 67
diff changeset
2765 /* Return true when CALL is a call stmt that definitely doesn't
kono
parents: 67
diff changeset
2766 free any memory or makes it unavailable otherwise. */
kono
parents: 67
diff changeset
2767 bool
kono
parents: 67
diff changeset
2768 nonfreeing_call_p (gimple *call)
kono
parents: 67
diff changeset
2769 {
kono
parents: 67
diff changeset
2770 if (gimple_call_builtin_p (call, BUILT_IN_NORMAL)
kono
parents: 67
diff changeset
2771 && gimple_call_flags (call) & ECF_LEAF)
kono
parents: 67
diff changeset
2772 switch (DECL_FUNCTION_CODE (gimple_call_fndecl (call)))
kono
parents: 67
diff changeset
2773 {
kono
parents: 67
diff changeset
2774 /* Just in case these become ECF_LEAF in the future. */
kono
parents: 67
diff changeset
2775 case BUILT_IN_FREE:
kono
parents: 67
diff changeset
2776 case BUILT_IN_TM_FREE:
kono
parents: 67
diff changeset
2777 case BUILT_IN_REALLOC:
kono
parents: 67
diff changeset
2778 case BUILT_IN_STACK_RESTORE:
kono
parents: 67
diff changeset
2779 return false;
kono
parents: 67
diff changeset
2780 default:
kono
parents: 67
diff changeset
2781 return true;
kono
parents: 67
diff changeset
2782 }
kono
parents: 67
diff changeset
2783 else if (gimple_call_internal_p (call))
kono
parents: 67
diff changeset
2784 switch (gimple_call_internal_fn (call))
kono
parents: 67
diff changeset
2785 {
kono
parents: 67
diff changeset
2786 case IFN_ABNORMAL_DISPATCHER:
kono
parents: 67
diff changeset
2787 return true;
kono
parents: 67
diff changeset
2788 case IFN_ASAN_MARK:
kono
parents: 67
diff changeset
2789 return tree_to_uhwi (gimple_call_arg (call, 0)) == ASAN_MARK_UNPOISON;
kono
parents: 67
diff changeset
2790 default:
kono
parents: 67
diff changeset
2791 if (gimple_call_flags (call) & ECF_LEAF)
kono
parents: 67
diff changeset
2792 return true;
kono
parents: 67
diff changeset
2793 return false;
kono
parents: 67
diff changeset
2794 }
kono
parents: 67
diff changeset
2795
kono
parents: 67
diff changeset
2796 tree fndecl = gimple_call_fndecl (call);
kono
parents: 67
diff changeset
2797 if (!fndecl)
kono
parents: 67
diff changeset
2798 return false;
kono
parents: 67
diff changeset
2799 struct cgraph_node *n = cgraph_node::get (fndecl);
kono
parents: 67
diff changeset
2800 if (!n)
kono
parents: 67
diff changeset
2801 return false;
kono
parents: 67
diff changeset
2802 enum availability availability;
kono
parents: 67
diff changeset
2803 n = n->function_symbol (&availability);
kono
parents: 67
diff changeset
2804 if (!n || availability <= AVAIL_INTERPOSABLE)
kono
parents: 67
diff changeset
2805 return false;
kono
parents: 67
diff changeset
2806 return n->nonfreeing_fn;
kono
parents: 67
diff changeset
2807 }
kono
parents: 67
diff changeset
2808
kono
parents: 67
diff changeset
2809 /* Return true when CALL is a call stmt that definitely need not
kono
parents: 67
diff changeset
2810 be considered to be a memory barrier. */
kono
parents: 67
diff changeset
2811 bool
kono
parents: 67
diff changeset
2812 nonbarrier_call_p (gimple *call)
kono
parents: 67
diff changeset
2813 {
kono
parents: 67
diff changeset
2814 if (gimple_call_flags (call) & (ECF_PURE | ECF_CONST))
kono
parents: 67
diff changeset
2815 return true;
kono
parents: 67
diff changeset
2816 /* Should extend this to have a nonbarrier_fn flag, just as above in
kono
parents: 67
diff changeset
2817 the nonfreeing case. */
kono
parents: 67
diff changeset
2818 return false;
kono
parents: 67
diff changeset
2819 }
kono
parents: 67
diff changeset
2820
kono
parents: 67
diff changeset
2821 /* Callback for walk_stmt_load_store_ops.
kono
parents: 67
diff changeset
2822
kono
parents: 67
diff changeset
2823 Return TRUE if OP will dereference the tree stored in DATA, FALSE
kono
parents: 67
diff changeset
2824 otherwise.
kono
parents: 67
diff changeset
2825
kono
parents: 67
diff changeset
2826 This routine only makes a superficial check for a dereference. Thus
kono
parents: 67
diff changeset
2827 it must only be used if it is safe to return a false negative. */
kono
parents: 67
diff changeset
2828 static bool
kono
parents: 67
diff changeset
2829 check_loadstore (gimple *, tree op, tree, void *data)
kono
parents: 67
diff changeset
2830 {
kono
parents: 67
diff changeset
2831 if (TREE_CODE (op) == MEM_REF || TREE_CODE (op) == TARGET_MEM_REF)
kono
parents: 67
diff changeset
2832 {
kono
parents: 67
diff changeset
2833 /* Some address spaces may legitimately dereference zero. */
kono
parents: 67
diff changeset
2834 addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (op));
kono
parents: 67
diff changeset
2835 if (targetm.addr_space.zero_address_valid (as))
kono
parents: 67
diff changeset
2836 return false;
kono
parents: 67
diff changeset
2837
kono
parents: 67
diff changeset
2838 return operand_equal_p (TREE_OPERAND (op, 0), (tree)data, 0);
kono
parents: 67
diff changeset
2839 }
kono
parents: 67
diff changeset
2840 return false;
kono
parents: 67
diff changeset
2841 }
kono
parents: 67
diff changeset
2842
kono
parents: 67
diff changeset
2843
kono
parents: 67
diff changeset
2844 /* Return true if OP can be inferred to be non-NULL after STMT executes,
kono
parents: 67
diff changeset
2845 either by using a pointer dereference or attributes. */
kono
parents: 67
diff changeset
2846 bool
kono
parents: 67
diff changeset
2847 infer_nonnull_range (gimple *stmt, tree op)
kono
parents: 67
diff changeset
2848 {
kono
parents: 67
diff changeset
2849 return infer_nonnull_range_by_dereference (stmt, op)
kono
parents: 67
diff changeset
2850 || infer_nonnull_range_by_attribute (stmt, op);
kono
parents: 67
diff changeset
2851 }
kono
parents: 67
diff changeset
2852
kono
parents: 67
diff changeset
2853 /* Return true if OP can be inferred to be non-NULL after STMT
kono
parents: 67
diff changeset
2854 executes by using a pointer dereference. */
kono
parents: 67
diff changeset
2855 bool
kono
parents: 67
diff changeset
2856 infer_nonnull_range_by_dereference (gimple *stmt, tree op)
kono
parents: 67
diff changeset
2857 {
kono
parents: 67
diff changeset
2858 /* We can only assume that a pointer dereference will yield
kono
parents: 67
diff changeset
2859 non-NULL if -fdelete-null-pointer-checks is enabled. */
kono
parents: 67
diff changeset
2860 if (!flag_delete_null_pointer_checks
kono
parents: 67
diff changeset
2861 || !POINTER_TYPE_P (TREE_TYPE (op))
kono
parents: 67
diff changeset
2862 || gimple_code (stmt) == GIMPLE_ASM)
kono
parents: 67
diff changeset
2863 return false;
kono
parents: 67
diff changeset
2864
kono
parents: 67
diff changeset
2865 if (walk_stmt_load_store_ops (stmt, (void *)op,
kono
parents: 67
diff changeset
2866 check_loadstore, check_loadstore))
kono
parents: 67
diff changeset
2867 return true;
kono
parents: 67
diff changeset
2868
kono
parents: 67
diff changeset
2869 return false;
kono
parents: 67
diff changeset
2870 }
kono
parents: 67
diff changeset
2871
kono
parents: 67
diff changeset
2872 /* Return true if OP can be inferred to be a non-NULL after STMT
kono
parents: 67
diff changeset
2873 executes by using attributes. */
kono
parents: 67
diff changeset
2874 bool
kono
parents: 67
diff changeset
2875 infer_nonnull_range_by_attribute (gimple *stmt, tree op)
kono
parents: 67
diff changeset
2876 {
kono
parents: 67
diff changeset
2877 /* We can only assume that a pointer dereference will yield
kono
parents: 67
diff changeset
2878 non-NULL if -fdelete-null-pointer-checks is enabled. */
kono
parents: 67
diff changeset
2879 if (!flag_delete_null_pointer_checks
kono
parents: 67
diff changeset
2880 || !POINTER_TYPE_P (TREE_TYPE (op))
kono
parents: 67
diff changeset
2881 || gimple_code (stmt) == GIMPLE_ASM)
kono
parents: 67
diff changeset
2882 return false;
kono
parents: 67
diff changeset
2883
kono
parents: 67
diff changeset
2884 if (is_gimple_call (stmt) && !gimple_call_internal_p (stmt))
kono
parents: 67
diff changeset
2885 {
kono
parents: 67
diff changeset
2886 tree fntype = gimple_call_fntype (stmt);
kono
parents: 67
diff changeset
2887 tree attrs = TYPE_ATTRIBUTES (fntype);
kono
parents: 67
diff changeset
2888 for (; attrs; attrs = TREE_CHAIN (attrs))
kono
parents: 67
diff changeset
2889 {
kono
parents: 67
diff changeset
2890 attrs = lookup_attribute ("nonnull", attrs);
kono
parents: 67
diff changeset
2891
kono
parents: 67
diff changeset
2892 /* If "nonnull" wasn't specified, we know nothing about
kono
parents: 67
diff changeset
2893 the argument. */
kono
parents: 67
diff changeset
2894 if (attrs == NULL_TREE)
kono
parents: 67
diff changeset
2895 return false;
kono
parents: 67
diff changeset
2896
kono
parents: 67
diff changeset
2897 /* If "nonnull" applies to all the arguments, then ARG
kono
parents: 67
diff changeset
2898 is non-null if it's in the argument list. */
kono
parents: 67
diff changeset
2899 if (TREE_VALUE (attrs) == NULL_TREE)
kono
parents: 67
diff changeset
2900 {
kono
parents: 67
diff changeset
2901 for (unsigned int i = 0; i < gimple_call_num_args (stmt); i++)
kono
parents: 67
diff changeset
2902 {
kono
parents: 67
diff changeset
2903 if (POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (stmt, i)))
kono
parents: 67
diff changeset
2904 && operand_equal_p (op, gimple_call_arg (stmt, i), 0))
kono
parents: 67
diff changeset
2905 return true;
kono
parents: 67
diff changeset
2906 }
kono
parents: 67
diff changeset
2907 return false;
kono
parents: 67
diff changeset
2908 }
kono
parents: 67
diff changeset
2909
kono
parents: 67
diff changeset
2910 /* Now see if op appears in the nonnull list. */
kono
parents: 67
diff changeset
2911 for (tree t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t))
kono
parents: 67
diff changeset
2912 {
kono
parents: 67
diff changeset
2913 unsigned int idx = TREE_INT_CST_LOW (TREE_VALUE (t)) - 1;
kono
parents: 67
diff changeset
2914 if (idx < gimple_call_num_args (stmt))
kono
parents: 67
diff changeset
2915 {
kono
parents: 67
diff changeset
2916 tree arg = gimple_call_arg (stmt, idx);
kono
parents: 67
diff changeset
2917 if (operand_equal_p (op, arg, 0))
kono
parents: 67
diff changeset
2918 return true;
kono
parents: 67
diff changeset
2919 }
kono
parents: 67
diff changeset
2920 }
kono
parents: 67
diff changeset
2921 }
kono
parents: 67
diff changeset
2922 }
kono
parents: 67
diff changeset
2923
kono
parents: 67
diff changeset
2924 /* If this function is marked as returning non-null, then we can
kono
parents: 67
diff changeset
2925 infer OP is non-null if it is used in the return statement. */
kono
parents: 67
diff changeset
2926 if (greturn *return_stmt = dyn_cast <greturn *> (stmt))
kono
parents: 67
diff changeset
2927 if (gimple_return_retval (return_stmt)
kono
parents: 67
diff changeset
2928 && operand_equal_p (gimple_return_retval (return_stmt), op, 0)
kono
parents: 67
diff changeset
2929 && lookup_attribute ("returns_nonnull",
kono
parents: 67
diff changeset
2930 TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
kono
parents: 67
diff changeset
2931 return true;
kono
parents: 67
diff changeset
2932
kono
parents: 67
diff changeset
2933 return false;
kono
parents: 67
diff changeset
2934 }
kono
parents: 67
diff changeset
2935
kono
parents: 67
diff changeset
2936 /* Compare two case labels. Because the front end should already have
kono
parents: 67
diff changeset
2937 made sure that case ranges do not overlap, it is enough to only compare
kono
parents: 67
diff changeset
2938 the CASE_LOW values of each case label. */
kono
parents: 67
diff changeset
2939
kono
parents: 67
diff changeset
2940 static int
kono
parents: 67
diff changeset
2941 compare_case_labels (const void *p1, const void *p2)
kono
parents: 67
diff changeset
2942 {
kono
parents: 67
diff changeset
2943 const_tree const case1 = *(const_tree const*)p1;
kono
parents: 67
diff changeset
2944 const_tree const case2 = *(const_tree const*)p2;
kono
parents: 67
diff changeset
2945
kono
parents: 67
diff changeset
2946 /* The 'default' case label always goes first. */
kono
parents: 67
diff changeset
2947 if (!CASE_LOW (case1))
kono
parents: 67
diff changeset
2948 return -1;
kono
parents: 67
diff changeset
2949 else if (!CASE_LOW (case2))
kono
parents: 67
diff changeset
2950 return 1;
kono
parents: 67
diff changeset
2951 else
kono
parents: 67
diff changeset
2952 return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
kono
parents: 67
diff changeset
2953 }
kono
parents: 67
diff changeset
2954
kono
parents: 67
diff changeset
2955 /* Sort the case labels in LABEL_VEC in place in ascending order. */
kono
parents: 67
diff changeset
2956
kono
parents: 67
diff changeset
2957 void
kono
parents: 67
diff changeset
2958 sort_case_labels (vec<tree> label_vec)
kono
parents: 67
diff changeset
2959 {
kono
parents: 67
diff changeset
2960 label_vec.qsort (compare_case_labels);
kono
parents: 67
diff changeset
2961 }
kono
parents: 67
diff changeset
2962
kono
parents: 67
diff changeset
2963 /* Prepare a vector of case labels to be used in a GIMPLE_SWITCH statement.
kono
parents: 67
diff changeset
2964
kono
parents: 67
diff changeset
2965 LABELS is a vector that contains all case labels to look at.
kono
parents: 67
diff changeset
2966
kono
parents: 67
diff changeset
2967 INDEX_TYPE is the type of the switch index expression. Case labels
kono
parents: 67
diff changeset
2968 in LABELS are discarded if their values are not in the value range
kono
parents: 67
diff changeset
2969 covered by INDEX_TYPE. The remaining case label values are folded
kono
parents: 67
diff changeset
2970 to INDEX_TYPE.
kono
parents: 67
diff changeset
2971
kono
parents: 67
diff changeset
2972 If a default case exists in LABELS, it is removed from LABELS and
kono
parents: 67
diff changeset
2973 returned in DEFAULT_CASEP. If no default case exists, but the
kono
parents: 67
diff changeset
2974 case labels already cover the whole range of INDEX_TYPE, a default
kono
parents: 67
diff changeset
2975 case is returned pointing to one of the existing case labels.
kono
parents: 67
diff changeset
2976 Otherwise DEFAULT_CASEP is set to NULL_TREE.
kono
parents: 67
diff changeset
2977
kono
parents: 67
diff changeset
2978 DEFAULT_CASEP may be NULL, in which case the above comment doesn't
kono
parents: 67
diff changeset
2979 apply and no action is taken regardless of whether a default case is
kono
parents: 67
diff changeset
2980 found or not. */
kono
parents: 67
diff changeset
2981
kono
parents: 67
diff changeset
2982 void
kono
parents: 67
diff changeset
2983 preprocess_case_label_vec_for_gimple (vec<tree> labels,
kono
parents: 67
diff changeset
2984 tree index_type,
kono
parents: 67
diff changeset
2985 tree *default_casep)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2986 {
111
kono
parents: 67
diff changeset
2987 tree min_value, max_value;
kono
parents: 67
diff changeset
2988 tree default_case = NULL_TREE;
kono
parents: 67
diff changeset
2989 size_t i, len;
kono
parents: 67
diff changeset
2990
kono
parents: 67
diff changeset
2991 i = 0;
kono
parents: 67
diff changeset
2992 min_value = TYPE_MIN_VALUE (index_type);
kono
parents: 67
diff changeset
2993 max_value = TYPE_MAX_VALUE (index_type);
kono
parents: 67
diff changeset
2994 while (i < labels.length ())
kono
parents: 67
diff changeset
2995 {
kono
parents: 67
diff changeset
2996 tree elt = labels[i];
kono
parents: 67
diff changeset
2997 tree low = CASE_LOW (elt);
kono
parents: 67
diff changeset
2998 tree high = CASE_HIGH (elt);
kono
parents: 67
diff changeset
2999 bool remove_element = FALSE;
kono
parents: 67
diff changeset
3000
kono
parents: 67
diff changeset
3001 if (low)
kono
parents: 67
diff changeset
3002 {
kono
parents: 67
diff changeset
3003 gcc_checking_assert (TREE_CODE (low) == INTEGER_CST);
kono
parents: 67
diff changeset
3004 gcc_checking_assert (!high || TREE_CODE (high) == INTEGER_CST);
kono
parents: 67
diff changeset
3005
kono
parents: 67
diff changeset
3006 /* This is a non-default case label, i.e. it has a value.
kono
parents: 67
diff changeset
3007
kono
parents: 67
diff changeset
3008 See if the case label is reachable within the range of
kono
parents: 67
diff changeset
3009 the index type. Remove out-of-range case values. Turn
kono
parents: 67
diff changeset
3010 case ranges into a canonical form (high > low strictly)
kono
parents: 67
diff changeset
3011 and convert the case label values to the index type.
kono
parents: 67
diff changeset
3012
kono
parents: 67
diff changeset
3013 NB: The type of gimple_switch_index() may be the promoted
kono
parents: 67
diff changeset
3014 type, but the case labels retain the original type. */
kono
parents: 67
diff changeset
3015
kono
parents: 67
diff changeset
3016 if (high)
kono
parents: 67
diff changeset
3017 {
kono
parents: 67
diff changeset
3018 /* This is a case range. Discard empty ranges.
kono
parents: 67
diff changeset
3019 If the bounds or the range are equal, turn this
kono
parents: 67
diff changeset
3020 into a simple (one-value) case. */
kono
parents: 67
diff changeset
3021 int cmp = tree_int_cst_compare (high, low);
kono
parents: 67
diff changeset
3022 if (cmp < 0)
kono
parents: 67
diff changeset
3023 remove_element = TRUE;
kono
parents: 67
diff changeset
3024 else if (cmp == 0)
kono
parents: 67
diff changeset
3025 high = NULL_TREE;
kono
parents: 67
diff changeset
3026 }
kono
parents: 67
diff changeset
3027
kono
parents: 67
diff changeset
3028 if (! high)
kono
parents: 67
diff changeset
3029 {
kono
parents: 67
diff changeset
3030 /* If the simple case value is unreachable, ignore it. */
kono
parents: 67
diff changeset
3031 if ((TREE_CODE (min_value) == INTEGER_CST
kono
parents: 67
diff changeset
3032 && tree_int_cst_compare (low, min_value) < 0)
kono
parents: 67
diff changeset
3033 || (TREE_CODE (max_value) == INTEGER_CST
kono
parents: 67
diff changeset
3034 && tree_int_cst_compare (low, max_value) > 0))
kono
parents: 67
diff changeset
3035 remove_element = TRUE;
kono
parents: 67
diff changeset
3036 else
kono
parents: 67
diff changeset
3037 low = fold_convert (index_type, low);
kono
parents: 67
diff changeset
3038 }
kono
parents: 67
diff changeset
3039 else
kono
parents: 67
diff changeset
3040 {
kono
parents: 67
diff changeset
3041 /* If the entire case range is unreachable, ignore it. */
kono
parents: 67
diff changeset
3042 if ((TREE_CODE (min_value) == INTEGER_CST
kono
parents: 67
diff changeset
3043 && tree_int_cst_compare (high, min_value) < 0)
kono
parents: 67
diff changeset
3044 || (TREE_CODE (max_value) == INTEGER_CST
kono
parents: 67
diff changeset
3045 && tree_int_cst_compare (low, max_value) > 0))
kono
parents: 67
diff changeset
3046 remove_element = TRUE;
kono
parents: 67
diff changeset
3047 else
kono
parents: 67
diff changeset
3048 {
kono
parents: 67
diff changeset
3049 /* If the lower bound is less than the index type's
kono
parents: 67
diff changeset
3050 minimum value, truncate the range bounds. */
kono
parents: 67
diff changeset
3051 if (TREE_CODE (min_value) == INTEGER_CST
kono
parents: 67
diff changeset
3052 && tree_int_cst_compare (low, min_value) < 0)
kono
parents: 67
diff changeset
3053 low = min_value;
kono
parents: 67
diff changeset
3054 low = fold_convert (index_type, low);
kono
parents: 67
diff changeset
3055
kono
parents: 67
diff changeset
3056 /* If the upper bound is greater than the index type's
kono
parents: 67
diff changeset
3057 maximum value, truncate the range bounds. */
kono
parents: 67
diff changeset
3058 if (TREE_CODE (max_value) == INTEGER_CST
kono
parents: 67
diff changeset
3059 && tree_int_cst_compare (high, max_value) > 0)
kono
parents: 67
diff changeset
3060 high = max_value;
kono
parents: 67
diff changeset
3061 high = fold_convert (index_type, high);
kono
parents: 67
diff changeset
3062
kono
parents: 67
diff changeset
3063 /* We may have folded a case range to a one-value case. */
kono
parents: 67
diff changeset
3064 if (tree_int_cst_equal (low, high))
kono
parents: 67
diff changeset
3065 high = NULL_TREE;
kono
parents: 67
diff changeset
3066 }
kono
parents: 67
diff changeset
3067 }
kono
parents: 67
diff changeset
3068
kono
parents: 67
diff changeset
3069 CASE_LOW (elt) = low;
kono
parents: 67
diff changeset
3070 CASE_HIGH (elt) = high;
kono
parents: 67
diff changeset
3071 }
kono
parents: 67
diff changeset
3072 else
kono
parents: 67
diff changeset
3073 {
kono
parents: 67
diff changeset
3074 gcc_assert (!default_case);
kono
parents: 67
diff changeset
3075 default_case = elt;
kono
parents: 67
diff changeset
3076 /* The default case must be passed separately to the
kono
parents: 67
diff changeset
3077 gimple_build_switch routine. But if DEFAULT_CASEP
kono
parents: 67
diff changeset
3078 is NULL, we do not remove the default case (it would
kono
parents: 67
diff changeset
3079 be completely lost). */
kono
parents: 67
diff changeset
3080 if (default_casep)
kono
parents: 67
diff changeset
3081 remove_element = TRUE;
kono
parents: 67
diff changeset
3082 }
kono
parents: 67
diff changeset
3083
kono
parents: 67
diff changeset
3084 if (remove_element)
kono
parents: 67
diff changeset
3085 labels.ordered_remove (i);
kono
parents: 67
diff changeset
3086 else
kono
parents: 67
diff changeset
3087 i++;
kono
parents: 67
diff changeset
3088 }
kono
parents: 67
diff changeset
3089 len = i;
kono
parents: 67
diff changeset
3090
kono
parents: 67
diff changeset
3091 if (!labels.is_empty ())
kono
parents: 67
diff changeset
3092 sort_case_labels (labels);
kono
parents: 67
diff changeset
3093
kono
parents: 67
diff changeset
3094 if (default_casep && !default_case)
kono
parents: 67
diff changeset
3095 {
kono
parents: 67
diff changeset
3096 /* If the switch has no default label, add one, so that we jump
kono
parents: 67
diff changeset
3097 around the switch body. If the labels already cover the whole
kono
parents: 67
diff changeset
3098 range of the switch index_type, add the default label pointing
kono
parents: 67
diff changeset
3099 to one of the existing labels. */
kono
parents: 67
diff changeset
3100 if (len
kono
parents: 67
diff changeset
3101 && TYPE_MIN_VALUE (index_type)
kono
parents: 67
diff changeset
3102 && TYPE_MAX_VALUE (index_type)
kono
parents: 67
diff changeset
3103 && tree_int_cst_equal (CASE_LOW (labels[0]),
kono
parents: 67
diff changeset
3104 TYPE_MIN_VALUE (index_type)))
kono
parents: 67
diff changeset
3105 {
kono
parents: 67
diff changeset
3106 tree low, high = CASE_HIGH (labels[len - 1]);
kono
parents: 67
diff changeset
3107 if (!high)
kono
parents: 67
diff changeset
3108 high = CASE_LOW (labels[len - 1]);
kono
parents: 67
diff changeset
3109 if (tree_int_cst_equal (high, TYPE_MAX_VALUE (index_type)))
kono
parents: 67
diff changeset
3110 {
kono
parents: 67
diff changeset
3111 tree widest_label = labels[0];
kono
parents: 67
diff changeset
3112 for (i = 1; i < len; i++)
kono
parents: 67
diff changeset
3113 {
kono
parents: 67
diff changeset
3114 high = CASE_LOW (labels[i]);
kono
parents: 67
diff changeset
3115 low = CASE_HIGH (labels[i - 1]);
kono
parents: 67
diff changeset
3116 if (!low)
kono
parents: 67
diff changeset
3117 low = CASE_LOW (labels[i - 1]);
kono
parents: 67
diff changeset
3118
kono
parents: 67
diff changeset
3119 if (CASE_HIGH (labels[i]) != NULL_TREE
kono
parents: 67
diff changeset
3120 && (CASE_HIGH (widest_label) == NULL_TREE
kono
parents: 67
diff changeset
3121 || (wi::gtu_p
kono
parents: 67
diff changeset
3122 (wi::to_wide (CASE_HIGH (labels[i]))
kono
parents: 67
diff changeset
3123 - wi::to_wide (CASE_LOW (labels[i])),
kono
parents: 67
diff changeset
3124 wi::to_wide (CASE_HIGH (widest_label))
kono
parents: 67
diff changeset
3125 - wi::to_wide (CASE_LOW (widest_label))))))
kono
parents: 67
diff changeset
3126 widest_label = labels[i];
kono
parents: 67
diff changeset
3127
kono
parents: 67
diff changeset
3128 if (wi::to_wide (low) + 1 != wi::to_wide (high))
kono
parents: 67
diff changeset
3129 break;
kono
parents: 67
diff changeset
3130 }
kono
parents: 67
diff changeset
3131 if (i == len)
kono
parents: 67
diff changeset
3132 {
kono
parents: 67
diff changeset
3133 /* Designate the label with the widest range to be the
kono
parents: 67
diff changeset
3134 default label. */
kono
parents: 67
diff changeset
3135 tree label = CASE_LABEL (widest_label);
kono
parents: 67
diff changeset
3136 default_case = build_case_label (NULL_TREE, NULL_TREE,
kono
parents: 67
diff changeset
3137 label);
kono
parents: 67
diff changeset
3138 }
kono
parents: 67
diff changeset
3139 }
kono
parents: 67
diff changeset
3140 }
kono
parents: 67
diff changeset
3141 }
kono
parents: 67
diff changeset
3142
kono
parents: 67
diff changeset
3143 if (default_casep)
kono
parents: 67
diff changeset
3144 *default_casep = default_case;
kono
parents: 67
diff changeset
3145 }
kono
parents: 67
diff changeset
3146
kono
parents: 67
diff changeset
3147 /* Set the location of all statements in SEQ to LOC. */
kono
parents: 67
diff changeset
3148
kono
parents: 67
diff changeset
3149 void
kono
parents: 67
diff changeset
3150 gimple_seq_set_location (gimple_seq seq, location_t loc)
kono
parents: 67
diff changeset
3151 {
kono
parents: 67
diff changeset
3152 for (gimple_stmt_iterator i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
kono
parents: 67
diff changeset
3153 gimple_set_location (gsi_stmt (i), loc);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
3154 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
3155
111
kono
parents: 67
diff changeset
3156 /* Release SSA_NAMEs in SEQ as well as the GIMPLE statements. */
kono
parents: 67
diff changeset
3157
kono
parents: 67
diff changeset
3158 void
kono
parents: 67
diff changeset
3159 gimple_seq_discard (gimple_seq seq)
kono
parents: 67
diff changeset
3160 {
kono
parents: 67
diff changeset
3161 gimple_stmt_iterator gsi;
kono
parents: 67
diff changeset
3162
kono
parents: 67
diff changeset
3163 for (gsi = gsi_start (seq); !gsi_end_p (gsi); )
kono
parents: 67
diff changeset
3164 {
kono
parents: 67
diff changeset
3165 gimple *stmt = gsi_stmt (gsi);
kono
parents: 67
diff changeset
3166 gsi_remove (&gsi, true);
kono
parents: 67
diff changeset
3167 release_defs (stmt);
kono
parents: 67
diff changeset
3168 ggc_free (stmt);
kono
parents: 67
diff changeset
3169 }
kono
parents: 67
diff changeset
3170 }
kono
parents: 67
diff changeset
3171
kono
parents: 67
diff changeset
3172 /* See if STMT now calls function that takes no parameters and if so, drop
kono
parents: 67
diff changeset
3173 call arguments. This is used when devirtualization machinery redirects
kono
parents: 67
diff changeset
3174 to __builtin_unreachable or __cxa_pure_virtual. */
kono
parents: 67
diff changeset
3175
kono
parents: 67
diff changeset
3176 void
kono
parents: 67
diff changeset
3177 maybe_remove_unused_call_args (struct function *fn, gimple *stmt)
kono
parents: 67
diff changeset
3178 {
kono
parents: 67
diff changeset
3179 tree decl = gimple_call_fndecl (stmt);
kono
parents: 67
diff changeset
3180 if (TYPE_ARG_TYPES (TREE_TYPE (decl))
kono
parents: 67
diff changeset
3181 && TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl))) == void_type_node
kono
parents: 67
diff changeset
3182 && gimple_call_num_args (stmt))
kono
parents: 67
diff changeset
3183 {
kono
parents: 67
diff changeset
3184 gimple_set_num_ops (stmt, 3);
kono
parents: 67
diff changeset
3185 update_stmt_fn (fn, stmt);
kono
parents: 67
diff changeset
3186 }
kono
parents: 67
diff changeset
3187 }
kono
parents: 67
diff changeset
3188
kono
parents: 67
diff changeset
3189 /* Return false if STMT will likely expand to real function call. */
kono
parents: 67
diff changeset
3190
kono
parents: 67
diff changeset
3191 bool
kono
parents: 67
diff changeset
3192 gimple_inexpensive_call_p (gcall *stmt)
kono
parents: 67
diff changeset
3193 {
kono
parents: 67
diff changeset
3194 if (gimple_call_internal_p (stmt))
kono
parents: 67
diff changeset
3195 return true;
kono
parents: 67
diff changeset
3196 tree decl = gimple_call_fndecl (stmt);
kono
parents: 67
diff changeset
3197 if (decl && is_inexpensive_builtin (decl))
kono
parents: 67
diff changeset
3198 return true;
kono
parents: 67
diff changeset
3199 return false;
kono
parents: 67
diff changeset
3200 }
kono
parents: 67
diff changeset
3201
kono
parents: 67
diff changeset
3202 #if CHECKING_P
kono
parents: 67
diff changeset
3203
kono
parents: 67
diff changeset
3204 namespace selftest {
kono
parents: 67
diff changeset
3205
kono
parents: 67
diff changeset
3206 /* Selftests for core gimple structures. */
kono
parents: 67
diff changeset
3207
kono
parents: 67
diff changeset
3208 /* Verify that STMT is pretty-printed as EXPECTED.
kono
parents: 67
diff changeset
3209 Helper function for selftests. */
kono
parents: 67
diff changeset
3210
kono
parents: 67
diff changeset
3211 static void
kono
parents: 67
diff changeset
3212 verify_gimple_pp (const char *expected, gimple *stmt)
kono
parents: 67
diff changeset
3213 {
kono
parents: 67
diff changeset
3214 pretty_printer pp;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3215 pp_gimple_stmt_1 (&pp, stmt, 0 /* spc */, TDF_NONE /* flags */);
111
kono
parents: 67
diff changeset
3216 ASSERT_STREQ (expected, pp_formatted_text (&pp));
kono
parents: 67
diff changeset
3217 }
kono
parents: 67
diff changeset
3218
kono
parents: 67
diff changeset
3219 /* Build a GIMPLE_ASSIGN equivalent to
kono
parents: 67
diff changeset
3220 tmp = 5;
kono
parents: 67
diff changeset
3221 and verify various properties of it. */
kono
parents: 67
diff changeset
3222
kono
parents: 67
diff changeset
3223 static void
kono
parents: 67
diff changeset
3224 test_assign_single ()
kono
parents: 67
diff changeset
3225 {
kono
parents: 67
diff changeset
3226 tree type = integer_type_node;
kono
parents: 67
diff changeset
3227 tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
kono
parents: 67
diff changeset
3228 get_identifier ("tmp"),
kono
parents: 67
diff changeset
3229 type);
kono
parents: 67
diff changeset
3230 tree rhs = build_int_cst (type, 5);
kono
parents: 67
diff changeset
3231 gassign *stmt = gimple_build_assign (lhs, rhs);
kono
parents: 67
diff changeset
3232 verify_gimple_pp ("tmp = 5;", stmt);
kono
parents: 67
diff changeset
3233
kono
parents: 67
diff changeset
3234 ASSERT_TRUE (is_gimple_assign (stmt));
kono
parents: 67
diff changeset
3235 ASSERT_EQ (lhs, gimple_assign_lhs (stmt));
kono
parents: 67
diff changeset
3236 ASSERT_EQ (lhs, gimple_get_lhs (stmt));
kono
parents: 67
diff changeset
3237 ASSERT_EQ (rhs, gimple_assign_rhs1 (stmt));
kono
parents: 67
diff changeset
3238 ASSERT_EQ (NULL, gimple_assign_rhs2 (stmt));
kono
parents: 67
diff changeset
3239 ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt));
kono
parents: 67
diff changeset
3240 ASSERT_TRUE (gimple_assign_single_p (stmt));
kono
parents: 67
diff changeset
3241 ASSERT_EQ (INTEGER_CST, gimple_assign_rhs_code (stmt));
kono
parents: 67
diff changeset
3242 }
kono
parents: 67
diff changeset
3243
kono
parents: 67
diff changeset
3244 /* Build a GIMPLE_ASSIGN equivalent to
kono
parents: 67
diff changeset
3245 tmp = a * b;
kono
parents: 67
diff changeset
3246 and verify various properties of it. */
kono
parents: 67
diff changeset
3247
kono
parents: 67
diff changeset
3248 static void
kono
parents: 67
diff changeset
3249 test_assign_binop ()
kono
parents: 67
diff changeset
3250 {
kono
parents: 67
diff changeset
3251 tree type = integer_type_node;
kono
parents: 67
diff changeset
3252 tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
kono
parents: 67
diff changeset
3253 get_identifier ("tmp"),
kono
parents: 67
diff changeset
3254 type);
kono
parents: 67
diff changeset
3255 tree a = build_decl (UNKNOWN_LOCATION, VAR_DECL,
kono
parents: 67
diff changeset
3256 get_identifier ("a"),
kono
parents: 67
diff changeset
3257 type);
kono
parents: 67
diff changeset
3258 tree b = build_decl (UNKNOWN_LOCATION, VAR_DECL,
kono
parents: 67
diff changeset
3259 get_identifier ("b"),
kono
parents: 67
diff changeset
3260 type);
kono
parents: 67
diff changeset
3261 gassign *stmt = gimple_build_assign (lhs, MULT_EXPR, a, b);
kono
parents: 67
diff changeset
3262 verify_gimple_pp ("tmp = a * b;", stmt);
kono
parents: 67
diff changeset
3263
kono
parents: 67
diff changeset
3264 ASSERT_TRUE (is_gimple_assign (stmt));
kono
parents: 67
diff changeset
3265 ASSERT_EQ (lhs, gimple_assign_lhs (stmt));
kono
parents: 67
diff changeset
3266 ASSERT_EQ (lhs, gimple_get_lhs (stmt));
kono
parents: 67
diff changeset
3267 ASSERT_EQ (a, gimple_assign_rhs1 (stmt));
kono
parents: 67
diff changeset
3268 ASSERT_EQ (b, gimple_assign_rhs2 (stmt));
kono
parents: 67
diff changeset
3269 ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt));
kono
parents: 67
diff changeset
3270 ASSERT_FALSE (gimple_assign_single_p (stmt));
kono
parents: 67
diff changeset
3271 ASSERT_EQ (MULT_EXPR, gimple_assign_rhs_code (stmt));
kono
parents: 67
diff changeset
3272 }
kono
parents: 67
diff changeset
3273
kono
parents: 67
diff changeset
3274 /* Build a GIMPLE_NOP and verify various properties of it. */
kono
parents: 67
diff changeset
3275
kono
parents: 67
diff changeset
3276 static void
kono
parents: 67
diff changeset
3277 test_nop_stmt ()
kono
parents: 67
diff changeset
3278 {
kono
parents: 67
diff changeset
3279 gimple *stmt = gimple_build_nop ();
kono
parents: 67
diff changeset
3280 verify_gimple_pp ("GIMPLE_NOP", stmt);
kono
parents: 67
diff changeset
3281 ASSERT_EQ (GIMPLE_NOP, gimple_code (stmt));
kono
parents: 67
diff changeset
3282 ASSERT_EQ (NULL, gimple_get_lhs (stmt));
kono
parents: 67
diff changeset
3283 ASSERT_FALSE (gimple_assign_single_p (stmt));
kono
parents: 67
diff changeset
3284 }
kono
parents: 67
diff changeset
3285
kono
parents: 67
diff changeset
3286 /* Build a GIMPLE_RETURN equivalent to
kono
parents: 67
diff changeset
3287 return 7;
kono
parents: 67
diff changeset
3288 and verify various properties of it. */
kono
parents: 67
diff changeset
3289
kono
parents: 67
diff changeset
3290 static void
kono
parents: 67
diff changeset
3291 test_return_stmt ()
kono
parents: 67
diff changeset
3292 {
kono
parents: 67
diff changeset
3293 tree type = integer_type_node;
kono
parents: 67
diff changeset
3294 tree val = build_int_cst (type, 7);
kono
parents: 67
diff changeset
3295 greturn *stmt = gimple_build_return (val);
kono
parents: 67
diff changeset
3296 verify_gimple_pp ("return 7;", stmt);
kono
parents: 67
diff changeset
3297
kono
parents: 67
diff changeset
3298 ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt));
kono
parents: 67
diff changeset
3299 ASSERT_EQ (NULL, gimple_get_lhs (stmt));
kono
parents: 67
diff changeset
3300 ASSERT_EQ (val, gimple_return_retval (stmt));
kono
parents: 67
diff changeset
3301 ASSERT_FALSE (gimple_assign_single_p (stmt));
kono
parents: 67
diff changeset
3302 }
kono
parents: 67
diff changeset
3303
kono
parents: 67
diff changeset
3304 /* Build a GIMPLE_RETURN equivalent to
kono
parents: 67
diff changeset
3305 return;
kono
parents: 67
diff changeset
3306 and verify various properties of it. */
kono
parents: 67
diff changeset
3307
kono
parents: 67
diff changeset
3308 static void
kono
parents: 67
diff changeset
3309 test_return_without_value ()
kono
parents: 67
diff changeset
3310 {
kono
parents: 67
diff changeset
3311 greturn *stmt = gimple_build_return (NULL);
kono
parents: 67
diff changeset
3312 verify_gimple_pp ("return;", stmt);
kono
parents: 67
diff changeset
3313
kono
parents: 67
diff changeset
3314 ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt));
kono
parents: 67
diff changeset
3315 ASSERT_EQ (NULL, gimple_get_lhs (stmt));
kono
parents: 67
diff changeset
3316 ASSERT_EQ (NULL, gimple_return_retval (stmt));
kono
parents: 67
diff changeset
3317 ASSERT_FALSE (gimple_assign_single_p (stmt));
kono
parents: 67
diff changeset
3318 }
kono
parents: 67
diff changeset
3319
kono
parents: 67
diff changeset
3320 /* Run all of the selftests within this file. */
kono
parents: 67
diff changeset
3321
kono
parents: 67
diff changeset
3322 void
kono
parents: 67
diff changeset
3323 gimple_c_tests ()
kono
parents: 67
diff changeset
3324 {
kono
parents: 67
diff changeset
3325 test_assign_single ();
kono
parents: 67
diff changeset
3326 test_assign_binop ();
kono
parents: 67
diff changeset
3327 test_nop_stmt ();
kono
parents: 67
diff changeset
3328 test_return_stmt ();
kono
parents: 67
diff changeset
3329 test_return_without_value ();
kono
parents: 67
diff changeset
3330 }
kono
parents: 67
diff changeset
3331
kono
parents: 67
diff changeset
3332 } // namespace selftest
kono
parents: 67
diff changeset
3333
kono
parents: 67
diff changeset
3334
kono
parents: 67
diff changeset
3335 #endif /* CHECKING_P */