]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-ssa-loop.c
[Ada] Update headers
[thirdparty/gcc.git] / gcc / tree-ssa-loop.c
CommitLineData
6de9cd9a 1/* Loop optimizations over tree-ssa.
8d9254fc 2 Copyright (C) 2003-2020 Free Software Foundation, Inc.
b8698a0f 3
6de9cd9a 4This file is part of GCC.
b8698a0f 5
6de9cd9a
DN
6GCC is free software; you can redistribute it and/or modify it
7under the terms of the GNU General Public License as published by the
9dcd6f09 8Free Software Foundation; either version 3, or (at your option) any
6de9cd9a 9later version.
b8698a0f 10
6de9cd9a
DN
11GCC is distributed in the hope that it will be useful, but WITHOUT
12ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
b8698a0f 15
6de9cd9a 16You should have received a copy of the GNU General Public License
9dcd6f09
NC
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
6de9cd9a
DN
19
20#include "config.h"
21#include "system.h"
22#include "coretypes.h"
c7131fb2 23#include "backend.h"
6de9cd9a 24#include "tree.h"
c7131fb2 25#include "gimple.h"
957060b5 26#include "tree-pass.h"
4d0cdd0c 27#include "memmodel.h"
957060b5 28#include "tm_p.h"
40e23961 29#include "fold-const.h"
5be5c238 30#include "gimple-iterator.h"
e28030cf
AM
31#include "tree-ssa-loop-ivopts.h"
32#include "tree-ssa-loop-manip.h"
33#include "tree-ssa-loop-niter.h"
442b4905 34#include "tree-ssa-loop.h"
6de9cd9a 35#include "cfgloop.h"
6de9cd9a 36#include "tree-inline.h"
79fe1b3b 37#include "tree-scalar-evolution.h"
8ed77e22 38#include "tree-vectorizer.h"
629b3d75 39#include "omp-general.h"
597a8ab9 40#include "diagnostic-core.h"
314e6352
ML
41#include "stringpool.h"
42#include "attribs.h"
6de9cd9a 43
e5d8bd8c 44
7d39012c
RB
45/* A pass making sure loops are fixed up. */
46
47namespace {
48
49const pass_data pass_data_fix_loops =
50{
51 GIMPLE_PASS, /* type */
52 "fix_loops", /* name */
53 OPTGROUP_LOOP, /* optinfo_flags */
54 TV_TREE_LOOP, /* tv_id */
55 PROP_cfg, /* properties_required */
56 0, /* properties_provided */
57 0, /* properties_destroyed */
58 0, /* todo_flags_start */
59 0, /* todo_flags_finish */
60};
61
62class pass_fix_loops : public gimple_opt_pass
63{
64public:
65 pass_fix_loops (gcc::context *ctxt)
66 : gimple_opt_pass (pass_data_fix_loops, ctxt)
67 {}
68
69 /* opt_pass methods: */
70 virtual bool gate (function *) { return flag_tree_loop_optimize; }
71
72 virtual unsigned int execute (function *fn);
73}; // class pass_fix_loops
74
75unsigned int
76pass_fix_loops::execute (function *)
77{
78 if (loops_state_satisfies_p (LOOPS_NEED_FIXUP))
79 {
80 calculate_dominance_info (CDI_DOMINATORS);
81 fix_loop_structure (NULL);
82 }
83 return 0;
84}
85
86} // anon namespace
87
88gimple_opt_pass *
89make_pass_fix_loops (gcc::context *ctxt)
90{
91 return new pass_fix_loops (ctxt);
92}
93
94
e5d8bd8c
RB
95/* Gate for loop pass group. The group is controlled by -ftree-loop-optimize
96 but we also avoid running it when the IL doesn't contain any loop. */
97
98static bool
99gate_loop (function *fn)
100{
101 if (!flag_tree_loop_optimize)
102 return false;
103
104 /* For -fdump-passes which runs before loop discovery print the
105 state of -ftree-loop-optimize. */
106 if (!loops_for_fn (fn))
107 return true;
108
e5d8bd8c
RB
109 return number_of_loops (fn) > 1;
110}
111
c66b6c66
ZD
112/* The loop superpass. */
113
27a4cd48
DM
114namespace {
115
116const pass_data pass_data_tree_loop =
117{
118 GIMPLE_PASS, /* type */
119 "loop", /* name */
120 OPTGROUP_LOOP, /* optinfo_flags */
27a4cd48
DM
121 TV_TREE_LOOP, /* tv_id */
122 PROP_cfg, /* properties_required */
123 0, /* properties_provided */
124 0, /* properties_destroyed */
125 0, /* todo_flags_start */
3bea341f 126 0, /* todo_flags_finish */
c66b6c66
ZD
127};
128
27a4cd48
DM
129class pass_tree_loop : public gimple_opt_pass
130{
131public:
c3284718
RS
132 pass_tree_loop (gcc::context *ctxt)
133 : gimple_opt_pass (pass_data_tree_loop, ctxt)
27a4cd48
DM
134 {}
135
136 /* opt_pass methods: */
e5d8bd8c 137 virtual bool gate (function *fn) { return gate_loop (fn); }
27a4cd48
DM
138
139}; // class pass_tree_loop
140
141} // anon namespace
142
143gimple_opt_pass *
144make_pass_tree_loop (gcc::context *ctxt)
145{
146 return new pass_tree_loop (ctxt);
147}
148
896522ee
TV
149/* Gate for oacc kernels pass group. */
150
151static bool
152gate_oacc_kernels (function *fn)
153{
f99c3557 154 if (!flag_openacc)
896522ee
TV
155 return false;
156
25651634 157 if (!lookup_attribute ("oacc kernels", DECL_ATTRIBUTES (fn->decl)))
896522ee
TV
158 return false;
159
99b1c316 160 class loop *loop;
896522ee
TV
161 FOR_EACH_LOOP (loop, 0)
162 if (loop->in_oacc_kernels_region)
163 return true;
164
165 return false;
166}
167
168/* The oacc kernels superpass. */
169
170namespace {
171
172const pass_data pass_data_oacc_kernels =
173{
174 GIMPLE_PASS, /* type */
175 "oacc_kernels", /* name */
176 OPTGROUP_LOOP, /* optinfo_flags */
177 TV_TREE_LOOP, /* tv_id */
178 PROP_cfg, /* properties_required */
179 0, /* properties_provided */
180 0, /* properties_destroyed */
181 0, /* todo_flags_start */
182 0, /* todo_flags_finish */
183};
184
185class pass_oacc_kernels : public gimple_opt_pass
186{
187public:
188 pass_oacc_kernels (gcc::context *ctxt)
189 : gimple_opt_pass (pass_data_oacc_kernels, ctxt)
190 {}
191
192 /* opt_pass methods: */
193 virtual bool gate (function *fn) { return gate_oacc_kernels (fn); }
194
195}; // class pass_oacc_kernels
196
197} // anon namespace
198
199gimple_opt_pass *
200make_pass_oacc_kernels (gcc::context *ctxt)
201{
202 return new pass_oacc_kernels (ctxt);
203}
204
597a8ab9
TV
205/* The ipa oacc superpass. */
206
896522ee
TV
207namespace {
208
597a8ab9 209const pass_data pass_data_ipa_oacc =
896522ee 210{
597a8ab9
TV
211 SIMPLE_IPA_PASS, /* type */
212 "ipa_oacc", /* name */
896522ee
TV
213 OPTGROUP_LOOP, /* optinfo_flags */
214 TV_TREE_LOOP, /* tv_id */
215 PROP_cfg, /* properties_required */
216 0, /* properties_provided */
217 0, /* properties_destroyed */
218 0, /* todo_flags_start */
219 0, /* todo_flags_finish */
220};
221
597a8ab9 222class pass_ipa_oacc : public simple_ipa_opt_pass
896522ee
TV
223{
224public:
597a8ab9
TV
225 pass_ipa_oacc (gcc::context *ctxt)
226 : simple_ipa_opt_pass (pass_data_ipa_oacc, ctxt)
896522ee
TV
227 {}
228
229 /* opt_pass methods: */
597a8ab9
TV
230 virtual bool gate (function *)
231 {
232 return (optimize
597a8ab9 233 && flag_openacc
f99c3557
TS
234 /* Don't bother doing anything if the program has errors. */
235 && !seen_error ());
597a8ab9 236 }
896522ee 237
597a8ab9 238}; // class pass_ipa_oacc
896522ee
TV
239
240} // anon namespace
241
597a8ab9
TV
242simple_ipa_opt_pass *
243make_pass_ipa_oacc (gcc::context *ctxt)
244{
245 return new pass_ipa_oacc (ctxt);
246}
247
248/* The ipa oacc kernels pass. */
249
250namespace {
251
252const pass_data pass_data_ipa_oacc_kernels =
253{
254 SIMPLE_IPA_PASS, /* type */
255 "ipa_oacc_kernels", /* name */
256 OPTGROUP_LOOP, /* optinfo_flags */
257 TV_TREE_LOOP, /* tv_id */
258 PROP_cfg, /* properties_required */
259 0, /* properties_provided */
260 0, /* properties_destroyed */
261 0, /* todo_flags_start */
262 0, /* todo_flags_finish */
263};
264
265class pass_ipa_oacc_kernels : public simple_ipa_opt_pass
266{
267public:
268 pass_ipa_oacc_kernels (gcc::context *ctxt)
269 : simple_ipa_opt_pass (pass_data_ipa_oacc_kernels, ctxt)
270 {}
271
272}; // class pass_ipa_oacc_kernels
273
274} // anon namespace
275
276simple_ipa_opt_pass *
277make_pass_ipa_oacc_kernels (gcc::context *ctxt)
896522ee 278{
597a8ab9 279 return new pass_ipa_oacc_kernels (ctxt);
896522ee
TV
280}
281
e5d8bd8c
RB
282/* The no-loop superpass. */
283
284namespace {
285
286const pass_data pass_data_tree_no_loop =
287{
288 GIMPLE_PASS, /* type */
289 "no_loop", /* name */
290 OPTGROUP_NONE, /* optinfo_flags */
e5d8bd8c
RB
291 TV_TREE_NOLOOP, /* tv_id */
292 PROP_cfg, /* properties_required */
293 0, /* properties_provided */
294 0, /* properties_destroyed */
295 0, /* todo_flags_start */
296 0, /* todo_flags_finish */
297};
298
299class pass_tree_no_loop : public gimple_opt_pass
300{
301public:
302 pass_tree_no_loop (gcc::context *ctxt)
303 : gimple_opt_pass (pass_data_tree_no_loop, ctxt)
304 {}
305
306 /* opt_pass methods: */
307 virtual bool gate (function *fn) { return !gate_loop (fn); }
308
309}; // class pass_tree_no_loop
310
311} // anon namespace
312
313gimple_opt_pass *
314make_pass_tree_no_loop (gcc::context *ctxt)
315{
316 return new pass_tree_no_loop (ctxt);
317}
318
319
c66b6c66
ZD
320/* Loop optimizer initialization. */
321
27a4cd48
DM
322namespace {
323
324const pass_data pass_data_tree_loop_init =
325{
326 GIMPLE_PASS, /* type */
327 "loopinit", /* name */
328 OPTGROUP_LOOP, /* optinfo_flags */
27a4cd48
DM
329 TV_NONE, /* tv_id */
330 PROP_cfg, /* properties_required */
331 0, /* properties_provided */
332 0, /* properties_destroyed */
8964432a 333 TODO_update_address_taken, /* todo_flags_start */
27a4cd48 334 0, /* todo_flags_finish */
c66b6c66
ZD
335};
336
27a4cd48
DM
337class pass_tree_loop_init : public gimple_opt_pass
338{
339public:
c3284718
RS
340 pass_tree_loop_init (gcc::context *ctxt)
341 : gimple_opt_pass (pass_data_tree_loop_init, ctxt)
27a4cd48
DM
342 {}
343
344 /* opt_pass methods: */
be55bfe6 345 virtual unsigned int execute (function *);
27a4cd48
DM
346
347}; // class pass_tree_loop_init
348
be55bfe6 349unsigned int
3e455386 350pass_tree_loop_init::execute (function *fun ATTRIBUTE_UNUSED)
be55bfe6 351{
33c6daf4
TV
352 /* When processing a loop in the loop pipeline, we should be able to assert
353 that:
354 (loops_state_satisfies_p (LOOPS_NORMAL | LOOPS_HAVE_RECORDED_EXITS
355 | LOOP_CLOSED_SSA)
356 && scev_initialized_p ())
357 */
be55bfe6
TS
358 loop_optimizer_init (LOOPS_NORMAL
359 | LOOPS_HAVE_RECORDED_EXITS);
360 rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
be55bfe6
TS
361 scev_initialize ();
362
be55bfe6
TS
363 return 0;
364}
365
27a4cd48
DM
366} // anon namespace
367
368gimple_opt_pass *
369make_pass_tree_loop_init (gcc::context *ctxt)
370{
371 return new pass_tree_loop_init (ctxt);
372}
373
79fe1b3b
DN
374/* Loop autovectorization. */
375
27a4cd48
DM
376namespace {
377
378const pass_data pass_data_vectorize =
379{
380 GIMPLE_PASS, /* type */
381 "vect", /* name */
382 OPTGROUP_LOOP | OPTGROUP_VEC, /* optinfo_flags */
27a4cd48
DM
383 TV_TREE_VECTORIZATION, /* tv_id */
384 ( PROP_cfg | PROP_ssa ), /* properties_required */
385 0, /* properties_provided */
386 0, /* properties_destroyed */
387 0, /* todo_flags_start */
388 0, /* todo_flags_finish */
79fe1b3b
DN
389};
390
27a4cd48
DM
391class pass_vectorize : public gimple_opt_pass
392{
393public:
c3284718
RS
394 pass_vectorize (gcc::context *ctxt)
395 : gimple_opt_pass (pass_data_vectorize, ctxt)
27a4cd48
DM
396 {}
397
398 /* opt_pass methods: */
1a3d085c
TS
399 virtual bool gate (function *fun)
400 {
401 return flag_tree_loop_vectorize || fun->has_force_vectorize_loops;
402 }
403
be55bfe6 404 virtual unsigned int execute (function *);
27a4cd48
DM
405
406}; // class pass_vectorize
407
be55bfe6
TS
408unsigned int
409pass_vectorize::execute (function *fun)
410{
411 if (number_of_loops (fun) <= 1)
412 return 0;
413
414 return vectorize_loops ();
415}
416
27a4cd48
DM
417} // anon namespace
418
419gimple_opt_pass *
420make_pass_vectorize (gcc::context *ctxt)
421{
422 return new pass_vectorize (ctxt);
423}
424
684aaf29
ZD
425/* Propagation of constants using scev. */
426
27a4cd48
DM
427namespace {
428
429const pass_data pass_data_scev_cprop =
430{
431 GIMPLE_PASS, /* type */
432 "sccp", /* name */
433 OPTGROUP_LOOP, /* optinfo_flags */
27a4cd48
DM
434 TV_SCEV_CONST, /* tv_id */
435 ( PROP_cfg | PROP_ssa ), /* properties_required */
436 0, /* properties_provided */
437 0, /* properties_destroyed */
438 0, /* todo_flags_start */
4cc31a3c 439 0, /* todo_flags_finish */
b7eae7b8
ZD
440};
441
27a4cd48
DM
442class pass_scev_cprop : public gimple_opt_pass
443{
444public:
c3284718
RS
445 pass_scev_cprop (gcc::context *ctxt)
446 : gimple_opt_pass (pass_data_scev_cprop, ctxt)
27a4cd48
DM
447 {}
448
449 /* opt_pass methods: */
1a3d085c 450 virtual bool gate (function *) { return flag_tree_scev_cprop; }
4cc31a3c 451 virtual unsigned int execute (function *);
27a4cd48
DM
452
453}; // class pass_scev_cprop
454
4cc31a3c
RB
455unsigned
456pass_scev_cprop::execute (function *)
457{
99b1c316 458 class loop *loop;
4cc31a3c
RB
459 bool any = false;
460
461 /* Perform final value replacement in loops, in case the replacement
462 expressions are cheap. */
463 FOR_EACH_LOOP (loop, LI_FROM_INNERMOST)
464 any |= final_value_replacement_loop (loop);
465
466 return any ? TODO_cleanup_cfg | TODO_update_ssa_only_virtuals : 0;
467}
468
27a4cd48
DM
469} // anon namespace
470
471gimple_opt_pass *
472make_pass_scev_cprop (gcc::context *ctxt)
473{
474 return new pass_scev_cprop (ctxt);
475}
476
8b11a64c
ZD
477/* Induction variable optimizations. */
478
27a4cd48
DM
479namespace {
480
481const pass_data pass_data_iv_optimize =
482{
483 GIMPLE_PASS, /* type */
484 "ivopts", /* name */
485 OPTGROUP_LOOP, /* optinfo_flags */
27a4cd48
DM
486 TV_TREE_LOOP_IVOPTS, /* tv_id */
487 ( PROP_cfg | PROP_ssa ), /* properties_required */
488 0, /* properties_provided */
489 0, /* properties_destroyed */
490 0, /* todo_flags_start */
491 TODO_update_ssa, /* todo_flags_finish */
82b85a85
ZD
492};
493
27a4cd48
DM
494class pass_iv_optimize : public gimple_opt_pass
495{
496public:
c3284718
RS
497 pass_iv_optimize (gcc::context *ctxt)
498 : gimple_opt_pass (pass_data_iv_optimize, ctxt)
27a4cd48
DM
499 {}
500
501 /* opt_pass methods: */
1a3d085c 502 virtual bool gate (function *) { return flag_ivopts != 0; }
be55bfe6 503 virtual unsigned int execute (function *);
27a4cd48
DM
504
505}; // class pass_iv_optimize
506
be55bfe6
TS
507unsigned int
508pass_iv_optimize::execute (function *fun)
509{
510 if (number_of_loops (fun) <= 1)
511 return 0;
512
513 tree_ssa_iv_optimize ();
514 return 0;
515}
516
27a4cd48
DM
517} // anon namespace
518
519gimple_opt_pass *
520make_pass_iv_optimize (gcc::context *ctxt)
521{
522 return new pass_iv_optimize (ctxt);
523}
524
c66b6c66
ZD
525/* Loop optimizer finalization. */
526
c2924966 527static unsigned int
c66b6c66
ZD
528tree_ssa_loop_done (void)
529{
61183076 530 free_numbers_of_iterations_estimates (cfun);
82b85a85 531 scev_finalize ();
598ec7bd 532 loop_optimizer_finalize ();
c2924966 533 return 0;
c66b6c66 534}
b8698a0f 535
27a4cd48
DM
536namespace {
537
538const pass_data pass_data_tree_loop_done =
539{
540 GIMPLE_PASS, /* type */
541 "loopdone", /* name */
542 OPTGROUP_LOOP, /* optinfo_flags */
27a4cd48
DM
543 TV_NONE, /* tv_id */
544 PROP_cfg, /* properties_required */
545 0, /* properties_provided */
546 0, /* properties_destroyed */
547 0, /* todo_flags_start */
3bea341f 548 TODO_cleanup_cfg, /* todo_flags_finish */
c66b6c66 549};
27a4cd48
DM
550
551class pass_tree_loop_done : public gimple_opt_pass
552{
553public:
c3284718
RS
554 pass_tree_loop_done (gcc::context *ctxt)
555 : gimple_opt_pass (pass_data_tree_loop_done, ctxt)
27a4cd48
DM
556 {}
557
558 /* opt_pass methods: */
be55bfe6 559 virtual unsigned int execute (function *) { return tree_ssa_loop_done (); }
27a4cd48
DM
560
561}; // class pass_tree_loop_done
562
563} // anon namespace
564
565gimple_opt_pass *
566make_pass_tree_loop_done (gcc::context *ctxt)
567{
568 return new pass_tree_loop_done (ctxt);
569}
71343877
AM
570
571/* Calls CBCK for each index in memory reference ADDR_P. There are two
572 kinds situations handled; in each of these cases, the memory reference
573 and DATA are passed to the callback:
574
575 Access to an array: ARRAY_{RANGE_}REF (base, index). In this case we also
576 pass the pointer to the index to the callback.
577
578 Pointer dereference: INDIRECT_REF (addr). In this case we also pass the
579 pointer to addr to the callback.
580
581 If the callback returns false, the whole search stops and false is returned.
582 Otherwise the function returns true after traversing through the whole
583 reference *ADDR_P. */
584
585bool
586for_each_index (tree *addr_p, bool (*cbck) (tree, tree *, void *), void *data)
587{
588 tree *nxt, *idx;
589
590 for (; ; addr_p = nxt)
591 {
592 switch (TREE_CODE (*addr_p))
593 {
594 case SSA_NAME:
595 return cbck (*addr_p, addr_p, data);
596
597 case MEM_REF:
598 nxt = &TREE_OPERAND (*addr_p, 0);
599 return cbck (*addr_p, nxt, data);
600
601 case BIT_FIELD_REF:
602 case VIEW_CONVERT_EXPR:
603 case REALPART_EXPR:
604 case IMAGPART_EXPR:
605 nxt = &TREE_OPERAND (*addr_p, 0);
606 break;
607
608 case COMPONENT_REF:
609 /* If the component has varying offset, it behaves like index
610 as well. */
611 idx = &TREE_OPERAND (*addr_p, 2);
612 if (*idx
613 && !cbck (*addr_p, idx, data))
614 return false;
615
616 nxt = &TREE_OPERAND (*addr_p, 0);
617 break;
618
619 case ARRAY_REF:
620 case ARRAY_RANGE_REF:
621 nxt = &TREE_OPERAND (*addr_p, 0);
622 if (!cbck (*addr_p, &TREE_OPERAND (*addr_p, 1), data))
623 return false;
624 break;
625
71343877
AM
626 case CONSTRUCTOR:
627 return true;
628
629 case ADDR_EXPR:
630 gcc_assert (is_gimple_min_invariant (*addr_p));
631 return true;
632
633 case TARGET_MEM_REF:
634 idx = &TMR_BASE (*addr_p);
635 if (*idx
636 && !cbck (*addr_p, idx, data))
637 return false;
638 idx = &TMR_INDEX (*addr_p);
639 if (*idx
640 && !cbck (*addr_p, idx, data))
641 return false;
642 idx = &TMR_INDEX2 (*addr_p);
643 if (*idx
644 && !cbck (*addr_p, idx, data))
645 return false;
646 return true;
647
648 default:
d12fd774
RB
649 if (DECL_P (*addr_p)
650 || CONSTANT_CLASS_P (*addr_p))
651 return true;
71343877
AM
652 gcc_unreachable ();
653 }
654 }
655}
656
657
658/* The name and the length of the currently generated variable
659 for lsm. */
660#define MAX_LSM_NAME_LENGTH 40
661static char lsm_tmp_name[MAX_LSM_NAME_LENGTH + 1];
662static int lsm_tmp_name_length;
663
664/* Adds S to lsm_tmp_name. */
665
666static void
667lsm_tmp_name_add (const char *s)
668{
669 int l = strlen (s) + lsm_tmp_name_length;
670 if (l > MAX_LSM_NAME_LENGTH)
671 return;
672
673 strcpy (lsm_tmp_name + lsm_tmp_name_length, s);
674 lsm_tmp_name_length = l;
675}
676
677/* Stores the name for temporary variable that replaces REF to
678 lsm_tmp_name. */
679
680static void
681gen_lsm_tmp_name (tree ref)
682{
683 const char *name;
684
685 switch (TREE_CODE (ref))
686 {
687 case MEM_REF:
688 case TARGET_MEM_REF:
689 gen_lsm_tmp_name (TREE_OPERAND (ref, 0));
690 lsm_tmp_name_add ("_");
691 break;
692
693 case ADDR_EXPR:
694 gen_lsm_tmp_name (TREE_OPERAND (ref, 0));
695 break;
696
697 case BIT_FIELD_REF:
698 case VIEW_CONVERT_EXPR:
699 case ARRAY_RANGE_REF:
700 gen_lsm_tmp_name (TREE_OPERAND (ref, 0));
701 break;
702
703 case REALPART_EXPR:
704 gen_lsm_tmp_name (TREE_OPERAND (ref, 0));
705 lsm_tmp_name_add ("_RE");
706 break;
707
708 case IMAGPART_EXPR:
709 gen_lsm_tmp_name (TREE_OPERAND (ref, 0));
710 lsm_tmp_name_add ("_IM");
711 break;
712
713 case COMPONENT_REF:
714 gen_lsm_tmp_name (TREE_OPERAND (ref, 0));
715 lsm_tmp_name_add ("_");
716 name = get_name (TREE_OPERAND (ref, 1));
717 if (!name)
718 name = "F";
719 lsm_tmp_name_add (name);
720 break;
721
722 case ARRAY_REF:
723 gen_lsm_tmp_name (TREE_OPERAND (ref, 0));
724 lsm_tmp_name_add ("_I");
725 break;
726
727 case SSA_NAME:
728 case VAR_DECL:
729 case PARM_DECL:
02d472a2
JJ
730 case FUNCTION_DECL:
731 case LABEL_DECL:
71343877
AM
732 name = get_name (ref);
733 if (!name)
734 name = "D";
735 lsm_tmp_name_add (name);
736 break;
737
738 case STRING_CST:
739 lsm_tmp_name_add ("S");
740 break;
741
742 case RESULT_DECL:
743 lsm_tmp_name_add ("R");
744 break;
745
746 case INTEGER_CST:
02d472a2 747 default:
71343877
AM
748 /* Nothing. */
749 break;
71343877
AM
750 }
751}
752
753/* Determines name for temporary variable that replaces REF.
754 The name is accumulated into the lsm_tmp_name variable.
755 N is added to the name of the temporary. */
756
757char *
758get_lsm_tmp_name (tree ref, unsigned n, const char *suffix)
759{
760 char ns[2];
761
762 lsm_tmp_name_length = 0;
763 gen_lsm_tmp_name (ref);
764 lsm_tmp_name_add ("_lsm");
765 if (n < 10)
766 {
767 ns[0] = '0' + n;
768 ns[1] = 0;
769 lsm_tmp_name_add (ns);
770 }
71343877
AM
771 if (suffix != NULL)
772 lsm_tmp_name_add (suffix);
cc261f66 773 return lsm_tmp_name;
71343877
AM
774}
775
776/* Computes an estimated number of insns in LOOP, weighted by WEIGHTS. */
777
778unsigned
99b1c316 779tree_num_loop_insns (class loop *loop, eni_weights *weights)
71343877
AM
780{
781 basic_block *body = get_loop_body (loop);
782 gimple_stmt_iterator gsi;
783 unsigned size = 0, i;
784
785 for (i = 0; i < loop->num_nodes; i++)
786 for (gsi = gsi_start_bb (body[i]); !gsi_end_p (gsi); gsi_next (&gsi))
787 size += estimate_num_insns (gsi_stmt (gsi), weights);
788 free (body);
789
790 return size;
791}
792
793
794