comparison gcc/sese.c @ 67:f6334be47118

update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
author nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
date Tue, 22 Mar 2011 17:18:12 +0900
parents b7f97abdc517
children 04ced10e8804
comparison
equal deleted inserted replaced
65:65488c3d617d 67:f6334be47118
21 <http://www.gnu.org/licenses/>. */ 21 <http://www.gnu.org/licenses/>. */
22 22
23 #include "config.h" 23 #include "config.h"
24 #include "system.h" 24 #include "system.h"
25 #include "coretypes.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"
32 #include "tree-pretty-print.h" 26 #include "tree-pretty-print.h"
33 #include "tree-flow.h" 27 #include "tree-flow.h"
34 #include "toplev.h"
35 #include "tree-dump.h"
36 #include "timevar.h"
37 #include "cfgloop.h" 28 #include "cfgloop.h"
38 #include "tree-chrec.h" 29 #include "tree-chrec.h"
39 #include "tree-data-ref.h" 30 #include "tree-data-ref.h"
40 #include "tree-scalar-evolution.h" 31 #include "tree-scalar-evolution.h"
41 #include "tree-pass.h" 32 #include "tree-pass.h"
42 #include "domwalk.h"
43 #include "value-prof.h" 33 #include "value-prof.h"
44 #include "pointer-set.h"
45 #include "gimple.h"
46 #include "sese.h" 34 #include "sese.h"
47 35
48 /* Print to stderr the element ELT. */ 36 /* Print to stderr the element ELT. */
49 37
50 static void 38 static void
65 struct rename_map_elt_s *entry = (struct rename_map_elt_s *) *slot; 53 struct rename_map_elt_s *entry = (struct rename_map_elt_s *) *slot;
66 debug_rename_elt (entry); 54 debug_rename_elt (entry);
67 return 1; 55 return 1;
68 } 56 }
69 57
70 /* Print to stderr all the elements of MAP. */ 58 /* Print to stderr all the elements of RENAME_MAP. */
71 59
72 void 60 DEBUG_FUNCTION void
73 debug_rename_map (htab_t map) 61 debug_rename_map (htab_t rename_map)
74 { 62 {
75 htab_traverse (map, debug_rename_map_1, NULL); 63 htab_traverse (rename_map, debug_rename_map_1, NULL);
76 } 64 }
77 65
78 /* Computes a hash function for database element ELT. */ 66 /* Computes a hash function for database element ELT. */
79 67
80 hashval_t 68 hashval_t
116 return 1; 104 return 1;
117 } 105 }
118 106
119 /* Print to stderr all the elements of MAP. */ 107 /* Print to stderr all the elements of MAP. */
120 108
121 void 109 DEBUG_FUNCTION void
122 debug_ivtype_map (htab_t map) 110 debug_ivtype_map (htab_t map)
123 { 111 {
124 htab_traverse (map, debug_ivtype_map_1, NULL); 112 htab_traverse (map, debug_ivtype_map_1, NULL);
125 } 113 }
126 114
179 } 167 }
180 168
181 /* Make sure that the loops in the SESE_LOOP_NEST are ordered. It 169 /* Make sure that the loops in the SESE_LOOP_NEST are ordered. It
182 can be the case that an inner loop is inserted before an outer 170 can be the case that an inner loop is inserted before an outer
183 loop. To avoid this, semi-sort once. */ 171 loop. To avoid this, semi-sort once. */
184 for (i = 0; VEC_iterate (loop_p, SESE_LOOP_NEST (region), i, loop0); i++) 172 FOR_EACH_VEC_ELT (loop_p, SESE_LOOP_NEST (region), i, loop0)
185 { 173 {
186 if (VEC_length (loop_p, SESE_LOOP_NEST (region)) == i + 1) 174 if (VEC_length (loop_p, SESE_LOOP_NEST (region)) == i + 1)
187 break; 175 break;
188 176
189 loop1 = VEC_index (loop_p, SESE_LOOP_NEST (region), i + 1); 177 loop1 = VEC_index (loop_p, SESE_LOOP_NEST (region), i + 1);
392 BITMAP_FREE (liveouts); 380 BITMAP_FREE (liveouts);
393 381
394 update_ssa (TODO_update_ssa); 382 update_ssa (TODO_update_ssa);
395 } 383 }
396 384
397 /* Get the definition of NAME before the SESE. Keep track of the
398 basic blocks that have been VISITED in a bitmap. */
399
400 static tree
401 get_vdef_before_sese (sese region, tree name, sbitmap visited)
402 {
403 unsigned i;
404 gimple stmt = SSA_NAME_DEF_STMT (name);
405 basic_block def_bb = gimple_bb (stmt);
406
407 if (!def_bb || !bb_in_sese_p (def_bb, region))
408 return name;
409
410 if (TEST_BIT (visited, def_bb->index))
411 return NULL_TREE;
412
413 SET_BIT (visited, def_bb->index);
414
415 switch (gimple_code (stmt))
416 {
417 case GIMPLE_PHI:
418 for (i = 0; i < gimple_phi_num_args (stmt); i++)
419 {
420 tree arg = gimple_phi_arg_def (stmt, i);
421 tree res;
422
423 if (gimple_bb (SSA_NAME_DEF_STMT (arg))
424 && def_bb->index == gimple_bb (SSA_NAME_DEF_STMT (arg))->index)
425 continue;
426
427 res = get_vdef_before_sese (region, arg, visited);
428 if (res)
429 return res;
430 }
431 return NULL_TREE;
432
433 case GIMPLE_ASSIGN:
434 case GIMPLE_CALL:
435 {
436 use_operand_p use_p = gimple_vuse_op (stmt);
437 tree use = USE_FROM_PTR (use_p);
438
439 if (def_bb->index == gimple_bb (SSA_NAME_DEF_STMT (use))->index)
440 RESET_BIT (visited, def_bb->index);
441
442 return get_vdef_before_sese (region, use, visited);
443 }
444
445 default:
446 return NULL_TREE;
447 }
448 }
449
450 /* Adjust a virtual phi node PHI that is placed at the end of the
451 generated code for SCOP:
452
453 | if (1)
454 | generated code from REGION;
455 | else
456 | REGION;
457
458 The FALSE_E edge comes from the original code, TRUE_E edge comes
459 from the code generated for the SCOP. */
460
461 static void
462 sese_adjust_vphi (sese region, gimple phi, edge true_e)
463 {
464 unsigned i;
465
466 gcc_assert (gimple_phi_num_args (phi) == 2);
467
468 for (i = 0; i < gimple_phi_num_args (phi); i++)
469 if (gimple_phi_arg_edge (phi, i) == true_e)
470 {
471 tree true_arg, false_arg, before_scop_arg;
472 sbitmap visited;
473
474 true_arg = gimple_phi_arg_def (phi, i);
475 if (!SSA_NAME_IS_DEFAULT_DEF (true_arg))
476 return;
477
478 false_arg = gimple_phi_arg_def (phi, i == 0 ? 1 : 0);
479 if (SSA_NAME_IS_DEFAULT_DEF (false_arg))
480 return;
481
482 visited = sbitmap_alloc (last_basic_block);
483 sbitmap_zero (visited);
484 before_scop_arg = get_vdef_before_sese (region, false_arg, visited);
485 gcc_assert (before_scop_arg != NULL_TREE);
486 SET_PHI_ARG_DEF (phi, i, before_scop_arg);
487 sbitmap_free (visited);
488 }
489 }
490
491 /* Returns the expression associated to OLD_NAME in MAP. */
492
493 static tree
494 get_rename (htab_t map, tree old_name)
495 {
496 struct rename_map_elt_s tmp;
497 PTR *slot;
498
499 gcc_assert (TREE_CODE (old_name) == SSA_NAME);
500 tmp.old_name = old_name;
501 slot = htab_find_slot (map, &tmp, NO_INSERT);
502
503 if (slot && *slot)
504 return ((rename_map_elt) *slot)->expr;
505
506 return old_name;
507 }
508
509 /* Register in MAP the rename tuple (OLD_NAME, EXPR). */
510
511 void
512 set_rename (htab_t map, tree old_name, tree expr)
513 {
514 struct rename_map_elt_s tmp;
515 PTR *slot;
516
517 if (old_name == expr)
518 return;
519
520 tmp.old_name = old_name;
521 slot = htab_find_slot (map, &tmp, INSERT);
522
523 if (!slot)
524 return;
525
526 if (*slot)
527 free (*slot);
528
529 *slot = new_rename_map_elt (old_name, expr);
530 }
531
532 /* Renames the expression T following the tuples (OLD_NAME, EXPR) in
533 the rename map M. Returns the expression T after renaming. */
534
535 static tree
536 rename_variables_in_expr (htab_t m, tree t)
537 {
538 if (!t)
539 return t;
540
541 if (TREE_CODE (t) == SSA_NAME)
542 return get_rename (m, t);
543
544 switch (TREE_CODE_LENGTH (TREE_CODE (t)))
545 {
546 case 3:
547 TREE_OPERAND (t, 2) = rename_variables_in_expr (m, TREE_OPERAND (t, 2));
548
549 case 2:
550 TREE_OPERAND (t, 1) = rename_variables_in_expr (m, TREE_OPERAND (t, 1));
551
552 case 1:
553 TREE_OPERAND (t, 0) = rename_variables_in_expr (m, TREE_OPERAND (t, 0));
554
555 default:
556 return t;
557 }
558 }
559
560 /* Renames all the loop->nb_iterations expressions following the
561 tuples (OLD_NAME, EXPR) in RENAME_MAP. */
562
563 void
564 rename_nb_iterations (htab_t rename_map)
565 {
566 loop_iterator li;
567 struct loop *loop;
568
569 FOR_EACH_LOOP (li, loop, 0)
570 loop->nb_iterations = rename_variables_in_expr (rename_map,
571 loop->nb_iterations);
572 }
573
574 /* Renames all the parameters of SESE following the tuples (OLD_NAME,
575 EXPR) in RENAME_MAP. */
576
577 void
578 rename_sese_parameters (htab_t rename_map, sese region)
579 {
580 int i;
581 tree p;
582
583 for (i = 0; VEC_iterate (tree, SESE_PARAMS (region), i, p); i++)
584 VEC_replace (tree, SESE_PARAMS (region), i,
585 rename_variables_in_expr (rename_map, p));
586 }
587
588 /* Adjusts the phi nodes in the block BB for variables defined in
589 SCOP_REGION and used outside the SCOP_REGION. The code generation
590 moves SCOP_REGION in the else clause of an "if (1)" and generates
591 code in the then clause:
592
593 | if (1)
594 | generated code from REGION;
595 | else
596 | REGION;
597
598 To adjust the phi nodes after the condition, the RENAME_MAP is
599 used. */
600
601 void
602 sese_adjust_liveout_phis (sese region, htab_t rename_map, basic_block bb,
603 edge false_e, edge true_e)
604 {
605 gimple_stmt_iterator si;
606
607 for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
608 {
609 unsigned i;
610 unsigned false_i = 0;
611 gimple phi = gsi_stmt (si);
612 tree res = gimple_phi_result (phi);
613
614 if (!is_gimple_reg (res))
615 {
616 sese_adjust_vphi (region, phi, true_e);
617 continue;
618 }
619
620 for (i = 0; i < gimple_phi_num_args (phi); i++)
621 if (gimple_phi_arg_edge (phi, i) == false_e)
622 {
623 false_i = i;
624 break;
625 }
626
627 for (i = 0; i < gimple_phi_num_args (phi); i++)
628 if (gimple_phi_arg_edge (phi, i) == true_e)
629 {
630 tree old_name = gimple_phi_arg_def (phi, false_i);
631 tree expr = get_rename (rename_map, old_name);
632 gimple_seq stmts;
633
634 gcc_assert (old_name != expr);
635
636 if (TREE_CODE (expr) != SSA_NAME
637 && is_gimple_reg (old_name))
638 {
639 tree type = TREE_TYPE (old_name);
640 tree var = create_tmp_var (type, "var");
641
642 expr = build2 (MODIFY_EXPR, type, var, expr);
643 expr = force_gimple_operand (expr, &stmts, true, NULL);
644 gsi_insert_seq_on_edge_immediate (true_e, stmts);
645 }
646
647 SET_PHI_ARG_DEF (phi, i, expr);
648 set_rename (rename_map, old_name, res);
649 }
650 }
651 }
652
653 /* Rename the SSA_NAMEs used in STMT and that appear in MAP. */
654
655 static void
656 rename_variables_in_stmt (gimple stmt, htab_t map, gimple_stmt_iterator *insert_gsi)
657 {
658 ssa_op_iter iter;
659 use_operand_p use_p;
660
661 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
662 {
663 tree use = USE_FROM_PTR (use_p);
664 tree expr, type_use, type_expr;
665 gimple_seq stmts;
666
667 if (TREE_CODE (use) != SSA_NAME)
668 continue;
669
670 expr = get_rename (map, use);
671 if (use == expr)
672 continue;
673
674 type_use = TREE_TYPE (use);
675 type_expr = TREE_TYPE (expr);
676
677 if (type_use != type_expr
678 || (TREE_CODE (expr) != SSA_NAME
679 && is_gimple_reg (use)))
680 {
681 tree var;
682
683 if (is_gimple_debug (stmt))
684 {
685 if (gimple_debug_bind_p (stmt))
686 gimple_debug_bind_reset_value (stmt);
687 else
688 gcc_unreachable ();
689
690 break;
691 }
692
693 var = create_tmp_var (type_use, "var");
694
695 if (type_use != type_expr)
696 expr = fold_convert (type_use, expr);
697
698 expr = build2 (MODIFY_EXPR, type_use, var, expr);
699 expr = force_gimple_operand (expr, &stmts, true, NULL);
700 gsi_insert_seq_before (insert_gsi, stmts, GSI_SAME_STMT);
701 }
702
703 replace_exp (use_p, expr);
704 }
705
706 update_stmt (stmt);
707 }
708
709 /* Returns true if NAME is a parameter of SESE. */
710
711 static bool
712 is_parameter (sese region, tree name)
713 {
714 int i;
715 tree p;
716
717 for (i = 0; VEC_iterate (tree, SESE_PARAMS (region), i, p); i++)
718 if (p == name)
719 return true;
720
721 return false;
722 }
723
724 /* Returns true if NAME is an induction variable. */
725
726 static bool
727 is_iv (tree name)
728 {
729 return gimple_code (SSA_NAME_DEF_STMT (name)) == GIMPLE_PHI;
730 }
731
732 static void expand_scalar_variables_stmt (gimple, basic_block, sese,
733 htab_t, gimple_stmt_iterator *);
734 static tree
735 expand_scalar_variables_expr (tree, tree, enum tree_code, tree, basic_block,
736 sese, htab_t, gimple_stmt_iterator *);
737
738 static tree
739 expand_scalar_variables_call (gimple stmt, basic_block bb, sese region,
740 htab_t map, gimple_stmt_iterator *gsi)
741 {
742 int i, nargs = gimple_call_num_args (stmt);
743 VEC (tree, gc) *args = VEC_alloc (tree, gc, nargs);
744 tree fn_type = TREE_TYPE (gimple_call_fn (stmt));
745 tree fn = gimple_call_fndecl (stmt);
746 tree call_expr, var, lhs;
747 gimple call;
748
749 for (i = 0; i < nargs; i++)
750 {
751 tree arg = gimple_call_arg (stmt, i);
752 tree t = TREE_TYPE (arg);
753
754 var = create_tmp_var (t, "var");
755 arg = expand_scalar_variables_expr (t, arg, TREE_CODE (arg), NULL,
756 bb, region, map, gsi);
757 arg = build2 (MODIFY_EXPR, t, var, arg);
758 arg = force_gimple_operand_gsi (gsi, arg, true, NULL,
759 true, GSI_SAME_STMT);
760 VEC_quick_push (tree, args, arg);
761 }
762
763 lhs = gimple_call_lhs (stmt);
764 var = create_tmp_var (TREE_TYPE (lhs), "var");
765 call_expr = build_call_vec (fn_type, fn, args);
766 call = gimple_build_call_from_tree (call_expr);
767 var = make_ssa_name (var, call);
768 gimple_call_set_lhs (call, var);
769 gsi_insert_before (gsi, call, GSI_SAME_STMT);
770
771 return var;
772 }
773
774 /* Copies at GSI all the scalar computations on which the ssa_name OP0
775 depends on in the SESE: these are all the scalar variables used in
776 the definition of OP0, that are defined outside BB and still in the
777 SESE, i.e. not a parameter of the SESE. The expression that is
778 returned contains only induction variables from the generated code:
779 MAP contains the induction variables renaming mapping, and is used
780 to translate the names of induction variables. */
781
782 static tree
783 expand_scalar_variables_ssa_name (tree type, tree op0, basic_block bb,
784 sese region, htab_t map,
785 gimple_stmt_iterator *gsi)
786 {
787 gimple def_stmt;
788 tree new_op;
789
790 if (is_parameter (region, op0)
791 || is_iv (op0))
792 return fold_convert (type, get_rename (map, op0));
793
794 def_stmt = SSA_NAME_DEF_STMT (op0);
795
796 /* Check whether we already have a rename for OP0. */
797 new_op = get_rename (map, op0);
798
799 if (new_op != op0
800 && gimple_bb (SSA_NAME_DEF_STMT (new_op)) == bb)
801 return fold_convert (type, new_op);
802
803 if (gimple_bb (def_stmt) == bb)
804 {
805 /* If the defining statement is in the basic block already
806 we do not need to create a new expression for it, we
807 only need to ensure its operands are expanded. */
808 expand_scalar_variables_stmt (def_stmt, bb, region, map, gsi);
809 return fold_convert (type, new_op);
810 }
811 else
812 {
813 if (!gimple_bb (def_stmt)
814 || !bb_in_sese_p (gimple_bb (def_stmt), region))
815 return fold_convert (type, new_op);
816
817 switch (gimple_code (def_stmt))
818 {
819 case GIMPLE_ASSIGN:
820 {
821 tree var0 = gimple_assign_rhs1 (def_stmt);
822 enum tree_code subcode = gimple_assign_rhs_code (def_stmt);
823 tree var1 = gimple_assign_rhs2 (def_stmt);
824 tree type = gimple_expr_type (def_stmt);
825
826 return expand_scalar_variables_expr (type, var0, subcode, var1, bb,
827 region, map, gsi);
828 }
829
830 case GIMPLE_CALL:
831 return expand_scalar_variables_call (def_stmt, bb, region, map, gsi);
832
833 default:
834 gcc_unreachable ();
835 return new_op;
836 }
837 }
838 }
839
840 /* Copies at GSI all the scalar computations on which the expression
841 OP0 CODE OP1 depends on in the SESE: these are all the scalar
842 variables used in OP0 and OP1, defined outside BB and still defined
843 in the SESE, i.e. not a parameter of the SESE. The expression that
844 is returned contains only induction variables from the generated
845 code: MAP contains the induction variables renaming mapping, and is
846 used to translate the names of induction variables. */
847
848 static tree
849 expand_scalar_variables_expr (tree type, tree op0, enum tree_code code,
850 tree op1, basic_block bb, sese region,
851 htab_t map, gimple_stmt_iterator *gsi)
852 {
853 if (TREE_CODE_CLASS (code) == tcc_constant
854 || TREE_CODE_CLASS (code) == tcc_declaration)
855 return op0;
856
857 /* For data references we have to duplicate also its memory
858 indexing. */
859 if (TREE_CODE_CLASS (code) == tcc_reference)
860 {
861 switch (code)
862 {
863 case REALPART_EXPR:
864 case IMAGPART_EXPR:
865 {
866 tree op = TREE_OPERAND (op0, 0);
867 tree res = expand_scalar_variables_expr
868 (type, op, TREE_CODE (op), NULL, bb, region, map, gsi);
869 return build1 (code, type, res);
870 }
871
872 case INDIRECT_REF:
873 {
874 tree old_name = TREE_OPERAND (op0, 0);
875 tree expr = expand_scalar_variables_ssa_name
876 (type, old_name, bb, region, map, gsi);
877
878 if (TREE_CODE (expr) != SSA_NAME
879 && is_gimple_reg (old_name))
880 {
881 tree type = TREE_TYPE (old_name);
882 tree var = create_tmp_var (type, "var");
883
884 expr = build2 (MODIFY_EXPR, type, var, expr);
885 expr = force_gimple_operand_gsi (gsi, expr, true, NULL,
886 true, GSI_SAME_STMT);
887 }
888
889 return fold_build1 (code, type, expr);
890 }
891
892 case ARRAY_REF:
893 {
894 tree op00 = TREE_OPERAND (op0, 0);
895 tree op01 = TREE_OPERAND (op0, 1);
896 tree op02 = TREE_OPERAND (op0, 2);
897 tree op03 = TREE_OPERAND (op0, 3);
898 tree base = expand_scalar_variables_expr
899 (TREE_TYPE (op00), op00, TREE_CODE (op00), NULL, bb, region,
900 map, gsi);
901 tree subscript = expand_scalar_variables_expr
902 (TREE_TYPE (op01), op01, TREE_CODE (op01), NULL, bb, region,
903 map, gsi);
904
905 return build4 (ARRAY_REF, type, base, subscript, op02, op03);
906 }
907
908 case COMPONENT_REF:
909 return op0;
910
911 default:
912 /* The above cases should catch everything. */
913 gcc_unreachable ();
914 }
915 }
916
917 if (TREE_CODE_CLASS (code) == tcc_unary)
918 {
919 tree op0_type = TREE_TYPE (op0);
920 enum tree_code op0_code = TREE_CODE (op0);
921 tree op0_expr = expand_scalar_variables_expr (op0_type, op0, op0_code,
922 NULL, bb, region, map, gsi);
923
924 return fold_build1 (code, type, op0_expr);
925 }
926
927 if (TREE_CODE_CLASS (code) == tcc_binary
928 || TREE_CODE_CLASS (code) == tcc_comparison)
929 {
930 tree op0_type = TREE_TYPE (op0);
931 enum tree_code op0_code = TREE_CODE (op0);
932 tree op0_expr = expand_scalar_variables_expr (op0_type, op0, op0_code,
933 NULL, bb, region, map, gsi);
934 tree op1_type = TREE_TYPE (op1);
935 enum tree_code op1_code = TREE_CODE (op1);
936 tree op1_expr = expand_scalar_variables_expr (op1_type, op1, op1_code,
937 NULL, bb, region, map, gsi);
938
939 return fold_build2 (code, type, op0_expr, op1_expr);
940 }
941
942 if (code == SSA_NAME)
943 return expand_scalar_variables_ssa_name (type, op0, bb, region, map, gsi);
944
945 if (code == ADDR_EXPR)
946 {
947 tree op00 = TREE_OPERAND (op0, 0);
948
949 if (handled_component_p (op00)
950 && TREE_CODE (op00) == ARRAY_REF)
951 {
952 tree e = expand_scalar_variables_expr (TREE_TYPE (op00), op00,
953 TREE_CODE (op00),
954 NULL, bb, region, map, gsi);
955 return fold_build1 (code, TREE_TYPE (op0), e);
956 }
957
958 return op0;
959 }
960
961 gcc_unreachable ();
962 return NULL;
963 }
964
965 /* Copies at the beginning of BB all the scalar computations on which
966 STMT depends on in the SESE: these are all the scalar variables used
967 in STMT, defined outside BB and still defined in the SESE, i.e. not a
968 parameter of the SESE. The expression that is returned contains
969 only induction variables from the generated code: MAP contains the
970 induction variables renaming mapping, and is used to translate the
971 names of induction variables. */
972
973 static void
974 expand_scalar_variables_stmt (gimple stmt, basic_block bb, sese region,
975 htab_t map, gimple_stmt_iterator *gsi)
976 {
977 ssa_op_iter iter;
978 use_operand_p use_p;
979
980 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
981 {
982 tree use = USE_FROM_PTR (use_p);
983 tree type = TREE_TYPE (use);
984 enum tree_code code = TREE_CODE (use);
985 tree use_expr;
986
987 if (!is_gimple_reg (use))
988 continue;
989
990 /* Don't expand USE if we already have a rename for it. */
991 use_expr = get_rename (map, use);
992 if (use_expr != use)
993 continue;
994
995 use_expr = expand_scalar_variables_expr (type, use, code, NULL, bb,
996 region, map, gsi);
997 use_expr = fold_convert (type, use_expr);
998
999 if (use_expr == use)
1000 continue;
1001
1002 if (is_gimple_debug (stmt))
1003 {
1004 if (gimple_debug_bind_p (stmt))
1005 gimple_debug_bind_reset_value (stmt);
1006 else
1007 gcc_unreachable ();
1008
1009 break;
1010 }
1011
1012 if (TREE_CODE (use_expr) != SSA_NAME)
1013 {
1014 tree var = create_tmp_var (type, "var");
1015
1016 use_expr = build2 (MODIFY_EXPR, type, var, use_expr);
1017 use_expr = force_gimple_operand_gsi (gsi, use_expr, true, NULL,
1018 true, GSI_SAME_STMT);
1019 }
1020
1021 replace_exp (use_p, use_expr);
1022 }
1023
1024 update_stmt (stmt);
1025 }
1026
1027 /* Copies at the beginning of BB all the scalar computations on which
1028 BB depends on in the SESE: these are all the scalar variables used
1029 in BB, defined outside BB and still defined in the SESE, i.e. not a
1030 parameter of the SESE. The expression that is returned contains
1031 only induction variables from the generated code: MAP contains the
1032 induction variables renaming mapping, and is used to translate the
1033 names of induction variables. */
1034
1035 static void
1036 expand_scalar_variables (basic_block bb, sese region, htab_t map)
1037 {
1038 gimple_stmt_iterator gsi;
1039
1040 for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi);)
1041 {
1042 gimple stmt = gsi_stmt (gsi);
1043 expand_scalar_variables_stmt (stmt, bb, region, map, &gsi);
1044 gsi_next (&gsi);
1045 }
1046 }
1047
1048 /* Rename all the SSA_NAMEs from block BB according to the MAP. */
1049
1050 static void
1051 rename_variables (basic_block bb, htab_t map)
1052 {
1053 gimple_stmt_iterator gsi;
1054 gimple_stmt_iterator insert_gsi = gsi_start_bb (bb);
1055
1056 for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1057 rename_variables_in_stmt (gsi_stmt (gsi), map, &insert_gsi);
1058 }
1059
1060 /* Remove condition from BB. */
1061
1062 static void
1063 remove_condition (basic_block bb)
1064 {
1065 gimple last = last_stmt (bb);
1066
1067 if (last && gimple_code (last) == GIMPLE_COND)
1068 {
1069 gimple_stmt_iterator gsi = gsi_last_bb (bb);
1070 gsi_remove (&gsi, true);
1071 }
1072 }
1073
1074 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag set. */ 385 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag set. */
1075 386
1076 edge 387 edge
1077 get_true_edge_from_guard_bb (basic_block bb) 388 get_true_edge_from_guard_bb (basic_block bb)
1078 { 389 {
1101 412
1102 gcc_unreachable (); 413 gcc_unreachable ();
1103 return NULL; 414 return NULL;
1104 } 415 }
1105 416
1106 /* Returns true when NAME is defined in LOOP. */ 417 /* Returns the expression associated to OLD_NAME in RENAME_MAP. */
418
419 static tree
420 get_rename (htab_t rename_map, tree old_name)
421 {
422 struct rename_map_elt_s tmp;
423 PTR *slot;
424
425 gcc_assert (TREE_CODE (old_name) == SSA_NAME);
426 tmp.old_name = old_name;
427 slot = htab_find_slot (rename_map, &tmp, NO_INSERT);
428
429 if (slot && *slot)
430 return ((rename_map_elt) *slot)->expr;
431
432 return NULL_TREE;
433 }
434
435 /* Register in RENAME_MAP the rename tuple (OLD_NAME, EXPR). */
436
437 static void
438 set_rename (htab_t rename_map, tree old_name, tree expr)
439 {
440 struct rename_map_elt_s tmp;
441 PTR *slot;
442
443 if (old_name == expr)
444 return;
445
446 tmp.old_name = old_name;
447 slot = htab_find_slot (rename_map, &tmp, INSERT);
448
449 if (!slot)
450 return;
451
452 if (*slot)
453 free (*slot);
454
455 *slot = new_rename_map_elt (old_name, expr);
456 }
457
458 /* Renames the scalar uses of the statement COPY, using the
459 substitution map RENAME_MAP, inserting the gimplification code at
460 GSI_TGT, for the translation REGION, with the original copied
461 statement in LOOP, and using the induction variable renaming map
462 IV_MAP. Returns true when something has been renamed. */
1107 463
1108 static bool 464 static bool
1109 name_defined_in_loop_p (tree name, loop_p loop) 465 rename_uses (gimple copy, htab_t rename_map, gimple_stmt_iterator *gsi_tgt,
1110 { 466 sese region, loop_p loop, VEC (tree, heap) *iv_map)
1111 return !SSA_NAME_IS_DEFAULT_DEF (name) 467 {
1112 && gimple_bb (SSA_NAME_DEF_STMT (name))->loop_father == loop; 468 use_operand_p use_p;
1113 } 469 ssa_op_iter op_iter;
1114 470 bool changed = false;
1115 /* Returns true when EXPR contains SSA_NAMEs defined in LOOP. */ 471
1116 472 if (is_gimple_debug (copy))
1117 static bool
1118 expr_defined_in_loop_p (tree expr, loop_p loop)
1119 {
1120 switch (TREE_CODE_LENGTH (TREE_CODE (expr)))
1121 { 473 {
1122 case 3: 474 if (gimple_debug_bind_p (copy))
1123 return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop) 475 gimple_debug_bind_reset_value (copy);
1124 || expr_defined_in_loop_p (TREE_OPERAND (expr, 1), loop) 476 else
1125 || expr_defined_in_loop_p (TREE_OPERAND (expr, 2), loop); 477 gcc_unreachable ();
1126 478
1127 case 2:
1128 return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop)
1129 || expr_defined_in_loop_p (TREE_OPERAND (expr, 1), loop);
1130
1131 case 1:
1132 return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop);
1133
1134 case 0:
1135 return TREE_CODE (expr) == SSA_NAME
1136 && name_defined_in_loop_p (expr, loop);
1137
1138 default:
1139 return false; 479 return false;
1140 } 480 }
1141 } 481
1142 482 FOR_EACH_SSA_USE_OPERAND (use_p, copy, op_iter, SSA_OP_ALL_USES)
1143 /* Returns the gimple statement that uses NAME outside the loop it is
1144 defined in, returns NULL if there is no such loop close phi node.
1145 An invariant of the loop closed SSA form is that the only use of a
1146 variable, outside the loop it is defined in, is in the loop close
1147 phi node that just follows the loop. */
1148
1149 static gimple
1150 alive_after_loop (tree name)
1151 {
1152 use_operand_p use_p;
1153 imm_use_iterator imm_iter;
1154 loop_p loop = gimple_bb (SSA_NAME_DEF_STMT (name))->loop_father;
1155
1156 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, name)
1157 { 483 {
1158 gimple stmt = USE_STMT (use_p); 484 tree old_name = USE_FROM_PTR (use_p);
1159 485 tree new_expr, scev;
1160 if (gimple_code (stmt) == GIMPLE_PHI 486 gimple_seq stmts;
1161 && gimple_bb (stmt)->loop_father != loop) 487
1162 return stmt; 488 if (TREE_CODE (old_name) != SSA_NAME
489 || !is_gimple_reg (old_name)
490 || SSA_NAME_IS_DEFAULT_DEF (old_name))
491 continue;
492
493 changed = true;
494 new_expr = get_rename (rename_map, old_name);
495 if (new_expr)
496 {
497 tree type_old_name = TREE_TYPE (old_name);
498 tree type_new_expr = TREE_TYPE (new_expr);
499
500 if (type_old_name != type_new_expr
501 || (TREE_CODE (new_expr) != SSA_NAME
502 && is_gimple_reg (old_name)))
503 {
504 tree var = create_tmp_var (type_old_name, "var");
505
506 if (type_old_name != type_new_expr)
507 new_expr = fold_convert (type_old_name, new_expr);
508
509 new_expr = build2 (MODIFY_EXPR, type_old_name, var, new_expr);
510 new_expr = force_gimple_operand (new_expr, &stmts, true, NULL);
511 gsi_insert_seq_before (gsi_tgt, stmts, GSI_SAME_STMT);
512 }
513
514 replace_exp (use_p, new_expr);
515 continue;
516 }
517
518 scev = scalar_evolution_in_region (region, loop, old_name);
519
520 /* At this point we should know the exact scev for each
521 scalar SSA_NAME used in the scop: all the other scalar
522 SSA_NAMEs should have been translated out of SSA using
523 arrays with one element. */
524 gcc_assert (!chrec_contains_undetermined (scev));
525
526 new_expr = chrec_apply_map (scev, iv_map);
527
528 /* The apply should produce an expression tree containing
529 the uses of the new induction variables. We should be
530 able to use new_expr instead of the old_name in the newly
531 generated loop nest. */
532 gcc_assert (!chrec_contains_undetermined (new_expr)
533 && !tree_contains_chrecs (new_expr, NULL));
534
535 /* Replace the old_name with the new_expr. */
536 new_expr = force_gimple_operand (unshare_expr (new_expr), &stmts,
537 true, NULL_TREE);
538 gsi_insert_seq_before (gsi_tgt, stmts, GSI_SAME_STMT);
539 replace_exp (use_p, new_expr);
540
541 if (TREE_CODE (new_expr) == INTEGER_CST
542 && is_gimple_assign (copy))
543 {
544 tree rhs = gimple_assign_rhs1 (copy);
545
546 if (TREE_CODE (rhs) == ADDR_EXPR)
547 recompute_tree_invariant_for_addr_expr (rhs);
548 }
549
550 set_rename (rename_map, old_name, new_expr);
1163 } 551 }
1164 552
1165 return NULL; 553 return changed;
1166 } 554 }
1167 555
1168 /* Return true if a close phi has not yet been inserted for the use of 556 /* Duplicates the statements of basic block BB into basic block NEW_BB
1169 variable NAME on the single exit of LOOP. */ 557 and compute the new induction variables according to the IV_MAP. */
1170 558
1171 static bool 559 static void
1172 close_phi_not_yet_inserted_p (loop_p loop, tree name) 560 graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb,
1173 { 561 htab_t rename_map,
1174 gimple_stmt_iterator psi; 562 VEC (tree, heap) *iv_map, sese region)
1175 basic_block bb = single_exit (loop)->dest;
1176
1177 for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi))
1178 if (gimple_phi_arg_def (gsi_stmt (psi), 0) == name)
1179 return false;
1180
1181 return true;
1182 }
1183
1184 /* A structure for passing parameters to add_loop_exit_phis. */
1185
1186 typedef struct alep {
1187 loop_p loop;
1188 VEC (rename_map_elt, heap) *new_renames;
1189 } *alep_p;
1190
1191 /* Helper function for htab_traverse in insert_loop_close_phis. */
1192
1193 static int
1194 add_loop_exit_phis (void **slot, void *data)
1195 {
1196 struct rename_map_elt_s *entry;
1197 alep_p a;
1198 loop_p loop;
1199 tree expr, new_name, old_name;
1200 bool def_in_loop_p, used_outside_p, need_close_phi_p;
1201 gimple old_close_phi;
1202
1203 if (!slot || !*slot || !data)
1204 return 1;
1205
1206 entry = (struct rename_map_elt_s *) *slot;
1207 a = (alep_p) data;
1208 loop = a->loop;
1209 new_name = expr = entry->expr;
1210 old_name = entry->old_name;
1211
1212 def_in_loop_p = expr_defined_in_loop_p (expr, loop);
1213 if (!def_in_loop_p)
1214 return 1;
1215
1216 /* Remove the old rename from the map when the expression is defined
1217 in the loop that we're closing. */
1218 free (*slot);
1219 *slot = NULL;
1220
1221 if (TREE_CODE (expr) != SSA_NAME)
1222 return 1;
1223
1224 old_close_phi = alive_after_loop (old_name);
1225 used_outside_p = (old_close_phi != NULL);
1226 need_close_phi_p = (used_outside_p
1227 && close_phi_not_yet_inserted_p (loop, new_name));
1228
1229 /* Insert a loop close phi node. */
1230 if (need_close_phi_p)
1231 {
1232 basic_block bb = single_exit (loop)->dest;
1233 gimple phi = create_phi_node (new_name, bb);
1234 tree new_res = create_new_def_for (gimple_phi_result (phi), phi,
1235 gimple_phi_result_ptr (phi));
1236
1237 add_phi_arg (phi, new_name, single_pred_edge (bb), UNKNOWN_LOCATION);
1238 VEC_safe_push (rename_map_elt, heap, a->new_renames,
1239 new_rename_map_elt (gimple_phi_result (old_close_phi),
1240 new_res));
1241 }
1242
1243 return 1;
1244 }
1245
1246 /* Traverses MAP and removes from it all the tuples (OLD, NEW) where
1247 NEW is defined in LOOP. Inserts on the exit of LOOP the close phi
1248 node "RES = phi (NEW)" corresponding to "OLD_RES = phi (OLD)" in
1249 the original code. Inserts in MAP the tuple (OLD_RES, RES). */
1250
1251 void
1252 insert_loop_close_phis (htab_t map, loop_p loop)
1253 {
1254 int i;
1255 struct alep a;
1256 rename_map_elt elt;
1257
1258 a.loop = loop;
1259 a.new_renames = VEC_alloc (rename_map_elt, heap, 3);
1260 update_ssa (TODO_update_ssa);
1261 htab_traverse (map, add_loop_exit_phis, &a);
1262 update_ssa (TODO_update_ssa);
1263
1264 for (i = 0; VEC_iterate (rename_map_elt, a.new_renames, i, elt); i++)
1265 {
1266 set_rename (map, elt->old_name, elt->expr);
1267 free (elt);
1268 }
1269
1270 VEC_free (rename_map_elt, heap, a.new_renames);
1271 }
1272
1273 /* Helper structure for htab_traverse in insert_guard_phis. */
1274
1275 struct igp {
1276 basic_block bb;
1277 edge true_edge, false_edge;
1278 htab_t before_guard;
1279 };
1280
1281 /* Return the default name that is before the guard. */
1282
1283 static tree
1284 default_before_guard (htab_t before_guard, tree old_name)
1285 {
1286 tree res = get_rename (before_guard, old_name);
1287
1288 if (res == old_name)
1289 {
1290 if (is_gimple_reg (res))
1291 return fold_convert (TREE_TYPE (res), integer_zero_node);
1292 return gimple_default_def (cfun, SSA_NAME_VAR (res));
1293 }
1294
1295 return res;
1296 }
1297
1298 /* Prepares EXPR to be a good phi argument when the phi result is
1299 RES. Insert needed statements on edge E. */
1300
1301 static tree
1302 convert_for_phi_arg (tree expr, tree res, edge e)
1303 {
1304 tree type = TREE_TYPE (res);
1305
1306 if (TREE_TYPE (expr) != type)
1307 expr = fold_convert (type, expr);
1308
1309 if (TREE_CODE (expr) != SSA_NAME
1310 && !is_gimple_min_invariant (expr))
1311 {
1312 tree var = create_tmp_var (type, "var");
1313 gimple_seq stmts;
1314
1315 expr = build2 (MODIFY_EXPR, type, var, expr);
1316 expr = force_gimple_operand (expr, &stmts, true, NULL);
1317 gsi_insert_seq_on_edge_immediate (e, stmts);
1318 }
1319
1320 return expr;
1321 }
1322
1323 /* Helper function for htab_traverse in insert_guard_phis. */
1324
1325 static int
1326 add_guard_exit_phis (void **slot, void *s)
1327 {
1328 struct rename_map_elt_s *entry = (struct rename_map_elt_s *) *slot;
1329 struct igp *i = (struct igp *) s;
1330 basic_block bb = i->bb;
1331 edge true_edge = i->true_edge;
1332 edge false_edge = i->false_edge;
1333 tree res = entry->old_name;
1334 tree name1 = entry->expr;
1335 tree name2 = default_before_guard (i->before_guard, res);
1336 gimple phi;
1337
1338 /* Nothing to be merged if the name before the guard is the same as
1339 the one after. */
1340 if (name1 == name2)
1341 return 1;
1342
1343 name1 = convert_for_phi_arg (name1, res, true_edge);
1344 name2 = convert_for_phi_arg (name2, res, false_edge);
1345
1346 phi = create_phi_node (res, bb);
1347 res = create_new_def_for (gimple_phi_result (phi), phi,
1348 gimple_phi_result_ptr (phi));
1349
1350 add_phi_arg (phi, name1, true_edge, UNKNOWN_LOCATION);
1351 add_phi_arg (phi, name2, false_edge, UNKNOWN_LOCATION);
1352
1353 entry->expr = res;
1354 *slot = entry;
1355 return 1;
1356 }
1357
1358 /* Iterate over RENAME_MAP and get tuples of the form (OLD, NAME1).
1359 If there is a correspondent tuple (OLD, NAME2) in BEFORE_GUARD,
1360 with NAME1 different than NAME2, then insert in BB the phi node:
1361
1362 | RES = phi (NAME1 (on TRUE_EDGE), NAME2 (on FALSE_EDGE))"
1363
1364 if there is no tuple for OLD in BEFORE_GUARD, insert
1365
1366 | RES = phi (NAME1 (on TRUE_EDGE),
1367 | DEFAULT_DEFINITION of NAME1 (on FALSE_EDGE))".
1368
1369 Finally register in RENAME_MAP the tuple (OLD, RES). */
1370
1371 void
1372 insert_guard_phis (basic_block bb, edge true_edge, edge false_edge,
1373 htab_t before_guard, htab_t rename_map)
1374 {
1375 struct igp i;
1376 i.bb = bb;
1377 i.true_edge = true_edge;
1378 i.false_edge = false_edge;
1379 i.before_guard = before_guard;
1380
1381 update_ssa (TODO_update_ssa);
1382 htab_traverse (rename_map, add_guard_exit_phis, &i);
1383 update_ssa (TODO_update_ssa);
1384 }
1385
1386 /* Create a duplicate of the basic block BB. NOTE: This does not
1387 preserve SSA form. */
1388
1389 static void
1390 graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb, htab_t map)
1391 { 563 {
1392 gimple_stmt_iterator gsi, gsi_tgt; 564 gimple_stmt_iterator gsi, gsi_tgt;
565 loop_p loop = bb->loop_father;
1393 566
1394 gsi_tgt = gsi_start_bb (new_bb); 567 gsi_tgt = gsi_start_bb (new_bb);
1395 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 568 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1396 { 569 {
1397 def_operand_p def_p; 570 def_operand_p def_p;
1398 ssa_op_iter op_iter; 571 ssa_op_iter op_iter;
1399 gimple stmt = gsi_stmt (gsi); 572 gimple stmt = gsi_stmt (gsi);
1400 gimple copy; 573 gimple copy;
1401 574 tree lhs;
1402 if (gimple_code (stmt) == GIMPLE_LABEL) 575
576 /* Do not copy labels or conditions. */
577 if (gimple_code (stmt) == GIMPLE_LABEL
578 || gimple_code (stmt) == GIMPLE_COND)
579 continue;
580
581 /* Do not copy induction variables. */
582 if (is_gimple_assign (stmt)
583 && (lhs = gimple_assign_lhs (stmt))
584 && TREE_CODE (lhs) == SSA_NAME
585 && is_gimple_reg (lhs)
586 && scev_analyzable_p (lhs, region))
1403 continue; 587 continue;
1404 588
1405 /* Create a new copy of STMT and duplicate STMT's virtual 589 /* Create a new copy of STMT and duplicate STMT's virtual
1406 operands. */ 590 operands. */
1407 copy = gimple_copy (stmt); 591 copy = gimple_copy (stmt);
1412 gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt); 596 gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
1413 597
1414 /* Create new names for all the definitions created by COPY and 598 /* Create new names for all the definitions created by COPY and
1415 add replacement mappings for each new name. */ 599 add replacement mappings for each new name. */
1416 FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS) 600 FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
1417 { 601 {
1418 tree old_name = DEF_FROM_PTR (def_p); 602 tree old_name = DEF_FROM_PTR (def_p);
1419 tree new_name = create_new_def_for (old_name, copy, def_p); 603 tree new_name = create_new_def_for (old_name, copy, def_p);
1420 set_rename (map, old_name, new_name); 604 set_rename (rename_map, old_name, new_name);
1421 } 605 }
606
607 if (rename_uses (copy, rename_map, &gsi_tgt, region, loop, iv_map))
608 fold_stmt_inplace (copy);
609
610 update_stmt (copy);
1422 } 611 }
1423 } 612 }
1424 613
1425 /* Copies BB and includes in the copied BB all the statements that can 614 /* Copies BB and includes in the copied BB all the statements that can
1426 be reached following the use-def chains from the memory accesses, 615 be reached following the use-def chains from the memory accesses,
1427 and returns the next edge following this new block. */ 616 and returns the next edge following this new block. */
1428 617
1429 edge 618 edge
1430 copy_bb_and_scalar_dependences (basic_block bb, sese region, 619 copy_bb_and_scalar_dependences (basic_block bb, sese region,
1431 edge next_e, htab_t map) 620 edge next_e, VEC (tree, heap) *iv_map)
1432 { 621 {
1433 basic_block new_bb = split_edge (next_e); 622 basic_block new_bb = split_edge (next_e);
623 htab_t rename_map = htab_create (10, rename_map_elt_info,
624 eq_rename_map_elts, free);
1434 625
1435 next_e = single_succ_edge (new_bb); 626 next_e = single_succ_edge (new_bb);
1436 graphite_copy_stmts_from_block (bb, new_bb, map); 627 graphite_copy_stmts_from_block (bb, new_bb, rename_map, iv_map, region);
1437 remove_condition (new_bb);
1438 remove_phi_nodes (new_bb); 628 remove_phi_nodes (new_bb);
1439 expand_scalar_variables (new_bb, region, map); 629 htab_delete (rename_map);
1440 rename_variables (new_bb, map);
1441 630
1442 return next_e; 631 return next_e;
1443 } 632 }
1444 633
1445 /* Returns the outermost loop in SCOP that contains BB. */ 634 /* Returns the outermost loop in SCOP that contains BB. */
1491 free (if_region->false_region); 680 free (if_region->false_region);
1492 if_region->false_region = region; 681 if_region->false_region = region;
1493 682
1494 if (slot) 683 if (slot)
1495 { 684 {
1496 struct loop_exit *loop_exit = GGC_CNEW (struct loop_exit); 685 struct loop_exit *loop_exit = ggc_alloc_cleared_loop_exit ();
1497 686
1498 memcpy (loop_exit, *((struct loop_exit **) slot), sizeof (struct loop_exit)); 687 memcpy (loop_exit, *((struct loop_exit **) slot), sizeof (struct loop_exit));
1499 htab_clear_slot (current_loops->exits, slot); 688 htab_clear_slot (current_loops->exits, slot);
1500 689
1501 slot = htab_find_slot_with_hash (current_loops->exits, false_edge, 690 slot = htab_find_slot_with_hash (current_loops->exits, false_edge,
1599 { 788 {
1600 gimple def; 789 gimple def;
1601 struct loop *def_loop; 790 struct loop *def_loop;
1602 basic_block before = block_before_sese (region); 791 basic_block before = block_before_sese (region);
1603 792
793 /* SCOP parameters. */
794 if (TREE_CODE (t) == SSA_NAME
795 && !defined_in_sese_p (t, region))
796 return t;
797
1604 if (TREE_CODE (t) != SSA_NAME 798 if (TREE_CODE (t) != SSA_NAME
1605 || loop_in_sese_p (loop, region)) 799 || loop_in_sese_p (loop, region))
1606 return instantiate_scev (before, loop, 800 return instantiate_scev (before, loop,
1607 analyze_scalar_evolution (loop, t)); 801 analyze_scalar_evolution (loop, t));
1608
1609 if (!defined_in_sese_p (t, region))
1610 return t;
1611 802
1612 def = SSA_NAME_DEF_STMT (t); 803 def = SSA_NAME_DEF_STMT (t);
1613 def_loop = loop_containing_stmt (def); 804 def_loop = loop_containing_stmt (def);
1614 805
1615 if (loop_in_sese_p (def_loop, region)) 806 if (loop_in_sese_p (def_loop, region))