* ipa/devirt9.C: Fix previous change.
[official-gcc.git] / gcc / gimplify-me.c
bloba7e9387b6480d98f36a3aac32f384968daf51080
1 /* Tree lowering to gimple for middle end use only.
2 This converts the GENERIC functions-as-trees tree representation into
3 the GIMPLE form.
4 Copyright (C) 2013 Free Software Foundation, Inc.
5 Major work done by Sebastian Pop <s.pop@laposte.net>,
6 Diego Novillo <dnovillo@redhat.com> and Jason Merrill <jason@redhat.com>.
8 This file is part of GCC.
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
13 version.
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 for more details.
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3. If not see
22 <http://www.gnu.org/licenses/>. */
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tree.h"
28 #include "stmt.h"
29 #include "stor-layout.h"
30 #include "gimple.h"
31 #include "gimple-iterator.h"
32 #include "gimplify.h"
33 #include "gimplify-me.h"
34 #include "gimple-ssa.h"
35 #include "stringpool.h"
36 #include "tree-ssanames.h"
39 /* Expand EXPR to list of gimple statements STMTS. GIMPLE_TEST_F specifies
40 the predicate that will hold for the result. If VAR is not NULL, make the
41 base variable of the final destination be VAR if suitable. */
43 tree
44 force_gimple_operand_1 (tree expr, gimple_seq *stmts,
45 gimple_predicate gimple_test_f, tree var)
47 enum gimplify_status ret;
48 struct gimplify_ctx gctx;
49 location_t saved_location;
51 *stmts = NULL;
53 /* gimple_test_f might be more strict than is_gimple_val, make
54 sure we pass both. Just checking gimple_test_f doesn't work
55 because most gimple predicates do not work recursively. */
56 if (is_gimple_val (expr)
57 && (*gimple_test_f) (expr))
58 return expr;
60 push_gimplify_context (&gctx);
61 gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
62 gimplify_ctxp->allow_rhs_cond_expr = true;
63 saved_location = input_location;
64 input_location = UNKNOWN_LOCATION;
66 if (var)
68 if (gimplify_ctxp->into_ssa
69 && is_gimple_reg (var))
70 var = make_ssa_name (var, NULL);
71 expr = build2 (MODIFY_EXPR, TREE_TYPE (var), var, expr);
74 if (TREE_CODE (expr) != MODIFY_EXPR
75 && TREE_TYPE (expr) == void_type_node)
77 gimplify_and_add (expr, stmts);
78 expr = NULL_TREE;
80 else
82 ret = gimplify_expr (&expr, stmts, NULL, gimple_test_f, fb_rvalue);
83 gcc_assert (ret != GS_ERROR);
86 input_location = saved_location;
87 pop_gimplify_context (NULL);
89 return expr;
92 /* Expand EXPR to list of gimple statements STMTS. If SIMPLE is true,
93 force the result to be either ssa_name or an invariant, otherwise
94 just force it to be a rhs expression. If VAR is not NULL, make the
95 base variable of the final destination be VAR if suitable. */
97 tree
98 force_gimple_operand (tree expr, gimple_seq *stmts, bool simple, tree var)
100 return force_gimple_operand_1 (expr, stmts,
101 simple ? is_gimple_val : is_gimple_reg_rhs,
102 var);
105 /* Invoke force_gimple_operand_1 for EXPR with parameters GIMPLE_TEST_F
106 and VAR. If some statements are produced, emits them at GSI.
107 If BEFORE is true. the statements are appended before GSI, otherwise
108 they are appended after it. M specifies the way GSI moves after
109 insertion (GSI_SAME_STMT or GSI_CONTINUE_LINKING are the usual values). */
111 tree
112 force_gimple_operand_gsi_1 (gimple_stmt_iterator *gsi, tree expr,
113 gimple_predicate gimple_test_f,
114 tree var, bool before,
115 enum gsi_iterator_update m)
117 gimple_seq stmts;
119 expr = force_gimple_operand_1 (expr, &stmts, gimple_test_f, var);
121 if (!gimple_seq_empty_p (stmts))
123 if (before)
124 gsi_insert_seq_before (gsi, stmts, m);
125 else
126 gsi_insert_seq_after (gsi, stmts, m);
129 return expr;
132 /* Invoke force_gimple_operand_1 for EXPR with parameter VAR.
133 If SIMPLE is true, force the result to be either ssa_name or an invariant,
134 otherwise just force it to be a rhs expression. If some statements are
135 produced, emits them at GSI. If BEFORE is true, the statements are
136 appended before GSI, otherwise they are appended after it. M specifies
137 the way GSI moves after insertion (GSI_SAME_STMT or GSI_CONTINUE_LINKING
138 are the usual values). */
140 tree
141 force_gimple_operand_gsi (gimple_stmt_iterator *gsi, tree expr,
142 bool simple_p, tree var, bool before,
143 enum gsi_iterator_update m)
145 return force_gimple_operand_gsi_1 (gsi, expr,
146 simple_p
147 ? is_gimple_val : is_gimple_reg_rhs,
148 var, before, m);
151 /* Some transformations like inlining may invalidate the GIMPLE form
152 for operands. This function traverses all the operands in STMT and
153 gimplifies anything that is not a valid gimple operand. Any new
154 GIMPLE statements are inserted before *GSI_P. */
156 void
157 gimple_regimplify_operands (gimple stmt, gimple_stmt_iterator *gsi_p)
159 size_t i, num_ops;
160 tree lhs;
161 gimple_seq pre = NULL;
162 gimple post_stmt = NULL;
163 struct gimplify_ctx gctx;
165 push_gimplify_context (&gctx);
166 gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
168 switch (gimple_code (stmt))
170 case GIMPLE_COND:
171 gimplify_expr (gimple_cond_lhs_ptr (stmt), &pre, NULL,
172 is_gimple_val, fb_rvalue);
173 gimplify_expr (gimple_cond_rhs_ptr (stmt), &pre, NULL,
174 is_gimple_val, fb_rvalue);
175 break;
176 case GIMPLE_SWITCH:
177 gimplify_expr (gimple_switch_index_ptr (stmt), &pre, NULL,
178 is_gimple_val, fb_rvalue);
179 break;
180 case GIMPLE_OMP_ATOMIC_LOAD:
181 gimplify_expr (gimple_omp_atomic_load_rhs_ptr (stmt), &pre, NULL,
182 is_gimple_val, fb_rvalue);
183 break;
184 case GIMPLE_ASM:
186 size_t i, noutputs = gimple_asm_noutputs (stmt);
187 const char *constraint, **oconstraints;
188 bool allows_mem, allows_reg, is_inout;
190 oconstraints
191 = (const char **) alloca ((noutputs) * sizeof (const char *));
192 for (i = 0; i < noutputs; i++)
194 tree op = gimple_asm_output_op (stmt, i);
195 constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
196 oconstraints[i] = constraint;
197 parse_output_constraint (&constraint, i, 0, 0, &allows_mem,
198 &allows_reg, &is_inout);
199 gimplify_expr (&TREE_VALUE (op), &pre, NULL,
200 is_inout ? is_gimple_min_lval : is_gimple_lvalue,
201 fb_lvalue | fb_mayfail);
203 for (i = 0; i < gimple_asm_ninputs (stmt); i++)
205 tree op = gimple_asm_input_op (stmt, i);
206 constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
207 parse_input_constraint (&constraint, 0, 0, noutputs, 0,
208 oconstraints, &allows_mem, &allows_reg);
209 if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (op))) && allows_mem)
210 allows_reg = 0;
211 if (!allows_reg && allows_mem)
212 gimplify_expr (&TREE_VALUE (op), &pre, NULL,
213 is_gimple_lvalue, fb_lvalue | fb_mayfail);
214 else
215 gimplify_expr (&TREE_VALUE (op), &pre, NULL,
216 is_gimple_asm_val, fb_rvalue);
219 break;
220 default:
221 /* NOTE: We start gimplifying operands from last to first to
222 make sure that side-effects on the RHS of calls, assignments
223 and ASMs are executed before the LHS. The ordering is not
224 important for other statements. */
225 num_ops = gimple_num_ops (stmt);
226 for (i = num_ops; i > 0; i--)
228 tree op = gimple_op (stmt, i - 1);
229 if (op == NULL_TREE)
230 continue;
231 if (i == 1 && (is_gimple_call (stmt) || is_gimple_assign (stmt)))
232 gimplify_expr (&op, &pre, NULL, is_gimple_lvalue, fb_lvalue);
233 else if (i == 2
234 && is_gimple_assign (stmt)
235 && num_ops == 2
236 && get_gimple_rhs_class (gimple_expr_code (stmt))
237 == GIMPLE_SINGLE_RHS)
238 gimplify_expr (&op, &pre, NULL,
239 rhs_predicate_for (gimple_assign_lhs (stmt)),
240 fb_rvalue);
241 else if (i == 2 && is_gimple_call (stmt))
243 if (TREE_CODE (op) == FUNCTION_DECL)
244 continue;
245 gimplify_expr (&op, &pre, NULL, is_gimple_call_addr, fb_rvalue);
247 else
248 gimplify_expr (&op, &pre, NULL, is_gimple_val, fb_rvalue);
249 gimple_set_op (stmt, i - 1, op);
252 lhs = gimple_get_lhs (stmt);
253 /* If the LHS changed it in a way that requires a simple RHS,
254 create temporary. */
255 if (lhs && !is_gimple_reg (lhs))
257 bool need_temp = false;
259 if (is_gimple_assign (stmt)
260 && num_ops == 2
261 && get_gimple_rhs_class (gimple_expr_code (stmt))
262 == GIMPLE_SINGLE_RHS)
263 gimplify_expr (gimple_assign_rhs1_ptr (stmt), &pre, NULL,
264 rhs_predicate_for (gimple_assign_lhs (stmt)),
265 fb_rvalue);
266 else if (is_gimple_reg (lhs))
268 if (is_gimple_reg_type (TREE_TYPE (lhs)))
270 if (is_gimple_call (stmt))
272 i = gimple_call_flags (stmt);
273 if ((i & ECF_LOOPING_CONST_OR_PURE)
274 || !(i & (ECF_CONST | ECF_PURE)))
275 need_temp = true;
277 if (stmt_can_throw_internal (stmt))
278 need_temp = true;
281 else
283 if (is_gimple_reg_type (TREE_TYPE (lhs)))
284 need_temp = true;
285 else if (TYPE_MODE (TREE_TYPE (lhs)) != BLKmode)
287 if (is_gimple_call (stmt))
289 tree fndecl = gimple_call_fndecl (stmt);
291 if (!aggregate_value_p (TREE_TYPE (lhs), fndecl)
292 && !(fndecl && DECL_RESULT (fndecl)
293 && DECL_BY_REFERENCE (DECL_RESULT (fndecl))))
294 need_temp = true;
296 else
297 need_temp = true;
300 if (need_temp)
302 tree temp = create_tmp_reg (TREE_TYPE (lhs), NULL);
303 if (gimple_in_ssa_p (cfun))
304 temp = make_ssa_name (temp, NULL);
305 gimple_set_lhs (stmt, temp);
306 post_stmt = gimple_build_assign (lhs, temp);
309 break;
312 if (!gimple_seq_empty_p (pre))
313 gsi_insert_seq_before (gsi_p, pre, GSI_SAME_STMT);
314 if (post_stmt)
315 gsi_insert_after (gsi_p, post_stmt, GSI_NEW_STMT);
317 pop_gimplify_context (NULL);