annotate gcc/gimple.c @ 120:f93fa5091070

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