annotate gcc/gimple.c @ 111:04ced10e8804

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