annotate gcc/gimple.c @ 112:ab0bcb71f44d

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