]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/sese.c
Fix PR46928: handle "A[p] == A[p]" in data dep analysis with p a parameter of the...
[thirdparty/gcc.git] / gcc / sese.c
CommitLineData
2abae5f1 1/* Single entry single exit control flow regions.
c75c517d
SB
2 Copyright (C) 2008, 2009, 2010
3 Free Software Foundation, Inc.
2abae5f1
SP
4 Contributed by Jan Sjodin <jan.sjodin@amd.com> and
5 Sebastian Pop <sebastian.pop@amd.com>.
6
7This file is part of GCC.
8
9GCC is free software; you can redistribute it and/or modify
10it under the terms of the GNU General Public License as published by
11the Free Software Foundation; either version 3, or (at your option)
12any later version.
13
14GCC is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with GCC; see the file COPYING3. If not see
21<http://www.gnu.org/licenses/>. */
22
23#include "config.h"
24#include "system.h"
25#include "coretypes.h"
26#include "tm.h"
27#include "ggc.h"
28#include "tree.h"
29#include "rtl.h"
30#include "basic-block.h"
31#include "diagnostic.h"
cf835838 32#include "tree-pretty-print.h"
2abae5f1 33#include "tree-flow.h"
2abae5f1
SP
34#include "tree-dump.h"
35#include "timevar.h"
36#include "cfgloop.h"
37#include "tree-chrec.h"
38#include "tree-data-ref.h"
39#include "tree-scalar-evolution.h"
40#include "tree-pass.h"
41#include "domwalk.h"
42#include "value-prof.h"
43#include "pointer-set.h"
44#include "gimple.h"
45#include "sese.h"
46
47/* Print to stderr the element ELT. */
48
49static void
50debug_rename_elt (rename_map_elt elt)
51{
52 fprintf (stderr, "(");
53 print_generic_expr (stderr, elt->old_name, 0);
54 fprintf (stderr, ", ");
55 print_generic_expr (stderr, elt->expr, 0);
56 fprintf (stderr, ")\n");
57}
58
59/* Helper function for debug_rename_map. */
60
61static int
62debug_rename_map_1 (void **slot, void *s ATTRIBUTE_UNUSED)
63{
64 struct rename_map_elt_s *entry = (struct rename_map_elt_s *) *slot;
65 debug_rename_elt (entry);
66 return 1;
67}
68
32e68db9 69/* Print to stderr all the elements of RENAME_MAP. */
2abae5f1 70
24e47c76 71DEBUG_FUNCTION void
32e68db9 72debug_rename_map (htab_t rename_map)
2abae5f1 73{
32e68db9 74 htab_traverse (rename_map, debug_rename_map_1, NULL);
2abae5f1
SP
75}
76
77/* Computes a hash function for database element ELT. */
78
79hashval_t
80rename_map_elt_info (const void *elt)
81{
617531d9 82 return SSA_NAME_VERSION (((const struct rename_map_elt_s *) elt)->old_name);
2abae5f1
SP
83}
84
85/* Compares database elements E1 and E2. */
86
87int
88eq_rename_map_elts (const void *e1, const void *e2)
89{
90 const struct rename_map_elt_s *elt1 = (const struct rename_map_elt_s *) e1;
91 const struct rename_map_elt_s *elt2 = (const struct rename_map_elt_s *) e2;
92
93 return (elt1->old_name == elt2->old_name);
94}
95
96\f
97
98/* Print to stderr the element ELT. */
99
100static void
101debug_ivtype_elt (ivtype_map_elt elt)
102{
103 fprintf (stderr, "(%s, ", elt->cloog_iv);
104 print_generic_expr (stderr, elt->type, 0);
105 fprintf (stderr, ")\n");
106}
107
108/* Helper function for debug_ivtype_map. */
109
110static int
111debug_ivtype_map_1 (void **slot, void *s ATTRIBUTE_UNUSED)
112{
113 struct ivtype_map_elt_s *entry = (struct ivtype_map_elt_s *) *slot;
114 debug_ivtype_elt (entry);
115 return 1;
116}
117
118/* Print to stderr all the elements of MAP. */
119
24e47c76 120DEBUG_FUNCTION void
2abae5f1
SP
121debug_ivtype_map (htab_t map)
122{
123 htab_traverse (map, debug_ivtype_map_1, NULL);
124}
125
126/* Computes a hash function for database element ELT. */
127
128hashval_t
129ivtype_map_elt_info (const void *elt)
130{
131 return htab_hash_pointer (((const struct ivtype_map_elt_s *) elt)->cloog_iv);
132}
133
134/* Compares database elements E1 and E2. */
135
136int
137eq_ivtype_map_elts (const void *e1, const void *e2)
138{
139 const struct ivtype_map_elt_s *elt1 = (const struct ivtype_map_elt_s *) e1;
140 const struct ivtype_map_elt_s *elt2 = (const struct ivtype_map_elt_s *) e2;
141
142 return (elt1->cloog_iv == elt2->cloog_iv);
143}
144
145\f
146
147/* Record LOOP as occuring in REGION. */
148
149static void
150sese_record_loop (sese region, loop_p loop)
151{
152 if (sese_contains_loop (region, loop))
153 return;
154
155 bitmap_set_bit (SESE_LOOPS (region), loop->num);
156 VEC_safe_push (loop_p, heap, SESE_LOOP_NEST (region), loop);
157}
158
159/* Build the loop nests contained in REGION. Returns true when the
160 operation was successful. */
161
162void
163build_sese_loop_nests (sese region)
164{
165 unsigned i;
166 basic_block bb;
167 struct loop *loop0, *loop1;
168
169 FOR_EACH_BB (bb)
170 if (bb_in_sese_p (bb, region))
171 {
172 struct loop *loop = bb->loop_father;
173
174 /* Only add loops if they are completely contained in the SCoP. */
175 if (loop->header == bb
176 && bb_in_sese_p (loop->latch, region))
177 sese_record_loop (region, loop);
178 }
179
180 /* Make sure that the loops in the SESE_LOOP_NEST are ordered. It
181 can be the case that an inner loop is inserted before an outer
182 loop. To avoid this, semi-sort once. */
ac47786e 183 FOR_EACH_VEC_ELT (loop_p, SESE_LOOP_NEST (region), i, loop0)
2abae5f1
SP
184 {
185 if (VEC_length (loop_p, SESE_LOOP_NEST (region)) == i + 1)
186 break;
187
188 loop1 = VEC_index (loop_p, SESE_LOOP_NEST (region), i + 1);
189 if (loop0->num > loop1->num)
190 {
191 VEC_replace (loop_p, SESE_LOOP_NEST (region), i, loop1);
192 VEC_replace (loop_p, SESE_LOOP_NEST (region), i + 1, loop0);
193 }
194 }
195}
196
197/* For a USE in BB, if BB is outside REGION, mark the USE in the
198 LIVEOUTS set. */
199
200static void
201sese_build_liveouts_use (sese region, bitmap liveouts, basic_block bb,
202 tree use)
203{
204 unsigned ver;
205 basic_block def_bb;
206
207 if (TREE_CODE (use) != SSA_NAME)
208 return;
209
210 ver = SSA_NAME_VERSION (use);
211 def_bb = gimple_bb (SSA_NAME_DEF_STMT (use));
212
213 if (!def_bb
214 || !bb_in_sese_p (def_bb, region)
215 || bb_in_sese_p (bb, region))
216 return;
217
218 bitmap_set_bit (liveouts, ver);
219}
220
221/* Marks for rewrite all the SSA_NAMES defined in REGION and that are
222 used in BB that is outside of the REGION. */
223
224static void
225sese_build_liveouts_bb (sese region, bitmap liveouts, basic_block bb)
226{
227 gimple_stmt_iterator bsi;
228 edge e;
229 edge_iterator ei;
230 ssa_op_iter iter;
231 use_operand_p use_p;
232
233 FOR_EACH_EDGE (e, ei, bb->succs)
234 for (bsi = gsi_start_phis (e->dest); !gsi_end_p (bsi); gsi_next (&bsi))
235 sese_build_liveouts_use (region, liveouts, bb,
236 PHI_ARG_DEF_FROM_EDGE (gsi_stmt (bsi), e));
237
238 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
a3201927
AO
239 {
240 gimple stmt = gsi_stmt (bsi);
241
242 if (is_gimple_debug (stmt))
243 continue;
244
245 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
246 sese_build_liveouts_use (region, liveouts, bb, USE_FROM_PTR (use_p));
247 }
248}
249
250/* For a USE in BB, return true if BB is outside REGION and it's not
251 in the LIVEOUTS set. */
252
253static bool
254sese_bad_liveouts_use (sese region, bitmap liveouts, basic_block bb,
255 tree use)
256{
257 unsigned ver;
258 basic_block def_bb;
259
260 if (TREE_CODE (use) != SSA_NAME)
261 return false;
262
263 ver = SSA_NAME_VERSION (use);
264
265 /* If it's in liveouts, the variable will get a new PHI node, and
266 the debug use will be properly adjusted. */
267 if (bitmap_bit_p (liveouts, ver))
268 return false;
269
270 def_bb = gimple_bb (SSA_NAME_DEF_STMT (use));
271
272 if (!def_bb
273 || !bb_in_sese_p (def_bb, region)
274 || bb_in_sese_p (bb, region))
275 return false;
276
277 return true;
278}
279
280/* Reset debug stmts that reference SSA_NAMES defined in REGION that
281 are not marked as liveouts. */
282
283static void
284sese_reset_debug_liveouts_bb (sese region, bitmap liveouts, basic_block bb)
285{
286 gimple_stmt_iterator bsi;
287 ssa_op_iter iter;
288 use_operand_p use_p;
289
290 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
291 {
292 gimple stmt = gsi_stmt (bsi);
293
294 if (!is_gimple_debug (stmt))
295 continue;
296
297 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
298 if (sese_bad_liveouts_use (region, liveouts, bb,
299 USE_FROM_PTR (use_p)))
300 {
301 gimple_debug_bind_reset_value (stmt);
302 update_stmt (stmt);
303 break;
304 }
305 }
2abae5f1
SP
306}
307
308/* Build the LIVEOUTS of REGION: the set of variables defined inside
309 and used outside the REGION. */
310
311static void
312sese_build_liveouts (sese region, bitmap liveouts)
313{
314 basic_block bb;
315
316 FOR_EACH_BB (bb)
317 sese_build_liveouts_bb (region, liveouts, bb);
a3201927
AO
318 if (MAY_HAVE_DEBUG_INSNS)
319 FOR_EACH_BB (bb)
320 sese_reset_debug_liveouts_bb (region, liveouts, bb);
2abae5f1
SP
321}
322
323/* Builds a new SESE region from edges ENTRY and EXIT. */
324
325sese
326new_sese (edge entry, edge exit)
327{
328 sese region = XNEW (struct sese_s);
329
330 SESE_ENTRY (region) = entry;
331 SESE_EXIT (region) = exit;
332 SESE_LOOPS (region) = BITMAP_ALLOC (NULL);
333 SESE_LOOP_NEST (region) = VEC_alloc (loop_p, heap, 3);
334 SESE_ADD_PARAMS (region) = true;
335 SESE_PARAMS (region) = VEC_alloc (tree, heap, 3);
2abae5f1
SP
336
337 return region;
338}
339
340/* Deletes REGION. */
341
342void
343free_sese (sese region)
344{
345 if (SESE_LOOPS (region))
346 SESE_LOOPS (region) = BITMAP_ALLOC (NULL);
347
348 VEC_free (tree, heap, SESE_PARAMS (region));
b8698a0f 349 VEC_free (loop_p, heap, SESE_LOOP_NEST (region));
2abae5f1 350
2abae5f1
SP
351 XDELETE (region);
352}
353
354/* Add exit phis for USE on EXIT. */
355
356static void
357sese_add_exit_phis_edge (basic_block exit, tree use, edge false_e, edge true_e)
358{
359 gimple phi = create_phi_node (use, exit);
360
361 create_new_def_for (gimple_phi_result (phi), phi,
362 gimple_phi_result_ptr (phi));
363 add_phi_arg (phi, use, false_e, UNKNOWN_LOCATION);
364 add_phi_arg (phi, use, true_e, UNKNOWN_LOCATION);
365}
366
367/* Insert in the block BB phi nodes for variables defined in REGION
368 and used outside the REGION. The code generation moves REGION in
369 the else clause of an "if (1)" and generates code in the then
370 clause that is at this point empty:
371
372 | if (1)
373 | empty;
374 | else
375 | REGION;
376*/
377
378void
379sese_insert_phis_for_liveouts (sese region, basic_block bb,
380 edge false_e, edge true_e)
381{
382 unsigned i;
383 bitmap_iterator bi;
384 bitmap liveouts = BITMAP_ALLOC (NULL);
385
386 update_ssa (TODO_update_ssa);
387
388 sese_build_liveouts (region, liveouts);
389 EXECUTE_IF_SET_IN_BITMAP (liveouts, 0, i, bi)
390 sese_add_exit_phis_edge (bb, ssa_name (i), false_e, true_e);
391 BITMAP_FREE (liveouts);
392
393 update_ssa (TODO_update_ssa);
394}
395
2e286fd2
SP
396/* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag set. */
397
398edge
399get_true_edge_from_guard_bb (basic_block bb)
400{
401 edge e;
402 edge_iterator ei;
403
404 FOR_EACH_EDGE (e, ei, bb->succs)
405 if (e->flags & EDGE_TRUE_VALUE)
406 return e;
407
408 gcc_unreachable ();
409 return NULL;
410}
411
412/* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag cleared. */
413
414edge
415get_false_edge_from_guard_bb (basic_block bb)
416{
417 edge e;
418 edge_iterator ei;
419
420 FOR_EACH_EDGE (e, ei, bb->succs)
421 if (!(e->flags & EDGE_TRUE_VALUE))
422 return e;
423
424 gcc_unreachable ();
425 return NULL;
426}
427
32e68db9 428/* Returns the expression associated to OLD_NAME in RENAME_MAP. */
2abae5f1
SP
429
430static tree
32e68db9 431get_rename (htab_t rename_map, tree old_name)
2abae5f1
SP
432{
433 struct rename_map_elt_s tmp;
434 PTR *slot;
435
c3382979 436 gcc_assert (TREE_CODE (old_name) == SSA_NAME);
2abae5f1 437 tmp.old_name = old_name;
32e68db9 438 slot = htab_find_slot (rename_map, &tmp, NO_INSERT);
2abae5f1
SP
439
440 if (slot && *slot)
441 return ((rename_map_elt) *slot)->expr;
442
2e286fd2 443 return NULL_TREE;
2abae5f1
SP
444}
445
32e68db9 446/* Register in RENAME_MAP the rename tuple (OLD_NAME, EXPR). */
2abae5f1 447
2e286fd2 448static void
32e68db9 449set_rename (htab_t rename_map, tree old_name, tree expr)
2abae5f1
SP
450{
451 struct rename_map_elt_s tmp;
452 PTR *slot;
453
454 if (old_name == expr)
455 return;
456
457 tmp.old_name = old_name;
32e68db9 458 slot = htab_find_slot (rename_map, &tmp, INSERT);
2abae5f1
SP
459
460 if (!slot)
461 return;
462
463 if (*slot)
464 free (*slot);
465
466 *slot = new_rename_map_elt (old_name, expr);
467}
468
2e286fd2
SP
469/* Renames the scalar uses of the statement COPY, using the
470 substitution map RENAME_MAP, inserting the gimplification code at
471 GSI_TGT, for the translation REGION, with the original copied
472 statement in LOOP, and using the induction variable renaming map
fd66ea1a 473 IV_MAP. Returns true when something has been renamed. */
2abae5f1 474
fd66ea1a 475static bool
2e286fd2
SP
476rename_uses (gimple copy, htab_t rename_map, gimple_stmt_iterator *gsi_tgt,
477 sese region, loop_p loop, VEC (tree, heap) *iv_map)
2abae5f1 478{
2abae5f1 479 use_operand_p use_p;
2e286fd2 480 ssa_op_iter op_iter;
fd66ea1a 481 bool changed = false;
2abae5f1 482
a0dd1502
SP
483 if (is_gimple_debug (copy))
484 {
485 if (gimple_debug_bind_p (copy))
486 gimple_debug_bind_reset_value (copy);
487 else
488 gcc_unreachable ();
489
fd66ea1a 490 return false;
a0dd1502
SP
491 }
492
2e286fd2 493 FOR_EACH_SSA_USE_OPERAND (use_p, copy, op_iter, SSA_OP_ALL_USES)
2abae5f1 494 {
2e286fd2
SP
495 tree old_name = USE_FROM_PTR (use_p);
496 tree new_expr, scev;
2abae5f1
SP
497 gimple_seq stmts;
498
2e286fd2
SP
499 if (TREE_CODE (old_name) != SSA_NAME
500 || !is_gimple_reg (old_name)
501 || SSA_NAME_IS_DEFAULT_DEF (old_name))
2abae5f1
SP
502 continue;
503
fd66ea1a 504 changed = true;
2e286fd2
SP
505 new_expr = get_rename (rename_map, old_name);
506 if (new_expr)
2abae5f1 507 {
2e286fd2
SP
508 tree type_old_name = TREE_TYPE (old_name);
509 tree type_new_expr = TREE_TYPE (new_expr);
a3201927 510
2e286fd2
SP
511 if (type_old_name != type_new_expr
512 || (TREE_CODE (new_expr) != SSA_NAME
513 && is_gimple_reg (old_name)))
a3201927 514 {
a0dd1502 515 tree var = create_tmp_var (type_old_name, "var");
a3201927 516
2e286fd2
SP
517 if (type_old_name != type_new_expr)
518 new_expr = fold_convert (type_old_name, new_expr);
a3201927 519
2e286fd2
SP
520 new_expr = build2 (MODIFY_EXPR, type_old_name, var, new_expr);
521 new_expr = force_gimple_operand (new_expr, &stmts, true, NULL);
522 gsi_insert_seq_before (gsi_tgt, stmts, GSI_SAME_STMT);
523 }
2abae5f1 524
2e286fd2
SP
525 replace_exp (use_p, new_expr);
526 continue;
2abae5f1
SP
527 }
528
2e286fd2 529 scev = scalar_evolution_in_region (region, loop, old_name);
2abae5f1 530
2e286fd2
SP
531 /* At this point we should know the exact scev for each
532 scalar SSA_NAME used in the scop: all the other scalar
533 SSA_NAMEs should have been translated out of SSA using
534 arrays with one element. */
535 gcc_assert (!chrec_contains_undetermined (scev));
2abae5f1 536
2e286fd2 537 new_expr = chrec_apply_map (scev, iv_map);
2abae5f1 538
2e286fd2
SP
539 /* The apply should produce an expression tree containing
540 the uses of the new induction variables. We should be
541 able to use new_expr instead of the old_name in the newly
542 generated loop nest. */
543 gcc_assert (!chrec_contains_undetermined (new_expr)
544 && !tree_contains_chrecs (new_expr, NULL));
b8698a0f 545
2e286fd2 546 /* Replace the old_name with the new_expr. */
6f23dd91 547 new_expr = force_gimple_operand (unshare_expr (new_expr), &stmts,
1c2a7491 548 true, NULL_TREE);
2e286fd2
SP
549 gsi_insert_seq_before (gsi_tgt, stmts, GSI_SAME_STMT);
550 replace_exp (use_p, new_expr);
c8f91fcc 551
fd66ea1a
RG
552 if (TREE_CODE (new_expr) == INTEGER_CST
553 && is_gimple_assign (copy))
c8f91fcc 554 {
c8f91fcc
SP
555 tree rhs = gimple_assign_rhs1 (copy);
556
c8f91fcc
SP
557 if (TREE_CODE (rhs) == ADDR_EXPR)
558 recompute_tree_invariant_for_addr_expr (rhs);
559 }
560
2e286fd2 561 set_rename (rename_map, old_name, new_expr);
2abae5f1 562 }
fd66ea1a
RG
563
564 return changed;
2abae5f1
SP
565}
566
2e286fd2
SP
567/* Duplicates the statements of basic block BB into basic block NEW_BB
568 and compute the new induction variables according to the IV_MAP. */
2abae5f1 569
b8698a0f 570static void
2e286fd2
SP
571graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb,
572 htab_t rename_map,
573 VEC (tree, heap) *iv_map, sese region)
2abae5f1
SP
574{
575 gimple_stmt_iterator gsi, gsi_tgt;
2e286fd2 576 loop_p loop = bb->loop_father;
2abae5f1
SP
577
578 gsi_tgt = gsi_start_bb (new_bb);
579 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
580 {
581 def_operand_p def_p;
582 ssa_op_iter op_iter;
2abae5f1
SP
583 gimple stmt = gsi_stmt (gsi);
584 gimple copy;
2e286fd2
SP
585 tree lhs;
586
587 /* Do not copy labels or conditions. */
588 if (gimple_code (stmt) == GIMPLE_LABEL
589 || gimple_code (stmt) == GIMPLE_COND)
590 continue;
2abae5f1 591
2e286fd2
SP
592 /* Do not copy induction variables. */
593 if (is_gimple_assign (stmt)
594 && (lhs = gimple_assign_lhs (stmt))
595 && TREE_CODE (lhs) == SSA_NAME
596 && is_gimple_reg (lhs)
597 && scev_analyzable_p (lhs, region))
2abae5f1
SP
598 continue;
599
600 /* Create a new copy of STMT and duplicate STMT's virtual
601 operands. */
602 copy = gimple_copy (stmt);
603 gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT);
604 mark_sym_for_renaming (gimple_vop (cfun));
605
1d65f45c 606 maybe_duplicate_eh_stmt (copy, stmt);
2abae5f1
SP
607 gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
608
609 /* Create new names for all the definitions created by COPY and
610 add replacement mappings for each new name. */
611 FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
2e286fd2
SP
612 {
613 tree old_name = DEF_FROM_PTR (def_p);
614 tree new_name = create_new_def_for (old_name, copy, def_p);
32e68db9 615 set_rename (rename_map, old_name, new_name);
2e286fd2
SP
616 }
617
fd66ea1a
RG
618 if (rename_uses (copy, rename_map, &gsi_tgt, region, loop, iv_map))
619 fold_stmt_inplace (copy);
2e286fd2
SP
620
621 update_stmt (copy);
2abae5f1
SP
622 }
623}
624
625/* Copies BB and includes in the copied BB all the statements that can
626 be reached following the use-def chains from the memory accesses,
627 and returns the next edge following this new block. */
b8698a0f 628
2abae5f1
SP
629edge
630copy_bb_and_scalar_dependences (basic_block bb, sese region,
2e286fd2 631 edge next_e, VEC (tree, heap) *iv_map)
2abae5f1
SP
632{
633 basic_block new_bb = split_edge (next_e);
2e286fd2
SP
634 htab_t rename_map = htab_create (10, rename_map_elt_info,
635 eq_rename_map_elts, free);
2abae5f1
SP
636
637 next_e = single_succ_edge (new_bb);
2e286fd2 638 graphite_copy_stmts_from_block (bb, new_bb, rename_map, iv_map, region);
2abae5f1 639 remove_phi_nodes (new_bb);
2e286fd2 640 htab_delete (rename_map);
2abae5f1
SP
641
642 return next_e;
643}
644
645/* Returns the outermost loop in SCOP that contains BB. */
646
647struct loop *
648outermost_loop_in_sese (sese region, basic_block bb)
649{
650 struct loop *nest;
651
652 nest = bb->loop_father;
653 while (loop_outer (nest)
654 && loop_in_sese_p (loop_outer (nest), region))
655 nest = loop_outer (nest);
656
657 return nest;
658}
659
660/* Sets the false region of an IF_REGION to REGION. */
661
662void
663if_region_set_false_region (ifsese if_region, sese region)
664{
665 basic_block condition = if_region_get_condition_block (if_region);
666 edge false_edge = get_false_edge_from_guard_bb (condition);
667 basic_block dummy = false_edge->dest;
668 edge entry_region = SESE_ENTRY (region);
669 edge exit_region = SESE_EXIT (region);
670 basic_block before_region = entry_region->src;
671 basic_block last_in_region = exit_region->src;
672 void **slot = htab_find_slot_with_hash (current_loops->exits, exit_region,
673 htab_hash_pointer (exit_region),
674 NO_INSERT);
675
676 entry_region->flags = false_edge->flags;
677 false_edge->flags = exit_region->flags;
678
679 redirect_edge_pred (entry_region, condition);
680 redirect_edge_pred (exit_region, before_region);
681 redirect_edge_pred (false_edge, last_in_region);
682 redirect_edge_succ (false_edge, single_succ (dummy));
683 delete_basic_block (dummy);
684
685 exit_region->flags = EDGE_FALLTHRU;
686 recompute_all_dominators ();
687
688 SESE_EXIT (region) = false_edge;
8c54631d
SP
689
690 if (if_region->false_region)
691 free (if_region->false_region);
2abae5f1
SP
692 if_region->false_region = region;
693
694 if (slot)
695 {
a9429e29 696 struct loop_exit *loop_exit = ggc_alloc_cleared_loop_exit ();
2abae5f1
SP
697
698 memcpy (loop_exit, *((struct loop_exit **) slot), sizeof (struct loop_exit));
699 htab_clear_slot (current_loops->exits, slot);
700
701 slot = htab_find_slot_with_hash (current_loops->exits, false_edge,
702 htab_hash_pointer (false_edge),
703 INSERT);
704 loop_exit->e = false_edge;
705 *slot = loop_exit;
706 false_edge->src->loop_father->exits->next = loop_exit;
707 }
708}
709
710/* Creates an IFSESE with CONDITION on edge ENTRY. */
711
086058c2 712static ifsese
2abae5f1
SP
713create_if_region_on_edge (edge entry, tree condition)
714{
715 edge e;
716 edge_iterator ei;
8c54631d
SP
717 sese sese_region = XNEW (struct sese_s);
718 sese true_region = XNEW (struct sese_s);
719 sese false_region = XNEW (struct sese_s);
720 ifsese if_region = XNEW (struct ifsese_s);
2abae5f1
SP
721 edge exit = create_empty_if_region_on_edge (entry, condition);
722
723 if_region->region = sese_region;
724 if_region->region->entry = entry;
725 if_region->region->exit = exit;
726
727 FOR_EACH_EDGE (e, ei, entry->dest->succs)
728 {
729 if (e->flags & EDGE_TRUE_VALUE)
730 {
731 true_region->entry = e;
732 true_region->exit = single_succ_edge (e->dest);
733 if_region->true_region = true_region;
734 }
735 else if (e->flags & EDGE_FALSE_VALUE)
736 {
737 false_region->entry = e;
738 false_region->exit = single_succ_edge (e->dest);
739 if_region->false_region = false_region;
740 }
741 }
742
743 return if_region;
744}
745
746/* Moves REGION in a condition expression:
747 | if (1)
748 | ;
749 | else
750 | REGION;
751*/
752
753ifsese
754move_sese_in_condition (sese region)
755{
756 basic_block pred_block = split_edge (SESE_ENTRY (region));
8c54631d 757 ifsese if_region;
2abae5f1
SP
758
759 SESE_ENTRY (region) = single_succ_edge (pred_block);
760 if_region = create_if_region_on_edge (single_pred_edge (pred_block), integer_one_node);
761 if_region_set_false_region (if_region, region);
762
763 return if_region;
764}
765
3c7c0158
SP
766/* Replaces the condition of the IF_REGION with CONDITION:
767 | if (CONDITION)
768 | true_region;
769 | else
770 | false_region;
771*/
772
773void
774set_ifsese_condition (ifsese if_region, tree condition)
775{
776 sese region = if_region->region;
777 edge entry = region->entry;
778 basic_block bb = entry->dest;
779 gimple last = last_stmt (bb);
780 gimple_stmt_iterator gsi = gsi_last_bb (bb);
781 gimple cond_stmt;
782
783 gcc_assert (gimple_code (last) == GIMPLE_COND);
784
785 gsi_remove (&gsi, true);
786 gsi = gsi_last_bb (bb);
787 condition = force_gimple_operand_gsi (&gsi, condition, true, NULL,
788 false, GSI_NEW_STMT);
789 cond_stmt = gimple_build_cond_from_tree (condition, NULL_TREE, NULL_TREE);
790 gsi = gsi_last_bb (bb);
791 gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
792}
793
2abae5f1
SP
794/* Returns the scalar evolution of T in REGION. Every variable that
795 is not defined in the REGION is considered a parameter. */
796
797tree
798scalar_evolution_in_region (sese region, loop_p loop, tree t)
799{
800 gimple def;
801 struct loop *def_loop;
802 basic_block before = block_before_sese (region);
803
804 if (TREE_CODE (t) != SSA_NAME
805 || loop_in_sese_p (loop, region))
806 return instantiate_scev (before, loop,
807 analyze_scalar_evolution (loop, t));
808
809 if (!defined_in_sese_p (t, region))
810 return t;
811
812 def = SSA_NAME_DEF_STMT (t);
813 def_loop = loop_containing_stmt (def);
814
815 if (loop_in_sese_p (def_loop, region))
816 {
817 t = analyze_scalar_evolution (def_loop, t);
818 def_loop = superloop_at_depth (def_loop, loop_depth (loop) + 1);
819 t = compute_overall_effect_of_inner_loop (def_loop, t);
820 return t;
821 }
822 else
823 return instantiate_scev (before, loop, t);
824}