1 /* Rtl-level induction variable analysis.
2 Copyright (C) 2004-2017 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 3, or (at your option) any
11 GCC is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 /* This is a simple analysis of induction variables of the loop. The major use
21 is for determining the number of iterations of a loop for loop unrolling,
22 doloop optimization and branch prediction. The iv information is computed
25 Induction variables are analyzed by walking the use-def chains. When
26 a basic induction variable (biv) is found, it is cached in the bivs
27 hash table. When register is proved to be a biv, its description
28 is stored to DF_REF_DATA of the def reference.
30 The analysis works always with one loop -- you must call
31 iv_analysis_loop_init (loop) for it. All the other functions then work with
32 this loop. When you need to work with another loop, just call
33 iv_analysis_loop_init for it. When you no longer need iv analysis, call
34 iv_analysis_done () to clean up the memory.
36 The available functions are:
38 iv_analyze (insn, mode, reg, iv): Stores the description of the induction
39 variable corresponding to the use of register REG in INSN to IV, given
40 that REG has mode MODE. Returns true if REG is an induction variable
41 in INSN. false otherwise. If a use of REG is not found in INSN,
42 the following insns are scanned (so that we may call this function
43 on insns returned by get_condition).
44 iv_analyze_result (insn, def, iv): Stores to IV the description of the iv
45 corresponding to DEF, which is a register defined in INSN.
46 iv_analyze_expr (insn, mode, expr, iv): Stores to IV the description of iv
47 corresponding to expression EXPR evaluated at INSN. All registers used bu
48 EXPR must also be used in INSN. MODE is the mode of EXPR.
53 #include "coretypes.h"
59 #include "diagnostic-core.h"
65 /* Possible return values of iv_get_reaching_def. */
69 /* More than one reaching def, or reaching def that does not
73 /* The use is trivial invariant of the loop, i.e. is not changed
77 /* The use is reached by initial value and a value from the
78 previous iteration. */
81 /* The use has single dominating def. */
85 /* Information about a biv. */
89 unsigned regno
; /* The register of the biv. */
90 struct rtx_iv iv
; /* Value of the biv. */
93 static bool clean_slate
= true;
95 static unsigned int iv_ref_table_size
= 0;
97 /* Table of rtx_ivs indexed by the df_ref uid field. */
98 static struct rtx_iv
** iv_ref_table
;
100 /* Induction variable stored at the reference. */
101 #define DF_REF_IV(REF) iv_ref_table[DF_REF_ID (REF)]
102 #define DF_REF_IV_SET(REF, IV) iv_ref_table[DF_REF_ID (REF)] = (IV)
104 /* The current loop. */
106 static struct loop
*current_loop
;
108 /* Hashtable helper. */
110 struct biv_entry_hasher
: free_ptr_hash
<biv_entry
>
112 typedef rtx_def
*compare_type
;
113 static inline hashval_t
hash (const biv_entry
*);
114 static inline bool equal (const biv_entry
*, const rtx_def
*);
117 /* Returns hash value for biv B. */
120 biv_entry_hasher::hash (const biv_entry
*b
)
125 /* Compares biv B and register R. */
128 biv_entry_hasher::equal (const biv_entry
*b
, const rtx_def
*r
)
130 return b
->regno
== REGNO (r
);
133 /* Bivs of the current loop. */
135 static hash_table
<biv_entry_hasher
> *bivs
;
137 static bool iv_analyze_op (rtx_insn
*, scalar_int_mode
, rtx
, struct rtx_iv
*);
139 /* Return the RTX code corresponding to the IV extend code EXTEND. */
140 static inline enum rtx_code
141 iv_extend_to_rtx_code (enum iv_extend_code extend
)
149 case IV_UNKNOWN_EXTEND
:
155 /* Dumps information about IV to FILE. */
157 extern void dump_iv_info (FILE *, struct rtx_iv
*);
159 dump_iv_info (FILE *file
, struct rtx_iv
*iv
)
163 fprintf (file
, "not simple");
167 if (iv
->step
== const0_rtx
168 && !iv
->first_special
)
169 fprintf (file
, "invariant ");
171 print_rtl (file
, iv
->base
);
172 if (iv
->step
!= const0_rtx
)
174 fprintf (file
, " + ");
175 print_rtl (file
, iv
->step
);
176 fprintf (file
, " * iteration");
178 fprintf (file
, " (in %s)", GET_MODE_NAME (iv
->mode
));
180 if (iv
->mode
!= iv
->extend_mode
)
181 fprintf (file
, " %s to %s",
182 rtx_name
[iv_extend_to_rtx_code (iv
->extend
)],
183 GET_MODE_NAME (iv
->extend_mode
));
185 if (iv
->mult
!= const1_rtx
)
187 fprintf (file
, " * ");
188 print_rtl (file
, iv
->mult
);
190 if (iv
->delta
!= const0_rtx
)
192 fprintf (file
, " + ");
193 print_rtl (file
, iv
->delta
);
195 if (iv
->first_special
)
196 fprintf (file
, " (first special)");
200 check_iv_ref_table_size (void)
202 if (iv_ref_table_size
< DF_DEFS_TABLE_SIZE ())
204 unsigned int new_size
= DF_DEFS_TABLE_SIZE () + (DF_DEFS_TABLE_SIZE () / 4);
205 iv_ref_table
= XRESIZEVEC (struct rtx_iv
*, iv_ref_table
, new_size
);
206 memset (&iv_ref_table
[iv_ref_table_size
], 0,
207 (new_size
- iv_ref_table_size
) * sizeof (struct rtx_iv
*));
208 iv_ref_table_size
= new_size
;
213 /* Checks whether REG is a well-behaved register. */
216 simple_reg_p (rtx reg
)
220 if (GET_CODE (reg
) == SUBREG
)
222 if (!subreg_lowpart_p (reg
))
224 reg
= SUBREG_REG (reg
);
231 if (HARD_REGISTER_NUM_P (r
))
234 if (GET_MODE_CLASS (GET_MODE (reg
)) != MODE_INT
)
240 /* Clears the information about ivs stored in df. */
245 unsigned i
, n_defs
= DF_DEFS_TABLE_SIZE ();
248 check_iv_ref_table_size ();
249 for (i
= 0; i
< n_defs
; i
++)
251 iv
= iv_ref_table
[i
];
255 iv_ref_table
[i
] = NULL
;
263 /* Prepare the data for an induction variable analysis of a LOOP. */
266 iv_analysis_loop_init (struct loop
*loop
)
270 /* Clear the information from the analysis of the previous loop. */
273 df_set_flags (DF_EQ_NOTES
+ DF_DEFER_INSN_RESCAN
);
274 bivs
= new hash_table
<biv_entry_hasher
> (10);
280 /* Get rid of the ud chains before processing the rescans. Then add
282 df_remove_problem (df_chain
);
283 df_process_deferred_rescans ();
284 df_set_flags (DF_RD_PRUNE_DEAD_DEFS
);
285 df_chain_add_problem (DF_UD_CHAIN
);
286 df_note_add_problem ();
287 df_analyze_loop (loop
);
289 df_dump_region (dump_file
);
291 check_iv_ref_table_size ();
294 /* Finds the definition of REG that dominates loop latch and stores
295 it to DEF. Returns false if there is not a single definition
296 dominating the latch. If REG has no definition in loop, DEF
297 is set to NULL and true is returned. */
300 latch_dominating_def (rtx reg
, df_ref
*def
)
302 df_ref single_rd
= NULL
, adef
;
303 unsigned regno
= REGNO (reg
);
304 struct df_rd_bb_info
*bb_info
= DF_RD_BB_INFO (current_loop
->latch
);
306 for (adef
= DF_REG_DEF_CHAIN (regno
); adef
; adef
= DF_REF_NEXT_REG (adef
))
308 if (!bitmap_bit_p (df
->blocks_to_analyze
, DF_REF_BBNO (adef
))
309 || !bitmap_bit_p (&bb_info
->out
, DF_REF_ID (adef
)))
312 /* More than one reaching definition. */
316 if (!just_once_each_iteration_p (current_loop
, DF_REF_BB (adef
)))
326 /* Gets definition of REG reaching its use in INSN and stores it to DEF. */
328 static enum iv_grd_result
329 iv_get_reaching_def (rtx_insn
*insn
, rtx reg
, df_ref
*def
)
332 basic_block def_bb
, use_bb
;
337 if (!simple_reg_p (reg
))
339 if (GET_CODE (reg
) == SUBREG
)
340 reg
= SUBREG_REG (reg
);
341 gcc_assert (REG_P (reg
));
343 use
= df_find_use (insn
, reg
);
344 gcc_assert (use
!= NULL
);
346 if (!DF_REF_CHAIN (use
))
347 return GRD_INVARIANT
;
349 /* More than one reaching def. */
350 if (DF_REF_CHAIN (use
)->next
)
353 adef
= DF_REF_CHAIN (use
)->ref
;
355 /* We do not handle setting only part of the register. */
356 if (DF_REF_FLAGS (adef
) & DF_REF_READ_WRITE
)
359 def_insn
= DF_REF_INSN (adef
);
360 def_bb
= DF_REF_BB (adef
);
361 use_bb
= BLOCK_FOR_INSN (insn
);
363 if (use_bb
== def_bb
)
364 dom_p
= (DF_INSN_LUID (def_insn
) < DF_INSN_LUID (insn
));
366 dom_p
= dominated_by_p (CDI_DOMINATORS
, use_bb
, def_bb
);
371 return GRD_SINGLE_DOM
;
374 /* The definition does not dominate the use. This is still OK if
375 this may be a use of a biv, i.e. if the def_bb dominates loop
377 if (just_once_each_iteration_p (current_loop
, def_bb
))
378 return GRD_MAYBE_BIV
;
383 /* Sets IV to invariant CST in MODE. Always returns true (just for
384 consistency with other iv manipulation functions that may fail). */
387 iv_constant (struct rtx_iv
*iv
, scalar_int_mode mode
, rtx cst
)
391 iv
->step
= const0_rtx
;
392 iv
->first_special
= false;
393 iv
->extend
= IV_UNKNOWN_EXTEND
;
394 iv
->extend_mode
= iv
->mode
;
395 iv
->delta
= const0_rtx
;
396 iv
->mult
= const1_rtx
;
401 /* Evaluates application of subreg to MODE on IV. */
404 iv_subreg (struct rtx_iv
*iv
, scalar_int_mode mode
)
406 /* If iv is invariant, just calculate the new value. */
407 if (iv
->step
== const0_rtx
408 && !iv
->first_special
)
410 rtx val
= get_iv_value (iv
, const0_rtx
);
411 val
= lowpart_subreg (mode
, val
,
412 iv
->extend
== IV_UNKNOWN_EXTEND
413 ? iv
->mode
: iv
->extend_mode
);
416 iv
->extend
= IV_UNKNOWN_EXTEND
;
417 iv
->mode
= iv
->extend_mode
= mode
;
418 iv
->delta
= const0_rtx
;
419 iv
->mult
= const1_rtx
;
423 if (iv
->extend_mode
== mode
)
426 if (GET_MODE_BITSIZE (mode
) > GET_MODE_BITSIZE (iv
->mode
))
429 iv
->extend
= IV_UNKNOWN_EXTEND
;
432 iv
->base
= simplify_gen_binary (PLUS
, iv
->extend_mode
, iv
->delta
,
433 simplify_gen_binary (MULT
, iv
->extend_mode
,
434 iv
->base
, iv
->mult
));
435 iv
->step
= simplify_gen_binary (MULT
, iv
->extend_mode
, iv
->step
, iv
->mult
);
436 iv
->mult
= const1_rtx
;
437 iv
->delta
= const0_rtx
;
438 iv
->first_special
= false;
443 /* Evaluates application of EXTEND to MODE on IV. */
446 iv_extend (struct rtx_iv
*iv
, enum iv_extend_code extend
, scalar_int_mode mode
)
448 /* If iv is invariant, just calculate the new value. */
449 if (iv
->step
== const0_rtx
450 && !iv
->first_special
)
452 rtx val
= get_iv_value (iv
, const0_rtx
);
453 if (iv
->extend_mode
!= iv
->mode
454 && iv
->extend
!= IV_UNKNOWN_EXTEND
455 && iv
->extend
!= extend
)
456 val
= lowpart_subreg (iv
->mode
, val
, iv
->extend_mode
);
457 val
= simplify_gen_unary (iv_extend_to_rtx_code (extend
), mode
,
460 ? iv
->extend_mode
: iv
->mode
);
462 iv
->extend
= IV_UNKNOWN_EXTEND
;
463 iv
->mode
= iv
->extend_mode
= mode
;
464 iv
->delta
= const0_rtx
;
465 iv
->mult
= const1_rtx
;
469 if (mode
!= iv
->extend_mode
)
472 if (iv
->extend
!= IV_UNKNOWN_EXTEND
473 && iv
->extend
!= extend
)
481 /* Evaluates negation of IV. */
484 iv_neg (struct rtx_iv
*iv
)
486 if (iv
->extend
== IV_UNKNOWN_EXTEND
)
488 iv
->base
= simplify_gen_unary (NEG
, iv
->extend_mode
,
489 iv
->base
, iv
->extend_mode
);
490 iv
->step
= simplify_gen_unary (NEG
, iv
->extend_mode
,
491 iv
->step
, iv
->extend_mode
);
495 iv
->delta
= simplify_gen_unary (NEG
, iv
->extend_mode
,
496 iv
->delta
, iv
->extend_mode
);
497 iv
->mult
= simplify_gen_unary (NEG
, iv
->extend_mode
,
498 iv
->mult
, iv
->extend_mode
);
504 /* Evaluates addition or subtraction (according to OP) of IV1 to IV0. */
507 iv_add (struct rtx_iv
*iv0
, struct rtx_iv
*iv1
, enum rtx_code op
)
509 scalar_int_mode mode
;
512 /* Extend the constant to extend_mode of the other operand if necessary. */
513 if (iv0
->extend
== IV_UNKNOWN_EXTEND
514 && iv0
->mode
== iv0
->extend_mode
515 && iv0
->step
== const0_rtx
516 && GET_MODE_SIZE (iv0
->extend_mode
) < GET_MODE_SIZE (iv1
->extend_mode
))
518 iv0
->extend_mode
= iv1
->extend_mode
;
519 iv0
->base
= simplify_gen_unary (ZERO_EXTEND
, iv0
->extend_mode
,
520 iv0
->base
, iv0
->mode
);
522 if (iv1
->extend
== IV_UNKNOWN_EXTEND
523 && iv1
->mode
== iv1
->extend_mode
524 && iv1
->step
== const0_rtx
525 && GET_MODE_SIZE (iv1
->extend_mode
) < GET_MODE_SIZE (iv0
->extend_mode
))
527 iv1
->extend_mode
= iv0
->extend_mode
;
528 iv1
->base
= simplify_gen_unary (ZERO_EXTEND
, iv1
->extend_mode
,
529 iv1
->base
, iv1
->mode
);
532 mode
= iv0
->extend_mode
;
533 if (mode
!= iv1
->extend_mode
)
536 if (iv0
->extend
== IV_UNKNOWN_EXTEND
537 && iv1
->extend
== IV_UNKNOWN_EXTEND
)
539 if (iv0
->mode
!= iv1
->mode
)
542 iv0
->base
= simplify_gen_binary (op
, mode
, iv0
->base
, iv1
->base
);
543 iv0
->step
= simplify_gen_binary (op
, mode
, iv0
->step
, iv1
->step
);
548 /* Handle addition of constant. */
549 if (iv1
->extend
== IV_UNKNOWN_EXTEND
551 && iv1
->step
== const0_rtx
)
553 iv0
->delta
= simplify_gen_binary (op
, mode
, iv0
->delta
, iv1
->base
);
557 if (iv0
->extend
== IV_UNKNOWN_EXTEND
559 && iv0
->step
== const0_rtx
)
567 iv0
->delta
= simplify_gen_binary (PLUS
, mode
, iv0
->delta
, arg
);
574 /* Evaluates multiplication of IV by constant CST. */
577 iv_mult (struct rtx_iv
*iv
, rtx mby
)
579 scalar_int_mode mode
= iv
->extend_mode
;
581 if (GET_MODE (mby
) != VOIDmode
582 && GET_MODE (mby
) != mode
)
585 if (iv
->extend
== IV_UNKNOWN_EXTEND
)
587 iv
->base
= simplify_gen_binary (MULT
, mode
, iv
->base
, mby
);
588 iv
->step
= simplify_gen_binary (MULT
, mode
, iv
->step
, mby
);
592 iv
->delta
= simplify_gen_binary (MULT
, mode
, iv
->delta
, mby
);
593 iv
->mult
= simplify_gen_binary (MULT
, mode
, iv
->mult
, mby
);
599 /* Evaluates shift of IV by constant CST. */
602 iv_shift (struct rtx_iv
*iv
, rtx mby
)
604 scalar_int_mode mode
= iv
->extend_mode
;
606 if (GET_MODE (mby
) != VOIDmode
607 && GET_MODE (mby
) != mode
)
610 if (iv
->extend
== IV_UNKNOWN_EXTEND
)
612 iv
->base
= simplify_gen_binary (ASHIFT
, mode
, iv
->base
, mby
);
613 iv
->step
= simplify_gen_binary (ASHIFT
, mode
, iv
->step
, mby
);
617 iv
->delta
= simplify_gen_binary (ASHIFT
, mode
, iv
->delta
, mby
);
618 iv
->mult
= simplify_gen_binary (ASHIFT
, mode
, iv
->mult
, mby
);
624 /* The recursive part of get_biv_step. Gets the value of the single value
625 defined by DEF wrto initial value of REG inside loop, in shape described
629 get_biv_step_1 (df_ref def
, scalar_int_mode outer_mode
, rtx reg
,
630 rtx
*inner_step
, scalar_int_mode
*inner_mode
,
631 enum iv_extend_code
*extend
,
634 rtx set
, rhs
, op0
= NULL_RTX
, op1
= NULL_RTX
;
637 rtx_insn
*insn
= DF_REF_INSN (def
);
639 enum iv_grd_result res
;
641 set
= single_set (insn
);
645 rhs
= find_reg_equal_equiv_note (insn
);
651 code
= GET_CODE (rhs
);
664 if (code
== PLUS
&& CONSTANT_P (op0
))
665 std::swap (op0
, op1
);
667 if (!simple_reg_p (op0
)
668 || !CONSTANT_P (op1
))
671 if (GET_MODE (rhs
) != outer_mode
)
673 /* ppc64 uses expressions like
675 (set x:SI (plus:SI (subreg:SI y:DI) 1)).
677 this is equivalent to
679 (set x':DI (plus:DI y:DI 1))
680 (set x:SI (subreg:SI (x':DI)). */
681 if (GET_CODE (op0
) != SUBREG
)
683 if (GET_MODE (SUBREG_REG (op0
)) != outer_mode
)
692 if (GET_MODE (rhs
) != outer_mode
)
696 if (!simple_reg_p (op0
))
706 if (GET_CODE (next
) == SUBREG
)
708 if (!subreg_lowpart_p (next
))
711 nextr
= SUBREG_REG (next
);
712 if (GET_MODE (nextr
) != outer_mode
)
718 res
= iv_get_reaching_def (insn
, nextr
, &next_def
);
720 if (res
== GRD_INVALID
|| res
== GRD_INVARIANT
)
723 if (res
== GRD_MAYBE_BIV
)
725 if (!rtx_equal_p (nextr
, reg
))
728 *inner_step
= const0_rtx
;
729 *extend
= IV_UNKNOWN_EXTEND
;
730 *inner_mode
= outer_mode
;
731 *outer_step
= const0_rtx
;
733 else if (!get_biv_step_1 (next_def
, outer_mode
, reg
,
734 inner_step
, inner_mode
, extend
,
738 if (GET_CODE (next
) == SUBREG
)
740 scalar_int_mode amode
;
741 if (!is_a
<scalar_int_mode
> (GET_MODE (next
), &amode
)
742 || GET_MODE_SIZE (amode
) > GET_MODE_SIZE (*inner_mode
))
746 *inner_step
= simplify_gen_binary (PLUS
, outer_mode
,
747 *inner_step
, *outer_step
);
748 *outer_step
= const0_rtx
;
749 *extend
= IV_UNKNOWN_EXTEND
;
760 if (*inner_mode
== outer_mode
761 /* See comment in previous switch. */
762 || GET_MODE (rhs
) != outer_mode
)
763 *inner_step
= simplify_gen_binary (code
, outer_mode
,
766 *outer_step
= simplify_gen_binary (code
, outer_mode
,
772 gcc_assert (GET_MODE (op0
) == *inner_mode
773 && *extend
== IV_UNKNOWN_EXTEND
774 && *outer_step
== const0_rtx
);
776 *extend
= (code
== SIGN_EXTEND
) ? IV_SIGN_EXTEND
: IV_ZERO_EXTEND
;
786 /* Gets the operation on register REG inside loop, in shape
788 OUTER_STEP + EXTEND_{OUTER_MODE} (SUBREG_{INNER_MODE} (REG + INNER_STEP))
790 If the operation cannot be described in this shape, return false.
791 LAST_DEF is the definition of REG that dominates loop latch. */
794 get_biv_step (df_ref last_def
, scalar_int_mode outer_mode
, rtx reg
,
795 rtx
*inner_step
, scalar_int_mode
*inner_mode
,
796 enum iv_extend_code
*extend
, rtx
*outer_step
)
798 if (!get_biv_step_1 (last_def
, outer_mode
, reg
,
799 inner_step
, inner_mode
, extend
,
803 gcc_assert ((*inner_mode
== outer_mode
) != (*extend
!= IV_UNKNOWN_EXTEND
));
804 gcc_assert (*inner_mode
!= outer_mode
|| *outer_step
== const0_rtx
);
809 /* Records information that DEF is induction variable IV. */
812 record_iv (df_ref def
, struct rtx_iv
*iv
)
814 struct rtx_iv
*recorded_iv
= XNEW (struct rtx_iv
);
817 check_iv_ref_table_size ();
818 DF_REF_IV_SET (def
, recorded_iv
);
821 /* If DEF was already analyzed for bivness, store the description of the biv to
822 IV and return true. Otherwise return false. */
825 analyzed_for_bivness_p (rtx def
, struct rtx_iv
*iv
)
827 struct biv_entry
*biv
= bivs
->find_with_hash (def
, REGNO (def
));
837 record_biv (rtx def
, struct rtx_iv
*iv
)
839 struct biv_entry
*biv
= XNEW (struct biv_entry
);
840 biv_entry
**slot
= bivs
->find_slot_with_hash (def
, REGNO (def
), INSERT
);
842 biv
->regno
= REGNO (def
);
848 /* Determines whether DEF is a biv and if so, stores its description
849 to *IV. OUTER_MODE is the mode of DEF. */
852 iv_analyze_biv (scalar_int_mode outer_mode
, rtx def
, struct rtx_iv
*iv
)
854 rtx inner_step
, outer_step
;
855 scalar_int_mode inner_mode
;
856 enum iv_extend_code extend
;
861 fprintf (dump_file
, "Analyzing ");
862 print_rtl (dump_file
, def
);
863 fprintf (dump_file
, " for bivness.\n");
868 if (!CONSTANT_P (def
))
871 return iv_constant (iv
, outer_mode
, def
);
874 if (!latch_dominating_def (def
, &last_def
))
877 fprintf (dump_file
, " not simple.\n");
882 return iv_constant (iv
, outer_mode
, def
);
884 if (analyzed_for_bivness_p (def
, iv
))
887 fprintf (dump_file
, " already analysed.\n");
888 return iv
->base
!= NULL_RTX
;
891 if (!get_biv_step (last_def
, outer_mode
, def
, &inner_step
, &inner_mode
,
892 &extend
, &outer_step
))
898 /* Loop transforms base to es (base + inner_step) + outer_step,
899 where es means extend of subreg between inner_mode and outer_mode.
900 The corresponding induction variable is
902 es ((base - outer_step) + i * (inner_step + outer_step)) + outer_step */
904 iv
->base
= simplify_gen_binary (MINUS
, outer_mode
, def
, outer_step
);
905 iv
->step
= simplify_gen_binary (PLUS
, outer_mode
, inner_step
, outer_step
);
906 iv
->mode
= inner_mode
;
907 iv
->extend_mode
= outer_mode
;
909 iv
->mult
= const1_rtx
;
910 iv
->delta
= outer_step
;
911 iv
->first_special
= inner_mode
!= outer_mode
;
916 fprintf (dump_file
, " ");
917 dump_iv_info (dump_file
, iv
);
918 fprintf (dump_file
, "\n");
921 record_biv (def
, iv
);
922 return iv
->base
!= NULL_RTX
;
925 /* Analyzes expression RHS used at INSN and stores the result to *IV.
926 The mode of the induction variable is MODE. */
929 iv_analyze_expr (rtx_insn
*insn
, scalar_int_mode mode
, rtx rhs
,
933 rtx op0
= NULL_RTX
, op1
= NULL_RTX
;
934 struct rtx_iv iv0
, iv1
;
935 enum rtx_code code
= GET_CODE (rhs
);
936 scalar_int_mode omode
= mode
;
941 gcc_assert (GET_MODE (rhs
) == mode
|| GET_MODE (rhs
) == VOIDmode
);
946 return iv_analyze_op (insn
, mode
, rhs
, iv
);
958 /* We don't know how many bits there are in a sign-extended constant. */
959 if (!is_a
<scalar_int_mode
> (GET_MODE (op0
), &omode
))
972 if (!CONSTANT_P (mby
))
973 std::swap (op0
, mby
);
974 if (!CONSTANT_P (mby
))
981 if (!CONSTANT_P (mby
))
990 && !iv_analyze_expr (insn
, omode
, op0
, &iv0
))
994 && !iv_analyze_expr (insn
, omode
, op1
, &iv1
))
1000 if (!iv_extend (&iv0
, IV_SIGN_EXTEND
, mode
))
1005 if (!iv_extend (&iv0
, IV_ZERO_EXTEND
, mode
))
1016 if (!iv_add (&iv0
, &iv1
, code
))
1021 if (!iv_mult (&iv0
, mby
))
1026 if (!iv_shift (&iv0
, mby
))
1035 return iv
->base
!= NULL_RTX
;
1038 /* Analyzes iv DEF and stores the result to *IV. */
1041 iv_analyze_def (df_ref def
, struct rtx_iv
*iv
)
1043 rtx_insn
*insn
= DF_REF_INSN (def
);
1044 rtx reg
= DF_REF_REG (def
);
1049 fprintf (dump_file
, "Analyzing def of ");
1050 print_rtl (dump_file
, reg
);
1051 fprintf (dump_file
, " in insn ");
1052 print_rtl_single (dump_file
, insn
);
1055 check_iv_ref_table_size ();
1056 if (DF_REF_IV (def
))
1059 fprintf (dump_file
, " already analysed.\n");
1060 *iv
= *DF_REF_IV (def
);
1061 return iv
->base
!= NULL_RTX
;
1064 iv
->base
= NULL_RTX
;
1065 iv
->step
= NULL_RTX
;
1067 scalar_int_mode mode
;
1068 if (!REG_P (reg
) || !is_a
<scalar_int_mode
> (GET_MODE (reg
), &mode
))
1071 set
= single_set (insn
);
1075 if (!REG_P (SET_DEST (set
)))
1078 gcc_assert (SET_DEST (set
) == reg
);
1079 rhs
= find_reg_equal_equiv_note (insn
);
1081 rhs
= XEXP (rhs
, 0);
1083 rhs
= SET_SRC (set
);
1085 iv_analyze_expr (insn
, mode
, rhs
, iv
);
1086 record_iv (def
, iv
);
1090 print_rtl (dump_file
, reg
);
1091 fprintf (dump_file
, " in insn ");
1092 print_rtl_single (dump_file
, insn
);
1093 fprintf (dump_file
, " is ");
1094 dump_iv_info (dump_file
, iv
);
1095 fprintf (dump_file
, "\n");
1098 return iv
->base
!= NULL_RTX
;
1101 /* Analyzes operand OP of INSN and stores the result to *IV. MODE is the
1105 iv_analyze_op (rtx_insn
*insn
, scalar_int_mode mode
, rtx op
, struct rtx_iv
*iv
)
1108 enum iv_grd_result res
;
1112 fprintf (dump_file
, "Analyzing operand ");
1113 print_rtl (dump_file
, op
);
1114 fprintf (dump_file
, " of insn ");
1115 print_rtl_single (dump_file
, insn
);
1118 if (function_invariant_p (op
))
1119 res
= GRD_INVARIANT
;
1120 else if (GET_CODE (op
) == SUBREG
)
1122 scalar_int_mode inner_mode
;
1123 if (!subreg_lowpart_p (op
)
1124 || !is_a
<scalar_int_mode
> (GET_MODE (SUBREG_REG (op
)), &inner_mode
))
1127 if (!iv_analyze_op (insn
, inner_mode
, SUBREG_REG (op
), iv
))
1130 return iv_subreg (iv
, mode
);
1134 res
= iv_get_reaching_def (insn
, op
, &def
);
1135 if (res
== GRD_INVALID
)
1138 fprintf (dump_file
, " not simple.\n");
1143 if (res
== GRD_INVARIANT
)
1145 iv_constant (iv
, mode
, op
);
1149 fprintf (dump_file
, " ");
1150 dump_iv_info (dump_file
, iv
);
1151 fprintf (dump_file
, "\n");
1156 if (res
== GRD_MAYBE_BIV
)
1157 return iv_analyze_biv (mode
, op
, iv
);
1159 return iv_analyze_def (def
, iv
);
1162 /* Analyzes value VAL at INSN and stores the result to *IV. MODE is the
1166 iv_analyze (rtx_insn
*insn
, scalar_int_mode mode
, rtx val
, struct rtx_iv
*iv
)
1170 /* We must find the insn in that val is used, so that we get to UD chains.
1171 Since the function is sometimes called on result of get_condition,
1172 this does not necessarily have to be directly INSN; scan also the
1174 if (simple_reg_p (val
))
1176 if (GET_CODE (val
) == SUBREG
)
1177 reg
= SUBREG_REG (val
);
1181 while (!df_find_use (insn
, reg
))
1182 insn
= NEXT_INSN (insn
);
1185 return iv_analyze_op (insn
, mode
, val
, iv
);
1188 /* Analyzes definition of DEF in INSN and stores the result to IV. */
1191 iv_analyze_result (rtx_insn
*insn
, rtx def
, struct rtx_iv
*iv
)
1195 adef
= df_find_def (insn
, def
);
1199 return iv_analyze_def (adef
, iv
);
1202 /* Checks whether definition of register REG in INSN is a basic induction
1203 variable. MODE is the mode of REG.
1205 IV analysis must have been initialized (via a call to
1206 iv_analysis_loop_init) for this function to produce a result. */
1209 biv_p (rtx_insn
*insn
, scalar_int_mode mode
, rtx reg
)
1212 df_ref def
, last_def
;
1214 if (!simple_reg_p (reg
))
1217 def
= df_find_def (insn
, reg
);
1218 gcc_assert (def
!= NULL
);
1219 if (!latch_dominating_def (reg
, &last_def
))
1221 if (last_def
!= def
)
1224 if (!iv_analyze_biv (mode
, reg
, &iv
))
1227 return iv
.step
!= const0_rtx
;
1230 /* Calculates value of IV at ITERATION-th iteration. */
1233 get_iv_value (struct rtx_iv
*iv
, rtx iteration
)
1237 /* We would need to generate some if_then_else patterns, and so far
1238 it is not needed anywhere. */
1239 gcc_assert (!iv
->first_special
);
1241 if (iv
->step
!= const0_rtx
&& iteration
!= const0_rtx
)
1242 val
= simplify_gen_binary (PLUS
, iv
->extend_mode
, iv
->base
,
1243 simplify_gen_binary (MULT
, iv
->extend_mode
,
1244 iv
->step
, iteration
));
1248 if (iv
->extend_mode
== iv
->mode
)
1251 val
= lowpart_subreg (iv
->mode
, val
, iv
->extend_mode
);
1253 if (iv
->extend
== IV_UNKNOWN_EXTEND
)
1256 val
= simplify_gen_unary (iv_extend_to_rtx_code (iv
->extend
),
1257 iv
->extend_mode
, val
, iv
->mode
);
1258 val
= simplify_gen_binary (PLUS
, iv
->extend_mode
, iv
->delta
,
1259 simplify_gen_binary (MULT
, iv
->extend_mode
,
1265 /* Free the data for an induction variable analysis. */
1268 iv_analysis_done (void)
1274 df_finish_pass (true);
1277 free (iv_ref_table
);
1278 iv_ref_table
= NULL
;
1279 iv_ref_table_size
= 0;
1283 /* Computes inverse to X modulo (1 << MOD). */
1286 inverse (uint64_t x
, int mod
)
1289 ((uint64_t) 1 << (mod
- 1) << 1) - 1;
1293 for (i
= 0; i
< mod
- 1; i
++)
1295 rslt
= (rslt
* x
) & mask
;
1302 /* Checks whether any register in X is in set ALT. */
1305 altered_reg_used (const_rtx x
, bitmap alt
)
1307 subrtx_iterator::array_type array
;
1308 FOR_EACH_SUBRTX (iter
, array
, x
, NONCONST
)
1310 const_rtx x
= *iter
;
1311 if (REG_P (x
) && REGNO_REG_SET_P (alt
, REGNO (x
)))
1317 /* Marks registers altered by EXPR in set ALT. */
1320 mark_altered (rtx expr
, const_rtx by ATTRIBUTE_UNUSED
, void *alt
)
1322 if (GET_CODE (expr
) == SUBREG
)
1323 expr
= SUBREG_REG (expr
);
1327 SET_REGNO_REG_SET ((bitmap
) alt
, REGNO (expr
));
1330 /* Checks whether RHS is simple enough to process. */
1333 simple_rhs_p (rtx rhs
)
1337 if (function_invariant_p (rhs
)
1338 || (REG_P (rhs
) && !HARD_REGISTER_P (rhs
)))
1341 switch (GET_CODE (rhs
))
1346 op0
= XEXP (rhs
, 0);
1347 op1
= XEXP (rhs
, 1);
1348 /* Allow reg OP const and reg OP reg. */
1349 if (!(REG_P (op0
) && !HARD_REGISTER_P (op0
))
1350 && !function_invariant_p (op0
))
1352 if (!(REG_P (op1
) && !HARD_REGISTER_P (op1
))
1353 && !function_invariant_p (op1
))
1362 op0
= XEXP (rhs
, 0);
1363 op1
= XEXP (rhs
, 1);
1364 /* Allow reg OP const. */
1365 if (!(REG_P (op0
) && !HARD_REGISTER_P (op0
)))
1367 if (!function_invariant_p (op1
))
1377 /* If REGNO has a single definition, return its known value, otherwise return
1381 find_single_def_src (unsigned int regno
)
1389 adef
= DF_REG_DEF_CHAIN (regno
);
1390 if (adef
== NULL
|| DF_REF_NEXT_REG (adef
) != NULL
1391 || DF_REF_IS_ARTIFICIAL (adef
))
1394 set
= single_set (DF_REF_INSN (adef
));
1395 if (set
== NULL
|| !REG_P (SET_DEST (set
))
1396 || REGNO (SET_DEST (set
)) != regno
)
1399 note
= find_reg_equal_equiv_note (DF_REF_INSN (adef
));
1401 if (note
&& function_invariant_p (XEXP (note
, 0)))
1403 src
= XEXP (note
, 0);
1406 src
= SET_SRC (set
);
1410 regno
= REGNO (src
);
1415 if (!function_invariant_p (src
))
1421 /* If any registers in *EXPR that have a single definition, try to replace
1422 them with the known-equivalent values. */
1425 replace_single_def_regs (rtx
*expr
)
1427 subrtx_var_iterator::array_type array
;
1429 FOR_EACH_SUBRTX_VAR (iter
, array
, *expr
, NONCONST
)
1433 if (rtx new_x
= find_single_def_src (REGNO (x
)))
1435 *expr
= simplify_replace_rtx (*expr
, x
, new_x
);
1441 /* A subroutine of simplify_using_initial_values, this function examines INSN
1442 to see if it contains a suitable set that we can use to make a replacement.
1443 If it is suitable, return true and set DEST and SRC to the lhs and rhs of
1444 the set; return false otherwise. */
1447 suitable_set_for_replacement (rtx_insn
*insn
, rtx
*dest
, rtx
*src
)
1449 rtx set
= single_set (insn
);
1450 rtx lhs
= NULL_RTX
, rhs
;
1455 lhs
= SET_DEST (set
);
1459 rhs
= find_reg_equal_equiv_note (insn
);
1461 rhs
= XEXP (rhs
, 0);
1463 rhs
= SET_SRC (set
);
1465 if (!simple_rhs_p (rhs
))
1473 /* Using the data returned by suitable_set_for_replacement, replace DEST
1474 with SRC in *EXPR and return the new expression. Also call
1475 replace_single_def_regs if the replacement changed something. */
1477 replace_in_expr (rtx
*expr
, rtx dest
, rtx src
)
1480 *expr
= simplify_replace_rtx (*expr
, dest
, src
);
1483 replace_single_def_regs (expr
);
1486 /* Checks whether A implies B. */
1489 implies_p (rtx a
, rtx b
)
1491 rtx op0
, op1
, opb0
, opb1
;
1494 if (rtx_equal_p (a
, b
))
1497 if (GET_CODE (a
) == EQ
)
1503 || (GET_CODE (op0
) == SUBREG
1504 && REG_P (SUBREG_REG (op0
))))
1506 rtx r
= simplify_replace_rtx (b
, op0
, op1
);
1507 if (r
== const_true_rtx
)
1512 || (GET_CODE (op1
) == SUBREG
1513 && REG_P (SUBREG_REG (op1
))))
1515 rtx r
= simplify_replace_rtx (b
, op1
, op0
);
1516 if (r
== const_true_rtx
)
1521 if (b
== const_true_rtx
)
1524 if ((GET_RTX_CLASS (GET_CODE (a
)) != RTX_COMM_COMPARE
1525 && GET_RTX_CLASS (GET_CODE (a
)) != RTX_COMPARE
)
1526 || (GET_RTX_CLASS (GET_CODE (b
)) != RTX_COMM_COMPARE
1527 && GET_RTX_CLASS (GET_CODE (b
)) != RTX_COMPARE
))
1535 mode
= GET_MODE (op0
);
1536 if (mode
!= GET_MODE (opb0
))
1538 else if (mode
== VOIDmode
)
1540 mode
= GET_MODE (op1
);
1541 if (mode
!= GET_MODE (opb1
))
1545 /* A < B implies A + 1 <= B. */
1546 if ((GET_CODE (a
) == GT
|| GET_CODE (a
) == LT
)
1547 && (GET_CODE (b
) == GE
|| GET_CODE (b
) == LE
))
1550 if (GET_CODE (a
) == GT
)
1551 std::swap (op0
, op1
);
1553 if (GET_CODE (b
) == GE
)
1554 std::swap (opb0
, opb1
);
1556 if (SCALAR_INT_MODE_P (mode
)
1557 && rtx_equal_p (op1
, opb1
)
1558 && simplify_gen_binary (MINUS
, mode
, opb0
, op0
) == const1_rtx
)
1563 /* A < B or A > B imply A != B. TODO: Likewise
1564 A + n < B implies A != B + n if neither wraps. */
1565 if (GET_CODE (b
) == NE
1566 && (GET_CODE (a
) == GT
|| GET_CODE (a
) == GTU
1567 || GET_CODE (a
) == LT
|| GET_CODE (a
) == LTU
))
1569 if (rtx_equal_p (op0
, opb0
)
1570 && rtx_equal_p (op1
, opb1
))
1574 /* For unsigned comparisons, A != 0 implies A > 0 and A >= 1. */
1575 if (GET_CODE (a
) == NE
1576 && op1
== const0_rtx
)
1578 if ((GET_CODE (b
) == GTU
1579 && opb1
== const0_rtx
)
1580 || (GET_CODE (b
) == GEU
1581 && opb1
== const1_rtx
))
1582 return rtx_equal_p (op0
, opb0
);
1585 /* A != N is equivalent to A - (N + 1) <u -1. */
1586 if (GET_CODE (a
) == NE
1587 && CONST_INT_P (op1
)
1588 && GET_CODE (b
) == LTU
1589 && opb1
== constm1_rtx
1590 && GET_CODE (opb0
) == PLUS
1591 && CONST_INT_P (XEXP (opb0
, 1))
1592 /* Avoid overflows. */
1593 && ((unsigned HOST_WIDE_INT
) INTVAL (XEXP (opb0
, 1))
1594 != ((unsigned HOST_WIDE_INT
)1
1595 << (HOST_BITS_PER_WIDE_INT
- 1)) - 1)
1596 && INTVAL (XEXP (opb0
, 1)) + 1 == -INTVAL (op1
))
1597 return rtx_equal_p (op0
, XEXP (opb0
, 0));
1599 /* Likewise, A != N implies A - N > 0. */
1600 if (GET_CODE (a
) == NE
1601 && CONST_INT_P (op1
))
1603 if (GET_CODE (b
) == GTU
1604 && GET_CODE (opb0
) == PLUS
1605 && opb1
== const0_rtx
1606 && CONST_INT_P (XEXP (opb0
, 1))
1607 /* Avoid overflows. */
1608 && ((unsigned HOST_WIDE_INT
) INTVAL (XEXP (opb0
, 1))
1609 != (HOST_WIDE_INT_1U
<< (HOST_BITS_PER_WIDE_INT
- 1)))
1610 && rtx_equal_p (XEXP (opb0
, 0), op0
))
1611 return INTVAL (op1
) == -INTVAL (XEXP (opb0
, 1));
1612 if (GET_CODE (b
) == GEU
1613 && GET_CODE (opb0
) == PLUS
1614 && opb1
== const1_rtx
1615 && CONST_INT_P (XEXP (opb0
, 1))
1616 /* Avoid overflows. */
1617 && ((unsigned HOST_WIDE_INT
) INTVAL (XEXP (opb0
, 1))
1618 != (HOST_WIDE_INT_1U
<< (HOST_BITS_PER_WIDE_INT
- 1)))
1619 && rtx_equal_p (XEXP (opb0
, 0), op0
))
1620 return INTVAL (op1
) == -INTVAL (XEXP (opb0
, 1));
1623 /* A >s X, where X is positive, implies A <u Y, if Y is negative. */
1624 if ((GET_CODE (a
) == GT
|| GET_CODE (a
) == GE
)
1625 && CONST_INT_P (op1
)
1626 && ((GET_CODE (a
) == GT
&& op1
== constm1_rtx
)
1627 || INTVAL (op1
) >= 0)
1628 && GET_CODE (b
) == LTU
1629 && CONST_INT_P (opb1
)
1630 && rtx_equal_p (op0
, opb0
))
1631 return INTVAL (opb1
) < 0;
1636 /* Canonicalizes COND so that
1638 (1) Ensure that operands are ordered according to
1639 swap_commutative_operands_p.
1640 (2) (LE x const) will be replaced with (LT x <const+1>) and similarly
1641 for GE, GEU, and LEU. */
1644 canon_condition (rtx cond
)
1650 code
= GET_CODE (cond
);
1651 op0
= XEXP (cond
, 0);
1652 op1
= XEXP (cond
, 1);
1654 if (swap_commutative_operands_p (op0
, op1
))
1656 code
= swap_condition (code
);
1657 std::swap (op0
, op1
);
1660 mode
= GET_MODE (op0
);
1661 if (mode
== VOIDmode
)
1662 mode
= GET_MODE (op1
);
1663 gcc_assert (mode
!= VOIDmode
);
1665 if (CONST_SCALAR_INT_P (op1
) && GET_MODE_CLASS (mode
) != MODE_CC
)
1667 rtx_mode_t
const_val (op1
, mode
);
1672 if (wi::ne_p (const_val
, wi::max_value (mode
, SIGNED
)))
1675 op1
= immed_wide_int_const (wi::add (const_val
, 1), mode
);
1680 if (wi::ne_p (const_val
, wi::min_value (mode
, SIGNED
)))
1683 op1
= immed_wide_int_const (wi::sub (const_val
, 1), mode
);
1688 if (wi::ne_p (const_val
, -1))
1691 op1
= immed_wide_int_const (wi::add (const_val
, 1), mode
);
1696 if (wi::ne_p (const_val
, 0))
1699 op1
= immed_wide_int_const (wi::sub (const_val
, 1), mode
);
1708 if (op0
!= XEXP (cond
, 0)
1709 || op1
!= XEXP (cond
, 1)
1710 || code
!= GET_CODE (cond
)
1711 || GET_MODE (cond
) != SImode
)
1712 cond
= gen_rtx_fmt_ee (code
, SImode
, op0
, op1
);
1717 /* Reverses CONDition; returns NULL if we cannot. */
1720 reversed_condition (rtx cond
)
1722 enum rtx_code reversed
;
1723 reversed
= reversed_comparison_code (cond
, NULL
);
1724 if (reversed
== UNKNOWN
)
1727 return gen_rtx_fmt_ee (reversed
,
1728 GET_MODE (cond
), XEXP (cond
, 0),
1732 /* Tries to use the fact that COND holds to simplify EXPR. ALTERED is the
1733 set of altered regs. */
1736 simplify_using_condition (rtx cond
, rtx
*expr
, regset altered
)
1738 rtx rev
, reve
, exp
= *expr
;
1740 /* If some register gets altered later, we do not really speak about its
1741 value at the time of comparison. */
1742 if (altered
&& altered_reg_used (cond
, altered
))
1745 if (GET_CODE (cond
) == EQ
1746 && REG_P (XEXP (cond
, 0)) && CONSTANT_P (XEXP (cond
, 1)))
1748 *expr
= simplify_replace_rtx (*expr
, XEXP (cond
, 0), XEXP (cond
, 1));
1752 if (!COMPARISON_P (exp
))
1755 rev
= reversed_condition (cond
);
1756 reve
= reversed_condition (exp
);
1758 cond
= canon_condition (cond
);
1759 exp
= canon_condition (exp
);
1761 rev
= canon_condition (rev
);
1763 reve
= canon_condition (reve
);
1765 if (rtx_equal_p (exp
, cond
))
1767 *expr
= const_true_rtx
;
1771 if (rev
&& rtx_equal_p (exp
, rev
))
1777 if (implies_p (cond
, exp
))
1779 *expr
= const_true_rtx
;
1783 if (reve
&& implies_p (cond
, reve
))
1789 /* A proof by contradiction. If *EXPR implies (not cond), *EXPR must
1791 if (rev
&& implies_p (exp
, rev
))
1797 /* Similarly, If (not *EXPR) implies (not cond), *EXPR must be true. */
1798 if (rev
&& reve
&& implies_p (reve
, rev
))
1800 *expr
= const_true_rtx
;
1804 /* We would like to have some other tests here. TODO. */
1809 /* Use relationship between A and *B to eventually eliminate *B.
1810 OP is the operation we consider. */
1813 eliminate_implied_condition (enum rtx_code op
, rtx a
, rtx
*b
)
1818 /* If A implies *B, we may replace *B by true. */
1819 if (implies_p (a
, *b
))
1820 *b
= const_true_rtx
;
1824 /* If *B implies A, we may replace *B by false. */
1825 if (implies_p (*b
, a
))
1834 /* Eliminates the conditions in TAIL that are implied by HEAD. OP is the
1835 operation we consider. */
1838 eliminate_implied_conditions (enum rtx_code op
, rtx
*head
, rtx tail
)
1842 for (elt
= tail
; elt
; elt
= XEXP (elt
, 1))
1843 eliminate_implied_condition (op
, *head
, &XEXP (elt
, 0));
1844 for (elt
= tail
; elt
; elt
= XEXP (elt
, 1))
1845 eliminate_implied_condition (op
, XEXP (elt
, 0), head
);
1848 /* Simplifies *EXPR using initial values at the start of the LOOP. If *EXPR
1849 is a list, its elements are assumed to be combined using OP. */
1852 simplify_using_initial_values (struct loop
*loop
, enum rtx_code op
, rtx
*expr
)
1854 bool expression_valid
;
1855 rtx head
, tail
, last_valid_expr
;
1856 rtx_expr_list
*cond_list
;
1859 regset altered
, this_altered
;
1865 if (CONSTANT_P (*expr
))
1868 if (GET_CODE (*expr
) == EXPR_LIST
)
1870 head
= XEXP (*expr
, 0);
1871 tail
= XEXP (*expr
, 1);
1873 eliminate_implied_conditions (op
, &head
, tail
);
1878 neutral
= const_true_rtx
;
1883 neutral
= const0_rtx
;
1884 aggr
= const_true_rtx
;
1891 simplify_using_initial_values (loop
, UNKNOWN
, &head
);
1894 XEXP (*expr
, 0) = aggr
;
1895 XEXP (*expr
, 1) = NULL_RTX
;
1898 else if (head
== neutral
)
1901 simplify_using_initial_values (loop
, op
, expr
);
1904 simplify_using_initial_values (loop
, op
, &tail
);
1906 if (tail
&& XEXP (tail
, 0) == aggr
)
1912 XEXP (*expr
, 0) = head
;
1913 XEXP (*expr
, 1) = tail
;
1917 gcc_assert (op
== UNKNOWN
);
1919 replace_single_def_regs (expr
);
1920 if (CONSTANT_P (*expr
))
1923 e
= loop_preheader_edge (loop
);
1924 if (e
->src
== ENTRY_BLOCK_PTR_FOR_FN (cfun
))
1927 altered
= ALLOC_REG_SET (®_obstack
);
1928 this_altered
= ALLOC_REG_SET (®_obstack
);
1930 expression_valid
= true;
1931 last_valid_expr
= *expr
;
1935 insn
= BB_END (e
->src
);
1936 if (any_condjump_p (insn
))
1938 rtx cond
= get_condition (BB_END (e
->src
), NULL
, false, true);
1940 if (cond
&& (e
->flags
& EDGE_FALLTHRU
))
1941 cond
= reversed_condition (cond
);
1945 simplify_using_condition (cond
, expr
, altered
);
1949 if (CONSTANT_P (*expr
))
1951 for (note
= cond_list
; note
; note
= XEXP (note
, 1))
1953 simplify_using_condition (XEXP (note
, 0), expr
, altered
);
1954 if (CONSTANT_P (*expr
))
1958 cond_list
= alloc_EXPR_LIST (0, cond
, cond_list
);
1962 FOR_BB_INSNS_REVERSE (e
->src
, insn
)
1970 CLEAR_REG_SET (this_altered
);
1971 note_stores (PATTERN (insn
), mark_altered
, this_altered
);
1974 /* Kill all call clobbered registers. */
1976 hard_reg_set_iterator hrsi
;
1977 EXECUTE_IF_SET_IN_HARD_REG_SET (regs_invalidated_by_call
,
1979 SET_REGNO_REG_SET (this_altered
, i
);
1982 if (suitable_set_for_replacement (insn
, &dest
, &src
))
1984 rtx_expr_list
**pnote
, **pnote_next
;
1986 replace_in_expr (expr
, dest
, src
);
1987 if (CONSTANT_P (*expr
))
1990 for (pnote
= &cond_list
; *pnote
; pnote
= pnote_next
)
1992 rtx_expr_list
*note
= *pnote
;
1993 rtx old_cond
= XEXP (note
, 0);
1995 pnote_next
= (rtx_expr_list
**)&XEXP (note
, 1);
1996 replace_in_expr (&XEXP (note
, 0), dest
, src
);
1998 /* We can no longer use a condition that has been simplified
1999 to a constant, and simplify_using_condition will abort if
2001 if (CONSTANT_P (XEXP (note
, 0)))
2003 *pnote
= *pnote_next
;
2005 free_EXPR_LIST_node (note
);
2007 /* Retry simplifications with this condition if either the
2008 expression or the condition changed. */
2009 else if (old_cond
!= XEXP (note
, 0) || old
!= *expr
)
2010 simplify_using_condition (XEXP (note
, 0), expr
, altered
);
2015 rtx_expr_list
**pnote
, **pnote_next
;
2017 /* If we did not use this insn to make a replacement, any overlap
2018 between stores in this insn and our expression will cause the
2019 expression to become invalid. */
2020 if (altered_reg_used (*expr
, this_altered
))
2023 /* Likewise for the conditions. */
2024 for (pnote
= &cond_list
; *pnote
; pnote
= pnote_next
)
2026 rtx_expr_list
*note
= *pnote
;
2027 rtx old_cond
= XEXP (note
, 0);
2029 pnote_next
= (rtx_expr_list
**)&XEXP (note
, 1);
2030 if (altered_reg_used (old_cond
, this_altered
))
2032 *pnote
= *pnote_next
;
2034 free_EXPR_LIST_node (note
);
2039 if (CONSTANT_P (*expr
))
2042 IOR_REG_SET (altered
, this_altered
);
2044 /* If the expression now contains regs that have been altered, we
2045 can't return it to the caller. However, it is still valid for
2046 further simplification, so keep searching to see if we can
2047 eventually turn it into a constant. */
2048 if (altered_reg_used (*expr
, altered
))
2049 expression_valid
= false;
2050 if (expression_valid
)
2051 last_valid_expr
= *expr
;
2054 if (!single_pred_p (e
->src
)
2055 || single_pred (e
->src
) == ENTRY_BLOCK_PTR_FOR_FN (cfun
))
2057 e
= single_pred_edge (e
->src
);
2061 free_EXPR_LIST_list (&cond_list
);
2062 if (!CONSTANT_P (*expr
))
2063 *expr
= last_valid_expr
;
2064 FREE_REG_SET (altered
);
2065 FREE_REG_SET (this_altered
);
2068 /* Transforms invariant IV into MODE. Adds assumptions based on the fact
2069 that IV occurs as left operands of comparison COND and its signedness
2070 is SIGNED_P to DESC. */
2073 shorten_into_mode (struct rtx_iv
*iv
, scalar_int_mode mode
,
2074 enum rtx_code cond
, bool signed_p
, struct niter_desc
*desc
)
2076 rtx mmin
, mmax
, cond_over
, cond_under
;
2078 get_mode_bounds (mode
, signed_p
, iv
->extend_mode
, &mmin
, &mmax
);
2079 cond_under
= simplify_gen_relational (LT
, SImode
, iv
->extend_mode
,
2081 cond_over
= simplify_gen_relational (GT
, SImode
, iv
->extend_mode
,
2090 if (cond_under
!= const0_rtx
)
2092 alloc_EXPR_LIST (0, cond_under
, desc
->infinite
);
2093 if (cond_over
!= const0_rtx
)
2094 desc
->noloop_assumptions
=
2095 alloc_EXPR_LIST (0, cond_over
, desc
->noloop_assumptions
);
2102 if (cond_over
!= const0_rtx
)
2104 alloc_EXPR_LIST (0, cond_over
, desc
->infinite
);
2105 if (cond_under
!= const0_rtx
)
2106 desc
->noloop_assumptions
=
2107 alloc_EXPR_LIST (0, cond_under
, desc
->noloop_assumptions
);
2111 if (cond_over
!= const0_rtx
)
2113 alloc_EXPR_LIST (0, cond_over
, desc
->infinite
);
2114 if (cond_under
!= const0_rtx
)
2116 alloc_EXPR_LIST (0, cond_under
, desc
->infinite
);
2124 iv
->extend
= signed_p
? IV_SIGN_EXTEND
: IV_ZERO_EXTEND
;
2127 /* Transforms IV0 and IV1 compared by COND so that they are both compared as
2128 subregs of the same mode if possible (sometimes it is necessary to add
2129 some assumptions to DESC). */
2132 canonicalize_iv_subregs (struct rtx_iv
*iv0
, struct rtx_iv
*iv1
,
2133 enum rtx_code cond
, struct niter_desc
*desc
)
2135 scalar_int_mode comp_mode
;
2138 /* If the ivs behave specially in the first iteration, or are
2139 added/multiplied after extending, we ignore them. */
2140 if (iv0
->first_special
|| iv0
->mult
!= const1_rtx
|| iv0
->delta
!= const0_rtx
)
2142 if (iv1
->first_special
|| iv1
->mult
!= const1_rtx
|| iv1
->delta
!= const0_rtx
)
2145 /* If there is some extend, it must match signedness of the comparison. */
2150 if (iv0
->extend
== IV_ZERO_EXTEND
2151 || iv1
->extend
== IV_ZERO_EXTEND
)
2158 if (iv0
->extend
== IV_SIGN_EXTEND
2159 || iv1
->extend
== IV_SIGN_EXTEND
)
2165 if (iv0
->extend
!= IV_UNKNOWN_EXTEND
2166 && iv1
->extend
!= IV_UNKNOWN_EXTEND
2167 && iv0
->extend
!= iv1
->extend
)
2171 if (iv0
->extend
!= IV_UNKNOWN_EXTEND
)
2172 signed_p
= iv0
->extend
== IV_SIGN_EXTEND
;
2173 if (iv1
->extend
!= IV_UNKNOWN_EXTEND
)
2174 signed_p
= iv1
->extend
== IV_SIGN_EXTEND
;
2181 /* Values of both variables should be computed in the same mode. These
2182 might indeed be different, if we have comparison like
2184 (compare (subreg:SI (iv0)) (subreg:SI (iv1)))
2186 and iv0 and iv1 are both ivs iterating in SI mode, but calculated
2187 in different modes. This does not seem impossible to handle, but
2188 it hardly ever occurs in practice.
2190 The only exception is the case when one of operands is invariant.
2191 For example pentium 3 generates comparisons like
2192 (lt (subreg:HI (reg:SI)) 100). Here we assign HImode to 100, but we
2193 definitely do not want this prevent the optimization. */
2194 comp_mode
= iv0
->extend_mode
;
2195 if (GET_MODE_BITSIZE (comp_mode
) < GET_MODE_BITSIZE (iv1
->extend_mode
))
2196 comp_mode
= iv1
->extend_mode
;
2198 if (iv0
->extend_mode
!= comp_mode
)
2200 if (iv0
->mode
!= iv0
->extend_mode
2201 || iv0
->step
!= const0_rtx
)
2204 iv0
->base
= simplify_gen_unary (signed_p
? SIGN_EXTEND
: ZERO_EXTEND
,
2205 comp_mode
, iv0
->base
, iv0
->mode
);
2206 iv0
->extend_mode
= comp_mode
;
2209 if (iv1
->extend_mode
!= comp_mode
)
2211 if (iv1
->mode
!= iv1
->extend_mode
2212 || iv1
->step
!= const0_rtx
)
2215 iv1
->base
= simplify_gen_unary (signed_p
? SIGN_EXTEND
: ZERO_EXTEND
,
2216 comp_mode
, iv1
->base
, iv1
->mode
);
2217 iv1
->extend_mode
= comp_mode
;
2220 /* Check that both ivs belong to a range of a single mode. If one of the
2221 operands is an invariant, we may need to shorten it into the common
2223 if (iv0
->mode
== iv0
->extend_mode
2224 && iv0
->step
== const0_rtx
2225 && iv0
->mode
!= iv1
->mode
)
2226 shorten_into_mode (iv0
, iv1
->mode
, cond
, signed_p
, desc
);
2228 if (iv1
->mode
== iv1
->extend_mode
2229 && iv1
->step
== const0_rtx
2230 && iv0
->mode
!= iv1
->mode
)
2231 shorten_into_mode (iv1
, iv0
->mode
, swap_condition (cond
), signed_p
, desc
);
2233 if (iv0
->mode
!= iv1
->mode
)
2236 desc
->mode
= iv0
->mode
;
2237 desc
->signed_p
= signed_p
;
2242 /* Tries to estimate the maximum number of iterations in LOOP, and return the
2243 result. This function is called from iv_number_of_iterations with
2244 a number of fields in DESC already filled in. OLD_NITER is the original
2245 expression for the number of iterations, before we tried to simplify it. */
2248 determine_max_iter (struct loop
*loop
, struct niter_desc
*desc
, rtx old_niter
)
2250 rtx niter
= desc
->niter_expr
;
2251 rtx mmin
, mmax
, cmp
;
2253 uint64_t andmax
= 0;
2255 /* We used to look for constant operand 0 of AND,
2256 but canonicalization should always make this impossible. */
2257 gcc_checking_assert (GET_CODE (niter
) != AND
2258 || !CONST_INT_P (XEXP (niter
, 0)));
2260 if (GET_CODE (niter
) == AND
2261 && CONST_INT_P (XEXP (niter
, 1)))
2263 andmax
= UINTVAL (XEXP (niter
, 1));
2264 niter
= XEXP (niter
, 0);
2267 get_mode_bounds (desc
->mode
, desc
->signed_p
, desc
->mode
, &mmin
, &mmax
);
2268 nmax
= UINTVAL (mmax
) - UINTVAL (mmin
);
2270 if (GET_CODE (niter
) == UDIV
)
2272 if (!CONST_INT_P (XEXP (niter
, 1)))
2274 inc
= INTVAL (XEXP (niter
, 1));
2275 niter
= XEXP (niter
, 0);
2280 /* We could use a binary search here, but for now improving the upper
2281 bound by just one eliminates one important corner case. */
2282 cmp
= simplify_gen_relational (desc
->signed_p
? LT
: LTU
, VOIDmode
,
2283 desc
->mode
, old_niter
, mmax
);
2284 simplify_using_initial_values (loop
, UNKNOWN
, &cmp
);
2285 if (cmp
== const_true_rtx
)
2290 fprintf (dump_file
, ";; improved upper bound by one.\n");
2294 nmax
= MIN (nmax
, andmax
);
2296 fprintf (dump_file
, ";; Determined upper bound %" PRId64
".\n",
2301 /* Computes number of iterations of the CONDITION in INSN in LOOP and stores
2302 the result into DESC. Very similar to determine_number_of_iterations
2303 (basically its rtl version), complicated by things like subregs. */
2306 iv_number_of_iterations (struct loop
*loop
, rtx_insn
*insn
, rtx condition
,
2307 struct niter_desc
*desc
)
2309 rtx op0
, op1
, delta
, step
, bound
, may_xform
, tmp
, tmp0
, tmp1
;
2310 struct rtx_iv iv0
, iv1
;
2311 rtx assumption
, may_not_xform
;
2313 machine_mode nonvoid_mode
;
2314 scalar_int_mode comp_mode
;
2315 rtx mmin
, mmax
, mode_mmin
, mode_mmax
;
2316 uint64_t s
, size
, d
, inv
, max
, up
, down
;
2317 int64_t inc
, step_val
;
2318 int was_sharp
= false;
2322 /* The meaning of these assumptions is this:
2324 then the rest of information does not have to be valid
2325 if noloop_assumptions then the loop does not roll
2326 if infinite then this exit is never used */
2328 desc
->assumptions
= NULL_RTX
;
2329 desc
->noloop_assumptions
= NULL_RTX
;
2330 desc
->infinite
= NULL_RTX
;
2331 desc
->simple_p
= true;
2333 desc
->const_iter
= false;
2334 desc
->niter_expr
= NULL_RTX
;
2336 cond
= GET_CODE (condition
);
2337 gcc_assert (COMPARISON_P (condition
));
2339 nonvoid_mode
= GET_MODE (XEXP (condition
, 0));
2340 if (nonvoid_mode
== VOIDmode
)
2341 nonvoid_mode
= GET_MODE (XEXP (condition
, 1));
2342 /* The constant comparisons should be folded. */
2343 gcc_assert (nonvoid_mode
!= VOIDmode
);
2345 /* We only handle integers or pointers. */
2346 scalar_int_mode mode
;
2347 if (!is_a
<scalar_int_mode
> (nonvoid_mode
, &mode
))
2350 op0
= XEXP (condition
, 0);
2351 if (!iv_analyze (insn
, mode
, op0
, &iv0
))
2354 op1
= XEXP (condition
, 1);
2355 if (!iv_analyze (insn
, mode
, op1
, &iv1
))
2358 if (GET_MODE_BITSIZE (iv0
.extend_mode
) > HOST_BITS_PER_WIDE_INT
2359 || GET_MODE_BITSIZE (iv1
.extend_mode
) > HOST_BITS_PER_WIDE_INT
)
2362 /* Check condition and normalize it. */
2370 std::swap (iv0
, iv1
);
2371 cond
= swap_condition (cond
);
2383 /* Handle extends. This is relatively nontrivial, so we only try in some
2384 easy cases, when we can canonicalize the ivs (possibly by adding some
2385 assumptions) to shape subreg (base + i * step). This function also fills
2386 in desc->mode and desc->signed_p. */
2388 if (!canonicalize_iv_subregs (&iv0
, &iv1
, cond
, desc
))
2391 comp_mode
= iv0
.extend_mode
;
2393 size
= GET_MODE_PRECISION (mode
);
2394 get_mode_bounds (mode
, (cond
== LE
|| cond
== LT
), comp_mode
, &mmin
, &mmax
);
2395 mode_mmin
= lowpart_subreg (mode
, mmin
, comp_mode
);
2396 mode_mmax
= lowpart_subreg (mode
, mmax
, comp_mode
);
2398 if (!CONST_INT_P (iv0
.step
) || !CONST_INT_P (iv1
.step
))
2401 /* We can take care of the case of two induction variables chasing each other
2402 if the test is NE. I have never seen a loop using it, but still it is
2404 if (iv0
.step
!= const0_rtx
&& iv1
.step
!= const0_rtx
)
2409 iv0
.step
= simplify_gen_binary (MINUS
, comp_mode
, iv0
.step
, iv1
.step
);
2410 iv1
.step
= const0_rtx
;
2413 iv0
.step
= lowpart_subreg (mode
, iv0
.step
, comp_mode
);
2414 iv1
.step
= lowpart_subreg (mode
, iv1
.step
, comp_mode
);
2416 /* This is either infinite loop or the one that ends immediately, depending
2417 on initial values. Unswitching should remove this kind of conditions. */
2418 if (iv0
.step
== const0_rtx
&& iv1
.step
== const0_rtx
)
2423 if (iv0
.step
== const0_rtx
)
2424 step_val
= -INTVAL (iv1
.step
);
2426 step_val
= INTVAL (iv0
.step
);
2428 /* Ignore loops of while (i-- < 10) type. */
2432 step_is_pow2
= !(step_val
& (step_val
- 1));
2436 /* We do not care about whether the step is power of two in this
2438 step_is_pow2
= false;
2442 /* Some more condition normalization. We must record some assumptions
2443 due to overflows. */
2448 /* We want to take care only of non-sharp relationals; this is easy,
2449 as in cases the overflow would make the transformation unsafe
2450 the loop does not roll. Seemingly it would make more sense to want
2451 to take care of sharp relationals instead, as NE is more similar to
2452 them, but the problem is that here the transformation would be more
2453 difficult due to possibly infinite loops. */
2454 if (iv0
.step
== const0_rtx
)
2456 tmp
= lowpart_subreg (mode
, iv0
.base
, comp_mode
);
2457 assumption
= simplify_gen_relational (EQ
, SImode
, mode
, tmp
,
2459 if (assumption
== const_true_rtx
)
2460 goto zero_iter_simplify
;
2461 iv0
.base
= simplify_gen_binary (PLUS
, comp_mode
,
2462 iv0
.base
, const1_rtx
);
2466 tmp
= lowpart_subreg (mode
, iv1
.base
, comp_mode
);
2467 assumption
= simplify_gen_relational (EQ
, SImode
, mode
, tmp
,
2469 if (assumption
== const_true_rtx
)
2470 goto zero_iter_simplify
;
2471 iv1
.base
= simplify_gen_binary (PLUS
, comp_mode
,
2472 iv1
.base
, constm1_rtx
);
2475 if (assumption
!= const0_rtx
)
2476 desc
->noloop_assumptions
=
2477 alloc_EXPR_LIST (0, assumption
, desc
->noloop_assumptions
);
2478 cond
= (cond
== LT
) ? LE
: LEU
;
2480 /* It will be useful to be able to tell the difference once more in
2481 LE -> NE reduction. */
2487 /* Take care of trivially infinite loops. */
2490 if (iv0
.step
== const0_rtx
)
2492 tmp
= lowpart_subreg (mode
, iv0
.base
, comp_mode
);
2493 if (rtx_equal_p (tmp
, mode_mmin
))
2496 alloc_EXPR_LIST (0, const_true_rtx
, NULL_RTX
);
2497 /* Fill in the remaining fields somehow. */
2498 goto zero_iter_simplify
;
2503 tmp
= lowpart_subreg (mode
, iv1
.base
, comp_mode
);
2504 if (rtx_equal_p (tmp
, mode_mmax
))
2507 alloc_EXPR_LIST (0, const_true_rtx
, NULL_RTX
);
2508 /* Fill in the remaining fields somehow. */
2509 goto zero_iter_simplify
;
2514 /* If we can we want to take care of NE conditions instead of size
2515 comparisons, as they are much more friendly (most importantly
2516 this takes care of special handling of loops with step 1). We can
2517 do it if we first check that upper bound is greater or equal to
2518 lower bound, their difference is constant c modulo step and that
2519 there is not an overflow. */
2522 if (iv0
.step
== const0_rtx
)
2523 step
= simplify_gen_unary (NEG
, comp_mode
, iv1
.step
, comp_mode
);
2526 step
= lowpart_subreg (mode
, step
, comp_mode
);
2527 delta
= simplify_gen_binary (MINUS
, comp_mode
, iv1
.base
, iv0
.base
);
2528 delta
= lowpart_subreg (mode
, delta
, comp_mode
);
2529 delta
= simplify_gen_binary (UMOD
, mode
, delta
, step
);
2530 may_xform
= const0_rtx
;
2531 may_not_xform
= const_true_rtx
;
2533 if (CONST_INT_P (delta
))
2535 if (was_sharp
&& INTVAL (delta
) == INTVAL (step
) - 1)
2537 /* A special case. We have transformed condition of type
2538 for (i = 0; i < 4; i += 4)
2540 for (i = 0; i <= 3; i += 4)
2541 obviously if the test for overflow during that transformation
2542 passed, we cannot overflow here. Most importantly any
2543 loop with sharp end condition and step 1 falls into this
2544 category, so handling this case specially is definitely
2545 worth the troubles. */
2546 may_xform
= const_true_rtx
;
2548 else if (iv0
.step
== const0_rtx
)
2550 bound
= simplify_gen_binary (PLUS
, comp_mode
, mmin
, step
);
2551 bound
= simplify_gen_binary (MINUS
, comp_mode
, bound
, delta
);
2552 bound
= lowpart_subreg (mode
, bound
, comp_mode
);
2553 tmp
= lowpart_subreg (mode
, iv0
.base
, comp_mode
);
2554 may_xform
= simplify_gen_relational (cond
, SImode
, mode
,
2556 may_not_xform
= simplify_gen_relational (reverse_condition (cond
),
2562 bound
= simplify_gen_binary (MINUS
, comp_mode
, mmax
, step
);
2563 bound
= simplify_gen_binary (PLUS
, comp_mode
, bound
, delta
);
2564 bound
= lowpart_subreg (mode
, bound
, comp_mode
);
2565 tmp
= lowpart_subreg (mode
, iv1
.base
, comp_mode
);
2566 may_xform
= simplify_gen_relational (cond
, SImode
, mode
,
2568 may_not_xform
= simplify_gen_relational (reverse_condition (cond
),
2574 if (may_xform
!= const0_rtx
)
2576 /* We perform the transformation always provided that it is not
2577 completely senseless. This is OK, as we would need this assumption
2578 to determine the number of iterations anyway. */
2579 if (may_xform
!= const_true_rtx
)
2581 /* If the step is a power of two and the final value we have
2582 computed overflows, the cycle is infinite. Otherwise it
2583 is nontrivial to compute the number of iterations. */
2585 desc
->infinite
= alloc_EXPR_LIST (0, may_not_xform
,
2588 desc
->assumptions
= alloc_EXPR_LIST (0, may_xform
,
2592 /* We are going to lose some information about upper bound on
2593 number of iterations in this step, so record the information
2595 inc
= INTVAL (iv0
.step
) - INTVAL (iv1
.step
);
2596 if (CONST_INT_P (iv1
.base
))
2597 up
= INTVAL (iv1
.base
);
2599 up
= INTVAL (mode_mmax
) - inc
;
2600 down
= INTVAL (CONST_INT_P (iv0
.base
)
2603 max
= (up
- down
) / inc
+ 1;
2605 && !desc
->assumptions
)
2606 record_niter_bound (loop
, max
, false, true);
2608 if (iv0
.step
== const0_rtx
)
2610 iv0
.base
= simplify_gen_binary (PLUS
, comp_mode
, iv0
.base
, delta
);
2611 iv0
.base
= simplify_gen_binary (MINUS
, comp_mode
, iv0
.base
, step
);
2615 iv1
.base
= simplify_gen_binary (MINUS
, comp_mode
, iv1
.base
, delta
);
2616 iv1
.base
= simplify_gen_binary (PLUS
, comp_mode
, iv1
.base
, step
);
2619 tmp0
= lowpart_subreg (mode
, iv0
.base
, comp_mode
);
2620 tmp1
= lowpart_subreg (mode
, iv1
.base
, comp_mode
);
2621 assumption
= simplify_gen_relational (reverse_condition (cond
),
2622 SImode
, mode
, tmp0
, tmp1
);
2623 if (assumption
== const_true_rtx
)
2624 goto zero_iter_simplify
;
2625 else if (assumption
!= const0_rtx
)
2626 desc
->noloop_assumptions
=
2627 alloc_EXPR_LIST (0, assumption
, desc
->noloop_assumptions
);
2632 /* Count the number of iterations. */
2635 /* Everything we do here is just arithmetics modulo size of mode. This
2636 makes us able to do more involved computations of number of iterations
2637 than in other cases. First transform the condition into shape
2638 s * i <> c, with s positive. */
2639 iv1
.base
= simplify_gen_binary (MINUS
, comp_mode
, iv1
.base
, iv0
.base
);
2640 iv0
.base
= const0_rtx
;
2641 iv0
.step
= simplify_gen_binary (MINUS
, comp_mode
, iv0
.step
, iv1
.step
);
2642 iv1
.step
= const0_rtx
;
2643 if (INTVAL (iv0
.step
) < 0)
2645 iv0
.step
= simplify_gen_unary (NEG
, comp_mode
, iv0
.step
, comp_mode
);
2646 iv1
.base
= simplify_gen_unary (NEG
, comp_mode
, iv1
.base
, comp_mode
);
2648 iv0
.step
= lowpart_subreg (mode
, iv0
.step
, comp_mode
);
2650 /* Let nsd (s, size of mode) = d. If d does not divide c, the loop
2651 is infinite. Otherwise, the number of iterations is
2652 (inverse(s/d) * (c/d)) mod (size of mode/d). */
2653 s
= INTVAL (iv0
.step
); d
= 1;
2660 bound
= GEN_INT (((uint64_t) 1 << (size
- 1 ) << 1) - 1);
2662 tmp1
= lowpart_subreg (mode
, iv1
.base
, comp_mode
);
2663 tmp
= simplify_gen_binary (UMOD
, mode
, tmp1
, gen_int_mode (d
, mode
));
2664 assumption
= simplify_gen_relational (NE
, SImode
, mode
, tmp
, const0_rtx
);
2665 desc
->infinite
= alloc_EXPR_LIST (0, assumption
, desc
->infinite
);
2667 tmp
= simplify_gen_binary (UDIV
, mode
, tmp1
, gen_int_mode (d
, mode
));
2668 inv
= inverse (s
, size
);
2669 tmp
= simplify_gen_binary (MULT
, mode
, tmp
, gen_int_mode (inv
, mode
));
2670 desc
->niter_expr
= simplify_gen_binary (AND
, mode
, tmp
, bound
);
2674 if (iv1
.step
== const0_rtx
)
2675 /* Condition in shape a + s * i <= b
2676 We must know that b + s does not overflow and a <= b + s and then we
2677 can compute number of iterations as (b + s - a) / s. (It might
2678 seem that we in fact could be more clever about testing the b + s
2679 overflow condition using some information about b - a mod s,
2680 but it was already taken into account during LE -> NE transform). */
2683 tmp0
= lowpart_subreg (mode
, iv0
.base
, comp_mode
);
2684 tmp1
= lowpart_subreg (mode
, iv1
.base
, comp_mode
);
2686 bound
= simplify_gen_binary (MINUS
, mode
, mode_mmax
,
2687 lowpart_subreg (mode
, step
,
2693 /* If s is power of 2, we know that the loop is infinite if
2694 a % s <= b % s and b + s overflows. */
2695 assumption
= simplify_gen_relational (reverse_condition (cond
),
2699 t0
= simplify_gen_binary (UMOD
, mode
, copy_rtx (tmp0
), step
);
2700 t1
= simplify_gen_binary (UMOD
, mode
, copy_rtx (tmp1
), step
);
2701 tmp
= simplify_gen_relational (cond
, SImode
, mode
, t0
, t1
);
2702 assumption
= simplify_gen_binary (AND
, SImode
, assumption
, tmp
);
2704 alloc_EXPR_LIST (0, assumption
, desc
->infinite
);
2708 assumption
= simplify_gen_relational (cond
, SImode
, mode
,
2711 alloc_EXPR_LIST (0, assumption
, desc
->assumptions
);
2714 tmp
= simplify_gen_binary (PLUS
, comp_mode
, iv1
.base
, iv0
.step
);
2715 tmp
= lowpart_subreg (mode
, tmp
, comp_mode
);
2716 assumption
= simplify_gen_relational (reverse_condition (cond
),
2717 SImode
, mode
, tmp0
, tmp
);
2719 delta
= simplify_gen_binary (PLUS
, mode
, tmp1
, step
);
2720 delta
= simplify_gen_binary (MINUS
, mode
, delta
, tmp0
);
2724 /* Condition in shape a <= b - s * i
2725 We must know that a - s does not overflow and a - s <= b and then
2726 we can again compute number of iterations as (b - (a - s)) / s. */
2727 step
= simplify_gen_unary (NEG
, mode
, iv1
.step
, mode
);
2728 tmp0
= lowpart_subreg (mode
, iv0
.base
, comp_mode
);
2729 tmp1
= lowpart_subreg (mode
, iv1
.base
, comp_mode
);
2731 bound
= simplify_gen_binary (PLUS
, mode
, mode_mmin
,
2732 lowpart_subreg (mode
, step
, comp_mode
));
2737 /* If s is power of 2, we know that the loop is infinite if
2738 a % s <= b % s and a - s overflows. */
2739 assumption
= simplify_gen_relational (reverse_condition (cond
),
2743 t0
= simplify_gen_binary (UMOD
, mode
, copy_rtx (tmp0
), step
);
2744 t1
= simplify_gen_binary (UMOD
, mode
, copy_rtx (tmp1
), step
);
2745 tmp
= simplify_gen_relational (cond
, SImode
, mode
, t0
, t1
);
2746 assumption
= simplify_gen_binary (AND
, SImode
, assumption
, tmp
);
2748 alloc_EXPR_LIST (0, assumption
, desc
->infinite
);
2752 assumption
= simplify_gen_relational (cond
, SImode
, mode
,
2755 alloc_EXPR_LIST (0, assumption
, desc
->assumptions
);
2758 tmp
= simplify_gen_binary (PLUS
, comp_mode
, iv0
.base
, iv1
.step
);
2759 tmp
= lowpart_subreg (mode
, tmp
, comp_mode
);
2760 assumption
= simplify_gen_relational (reverse_condition (cond
),
2763 delta
= simplify_gen_binary (MINUS
, mode
, tmp0
, step
);
2764 delta
= simplify_gen_binary (MINUS
, mode
, tmp1
, delta
);
2766 if (assumption
== const_true_rtx
)
2767 goto zero_iter_simplify
;
2768 else if (assumption
!= const0_rtx
)
2769 desc
->noloop_assumptions
=
2770 alloc_EXPR_LIST (0, assumption
, desc
->noloop_assumptions
);
2771 delta
= simplify_gen_binary (UDIV
, mode
, delta
, step
);
2772 desc
->niter_expr
= delta
;
2775 old_niter
= desc
->niter_expr
;
2777 simplify_using_initial_values (loop
, AND
, &desc
->assumptions
);
2778 if (desc
->assumptions
2779 && XEXP (desc
->assumptions
, 0) == const0_rtx
)
2781 simplify_using_initial_values (loop
, IOR
, &desc
->noloop_assumptions
);
2782 simplify_using_initial_values (loop
, IOR
, &desc
->infinite
);
2783 simplify_using_initial_values (loop
, UNKNOWN
, &desc
->niter_expr
);
2785 /* Rerun the simplification. Consider code (created by copying loop headers)
2797 The first pass determines that i = 0, the second pass uses it to eliminate
2798 noloop assumption. */
2800 simplify_using_initial_values (loop
, AND
, &desc
->assumptions
);
2801 if (desc
->assumptions
2802 && XEXP (desc
->assumptions
, 0) == const0_rtx
)
2804 simplify_using_initial_values (loop
, IOR
, &desc
->noloop_assumptions
);
2805 simplify_using_initial_values (loop
, IOR
, &desc
->infinite
);
2806 simplify_using_initial_values (loop
, UNKNOWN
, &desc
->niter_expr
);
2808 if (desc
->noloop_assumptions
2809 && XEXP (desc
->noloop_assumptions
, 0) == const_true_rtx
)
2812 if (CONST_INT_P (desc
->niter_expr
))
2814 uint64_t val
= INTVAL (desc
->niter_expr
);
2816 desc
->const_iter
= true;
2817 desc
->niter
= val
& GET_MODE_MASK (desc
->mode
);
2819 && !desc
->assumptions
)
2820 record_niter_bound (loop
, desc
->niter
, false, true);
2824 max
= determine_max_iter (loop
, desc
, old_niter
);
2826 goto zero_iter_simplify
;
2828 && !desc
->assumptions
)
2829 record_niter_bound (loop
, max
, false, true);
2831 /* simplify_using_initial_values does a copy propagation on the registers
2832 in the expression for the number of iterations. This prolongs life
2833 ranges of registers and increases register pressure, and usually
2834 brings no gain (and if it happens to do, the cse pass will take care
2835 of it anyway). So prevent this behavior, unless it enabled us to
2836 derive that the number of iterations is a constant. */
2837 desc
->niter_expr
= old_niter
;
2843 /* Simplify the assumptions. */
2844 simplify_using_initial_values (loop
, AND
, &desc
->assumptions
);
2845 if (desc
->assumptions
2846 && XEXP (desc
->assumptions
, 0) == const0_rtx
)
2848 simplify_using_initial_values (loop
, IOR
, &desc
->infinite
);
2852 desc
->const_iter
= true;
2854 record_niter_bound (loop
, 0, true, true);
2855 desc
->noloop_assumptions
= NULL_RTX
;
2856 desc
->niter_expr
= const0_rtx
;
2860 desc
->simple_p
= false;
2864 /* Checks whether E is a simple exit from LOOP and stores its description
2868 check_simple_exit (struct loop
*loop
, edge e
, struct niter_desc
*desc
)
2870 basic_block exit_bb
;
2876 desc
->simple_p
= false;
2878 /* It must belong directly to the loop. */
2879 if (exit_bb
->loop_father
!= loop
)
2882 /* It must be tested (at least) once during any iteration. */
2883 if (!dominated_by_p (CDI_DOMINATORS
, loop
->latch
, exit_bb
))
2886 /* It must end in a simple conditional jump. */
2887 if (!any_condjump_p (BB_END (exit_bb
)))
2890 ein
= EDGE_SUCC (exit_bb
, 0);
2892 ein
= EDGE_SUCC (exit_bb
, 1);
2895 desc
->in_edge
= ein
;
2897 /* Test whether the condition is suitable. */
2898 if (!(condition
= get_condition (BB_END (ein
->src
), &at
, false, false)))
2901 if (ein
->flags
& EDGE_FALLTHRU
)
2903 condition
= reversed_condition (condition
);
2908 /* Check that we are able to determine number of iterations and fill
2909 in information about it. */
2910 iv_number_of_iterations (loop
, at
, condition
, desc
);
2913 /* Finds a simple exit of LOOP and stores its description into DESC. */
2916 find_simple_exit (struct loop
*loop
, struct niter_desc
*desc
)
2921 struct niter_desc act
;
2925 desc
->simple_p
= false;
2926 body
= get_loop_body (loop
);
2928 for (i
= 0; i
< loop
->num_nodes
; i
++)
2930 FOR_EACH_EDGE (e
, ei
, body
[i
]->succs
)
2932 if (flow_bb_inside_loop_p (loop
, e
->dest
))
2935 check_simple_exit (loop
, e
, &act
);
2943 /* Prefer constant iterations; the less the better. */
2945 || (desc
->const_iter
&& act
.niter
>= desc
->niter
))
2948 /* Also if the actual exit may be infinite, while the old one
2949 not, prefer the old one. */
2950 if (act
.infinite
&& !desc
->infinite
)
2962 fprintf (dump_file
, "Loop %d is simple:\n", loop
->num
);
2963 fprintf (dump_file
, " simple exit %d -> %d\n",
2964 desc
->out_edge
->src
->index
,
2965 desc
->out_edge
->dest
->index
);
2966 if (desc
->assumptions
)
2968 fprintf (dump_file
, " assumptions: ");
2969 print_rtl (dump_file
, desc
->assumptions
);
2970 fprintf (dump_file
, "\n");
2972 if (desc
->noloop_assumptions
)
2974 fprintf (dump_file
, " does not roll if: ");
2975 print_rtl (dump_file
, desc
->noloop_assumptions
);
2976 fprintf (dump_file
, "\n");
2980 fprintf (dump_file
, " infinite if: ");
2981 print_rtl (dump_file
, desc
->infinite
);
2982 fprintf (dump_file
, "\n");
2985 fprintf (dump_file
, " number of iterations: ");
2986 print_rtl (dump_file
, desc
->niter_expr
);
2987 fprintf (dump_file
, "\n");
2989 fprintf (dump_file
, " upper bound: %li\n",
2990 (long)get_max_loop_iterations_int (loop
));
2991 fprintf (dump_file
, " likely upper bound: %li\n",
2992 (long)get_likely_max_loop_iterations_int (loop
));
2993 fprintf (dump_file
, " realistic bound: %li\n",
2994 (long)get_estimated_loop_iterations_int (loop
));
2997 fprintf (dump_file
, "Loop %d is not simple.\n", loop
->num
);
3003 /* Creates a simple loop description of LOOP if it was not computed
3007 get_simple_loop_desc (struct loop
*loop
)
3009 struct niter_desc
*desc
= simple_loop_desc (loop
);
3014 /* At least desc->infinite is not always initialized by
3015 find_simple_loop_exit. */
3016 desc
= ggc_cleared_alloc
<niter_desc
> ();
3017 iv_analysis_loop_init (loop
);
3018 find_simple_exit (loop
, desc
);
3019 loop
->simple_loop_desc
= desc
;
3023 /* Releases simple loop description for LOOP. */
3026 free_simple_loop_desc (struct loop
*loop
)
3028 struct niter_desc
*desc
= simple_loop_desc (loop
);
3034 loop
->simple_loop_desc
= NULL
;