1 /* Analyze RTL for GNU compiler.
2 Copyright (C) 1987-2023 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 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/>. */
23 #include "coretypes.h"
33 #include "insn-config.h"
35 #include "emit-rtl.h" /* FIXME: Can go away once crtl is moved to rtl.h. */
37 #include "addresses.h"
39 #include "hard-reg-set.h"
40 #include "function-abi.h"
42 /* Forward declarations */
43 static void set_of_1 (rtx
, const_rtx
, void *);
44 static bool covers_regno_p (const_rtx
, unsigned int);
45 static bool covers_regno_no_parallel_p (const_rtx
, unsigned int);
46 static bool computed_jump_p_1 (const_rtx
);
47 static void parms_set (rtx
, const_rtx
, void *);
49 static unsigned HOST_WIDE_INT
cached_nonzero_bits (const_rtx
, scalar_int_mode
,
50 const_rtx
, machine_mode
,
51 unsigned HOST_WIDE_INT
);
52 static unsigned HOST_WIDE_INT
nonzero_bits1 (const_rtx
, scalar_int_mode
,
53 const_rtx
, machine_mode
,
54 unsigned HOST_WIDE_INT
);
55 static unsigned int cached_num_sign_bit_copies (const_rtx
, scalar_int_mode
,
56 const_rtx
, machine_mode
,
58 static unsigned int num_sign_bit_copies1 (const_rtx
, scalar_int_mode
,
59 const_rtx
, machine_mode
,
62 rtx_subrtx_bound_info rtx_all_subrtx_bounds
[NUM_RTX_CODE
];
63 rtx_subrtx_bound_info rtx_nonconst_subrtx_bounds
[NUM_RTX_CODE
];
65 /* Truncation narrows the mode from SOURCE mode to DESTINATION mode.
66 If TARGET_MODE_REP_EXTENDED (DESTINATION, DESTINATION_REP) is
67 SIGN_EXTEND then while narrowing we also have to enforce the
68 representation and sign-extend the value to mode DESTINATION_REP.
70 If the value is already sign-extended to DESTINATION_REP mode we
71 can just switch to DESTINATION mode on it. For each pair of
72 integral modes SOURCE and DESTINATION, when truncating from SOURCE
73 to DESTINATION, NUM_SIGN_BIT_COPIES_IN_REP[SOURCE][DESTINATION]
74 contains the number of high-order bits in SOURCE that have to be
75 copies of the sign-bit so that we can do this mode-switch to
79 num_sign_bit_copies_in_rep
[MAX_MODE_INT
+ 1][MAX_MODE_INT
+ 1];
81 /* Store X into index I of ARRAY. ARRAY is known to have at least I
82 elements. Return the new base of ARRAY. */
85 typename
T::value_type
*
86 generic_subrtx_iterator
<T
>::add_single_to_queue (array_type
&array
,
88 size_t i
, value_type x
)
90 if (base
== array
.stack
)
97 gcc_checking_assert (i
== LOCAL_ELEMS
);
98 /* A previous iteration might also have moved from the stack to the
99 heap, in which case the heap array will already be big enough. */
100 if (vec_safe_length (array
.heap
) <= i
)
101 vec_safe_grow (array
.heap
, i
+ 1, true);
102 base
= array
.heap
->address ();
103 memcpy (base
, array
.stack
, sizeof (array
.stack
));
104 base
[LOCAL_ELEMS
] = x
;
107 unsigned int length
= array
.heap
->length ();
110 gcc_checking_assert (base
== array
.heap
->address ());
116 gcc_checking_assert (i
== length
);
117 vec_safe_push (array
.heap
, x
);
118 return array
.heap
->address ();
122 /* Add the subrtxes of X to worklist ARRAY, starting at END. Return the
123 number of elements added to the worklist. */
125 template <typename T
>
127 generic_subrtx_iterator
<T
>::add_subrtxes_to_queue (array_type
&array
,
129 size_t end
, rtx_type x
)
131 enum rtx_code code
= GET_CODE (x
);
132 const char *format
= GET_RTX_FORMAT (code
);
133 size_t orig_end
= end
;
134 if (UNLIKELY (INSN_P (x
)))
136 /* Put the pattern at the top of the queue, since that's what
137 we're likely to want most. It also allows for the SEQUENCE
139 for (int i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; --i
)
140 if (format
[i
] == 'e')
142 value_type subx
= T::get_value (x
->u
.fld
[i
].rt_rtx
);
143 if (LIKELY (end
< LOCAL_ELEMS
))
146 base
= add_single_to_queue (array
, base
, end
++, subx
);
150 for (int i
= 0; format
[i
]; ++i
)
151 if (format
[i
] == 'e')
153 value_type subx
= T::get_value (x
->u
.fld
[i
].rt_rtx
);
154 if (LIKELY (end
< LOCAL_ELEMS
))
157 base
= add_single_to_queue (array
, base
, end
++, subx
);
159 else if (format
[i
] == 'E')
161 unsigned int length
= GET_NUM_ELEM (x
->u
.fld
[i
].rt_rtvec
);
162 rtx
*vec
= x
->u
.fld
[i
].rt_rtvec
->elem
;
163 if (LIKELY (end
+ length
<= LOCAL_ELEMS
))
164 for (unsigned int j
= 0; j
< length
; j
++)
165 base
[end
++] = T::get_value (vec
[j
]);
167 for (unsigned int j
= 0; j
< length
; j
++)
168 base
= add_single_to_queue (array
, base
, end
++,
169 T::get_value (vec
[j
]));
170 if (code
== SEQUENCE
&& end
== length
)
171 /* If the subrtxes of the sequence fill the entire array then
172 we know that no other parts of a containing insn are queued.
173 The caller is therefore iterating over the sequence as a
174 PATTERN (...), so we also want the patterns of the
176 for (unsigned int j
= 0; j
< length
; j
++)
178 typename
T::rtx_type x
= T::get_rtx (base
[j
]);
180 base
[j
] = T::get_value (PATTERN (x
));
183 return end
- orig_end
;
186 template <typename T
>
188 generic_subrtx_iterator
<T
>::free_array (array_type
&array
)
190 vec_free (array
.heap
);
193 template <typename T
>
194 const size_t generic_subrtx_iterator
<T
>::LOCAL_ELEMS
;
196 template class generic_subrtx_iterator
<const_rtx_accessor
>;
197 template class generic_subrtx_iterator
<rtx_var_accessor
>;
198 template class generic_subrtx_iterator
<rtx_ptr_accessor
>;
200 /* Return true if the value of X is unstable
201 (would be different at a different point in the program).
202 The frame pointer, arg pointer, etc. are considered stable
203 (within one function) and so is anything marked `unchanging'. */
206 rtx_unstable_p (const_rtx x
)
208 const RTX_CODE code
= GET_CODE (x
);
215 return !MEM_READONLY_P (x
) || rtx_unstable_p (XEXP (x
, 0));
224 /* As in rtx_varies_p, we have to use the actual rtx, not reg number. */
225 if (x
== frame_pointer_rtx
|| x
== hard_frame_pointer_rtx
226 /* The arg pointer varies if it is not a fixed register. */
227 || (x
== arg_pointer_rtx
&& fixed_regs
[ARG_POINTER_REGNUM
]))
229 /* ??? When call-clobbered, the value is stable modulo the restore
230 that must happen after a call. This currently screws up local-alloc
231 into believing that the restore is not needed. */
232 if (!PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
&& x
== pic_offset_table_rtx
)
237 if (MEM_VOLATILE_P (x
))
246 fmt
= GET_RTX_FORMAT (code
);
247 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
250 if (rtx_unstable_p (XEXP (x
, i
)))
253 else if (fmt
[i
] == 'E')
256 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
257 if (rtx_unstable_p (XVECEXP (x
, i
, j
)))
264 /* Return true if X has a value that can vary even between two
265 executions of the program. false means X can be compared reliably
266 against certain constants or near-constants.
267 FOR_ALIAS is nonzero if we are called from alias analysis; if it is
268 zero, we are slightly more conservative.
269 The frame pointer and the arg pointer are considered constant. */
272 rtx_varies_p (const_rtx x
, bool for_alias
)
285 return !MEM_READONLY_P (x
) || rtx_varies_p (XEXP (x
, 0), for_alias
);
294 /* Note that we have to test for the actual rtx used for the frame
295 and arg pointers and not just the register number in case we have
296 eliminated the frame and/or arg pointer and are using it
298 if (x
== frame_pointer_rtx
|| x
== hard_frame_pointer_rtx
299 /* The arg pointer varies if it is not a fixed register. */
300 || (x
== arg_pointer_rtx
&& fixed_regs
[ARG_POINTER_REGNUM
]))
302 if (x
== pic_offset_table_rtx
303 /* ??? When call-clobbered, the value is stable modulo the restore
304 that must happen after a call. This currently screws up
305 local-alloc into believing that the restore is not needed, so we
306 must return 0 only if we are called from alias analysis. */
307 && (!PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
|| for_alias
))
312 /* The operand 0 of a LO_SUM is considered constant
313 (in fact it is related specifically to operand 1)
314 during alias analysis. */
315 return (! for_alias
&& rtx_varies_p (XEXP (x
, 0), for_alias
))
316 || rtx_varies_p (XEXP (x
, 1), for_alias
);
319 if (MEM_VOLATILE_P (x
))
328 fmt
= GET_RTX_FORMAT (code
);
329 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
332 if (rtx_varies_p (XEXP (x
, i
), for_alias
))
335 else if (fmt
[i
] == 'E')
338 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
339 if (rtx_varies_p (XVECEXP (x
, i
, j
), for_alias
))
346 /* Compute an approximation for the offset between the register
347 FROM and TO for the current function, as it was at the start
351 get_initial_register_offset (int from
, int to
)
353 static const struct elim_table_t
357 } table
[] = ELIMINABLE_REGS
;
358 poly_int64 offset1
, offset2
;
364 /* It is not safe to call INITIAL_ELIMINATION_OFFSET before the epilogue
365 is completed, but we need to give at least an estimate for the stack
366 pointer based on the frame size. */
367 if (!epilogue_completed
)
369 offset1
= crtl
->outgoing_args_size
+ get_frame_size ();
370 #if !STACK_GROWS_DOWNWARD
373 if (to
== STACK_POINTER_REGNUM
)
375 else if (from
== STACK_POINTER_REGNUM
)
381 for (i
= 0; i
< ARRAY_SIZE (table
); i
++)
382 if (table
[i
].from
== from
)
384 if (table
[i
].to
== to
)
386 INITIAL_ELIMINATION_OFFSET (table
[i
].from
, table
[i
].to
,
390 for (j
= 0; j
< ARRAY_SIZE (table
); j
++)
392 if (table
[j
].to
== to
393 && table
[j
].from
== table
[i
].to
)
395 INITIAL_ELIMINATION_OFFSET (table
[i
].from
, table
[i
].to
,
397 INITIAL_ELIMINATION_OFFSET (table
[j
].from
, table
[j
].to
,
399 return offset1
+ offset2
;
401 if (table
[j
].from
== to
402 && table
[j
].to
== table
[i
].to
)
404 INITIAL_ELIMINATION_OFFSET (table
[i
].from
, table
[i
].to
,
406 INITIAL_ELIMINATION_OFFSET (table
[j
].from
, table
[j
].to
,
408 return offset1
- offset2
;
412 else if (table
[i
].to
== from
)
414 if (table
[i
].from
== to
)
416 INITIAL_ELIMINATION_OFFSET (table
[i
].from
, table
[i
].to
,
420 for (j
= 0; j
< ARRAY_SIZE (table
); j
++)
422 if (table
[j
].to
== to
423 && table
[j
].from
== table
[i
].from
)
425 INITIAL_ELIMINATION_OFFSET (table
[i
].from
, table
[i
].to
,
427 INITIAL_ELIMINATION_OFFSET (table
[j
].from
, table
[j
].to
,
429 return - offset1
+ offset2
;
431 if (table
[j
].from
== to
432 && table
[j
].to
== table
[i
].from
)
434 INITIAL_ELIMINATION_OFFSET (table
[i
].from
, table
[i
].to
,
436 INITIAL_ELIMINATION_OFFSET (table
[j
].from
, table
[j
].to
,
438 return - offset1
- offset2
;
443 /* If the requested register combination was not found,
444 try a different more simple combination. */
445 if (from
== ARG_POINTER_REGNUM
)
446 return get_initial_register_offset (HARD_FRAME_POINTER_REGNUM
, to
);
447 else if (to
== ARG_POINTER_REGNUM
)
448 return get_initial_register_offset (from
, HARD_FRAME_POINTER_REGNUM
);
449 else if (from
== HARD_FRAME_POINTER_REGNUM
)
450 return get_initial_register_offset (FRAME_POINTER_REGNUM
, to
);
451 else if (to
== HARD_FRAME_POINTER_REGNUM
)
452 return get_initial_register_offset (from
, FRAME_POINTER_REGNUM
);
457 /* Return true if the use of X+OFFSET as an address in a MEM with SIZE
458 bytes can cause a trap. MODE is the mode of the MEM (not that of X) and
459 UNALIGNED_MEMS controls whether true is returned for unaligned memory
460 references on strict alignment machines. */
463 rtx_addr_can_trap_p_1 (const_rtx x
, poly_int64 offset
, poly_int64 size
,
464 machine_mode mode
, bool unaligned_mems
)
466 enum rtx_code code
= GET_CODE (x
);
467 gcc_checking_assert (mode
== BLKmode
469 || known_size_p (size
));
472 /* The offset must be a multiple of the mode size if we are considering
473 unaligned memory references on strict alignment machines. */
479 poly_int64 actual_offset
= offset
;
481 #ifdef SPARC_STACK_BOUNDARY_HACK
482 /* ??? The SPARC port may claim a STACK_BOUNDARY higher than
483 the real alignment of %sp. However, when it does this, the
484 alignment of %sp+STACK_POINTER_OFFSET is STACK_BOUNDARY. */
485 if (SPARC_STACK_BOUNDARY_HACK
486 && (x
== stack_pointer_rtx
|| x
== hard_frame_pointer_rtx
))
487 actual_offset
-= STACK_POINTER_OFFSET
;
490 if (!multiple_p (actual_offset
, GET_MODE_SIZE (mode
)))
497 if (SYMBOL_REF_WEAK (x
))
499 if (!CONSTANT_POOL_ADDRESS_P (x
) && !SYMBOL_REF_FUNCTION_P (x
))
502 poly_int64 decl_size
;
504 if (maybe_lt (offset
, 0))
506 if (!known_size_p (size
))
507 return maybe_ne (offset
, 0);
509 /* If the size of the access or of the symbol is unknown,
511 decl
= SYMBOL_REF_DECL (x
);
513 /* Else check that the access is in bounds. TODO: restructure
514 expr_size/tree_expr_size/int_expr_size and just use the latter. */
517 else if (DECL_P (decl
) && DECL_SIZE_UNIT (decl
))
519 if (!poly_int_tree_p (DECL_SIZE_UNIT (decl
), &decl_size
))
522 else if (TREE_CODE (decl
) == STRING_CST
)
523 decl_size
= TREE_STRING_LENGTH (decl
);
524 else if (TYPE_SIZE_UNIT (TREE_TYPE (decl
)))
525 decl_size
= int_size_in_bytes (TREE_TYPE (decl
));
529 return (!known_size_p (decl_size
) || known_eq (decl_size
, 0)
530 ? maybe_ne (offset
, 0)
531 : !known_subrange_p (offset
, size
, 0, decl_size
));
540 /* Stack references are assumed not to trap, but we need to deal with
541 nonsensical offsets. */
542 if (x
== frame_pointer_rtx
|| x
== hard_frame_pointer_rtx
543 || x
== stack_pointer_rtx
544 /* The arg pointer varies if it is not a fixed register. */
545 || (x
== arg_pointer_rtx
&& fixed_regs
[ARG_POINTER_REGNUM
]))
548 poly_int64 red_zone_size
= RED_ZONE_SIZE
;
550 poly_int64 red_zone_size
= 0;
552 poly_int64 stack_boundary
= PREFERRED_STACK_BOUNDARY
/ BITS_PER_UNIT
;
553 poly_int64 low_bound
, high_bound
;
555 if (!known_size_p (size
))
558 if (x
== frame_pointer_rtx
)
560 if (FRAME_GROWS_DOWNWARD
)
562 high_bound
= targetm
.starting_frame_offset ();
563 low_bound
= high_bound
- get_frame_size ();
567 low_bound
= targetm
.starting_frame_offset ();
568 high_bound
= low_bound
+ get_frame_size ();
571 else if (x
== hard_frame_pointer_rtx
)
574 = get_initial_register_offset (STACK_POINTER_REGNUM
,
575 HARD_FRAME_POINTER_REGNUM
);
577 = get_initial_register_offset (ARG_POINTER_REGNUM
,
578 HARD_FRAME_POINTER_REGNUM
);
580 #if STACK_GROWS_DOWNWARD
581 low_bound
= sp_offset
- red_zone_size
- stack_boundary
;
582 high_bound
= ap_offset
583 + FIRST_PARM_OFFSET (current_function_decl
)
584 #if !ARGS_GROW_DOWNWARD
589 high_bound
= sp_offset
+ red_zone_size
+ stack_boundary
;
590 low_bound
= ap_offset
591 + FIRST_PARM_OFFSET (current_function_decl
)
592 #if ARGS_GROW_DOWNWARD
598 else if (x
== stack_pointer_rtx
)
601 = get_initial_register_offset (ARG_POINTER_REGNUM
,
602 STACK_POINTER_REGNUM
);
604 #if STACK_GROWS_DOWNWARD
605 low_bound
= - red_zone_size
- stack_boundary
;
606 high_bound
= ap_offset
607 + FIRST_PARM_OFFSET (current_function_decl
)
608 #if !ARGS_GROW_DOWNWARD
613 high_bound
= red_zone_size
+ stack_boundary
;
614 low_bound
= ap_offset
615 + FIRST_PARM_OFFSET (current_function_decl
)
616 #if ARGS_GROW_DOWNWARD
624 /* We assume that accesses are safe to at least the
626 Examples are varargs and __builtin_return_address. */
627 #if ARGS_GROW_DOWNWARD
628 high_bound
= FIRST_PARM_OFFSET (current_function_decl
)
630 low_bound
= FIRST_PARM_OFFSET (current_function_decl
)
631 - crtl
->args
.size
- stack_boundary
;
633 low_bound
= FIRST_PARM_OFFSET (current_function_decl
)
635 high_bound
= FIRST_PARM_OFFSET (current_function_decl
)
636 + crtl
->args
.size
+ stack_boundary
;
640 if (known_ge (offset
, low_bound
)
641 && known_le (offset
, high_bound
- size
))
645 /* All of the virtual frame registers are stack references. */
646 if (VIRTUAL_REGISTER_P (x
))
651 return rtx_addr_can_trap_p_1 (XEXP (x
, 0), offset
, size
,
652 mode
, unaligned_mems
);
655 /* An address is assumed not to trap if:
656 - it is the pic register plus a const unspec without offset. */
657 if (XEXP (x
, 0) == pic_offset_table_rtx
658 && GET_CODE (XEXP (x
, 1)) == CONST
659 && GET_CODE (XEXP (XEXP (x
, 1), 0)) == UNSPEC
660 && known_eq (offset
, 0))
663 /* - or it is an address that can't trap plus a constant integer. */
664 if (poly_int_rtx_p (XEXP (x
, 1), &const_x1
)
665 && !rtx_addr_can_trap_p_1 (XEXP (x
, 0), offset
+ const_x1
,
666 size
, mode
, unaligned_mems
))
673 return rtx_addr_can_trap_p_1 (XEXP (x
, 1), offset
, size
,
674 mode
, unaligned_mems
);
681 return rtx_addr_can_trap_p_1 (XEXP (x
, 0), offset
, size
,
682 mode
, unaligned_mems
);
688 /* If it isn't one of the case above, it can cause a trap. */
692 /* Return true if the use of X as an address in a MEM can cause a trap. */
695 rtx_addr_can_trap_p (const_rtx x
)
697 return rtx_addr_can_trap_p_1 (x
, 0, -1, BLKmode
, false);
700 /* Return true if X contains a MEM subrtx. */
703 contains_mem_rtx_p (rtx x
)
705 subrtx_iterator::array_type array
;
706 FOR_EACH_SUBRTX (iter
, array
, x
, ALL
)
713 /* Return true if X is an address that is known to not be zero. */
716 nonzero_address_p (const_rtx x
)
718 const enum rtx_code code
= GET_CODE (x
);
723 return flag_delete_null_pointer_checks
&& !SYMBOL_REF_WEAK (x
);
729 /* As in rtx_varies_p, we have to use the actual rtx, not reg number. */
730 if (x
== frame_pointer_rtx
|| x
== hard_frame_pointer_rtx
731 || x
== stack_pointer_rtx
732 || (x
== arg_pointer_rtx
&& fixed_regs
[ARG_POINTER_REGNUM
]))
734 /* All of the virtual frame registers are stack references. */
735 if (VIRTUAL_REGISTER_P (x
))
740 return nonzero_address_p (XEXP (x
, 0));
743 /* Handle PIC references. */
744 if (XEXP (x
, 0) == pic_offset_table_rtx
745 && CONSTANT_P (XEXP (x
, 1)))
750 /* Similar to the above; allow positive offsets. Further, since
751 auto-inc is only allowed in memories, the register must be a
753 if (CONST_INT_P (XEXP (x
, 1))
754 && INTVAL (XEXP (x
, 1)) > 0)
756 return nonzero_address_p (XEXP (x
, 0));
759 /* Similarly. Further, the offset is always positive. */
766 return nonzero_address_p (XEXP (x
, 0));
769 return nonzero_address_p (XEXP (x
, 1));
775 /* If it isn't one of the case above, might be zero. */
779 /* Return true if X refers to a memory location whose address
780 cannot be compared reliably with constant addresses,
781 or if X refers to a BLKmode memory object.
782 FOR_ALIAS is nonzero if we are called from alias analysis; if it is
783 zero, we are slightly more conservative. */
786 rtx_addr_varies_p (const_rtx x
, bool for_alias
)
797 return GET_MODE (x
) == BLKmode
|| rtx_varies_p (XEXP (x
, 0), for_alias
);
799 fmt
= GET_RTX_FORMAT (code
);
800 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
803 if (rtx_addr_varies_p (XEXP (x
, i
), for_alias
))
806 else if (fmt
[i
] == 'E')
809 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
810 if (rtx_addr_varies_p (XVECEXP (x
, i
, j
), for_alias
))
816 /* Return the CALL in X if there is one. */
819 get_call_rtx_from (const rtx_insn
*insn
)
821 rtx x
= PATTERN (insn
);
822 if (GET_CODE (x
) == PARALLEL
)
823 x
= XVECEXP (x
, 0, 0);
824 if (GET_CODE (x
) == SET
)
826 if (GET_CODE (x
) == CALL
&& MEM_P (XEXP (x
, 0)))
831 /* Get the declaration of the function called by INSN. */
834 get_call_fndecl (const rtx_insn
*insn
)
838 note
= find_reg_note (insn
, REG_CALL_DECL
, NULL_RTX
);
839 if (note
== NULL_RTX
)
842 datum
= XEXP (note
, 0);
843 if (datum
!= NULL_RTX
)
844 return SYMBOL_REF_DECL (datum
);
849 /* Return the value of the integer term in X, if one is apparent;
851 Only obvious integer terms are detected.
852 This is used in cse.cc with the `related_value' field. */
855 get_integer_term (const_rtx x
)
857 if (GET_CODE (x
) == CONST
)
860 if (GET_CODE (x
) == MINUS
861 && CONST_INT_P (XEXP (x
, 1)))
862 return - INTVAL (XEXP (x
, 1));
863 if (GET_CODE (x
) == PLUS
864 && CONST_INT_P (XEXP (x
, 1)))
865 return INTVAL (XEXP (x
, 1));
869 /* If X is a constant, return the value sans apparent integer term;
871 Only obvious integer terms are detected. */
874 get_related_value (const_rtx x
)
876 if (GET_CODE (x
) != CONST
)
879 if (GET_CODE (x
) == PLUS
880 && CONST_INT_P (XEXP (x
, 1)))
882 else if (GET_CODE (x
) == MINUS
883 && CONST_INT_P (XEXP (x
, 1)))
888 /* Return true if SYMBOL is a SYMBOL_REF and OFFSET + SYMBOL points
889 to somewhere in the same object or object_block as SYMBOL. */
892 offset_within_block_p (const_rtx symbol
, HOST_WIDE_INT offset
)
896 if (GET_CODE (symbol
) != SYMBOL_REF
)
904 if (CONSTANT_POOL_ADDRESS_P (symbol
)
905 && offset
< (int) GET_MODE_SIZE (get_pool_mode (symbol
)))
908 decl
= SYMBOL_REF_DECL (symbol
);
909 if (decl
&& offset
< int_size_in_bytes (TREE_TYPE (decl
)))
913 if (SYMBOL_REF_HAS_BLOCK_INFO_P (symbol
)
914 && SYMBOL_REF_BLOCK (symbol
)
915 && SYMBOL_REF_BLOCK_OFFSET (symbol
) >= 0
916 && ((unsigned HOST_WIDE_INT
) offset
+ SYMBOL_REF_BLOCK_OFFSET (symbol
)
917 < (unsigned HOST_WIDE_INT
) SYMBOL_REF_BLOCK (symbol
)->size
))
923 /* Split X into a base and a constant offset, storing them in *BASE_OUT
924 and *OFFSET_OUT respectively. */
927 split_const (rtx x
, rtx
*base_out
, rtx
*offset_out
)
929 if (GET_CODE (x
) == CONST
)
932 if (GET_CODE (x
) == PLUS
&& CONST_INT_P (XEXP (x
, 1)))
934 *base_out
= XEXP (x
, 0);
935 *offset_out
= XEXP (x
, 1);
940 *offset_out
= const0_rtx
;
943 /* Express integer value X as some value Y plus a polynomial offset,
944 where Y is either const0_rtx, X or something within X (as opposed
945 to a new rtx). Return the Y and store the offset in *OFFSET_OUT. */
948 strip_offset (rtx x
, poly_int64_pod
*offset_out
)
950 rtx base
= const0_rtx
;
952 if (GET_CODE (test
) == CONST
)
953 test
= XEXP (test
, 0);
954 if (GET_CODE (test
) == PLUS
)
956 base
= XEXP (test
, 0);
957 test
= XEXP (test
, 1);
959 if (poly_int_rtx_p (test
, offset_out
))
965 /* Return the argument size in REG_ARGS_SIZE note X. */
968 get_args_size (const_rtx x
)
970 gcc_checking_assert (REG_NOTE_KIND (x
) == REG_ARGS_SIZE
);
971 return rtx_to_poly_int64 (XEXP (x
, 0));
974 /* Return the number of places FIND appears within X. If COUNT_DEST is
975 zero, we do not count occurrences inside the destination of a SET. */
978 count_occurrences (const_rtx x
, const_rtx find
, int count_dest
)
982 const char *format_ptr
;
1000 count
= count_occurrences (XEXP (x
, 0), find
, count_dest
);
1002 count
+= count_occurrences (XEXP (x
, 1), find
, count_dest
);
1006 if (MEM_P (find
) && rtx_equal_p (x
, find
))
1011 if (SET_DEST (x
) == find
&& ! count_dest
)
1012 return count_occurrences (SET_SRC (x
), find
, count_dest
);
1019 format_ptr
= GET_RTX_FORMAT (code
);
1022 for (i
= 0; i
< GET_RTX_LENGTH (code
); i
++)
1024 switch (*format_ptr
++)
1027 count
+= count_occurrences (XEXP (x
, i
), find
, count_dest
);
1031 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1032 count
+= count_occurrences (XVECEXP (x
, i
, j
), find
, count_dest
);
1040 /* Return TRUE if OP is a register or subreg of a register that
1041 holds an unsigned quantity. Otherwise, return FALSE. */
1044 unsigned_reg_p (rtx op
)
1048 && TYPE_UNSIGNED (TREE_TYPE (REG_EXPR (op
))))
1051 if (GET_CODE (op
) == SUBREG
1052 && SUBREG_PROMOTED_SIGN (op
))
1059 /* Return true if register REG appears somewhere within IN.
1060 Also works if REG is not a register; in this case it checks
1061 for a subexpression of IN that is Lisp "equal" to REG. */
1064 reg_mentioned_p (const_rtx reg
, const_rtx in
)
1076 if (GET_CODE (in
) == LABEL_REF
)
1077 return reg
== label_ref_label (in
);
1079 code
= GET_CODE (in
);
1083 /* Compare registers by number. */
1085 return REG_P (reg
) && REGNO (in
) == REGNO (reg
);
1087 /* These codes have no constituent expressions
1094 /* These are kept unique for a given value. */
1101 if (GET_CODE (reg
) == code
&& rtx_equal_p (reg
, in
))
1104 fmt
= GET_RTX_FORMAT (code
);
1106 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1111 for (j
= XVECLEN (in
, i
) - 1; j
>= 0; j
--)
1112 if (reg_mentioned_p (reg
, XVECEXP (in
, i
, j
)))
1115 else if (fmt
[i
] == 'e'
1116 && reg_mentioned_p (reg
, XEXP (in
, i
)))
1122 /* Return true if in between BEG and END, exclusive of BEG and END, there is
1123 no CODE_LABEL insn. */
1126 no_labels_between_p (const rtx_insn
*beg
, const rtx_insn
*end
)
1131 for (p
= NEXT_INSN (beg
); p
!= end
; p
= NEXT_INSN (p
))
1137 /* Return true if register REG is used in an insn between
1138 FROM_INSN and TO_INSN (exclusive of those two). */
1141 reg_used_between_p (const_rtx reg
, const rtx_insn
*from_insn
,
1142 const rtx_insn
*to_insn
)
1146 if (from_insn
== to_insn
)
1149 for (insn
= NEXT_INSN (from_insn
); insn
!= to_insn
; insn
= NEXT_INSN (insn
))
1150 if (NONDEBUG_INSN_P (insn
)
1151 && (reg_overlap_mentioned_p (reg
, PATTERN (insn
))
1152 || (CALL_P (insn
) && find_reg_fusage (insn
, USE
, reg
))))
1157 /* Return true if the old value of X, a register, is referenced in BODY. If X
1158 is entirely replaced by a new value and the only use is as a SET_DEST,
1159 we do not consider it a reference. */
1162 reg_referenced_p (const_rtx x
, const_rtx body
)
1166 switch (GET_CODE (body
))
1169 if (reg_overlap_mentioned_p (x
, SET_SRC (body
)))
1172 /* If the destination is anything other than PC, a REG or a SUBREG
1173 of a REG that occupies all of the REG, the insn references X if
1174 it is mentioned in the destination. */
1175 if (GET_CODE (SET_DEST (body
)) != PC
1176 && !REG_P (SET_DEST (body
))
1177 && ! (GET_CODE (SET_DEST (body
)) == SUBREG
1178 && REG_P (SUBREG_REG (SET_DEST (body
)))
1179 && !read_modify_subreg_p (SET_DEST (body
)))
1180 && reg_overlap_mentioned_p (x
, SET_DEST (body
)))
1185 for (i
= ASM_OPERANDS_INPUT_LENGTH (body
) - 1; i
>= 0; i
--)
1186 if (reg_overlap_mentioned_p (x
, ASM_OPERANDS_INPUT (body
, i
)))
1193 return reg_overlap_mentioned_p (x
, body
);
1196 return reg_overlap_mentioned_p (x
, TRAP_CONDITION (body
));
1199 return reg_overlap_mentioned_p (x
, XEXP (body
, 0));
1202 case UNSPEC_VOLATILE
:
1203 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
1204 if (reg_overlap_mentioned_p (x
, XVECEXP (body
, 0, i
)))
1209 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
1210 if (reg_referenced_p (x
, XVECEXP (body
, 0, i
)))
1215 if (MEM_P (XEXP (body
, 0)))
1216 if (reg_overlap_mentioned_p (x
, XEXP (XEXP (body
, 0), 0)))
1221 if (reg_overlap_mentioned_p (x
, COND_EXEC_TEST (body
)))
1223 return reg_referenced_p (x
, COND_EXEC_CODE (body
));
1230 /* Return true if register REG is set or clobbered in an insn between
1231 FROM_INSN and TO_INSN (exclusive of those two). */
1234 reg_set_between_p (const_rtx reg
, const rtx_insn
*from_insn
,
1235 const rtx_insn
*to_insn
)
1237 const rtx_insn
*insn
;
1239 if (from_insn
== to_insn
)
1242 for (insn
= NEXT_INSN (from_insn
); insn
!= to_insn
; insn
= NEXT_INSN (insn
))
1243 if (INSN_P (insn
) && reg_set_p (reg
, insn
))
1248 /* Return true if REG is set or clobbered inside INSN. */
1251 reg_set_p (const_rtx reg
, const_rtx insn
)
1253 /* After delay slot handling, call and branch insns might be in a
1254 sequence. Check all the elements there. */
1255 if (INSN_P (insn
) && GET_CODE (PATTERN (insn
)) == SEQUENCE
)
1257 for (int i
= 0; i
< XVECLEN (PATTERN (insn
), 0); ++i
)
1258 if (reg_set_p (reg
, XVECEXP (PATTERN (insn
), 0, i
)))
1264 /* We can be passed an insn or part of one. If we are passed an insn,
1265 check if a side-effect of the insn clobbers REG. */
1267 && (FIND_REG_INC_NOTE (insn
, reg
)
1270 && REGNO (reg
) < FIRST_PSEUDO_REGISTER
1271 && (insn_callee_abi (as_a
<const rtx_insn
*> (insn
))
1272 .clobbers_reg_p (GET_MODE (reg
), REGNO (reg
))))
1274 || find_reg_fusage (insn
, CLOBBER
, reg
)))))
1277 /* There are no REG_INC notes for SP autoinc. */
1278 if (reg
== stack_pointer_rtx
&& INSN_P (insn
))
1280 subrtx_var_iterator::array_type array
;
1281 FOR_EACH_SUBRTX_VAR (iter
, array
, PATTERN (insn
), NONCONST
)
1286 && GET_RTX_CLASS (GET_CODE (XEXP (mem
, 0))) == RTX_AUTOINC
)
1288 if (XEXP (XEXP (mem
, 0), 0) == stack_pointer_rtx
)
1290 iter
.skip_subrtxes ();
1295 return set_of (reg
, insn
) != NULL_RTX
;
1298 /* Similar to reg_set_between_p, but check all registers in X. Return false
1299 only if none of them are modified between START and END. Return true if
1300 X contains a MEM; this routine does use memory aliasing. */
1303 modified_between_p (const_rtx x
, const rtx_insn
*start
, const rtx_insn
*end
)
1305 const enum rtx_code code
= GET_CODE (x
);
1325 if (modified_between_p (XEXP (x
, 0), start
, end
))
1327 if (MEM_READONLY_P (x
))
1329 for (insn
= NEXT_INSN (start
); insn
!= end
; insn
= NEXT_INSN (insn
))
1330 if (memory_modified_in_insn_p (x
, insn
))
1335 return reg_set_between_p (x
, start
, end
);
1341 fmt
= GET_RTX_FORMAT (code
);
1342 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1344 if (fmt
[i
] == 'e' && modified_between_p (XEXP (x
, i
), start
, end
))
1347 else if (fmt
[i
] == 'E')
1348 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1349 if (modified_between_p (XVECEXP (x
, i
, j
), start
, end
))
1356 /* Similar to reg_set_p, but check all registers in X. Return false only if
1357 none of them are modified in INSN. Return true if X contains a MEM; this
1358 routine does use memory aliasing. */
1361 modified_in_p (const_rtx x
, const_rtx insn
)
1363 const enum rtx_code code
= GET_CODE (x
);
1379 if (modified_in_p (XEXP (x
, 0), insn
))
1381 if (MEM_READONLY_P (x
))
1383 if (memory_modified_in_insn_p (x
, insn
))
1388 return reg_set_p (x
, insn
);
1394 fmt
= GET_RTX_FORMAT (code
);
1395 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1397 if (fmt
[i
] == 'e' && modified_in_p (XEXP (x
, i
), insn
))
1400 else if (fmt
[i
] == 'E')
1401 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1402 if (modified_in_p (XVECEXP (x
, i
, j
), insn
))
1409 /* Return true if X is a SUBREG and if storing a value to X would
1410 preserve some of its SUBREG_REG. For example, on a normal 32-bit
1411 target, using a SUBREG to store to one half of a DImode REG would
1412 preserve the other half. */
1415 read_modify_subreg_p (const_rtx x
)
1417 if (GET_CODE (x
) != SUBREG
)
1419 poly_uint64 isize
= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x
)));
1420 poly_uint64 osize
= GET_MODE_SIZE (GET_MODE (x
));
1421 poly_uint64 regsize
= REGMODE_NATURAL_SIZE (GET_MODE (SUBREG_REG (x
)));
1422 /* The inner and outer modes of a subreg must be ordered, so that we
1423 can tell whether they're paradoxical or partial. */
1424 gcc_checking_assert (ordered_p (isize
, osize
));
1425 return (maybe_gt (isize
, osize
) && maybe_gt (isize
, regsize
));
1428 /* Helper function for set_of. */
1436 set_of_1 (rtx x
, const_rtx pat
, void *data1
)
1438 struct set_of_data
*const data
= (struct set_of_data
*) (data1
);
1439 if (rtx_equal_p (x
, data
->pat
)
1440 || (!MEM_P (x
) && reg_overlap_mentioned_p (data
->pat
, x
)))
1444 /* Give an INSN, return a SET or CLOBBER expression that does modify PAT
1445 (either directly or via STRICT_LOW_PART and similar modifiers). */
1447 set_of (const_rtx pat
, const_rtx insn
)
1449 struct set_of_data data
;
1450 data
.found
= NULL_RTX
;
1452 note_pattern_stores (INSN_P (insn
) ? PATTERN (insn
) : insn
, set_of_1
, &data
);
1456 /* Check whether instruction pattern PAT contains a SET with the following
1459 - the SET is executed unconditionally; and
1461 - the destination of the SET is a REG that contains REGNO; or
1463 - the destination of the SET is a SUBREG of such a REG; and
1464 - writing to the subreg clobbers all of the SUBREG_REG
1465 (in other words, read_modify_subreg_p is false).
1467 If PAT does have a SET like that, return the set, otherwise return null.
1469 This is intended to be an alternative to single_set for passes that
1470 can handle patterns with multiple_sets. */
1472 simple_regno_set (rtx pat
, unsigned int regno
)
1474 if (GET_CODE (pat
) == PARALLEL
)
1476 int last
= XVECLEN (pat
, 0) - 1;
1477 for (int i
= 0; i
< last
; ++i
)
1478 if (rtx set
= simple_regno_set (XVECEXP (pat
, 0, i
), regno
))
1481 pat
= XVECEXP (pat
, 0, last
);
1484 if (GET_CODE (pat
) == SET
1485 && covers_regno_no_parallel_p (SET_DEST (pat
), regno
))
1491 /* Add all hard register in X to *PSET. */
1493 find_all_hard_regs (const_rtx x
, HARD_REG_SET
*pset
)
1495 subrtx_iterator::array_type array
;
1496 FOR_EACH_SUBRTX (iter
, array
, x
, NONCONST
)
1498 const_rtx x
= *iter
;
1499 if (REG_P (x
) && REGNO (x
) < FIRST_PSEUDO_REGISTER
)
1500 add_to_hard_reg_set (pset
, GET_MODE (x
), REGNO (x
));
1504 /* This function, called through note_stores, collects sets and
1505 clobbers of hard registers in a HARD_REG_SET, which is pointed to
1508 record_hard_reg_sets (rtx x
, const_rtx pat ATTRIBUTE_UNUSED
, void *data
)
1510 HARD_REG_SET
*pset
= (HARD_REG_SET
*)data
;
1511 if (REG_P (x
) && HARD_REGISTER_P (x
))
1512 add_to_hard_reg_set (pset
, GET_MODE (x
), REGNO (x
));
1515 /* Examine INSN, and compute the set of hard registers written by it.
1516 Store it in *PSET. Should only be called after reload.
1518 IMPLICIT is true if we should include registers that are fully-clobbered
1519 by calls. This should be used with caution, since it doesn't include
1520 partially-clobbered registers. */
1522 find_all_hard_reg_sets (const rtx_insn
*insn
, HARD_REG_SET
*pset
, bool implicit
)
1526 CLEAR_HARD_REG_SET (*pset
);
1527 note_stores (insn
, record_hard_reg_sets
, pset
);
1528 if (CALL_P (insn
) && implicit
)
1529 *pset
|= insn_callee_abi (insn
).full_reg_clobbers ();
1530 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
1531 if (REG_NOTE_KIND (link
) == REG_INC
)
1532 record_hard_reg_sets (XEXP (link
, 0), NULL
, pset
);
1535 /* Like record_hard_reg_sets, but called through note_uses. */
1537 record_hard_reg_uses (rtx
*px
, void *data
)
1539 find_all_hard_regs (*px
, (HARD_REG_SET
*) data
);
1542 /* Given an INSN, return a SET expression if this insn has only a single SET.
1543 It may also have CLOBBERs, USEs, or SET whose output
1544 will not be used, which we ignore. */
1547 single_set_2 (const rtx_insn
*insn
, const_rtx pat
)
1550 int set_verified
= 1;
1553 if (GET_CODE (pat
) == PARALLEL
)
1555 for (i
= 0; i
< XVECLEN (pat
, 0); i
++)
1557 rtx sub
= XVECEXP (pat
, 0, i
);
1558 switch (GET_CODE (sub
))
1565 /* We can consider insns having multiple sets, where all
1566 but one are dead as single set insns. In common case
1567 only single set is present in the pattern so we want
1568 to avoid checking for REG_UNUSED notes unless necessary.
1570 When we reach set first time, we just expect this is
1571 the single set we are looking for and only when more
1572 sets are found in the insn, we check them. */
1575 if (find_reg_note (insn
, REG_UNUSED
, SET_DEST (set
))
1576 && !side_effects_p (set
))
1582 set
= sub
, set_verified
= 0;
1583 else if (!find_reg_note (insn
, REG_UNUSED
, SET_DEST (sub
))
1584 || side_effects_p (sub
))
1596 /* Given an INSN, return true if it has more than one SET, else return
1600 multiple_sets (const_rtx insn
)
1605 /* INSN must be an insn. */
1606 if (! INSN_P (insn
))
1609 /* Only a PARALLEL can have multiple SETs. */
1610 if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
1612 for (i
= 0, found
= false; i
< XVECLEN (PATTERN (insn
), 0); i
++)
1613 if (GET_CODE (XVECEXP (PATTERN (insn
), 0, i
)) == SET
)
1615 /* If we have already found a SET, then return now. */
1623 /* Either zero or one SET. */
1627 /* Return true if the destination of SET equals the source
1628 and there are no side effects. */
1631 set_noop_p (const_rtx set
)
1633 rtx src
= SET_SRC (set
);
1634 rtx dst
= SET_DEST (set
);
1636 if (dst
== pc_rtx
&& src
== pc_rtx
)
1639 if (MEM_P (dst
) && MEM_P (src
))
1640 return rtx_equal_p (dst
, src
) && !side_effects_p (dst
);
1642 if (GET_CODE (dst
) == ZERO_EXTRACT
)
1643 return rtx_equal_p (XEXP (dst
, 0), src
)
1644 && !BITS_BIG_ENDIAN
&& XEXP (dst
, 2) == const0_rtx
1645 && !side_effects_p (src
);
1647 if (GET_CODE (dst
) == STRICT_LOW_PART
)
1648 dst
= XEXP (dst
, 0);
1650 if (GET_CODE (src
) == SUBREG
&& GET_CODE (dst
) == SUBREG
)
1652 if (maybe_ne (SUBREG_BYTE (src
), SUBREG_BYTE (dst
)))
1654 src
= SUBREG_REG (src
);
1655 dst
= SUBREG_REG (dst
);
1656 if (GET_MODE (src
) != GET_MODE (dst
))
1657 /* It is hard to tell whether subregs refer to the same bits, so act
1658 conservatively and return false. */
1662 /* It is a NOOP if destination overlaps with selected src vector
1664 if (GET_CODE (src
) == VEC_SELECT
1665 && REG_P (XEXP (src
, 0)) && REG_P (dst
)
1666 && HARD_REGISTER_P (XEXP (src
, 0))
1667 && HARD_REGISTER_P (dst
))
1670 rtx par
= XEXP (src
, 1);
1671 rtx src0
= XEXP (src
, 0);
1673 if (!poly_int_rtx_p (XVECEXP (par
, 0, 0), &c0
))
1675 poly_int64 offset
= GET_MODE_UNIT_SIZE (GET_MODE (src0
)) * c0
;
1677 for (i
= 1; i
< XVECLEN (par
, 0); i
++)
1680 if (!poly_int_rtx_p (XVECEXP (par
, 0, i
), &c0i
)
1681 || maybe_ne (c0i
, c0
+ i
))
1685 REG_CAN_CHANGE_MODE_P (REGNO (dst
), GET_MODE (src0
), GET_MODE (dst
))
1686 && simplify_subreg_regno (REGNO (src0
), GET_MODE (src0
),
1687 offset
, GET_MODE (dst
)) == (int) REGNO (dst
);
1690 return (REG_P (src
) && REG_P (dst
)
1691 && REGNO (src
) == REGNO (dst
));
1694 /* Return true if an insn consists only of SETs, each of which only sets a
1698 noop_move_p (const rtx_insn
*insn
)
1700 rtx pat
= PATTERN (insn
);
1702 if (INSN_CODE (insn
) == NOOP_MOVE_INSN_CODE
)
1705 /* Check the code to be executed for COND_EXEC. */
1706 if (GET_CODE (pat
) == COND_EXEC
)
1707 pat
= COND_EXEC_CODE (pat
);
1709 if (GET_CODE (pat
) == SET
&& set_noop_p (pat
))
1712 if (GET_CODE (pat
) == PARALLEL
)
1715 /* If nothing but SETs of registers to themselves,
1716 this insn can also be deleted. */
1717 for (i
= 0; i
< XVECLEN (pat
, 0); i
++)
1719 rtx tem
= XVECEXP (pat
, 0, i
);
1721 if (GET_CODE (tem
) == USE
|| GET_CODE (tem
) == CLOBBER
)
1724 if (GET_CODE (tem
) != SET
|| ! set_noop_p (tem
))
1734 /* Return true if register in range [REGNO, ENDREGNO)
1735 appears either explicitly or implicitly in X
1736 other than being stored into.
1738 References contained within the substructure at LOC do not count.
1739 LOC may be zero, meaning don't ignore anything. */
1742 refers_to_regno_p (unsigned int regno
, unsigned int endregno
, const_rtx x
,
1746 unsigned int x_regno
;
1751 /* The contents of a REG_NONNEG note is always zero, so we must come here
1752 upon repeat in case the last REG_NOTE is a REG_NONNEG note. */
1756 code
= GET_CODE (x
);
1761 x_regno
= REGNO (x
);
1763 /* If we modifying the stack, frame, or argument pointer, it will
1764 clobber a virtual register. In fact, we could be more precise,
1765 but it isn't worth it. */
1766 if ((x_regno
== STACK_POINTER_REGNUM
1767 || (FRAME_POINTER_REGNUM
!= ARG_POINTER_REGNUM
1768 && x_regno
== ARG_POINTER_REGNUM
)
1769 || x_regno
== FRAME_POINTER_REGNUM
)
1770 && VIRTUAL_REGISTER_NUM_P (regno
))
1773 return endregno
> x_regno
&& regno
< END_REGNO (x
);
1776 /* If this is a SUBREG of a hard reg, we can see exactly which
1777 registers are being modified. Otherwise, handle normally. */
1778 if (REG_P (SUBREG_REG (x
))
1779 && REGNO (SUBREG_REG (x
)) < FIRST_PSEUDO_REGISTER
)
1781 unsigned int inner_regno
= subreg_regno (x
);
1782 unsigned int inner_endregno
1783 = inner_regno
+ (inner_regno
< FIRST_PSEUDO_REGISTER
1784 ? subreg_nregs (x
) : 1);
1786 return endregno
> inner_regno
&& regno
< inner_endregno
;
1792 if (&SET_DEST (x
) != loc
1793 /* Note setting a SUBREG counts as referring to the REG it is in for
1794 a pseudo but not for hard registers since we can
1795 treat each word individually. */
1796 && ((GET_CODE (SET_DEST (x
)) == SUBREG
1797 && loc
!= &SUBREG_REG (SET_DEST (x
))
1798 && REG_P (SUBREG_REG (SET_DEST (x
)))
1799 && REGNO (SUBREG_REG (SET_DEST (x
))) >= FIRST_PSEUDO_REGISTER
1800 && refers_to_regno_p (regno
, endregno
,
1801 SUBREG_REG (SET_DEST (x
)), loc
))
1802 || (!REG_P (SET_DEST (x
))
1803 && refers_to_regno_p (regno
, endregno
, SET_DEST (x
), loc
))))
1806 if (code
== CLOBBER
|| loc
== &SET_SRC (x
))
1815 /* X does not match, so try its subexpressions. */
1817 fmt
= GET_RTX_FORMAT (code
);
1818 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1820 if (fmt
[i
] == 'e' && loc
!= &XEXP (x
, i
))
1828 if (refers_to_regno_p (regno
, endregno
, XEXP (x
, i
), loc
))
1831 else if (fmt
[i
] == 'E')
1834 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1835 if (loc
!= &XVECEXP (x
, i
, j
)
1836 && refers_to_regno_p (regno
, endregno
, XVECEXP (x
, i
, j
), loc
))
1843 /* Rreturn true if modifying X will affect IN. If X is a register or a SUBREG,
1844 we check if any register number in X conflicts with the relevant register
1845 numbers. If X is a constant, return false. If X is a MEM, return true iff
1846 IN contains a MEM (we don't bother checking for memory addresses that can't
1847 conflict because we expect this to be a rare case. */
1850 reg_overlap_mentioned_p (const_rtx x
, const_rtx in
)
1852 unsigned int regno
, endregno
;
1854 /* If either argument is a constant, then modifying X cannot
1855 affect IN. Here we look at IN, we can profitably combine
1856 CONSTANT_P (x) with the switch statement below. */
1857 if (CONSTANT_P (in
))
1861 switch (GET_CODE (x
))
1864 case STRICT_LOW_PART
:
1867 /* Overly conservative. */
1872 regno
= REGNO (SUBREG_REG (x
));
1873 if (regno
< FIRST_PSEUDO_REGISTER
)
1874 regno
= subreg_regno (x
);
1875 endregno
= regno
+ (regno
< FIRST_PSEUDO_REGISTER
1876 ? subreg_nregs (x
) : 1);
1881 endregno
= END_REGNO (x
);
1883 return refers_to_regno_p (regno
, endregno
, in
, (rtx
*) 0);
1893 fmt
= GET_RTX_FORMAT (GET_CODE (in
));
1894 for (i
= GET_RTX_LENGTH (GET_CODE (in
)) - 1; i
>= 0; i
--)
1897 if (reg_overlap_mentioned_p (x
, XEXP (in
, i
)))
1900 else if (fmt
[i
] == 'E')
1903 for (j
= XVECLEN (in
, i
) - 1; j
>= 0; --j
)
1904 if (reg_overlap_mentioned_p (x
, XVECEXP (in
, i
, j
)))
1913 return reg_mentioned_p (x
, in
);
1919 /* If any register in here refers to it we return true. */
1920 for (i
= XVECLEN (x
, 0) - 1; i
>= 0; i
--)
1921 if (XEXP (XVECEXP (x
, 0, i
), 0) != 0
1922 && reg_overlap_mentioned_p (XEXP (XVECEXP (x
, 0, i
), 0), in
))
1928 gcc_assert (CONSTANT_P (x
));
1933 /* Call FUN on each register or MEM that is stored into or clobbered by X.
1934 (X would be the pattern of an insn). DATA is an arbitrary pointer,
1935 ignored by note_stores, but passed to FUN.
1937 FUN receives three arguments:
1938 1. the REG, MEM or PC being stored in or clobbered,
1939 2. the SET or CLOBBER rtx that does the store,
1940 3. the pointer DATA provided to note_stores.
1942 If the item being stored in or clobbered is a SUBREG of a hard register,
1943 the SUBREG will be passed. */
1946 note_pattern_stores (const_rtx x
,
1947 void (*fun
) (rtx
, const_rtx
, void *), void *data
)
1951 if (GET_CODE (x
) == COND_EXEC
)
1952 x
= COND_EXEC_CODE (x
);
1954 if (GET_CODE (x
) == SET
|| GET_CODE (x
) == CLOBBER
)
1956 rtx dest
= SET_DEST (x
);
1958 while ((GET_CODE (dest
) == SUBREG
1959 && (!REG_P (SUBREG_REG (dest
))
1960 || REGNO (SUBREG_REG (dest
)) >= FIRST_PSEUDO_REGISTER
))
1961 || GET_CODE (dest
) == ZERO_EXTRACT
1962 || GET_CODE (dest
) == STRICT_LOW_PART
)
1963 dest
= XEXP (dest
, 0);
1965 /* If we have a PARALLEL, SET_DEST is a list of EXPR_LIST expressions,
1966 each of whose first operand is a register. */
1967 if (GET_CODE (dest
) == PARALLEL
)
1969 for (i
= XVECLEN (dest
, 0) - 1; i
>= 0; i
--)
1970 if (XEXP (XVECEXP (dest
, 0, i
), 0) != 0)
1971 (*fun
) (XEXP (XVECEXP (dest
, 0, i
), 0), x
, data
);
1974 (*fun
) (dest
, x
, data
);
1977 else if (GET_CODE (x
) == PARALLEL
)
1978 for (i
= XVECLEN (x
, 0) - 1; i
>= 0; i
--)
1979 note_pattern_stores (XVECEXP (x
, 0, i
), fun
, data
);
1982 /* Same, but for an instruction. If the instruction is a call, include
1983 any CLOBBERs in its CALL_INSN_FUNCTION_USAGE. */
1986 note_stores (const rtx_insn
*insn
,
1987 void (*fun
) (rtx
, const_rtx
, void *), void *data
)
1990 for (rtx link
= CALL_INSN_FUNCTION_USAGE (insn
);
1991 link
; link
= XEXP (link
, 1))
1992 if (GET_CODE (XEXP (link
, 0)) == CLOBBER
)
1993 note_pattern_stores (XEXP (link
, 0), fun
, data
);
1994 note_pattern_stores (PATTERN (insn
), fun
, data
);
1997 /* Like notes_stores, but call FUN for each expression that is being
1998 referenced in PBODY, a pointer to the PATTERN of an insn. We only call
1999 FUN for each expression, not any interior subexpressions. FUN receives a
2000 pointer to the expression and the DATA passed to this function.
2002 Note that this is not quite the same test as that done in reg_referenced_p
2003 since that considers something as being referenced if it is being
2004 partially set, while we do not. */
2007 note_uses (rtx
*pbody
, void (*fun
) (rtx
*, void *), void *data
)
2012 switch (GET_CODE (body
))
2015 (*fun
) (&COND_EXEC_TEST (body
), data
);
2016 note_uses (&COND_EXEC_CODE (body
), fun
, data
);
2020 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
2021 note_uses (&XVECEXP (body
, 0, i
), fun
, data
);
2025 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
2026 note_uses (&PATTERN (XVECEXP (body
, 0, i
)), fun
, data
);
2030 (*fun
) (&XEXP (body
, 0), data
);
2034 for (i
= ASM_OPERANDS_INPUT_LENGTH (body
) - 1; i
>= 0; i
--)
2035 (*fun
) (&ASM_OPERANDS_INPUT (body
, i
), data
);
2039 (*fun
) (&TRAP_CONDITION (body
), data
);
2043 (*fun
) (&XEXP (body
, 0), data
);
2047 case UNSPEC_VOLATILE
:
2048 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
2049 (*fun
) (&XVECEXP (body
, 0, i
), data
);
2053 if (MEM_P (XEXP (body
, 0)))
2054 (*fun
) (&XEXP (XEXP (body
, 0), 0), data
);
2059 rtx dest
= SET_DEST (body
);
2061 /* For sets we replace everything in source plus registers in memory
2062 expression in store and operands of a ZERO_EXTRACT. */
2063 (*fun
) (&SET_SRC (body
), data
);
2065 if (GET_CODE (dest
) == ZERO_EXTRACT
)
2067 (*fun
) (&XEXP (dest
, 1), data
);
2068 (*fun
) (&XEXP (dest
, 2), data
);
2071 while (GET_CODE (dest
) == SUBREG
|| GET_CODE (dest
) == STRICT_LOW_PART
)
2072 dest
= XEXP (dest
, 0);
2075 (*fun
) (&XEXP (dest
, 0), data
);
2080 /* All the other possibilities never store. */
2081 (*fun
) (pbody
, data
);
2086 /* Try to add a description of REG X to this object, stopping once
2087 the REF_END limit has been reached. FLAGS is a bitmask of
2088 rtx_obj_reference flags that describe the context. */
2091 rtx_properties::try_to_add_reg (const_rtx x
, unsigned int flags
)
2093 if (REG_NREGS (x
) != 1)
2094 flags
|= rtx_obj_flags::IS_MULTIREG
;
2095 machine_mode mode
= GET_MODE (x
);
2096 unsigned int start_regno
= REGNO (x
);
2097 unsigned int end_regno
= END_REGNO (x
);
2098 for (unsigned int regno
= start_regno
; regno
< end_regno
; ++regno
)
2099 if (ref_iter
!= ref_end
)
2100 *ref_iter
++ = rtx_obj_reference (regno
, flags
, mode
,
2101 regno
- start_regno
);
2104 /* Add a description of destination X to this object. FLAGS is a bitmask
2105 of rtx_obj_reference flags that describe the context.
2107 This routine accepts all rtxes that can legitimately appear in a
2111 rtx_properties::try_to_add_dest (const_rtx x
, unsigned int flags
)
2113 /* If we have a PARALLEL, SET_DEST is a list of EXPR_LIST expressions,
2114 each of whose first operand is a register. */
2115 if (UNLIKELY (GET_CODE (x
) == PARALLEL
))
2117 for (int i
= XVECLEN (x
, 0) - 1; i
>= 0; --i
)
2118 if (rtx dest
= XEXP (XVECEXP (x
, 0, i
), 0))
2119 try_to_add_dest (dest
, flags
);
2123 unsigned int base_flags
= flags
& rtx_obj_flags::STICKY_FLAGS
;
2124 flags
|= rtx_obj_flags::IS_WRITE
;
2126 if (GET_CODE (x
) == ZERO_EXTRACT
)
2128 try_to_add_src (XEXP (x
, 1), base_flags
);
2129 try_to_add_src (XEXP (x
, 2), base_flags
);
2130 flags
|= rtx_obj_flags::IS_READ
;
2133 else if (GET_CODE (x
) == STRICT_LOW_PART
)
2135 flags
|= rtx_obj_flags::IS_READ
;
2138 else if (GET_CODE (x
) == SUBREG
)
2140 flags
|= rtx_obj_flags::IN_SUBREG
;
2141 if (read_modify_subreg_p (x
))
2142 flags
|= rtx_obj_flags::IS_READ
;
2150 if (ref_iter
!= ref_end
)
2151 *ref_iter
++ = rtx_obj_reference (MEM_REGNO
, flags
, GET_MODE (x
));
2153 unsigned int addr_flags
= base_flags
| rtx_obj_flags::IN_MEM_STORE
;
2154 if (flags
& rtx_obj_flags::IS_READ
)
2155 addr_flags
|= rtx_obj_flags::IN_MEM_LOAD
;
2156 try_to_add_src (XEXP (x
, 0), addr_flags
);
2160 if (LIKELY (REG_P (x
)))
2162 /* We want to keep sp alive everywhere - by making all
2163 writes to sp also use sp. */
2164 if (REGNO (x
) == STACK_POINTER_REGNUM
)
2165 flags
|= rtx_obj_flags::IS_READ
;
2166 try_to_add_reg (x
, flags
);
2171 /* Try to add a description of source X to this object, stopping once
2172 the REF_END limit has been reached. FLAGS is a bitmask of
2173 rtx_obj_reference flags that describe the context.
2175 This routine accepts all rtxes that can legitimately appear in a SET_SRC. */
2178 rtx_properties::try_to_add_src (const_rtx x
, unsigned int flags
)
2180 unsigned int base_flags
= flags
& rtx_obj_flags::STICKY_FLAGS
;
2181 subrtx_iterator::array_type array
;
2182 FOR_EACH_SUBRTX (iter
, array
, x
, NONCONST
)
2184 const_rtx x
= *iter
;
2185 rtx_code code
= GET_CODE (x
);
2187 try_to_add_reg (x
, flags
| rtx_obj_flags::IS_READ
);
2188 else if (code
== MEM
)
2190 if (MEM_VOLATILE_P (x
))
2191 has_volatile_refs
= true;
2193 if (!MEM_READONLY_P (x
) && ref_iter
!= ref_end
)
2195 auto mem_flags
= flags
| rtx_obj_flags::IS_READ
;
2196 *ref_iter
++ = rtx_obj_reference (MEM_REGNO
, mem_flags
,
2200 try_to_add_src (XEXP (x
, 0),
2201 base_flags
| rtx_obj_flags::IN_MEM_LOAD
);
2202 iter
.skip_subrtxes ();
2204 else if (code
== SUBREG
)
2206 try_to_add_src (SUBREG_REG (x
), flags
| rtx_obj_flags::IN_SUBREG
);
2207 iter
.skip_subrtxes ();
2209 else if (code
== UNSPEC_VOLATILE
)
2210 has_volatile_refs
= true;
2211 else if (code
== ASM_INPUT
|| code
== ASM_OPERANDS
)
2214 if (MEM_VOLATILE_P (x
))
2215 has_volatile_refs
= true;
2217 else if (code
== PRE_INC
2221 || code
== PRE_MODIFY
2222 || code
== POST_MODIFY
)
2224 has_pre_post_modify
= true;
2226 unsigned int addr_flags
= (base_flags
2227 | rtx_obj_flags::IS_PRE_POST_MODIFY
2228 | rtx_obj_flags::IS_READ
);
2229 try_to_add_dest (XEXP (x
, 0), addr_flags
);
2230 if (code
== PRE_MODIFY
|| code
== POST_MODIFY
)
2231 iter
.substitute (XEXP (XEXP (x
, 1), 1));
2233 iter
.skip_subrtxes ();
2235 else if (code
== CALL
)
2240 /* Try to add a description of instruction pattern PAT to this object,
2241 stopping once the REF_END limit has been reached. */
2244 rtx_properties::try_to_add_pattern (const_rtx pat
)
2246 switch (GET_CODE (pat
))
2249 try_to_add_src (COND_EXEC_TEST (pat
));
2250 try_to_add_pattern (COND_EXEC_CODE (pat
));
2255 int last
= XVECLEN (pat
, 0) - 1;
2256 for (int i
= 0; i
< last
; ++i
)
2257 try_to_add_pattern (XVECEXP (pat
, 0, i
));
2258 try_to_add_pattern (XVECEXP (pat
, 0, last
));
2263 for (int i
= 0, len
= ASM_OPERANDS_INPUT_LENGTH (pat
); i
< len
; ++i
)
2264 try_to_add_src (ASM_OPERANDS_INPUT (pat
, i
));
2268 try_to_add_dest (XEXP (pat
, 0), rtx_obj_flags::IS_CLOBBER
);
2272 try_to_add_dest (SET_DEST (pat
));
2273 try_to_add_src (SET_SRC (pat
));
2277 /* All the other possibilities never store and can use a normal
2278 rtx walk. This includes:
2284 - UNSPEC_VOLATILE. */
2285 try_to_add_src (pat
);
2290 /* Try to add a description of INSN to this object, stopping once
2291 the REF_END limit has been reached. INCLUDE_NOTES is true if the
2292 description should include REG_EQUAL and REG_EQUIV notes; all such
2293 references will then be marked with rtx_obj_flags::IN_NOTE.
2295 For calls, this description includes all accesses in
2296 CALL_INSN_FUNCTION_USAGE. It also include all implicit accesses
2297 to global registers by the target function. However, it does not
2298 include clobbers performed by the target function; callers that want
2299 this information should instead use the function_abi interface. */
2302 rtx_properties::try_to_add_insn (const rtx_insn
*insn
, bool include_notes
)
2306 /* Non-const functions can read from global registers. Impure
2307 functions can also set them.
2309 Adding the global registers first removes a situation in which
2310 a fixed-form clobber of register R could come before a real set
2312 if (!hard_reg_set_empty_p (global_reg_set
)
2313 && !RTL_CONST_CALL_P (insn
))
2315 unsigned int flags
= rtx_obj_flags::IS_READ
;
2316 if (!RTL_PURE_CALL_P (insn
))
2317 flags
|= rtx_obj_flags::IS_WRITE
;
2318 for (unsigned int regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; ++regno
)
2319 /* As a special case, the stack pointer is invariant across calls
2320 even if it has been marked global; see the corresponding
2321 handling in df_get_call_refs. */
2322 if (regno
!= STACK_POINTER_REGNUM
2323 && global_regs
[regno
]
2324 && ref_iter
!= ref_end
)
2325 *ref_iter
++ = rtx_obj_reference (regno
, flags
,
2326 reg_raw_mode
[regno
], 0);
2328 /* Untyped calls implicitly set all function value registers.
2329 Again, we add them first in case the main pattern contains
2330 a fixed-form clobber. */
2331 if (find_reg_note (insn
, REG_UNTYPED_CALL
, NULL_RTX
))
2332 for (unsigned int regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; ++regno
)
2333 if (targetm
.calls
.function_value_regno_p (regno
)
2334 && ref_iter
!= ref_end
)
2335 *ref_iter
++ = rtx_obj_reference (regno
, rtx_obj_flags::IS_WRITE
,
2336 reg_raw_mode
[regno
], 0);
2337 if (ref_iter
!= ref_end
&& !RTL_CONST_CALL_P (insn
))
2339 auto mem_flags
= rtx_obj_flags::IS_READ
;
2340 if (!RTL_PURE_CALL_P (insn
))
2341 mem_flags
|= rtx_obj_flags::IS_WRITE
;
2342 *ref_iter
++ = rtx_obj_reference (MEM_REGNO
, mem_flags
, BLKmode
);
2344 try_to_add_pattern (PATTERN (insn
));
2345 for (rtx link
= CALL_INSN_FUNCTION_USAGE (insn
); link
;
2346 link
= XEXP (link
, 1))
2348 rtx x
= XEXP (link
, 0);
2349 if (GET_CODE (x
) == CLOBBER
)
2350 try_to_add_dest (XEXP (x
, 0), rtx_obj_flags::IS_CLOBBER
);
2351 else if (GET_CODE (x
) == USE
)
2352 try_to_add_src (XEXP (x
, 0));
2356 try_to_add_pattern (PATTERN (insn
));
2359 for (rtx note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
2360 if (REG_NOTE_KIND (note
) == REG_EQUAL
2361 || REG_NOTE_KIND (note
) == REG_EQUIV
)
2362 try_to_add_note (XEXP (note
, 0));
2365 /* Grow the storage by a bit while keeping the contents of the first
2369 vec_rtx_properties_base::grow (ptrdiff_t start
)
2371 /* The same heuristic that vec uses. */
2372 ptrdiff_t new_elems
= (ref_end
- ref_begin
) * 3 / 2;
2373 if (ref_begin
== m_storage
)
2375 ref_begin
= XNEWVEC (rtx_obj_reference
, new_elems
);
2377 memcpy (ref_begin
, m_storage
, start
* sizeof (rtx_obj_reference
));
2380 ref_begin
= reinterpret_cast<rtx_obj_reference
*>
2381 (xrealloc (ref_begin
, new_elems
* sizeof (rtx_obj_reference
)));
2382 ref_iter
= ref_begin
+ start
;
2383 ref_end
= ref_begin
+ new_elems
;
2386 /* Return true if X's old contents don't survive after INSN.
2387 This will be true if X is a register and X dies in INSN or because
2388 INSN entirely sets X.
2390 "Entirely set" means set directly and not through a SUBREG, or
2391 ZERO_EXTRACT, so no trace of the old contents remains.
2392 Likewise, REG_INC does not count.
2394 REG may be a hard or pseudo reg. Renumbering is not taken into account,
2395 but for this use that makes no difference, since regs don't overlap
2396 during their lifetimes. Therefore, this function may be used
2397 at any time after deaths have been computed.
2399 If REG is a hard reg that occupies multiple machine registers, this
2400 function will only return true if each of those registers will be replaced
2404 dead_or_set_p (const rtx_insn
*insn
, const_rtx x
)
2406 unsigned int regno
, end_regno
;
2409 gcc_assert (REG_P (x
));
2412 end_regno
= END_REGNO (x
);
2413 for (i
= regno
; i
< end_regno
; i
++)
2414 if (! dead_or_set_regno_p (insn
, i
))
2420 /* Return TRUE iff DEST is a register or subreg of a register, is a
2421 complete rather than read-modify-write destination, and contains
2422 register TEST_REGNO. */
2425 covers_regno_no_parallel_p (const_rtx dest
, unsigned int test_regno
)
2427 unsigned int regno
, endregno
;
2429 if (GET_CODE (dest
) == SUBREG
&& !read_modify_subreg_p (dest
))
2430 dest
= SUBREG_REG (dest
);
2435 regno
= REGNO (dest
);
2436 endregno
= END_REGNO (dest
);
2437 return (test_regno
>= regno
&& test_regno
< endregno
);
2440 /* Like covers_regno_no_parallel_p, but also handles PARALLELs where
2441 any member matches the covers_regno_no_parallel_p criteria. */
2444 covers_regno_p (const_rtx dest
, unsigned int test_regno
)
2446 if (GET_CODE (dest
) == PARALLEL
)
2448 /* Some targets place small structures in registers for return
2449 values of functions, and those registers are wrapped in
2450 PARALLELs that we may see as the destination of a SET. */
2453 for (i
= XVECLEN (dest
, 0) - 1; i
>= 0; i
--)
2455 rtx inner
= XEXP (XVECEXP (dest
, 0, i
), 0);
2456 if (inner
!= NULL_RTX
2457 && covers_regno_no_parallel_p (inner
, test_regno
))
2464 return covers_regno_no_parallel_p (dest
, test_regno
);
2467 /* Utility function for dead_or_set_p to check an individual register. */
2470 dead_or_set_regno_p (const rtx_insn
*insn
, unsigned int test_regno
)
2474 /* See if there is a death note for something that includes TEST_REGNO. */
2475 if (find_regno_note (insn
, REG_DEAD
, test_regno
))
2479 && find_regno_fusage (insn
, CLOBBER
, test_regno
))
2482 pattern
= PATTERN (insn
);
2484 /* If a COND_EXEC is not executed, the value survives. */
2485 if (GET_CODE (pattern
) == COND_EXEC
)
2488 if (GET_CODE (pattern
) == SET
|| GET_CODE (pattern
) == CLOBBER
)
2489 return covers_regno_p (SET_DEST (pattern
), test_regno
);
2490 else if (GET_CODE (pattern
) == PARALLEL
)
2494 for (i
= XVECLEN (pattern
, 0) - 1; i
>= 0; i
--)
2496 rtx body
= XVECEXP (pattern
, 0, i
);
2498 if (GET_CODE (body
) == COND_EXEC
)
2499 body
= COND_EXEC_CODE (body
);
2501 if ((GET_CODE (body
) == SET
|| GET_CODE (body
) == CLOBBER
)
2502 && covers_regno_p (SET_DEST (body
), test_regno
))
2510 /* Return the reg-note of kind KIND in insn INSN, if there is one.
2511 If DATUM is nonzero, look for one whose datum is DATUM. */
2514 find_reg_note (const_rtx insn
, enum reg_note kind
, const_rtx datum
)
2518 gcc_checking_assert (insn
);
2520 /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN. */
2521 if (! INSN_P (insn
))
2525 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
2526 if (REG_NOTE_KIND (link
) == kind
)
2531 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
2532 if (REG_NOTE_KIND (link
) == kind
&& datum
== XEXP (link
, 0))
2537 /* Return the reg-note of kind KIND in insn INSN which applies to register
2538 number REGNO, if any. Return 0 if there is no such reg-note. Note that
2539 the REGNO of this NOTE need not be REGNO if REGNO is a hard register;
2540 it might be the case that the note overlaps REGNO. */
2543 find_regno_note (const_rtx insn
, enum reg_note kind
, unsigned int regno
)
2547 /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN. */
2548 if (! INSN_P (insn
))
2551 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
2552 if (REG_NOTE_KIND (link
) == kind
2553 /* Verify that it is a register, so that scratch and MEM won't cause a
2555 && REG_P (XEXP (link
, 0))
2556 && REGNO (XEXP (link
, 0)) <= regno
2557 && END_REGNO (XEXP (link
, 0)) > regno
)
2562 /* Return a REG_EQUIV or REG_EQUAL note if insn has only a single set and
2566 find_reg_equal_equiv_note (const_rtx insn
)
2573 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
2574 if (REG_NOTE_KIND (link
) == REG_EQUAL
2575 || REG_NOTE_KIND (link
) == REG_EQUIV
)
2577 /* FIXME: We should never have REG_EQUAL/REG_EQUIV notes on
2578 insns that have multiple sets. Checking single_set to
2579 make sure of this is not the proper check, as explained
2580 in the comment in set_unique_reg_note.
2582 This should be changed into an assert. */
2583 if (GET_CODE (PATTERN (insn
)) == PARALLEL
&& multiple_sets (insn
))
2590 /* Check whether INSN is a single_set whose source is known to be
2591 equivalent to a constant. Return that constant if so, otherwise
2595 find_constant_src (const rtx_insn
*insn
)
2599 set
= single_set (insn
);
2602 x
= avoid_constant_pool_reference (SET_SRC (set
));
2607 note
= find_reg_equal_equiv_note (insn
);
2608 if (note
&& CONSTANT_P (XEXP (note
, 0)))
2609 return XEXP (note
, 0);
2614 /* Return true if DATUM, or any overlap of DATUM, of kind CODE is found
2615 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
2618 find_reg_fusage (const_rtx insn
, enum rtx_code code
, const_rtx datum
)
2620 /* If it's not a CALL_INSN, it can't possibly have a
2621 CALL_INSN_FUNCTION_USAGE field, so don't bother checking. */
2631 for (link
= CALL_INSN_FUNCTION_USAGE (insn
);
2633 link
= XEXP (link
, 1))
2634 if (GET_CODE (XEXP (link
, 0)) == code
2635 && rtx_equal_p (datum
, XEXP (XEXP (link
, 0), 0)))
2640 unsigned int regno
= REGNO (datum
);
2642 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
2643 to pseudo registers, so don't bother checking. */
2645 if (regno
< FIRST_PSEUDO_REGISTER
)
2647 unsigned int end_regno
= END_REGNO (datum
);
2650 for (i
= regno
; i
< end_regno
; i
++)
2651 if (find_regno_fusage (insn
, code
, i
))
2659 /* Return true if REGNO, or any overlap of REGNO, of kind CODE is found
2660 in the CALL_INSN_FUNCTION_USAGE information of INSN. */
2663 find_regno_fusage (const_rtx insn
, enum rtx_code code
, unsigned int regno
)
2667 /* CALL_INSN_FUNCTION_USAGE information cannot contain references
2668 to pseudo registers, so don't bother checking. */
2670 if (regno
>= FIRST_PSEUDO_REGISTER
2674 for (link
= CALL_INSN_FUNCTION_USAGE (insn
); link
; link
= XEXP (link
, 1))
2678 if (GET_CODE (op
= XEXP (link
, 0)) == code
2679 && REG_P (reg
= XEXP (op
, 0))
2680 && REGNO (reg
) <= regno
2681 && END_REGNO (reg
) > regno
)
2689 /* Return true if KIND is an integer REG_NOTE. */
2692 int_reg_note_p (enum reg_note kind
)
2694 return kind
== REG_BR_PROB
;
2697 /* Allocate a register note with kind KIND and datum DATUM. LIST is
2698 stored as the pointer to the next register note. */
2701 alloc_reg_note (enum reg_note kind
, rtx datum
, rtx list
)
2705 gcc_checking_assert (!int_reg_note_p (kind
));
2708 case REG_LABEL_TARGET
:
2709 case REG_LABEL_OPERAND
:
2711 /* These types of register notes use an INSN_LIST rather than an
2712 EXPR_LIST, so that copying is done right and dumps look
2714 note
= alloc_INSN_LIST (datum
, list
);
2715 PUT_REG_NOTE_KIND (note
, kind
);
2719 note
= alloc_EXPR_LIST (kind
, datum
, list
);
2726 /* Add register note with kind KIND and datum DATUM to INSN. */
2729 add_reg_note (rtx insn
, enum reg_note kind
, rtx datum
)
2731 REG_NOTES (insn
) = alloc_reg_note (kind
, datum
, REG_NOTES (insn
));
2734 /* Add an integer register note with kind KIND and datum DATUM to INSN. */
2737 add_int_reg_note (rtx_insn
*insn
, enum reg_note kind
, int datum
)
2739 gcc_checking_assert (int_reg_note_p (kind
));
2740 REG_NOTES (insn
) = gen_rtx_INT_LIST ((machine_mode
) kind
,
2741 datum
, REG_NOTES (insn
));
2744 /* Add a REG_ARGS_SIZE note to INSN with value VALUE. */
2747 add_args_size_note (rtx_insn
*insn
, poly_int64 value
)
2749 gcc_checking_assert (!find_reg_note (insn
, REG_ARGS_SIZE
, NULL_RTX
));
2750 add_reg_note (insn
, REG_ARGS_SIZE
, gen_int_mode (value
, Pmode
));
2753 /* Add a register note like NOTE to INSN. */
2756 add_shallow_copy_of_reg_note (rtx_insn
*insn
, rtx note
)
2758 if (GET_CODE (note
) == INT_LIST
)
2759 add_int_reg_note (insn
, REG_NOTE_KIND (note
), XINT (note
, 0));
2761 add_reg_note (insn
, REG_NOTE_KIND (note
), XEXP (note
, 0));
2764 /* Duplicate NOTE and return the copy. */
2766 duplicate_reg_note (rtx note
)
2768 reg_note kind
= REG_NOTE_KIND (note
);
2770 if (GET_CODE (note
) == INT_LIST
)
2771 return gen_rtx_INT_LIST ((machine_mode
) kind
, XINT (note
, 0), NULL_RTX
);
2772 else if (GET_CODE (note
) == EXPR_LIST
)
2773 return alloc_reg_note (kind
, copy_insn_1 (XEXP (note
, 0)), NULL_RTX
);
2775 return alloc_reg_note (kind
, XEXP (note
, 0), NULL_RTX
);
2778 /* Remove register note NOTE from the REG_NOTES of INSN. */
2781 remove_note (rtx_insn
*insn
, const_rtx note
)
2785 if (note
== NULL_RTX
)
2788 if (REG_NOTES (insn
) == note
)
2789 REG_NOTES (insn
) = XEXP (note
, 1);
2791 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
2792 if (XEXP (link
, 1) == note
)
2794 XEXP (link
, 1) = XEXP (note
, 1);
2798 switch (REG_NOTE_KIND (note
))
2802 df_notes_rescan (insn
);
2809 /* Remove REG_EQUAL and/or REG_EQUIV notes if INSN has such notes.
2810 If NO_RESCAN is false and any notes were removed, call
2811 df_notes_rescan. Return true if any note has been removed. */
2814 remove_reg_equal_equiv_notes (rtx_insn
*insn
, bool no_rescan
)
2819 loc
= ®_NOTES (insn
);
2822 enum reg_note kind
= REG_NOTE_KIND (*loc
);
2823 if (kind
== REG_EQUAL
|| kind
== REG_EQUIV
)
2825 *loc
= XEXP (*loc
, 1);
2829 loc
= &XEXP (*loc
, 1);
2831 if (ret
&& !no_rescan
)
2832 df_notes_rescan (insn
);
2836 /* Remove all REG_EQUAL and REG_EQUIV notes referring to REGNO. */
2839 remove_reg_equal_equiv_notes_for_regno (unsigned int regno
)
2846 /* This loop is a little tricky. We cannot just go down the chain because
2847 it is being modified by some actions in the loop. So we just iterate
2848 over the head. We plan to drain the list anyway. */
2849 while ((eq_use
= DF_REG_EQ_USE_CHAIN (regno
)) != NULL
)
2851 rtx_insn
*insn
= DF_REF_INSN (eq_use
);
2852 rtx note
= find_reg_equal_equiv_note (insn
);
2854 /* This assert is generally triggered when someone deletes a REG_EQUAL
2855 or REG_EQUIV note by hacking the list manually rather than calling
2859 remove_note (insn
, note
);
2863 /* Search LISTP (an EXPR_LIST) for an entry whose first operand is NODE and
2864 return 1 if it is found. A simple equality test is used to determine if
2868 in_insn_list_p (const rtx_insn_list
*listp
, const rtx_insn
*node
)
2872 for (x
= listp
; x
; x
= XEXP (x
, 1))
2873 if (node
== XEXP (x
, 0))
2879 /* Search LISTP (an INSN_LIST) for an entry whose first operand is NODE and
2880 remove that entry from the list if it is found.
2882 A simple equality test is used to determine if NODE matches. */
2885 remove_node_from_insn_list (const rtx_insn
*node
, rtx_insn_list
**listp
)
2887 rtx_insn_list
*temp
= *listp
;
2888 rtx_insn_list
*prev
= NULL
;
2892 if (node
== temp
->insn ())
2894 /* Splice the node out of the list. */
2896 XEXP (prev
, 1) = temp
->next ();
2898 *listp
= temp
->next ();
2900 gcc_checking_assert (!in_insn_list_p (temp
->next (), node
));
2905 temp
= temp
->next ();
2909 /* Return true if X contains any volatile instructions. These are instructions
2910 which may cause unpredictable machine state instructions, and thus no
2911 instructions or register uses should be moved or combined across them.
2912 This includes only volatile asms and UNSPEC_VOLATILE instructions. */
2915 volatile_insn_p (const_rtx x
)
2917 const RTX_CODE code
= GET_CODE (x
);
2934 case UNSPEC_VOLATILE
:
2939 if (MEM_VOLATILE_P (x
))
2946 /* Recursively scan the operands of this expression. */
2949 const char *const fmt
= GET_RTX_FORMAT (code
);
2952 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
2956 if (volatile_insn_p (XEXP (x
, i
)))
2959 else if (fmt
[i
] == 'E')
2962 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
2963 if (volatile_insn_p (XVECEXP (x
, i
, j
)))
2971 /* Return true if X contains any volatile memory references
2972 UNSPEC_VOLATILE operations or volatile ASM_OPERANDS expressions. */
2975 volatile_refs_p (const_rtx x
)
2977 const RTX_CODE code
= GET_CODE (x
);
2992 case UNSPEC_VOLATILE
:
2998 if (MEM_VOLATILE_P (x
))
3005 /* Recursively scan the operands of this expression. */
3008 const char *const fmt
= GET_RTX_FORMAT (code
);
3011 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
3015 if (volatile_refs_p (XEXP (x
, i
)))
3018 else if (fmt
[i
] == 'E')
3021 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
3022 if (volatile_refs_p (XVECEXP (x
, i
, j
)))
3030 /* Similar to above, except that it also rejects register pre- and post-
3034 side_effects_p (const_rtx x
)
3036 const RTX_CODE code
= GET_CODE (x
);
3052 /* Reject CLOBBER with a non-VOID mode. These are made by combine.cc
3053 when some combination can't be done. If we see one, don't think
3054 that we can simplify the expression. */
3055 return (GET_MODE (x
) != VOIDmode
);
3064 case UNSPEC_VOLATILE
:
3070 if (MEM_VOLATILE_P (x
))
3077 /* Recursively scan the operands of this expression. */
3080 const char *fmt
= GET_RTX_FORMAT (code
);
3083 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
3087 if (side_effects_p (XEXP (x
, i
)))
3090 else if (fmt
[i
] == 'E')
3093 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
3094 if (side_effects_p (XVECEXP (x
, i
, j
)))
3102 /* Return true if evaluating rtx X might cause a trap.
3103 FLAGS controls how to consider MEMs. A true means the context
3104 of the access may have changed from the original, such that the
3105 address may have become invalid. */
3108 may_trap_p_1 (const_rtx x
, unsigned flags
)
3114 /* We make no distinction currently, but this function is part of
3115 the internal target-hooks ABI so we keep the parameter as
3116 "unsigned flags". */
3117 bool code_changed
= flags
!= 0;
3121 code
= GET_CODE (x
);
3124 /* Handle these cases quickly. */
3135 return targetm
.unspec_may_trap_p (x
, flags
);
3137 case UNSPEC_VOLATILE
:
3143 return MEM_VOLATILE_P (x
);
3145 /* Memory ref can trap unless it's a static var or a stack slot. */
3147 /* Recognize specific pattern of stack checking probes. */
3148 if (flag_stack_check
3149 && MEM_VOLATILE_P (x
)
3150 && XEXP (x
, 0) == stack_pointer_rtx
)
3152 if (/* MEM_NOTRAP_P only relates to the actual position of the memory
3153 reference; moving it out of context such as when moving code
3154 when optimizing, might cause its address to become invalid. */
3156 || !MEM_NOTRAP_P (x
))
3158 poly_int64 size
= MEM_SIZE_KNOWN_P (x
) ? MEM_SIZE (x
) : -1;
3159 return rtx_addr_can_trap_p_1 (XEXP (x
, 0), 0, size
,
3160 GET_MODE (x
), code_changed
);
3165 /* Division by a non-constant might trap. */
3170 if (HONOR_SNANS (x
))
3172 if (FLOAT_MODE_P (GET_MODE (x
)))
3173 return flag_trapping_math
;
3174 if (!CONSTANT_P (XEXP (x
, 1)) || (XEXP (x
, 1) == const0_rtx
))
3176 if (GET_CODE (XEXP (x
, 1)) == CONST_VECTOR
)
3178 /* For CONST_VECTOR, return 1 if any element is or might be zero. */
3179 unsigned int n_elts
;
3180 rtx op
= XEXP (x
, 1);
3181 if (!GET_MODE_NUNITS (GET_MODE (op
)).is_constant (&n_elts
))
3183 if (!CONST_VECTOR_DUPLICATE_P (op
))
3185 for (unsigned i
= 0; i
< (unsigned int) XVECLEN (op
, 0); i
++)
3186 if (CONST_VECTOR_ENCODED_ELT (op
, i
) == const0_rtx
)
3190 for (unsigned i
= 0; i
< n_elts
; i
++)
3191 if (CONST_VECTOR_ELT (op
, i
) == const0_rtx
)
3197 /* An EXPR_LIST is used to represent a function call. This
3198 certainly may trap. */
3207 /* Treat min/max similar as comparisons. */
3210 /* Some floating point comparisons may trap. */
3211 if (!flag_trapping_math
)
3213 /* ??? There is no machine independent way to check for tests that trap
3214 when COMPARE is used, though many targets do make this distinction.
3215 For instance, sparc uses CCFPE for compares which generate exceptions
3216 and CCFP for compares which do not generate exceptions. */
3219 /* But often the compare has some CC mode, so check operand
3221 if (HONOR_NANS (XEXP (x
, 0))
3222 || HONOR_NANS (XEXP (x
, 1)))
3228 if (HONOR_SNANS (x
))
3230 /* Often comparison is CC mode, so check operand modes. */
3231 if (HONOR_SNANS (XEXP (x
, 0))
3232 || HONOR_SNANS (XEXP (x
, 1)))
3238 /* Conversion of floating point might trap. */
3239 if (flag_trapping_math
&& HONOR_NANS (XEXP (x
, 0)))
3250 /* These operations don't trap even with floating point. */
3254 /* Any floating arithmetic may trap. */
3255 if (FLOAT_MODE_P (GET_MODE (x
)) && flag_trapping_math
)
3259 fmt
= GET_RTX_FORMAT (code
);
3260 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
3264 if (may_trap_p_1 (XEXP (x
, i
), flags
))
3267 else if (fmt
[i
] == 'E')
3270 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
3271 if (may_trap_p_1 (XVECEXP (x
, i
, j
), flags
))
3278 /* Return true if evaluating rtx X might cause a trap. */
3281 may_trap_p (const_rtx x
)
3283 return may_trap_p_1 (x
, 0);
3286 /* Same as above, but additionally return true if evaluating rtx X might
3287 cause a fault. We define a fault for the purpose of this function as a
3288 erroneous execution condition that cannot be encountered during the normal
3289 execution of a valid program; the typical example is an unaligned memory
3290 access on a strict alignment machine. The compiler guarantees that it
3291 doesn't generate code that will fault from a valid program, but this
3292 guarantee doesn't mean anything for individual instructions. Consider
3293 the following example:
3295 struct S { int d; union { char *cp; int *ip; }; };
3297 int foo(struct S *s)
3305 on a strict alignment machine. In a valid program, foo will never be
3306 invoked on a structure for which d is equal to 1 and the underlying
3307 unique field of the union not aligned on a 4-byte boundary, but the
3308 expression *s->ip might cause a fault if considered individually.
3310 At the RTL level, potentially problematic expressions will almost always
3311 verify may_trap_p; for example, the above dereference can be emitted as
3312 (mem:SI (reg:P)) and this expression is may_trap_p for a generic register.
3313 However, suppose that foo is inlined in a caller that causes s->cp to
3314 point to a local character variable and guarantees that s->d is not set
3315 to 1; foo may have been effectively translated into pseudo-RTL as:
3318 (set (reg:SI) (mem:SI (%fp - 7)))
3320 (set (reg:QI) (mem:QI (%fp - 7)))
3322 Now (mem:SI (%fp - 7)) is considered as not may_trap_p since it is a
3323 memory reference to a stack slot, but it will certainly cause a fault
3324 on a strict alignment machine. */
3327 may_trap_or_fault_p (const_rtx x
)
3329 return may_trap_p_1 (x
, 1);
3332 /* Replace any occurrence of FROM in X with TO. The function does
3333 not enter into CONST_DOUBLE for the replace.
3335 Note that copying is not done so X must not be shared unless all copies
3338 ALL_REGS is true if we want to replace all REGs equal to FROM, not just
3339 those pointer-equal ones. */
3342 replace_rtx (rtx x
, rtx from
, rtx to
, bool all_regs
)
3350 /* Allow this function to make replacements in EXPR_LISTs. */
3357 && REGNO (x
) == REGNO (from
))
3359 gcc_assert (GET_MODE (x
) == GET_MODE (from
));
3362 else if (GET_CODE (x
) == SUBREG
)
3364 rtx new_rtx
= replace_rtx (SUBREG_REG (x
), from
, to
, all_regs
);
3366 if (CONST_SCALAR_INT_P (new_rtx
))
3368 x
= simplify_subreg (GET_MODE (x
), new_rtx
,
3369 GET_MODE (SUBREG_REG (x
)),
3374 SUBREG_REG (x
) = new_rtx
;
3378 else if (GET_CODE (x
) == ZERO_EXTEND
)
3380 rtx new_rtx
= replace_rtx (XEXP (x
, 0), from
, to
, all_regs
);
3382 if (CONST_SCALAR_INT_P (new_rtx
))
3384 x
= simplify_unary_operation (ZERO_EXTEND
, GET_MODE (x
),
3385 new_rtx
, GET_MODE (XEXP (x
, 0)));
3389 XEXP (x
, 0) = new_rtx
;
3394 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
3395 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
3398 XEXP (x
, i
) = replace_rtx (XEXP (x
, i
), from
, to
, all_regs
);
3399 else if (fmt
[i
] == 'E')
3400 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
3401 XVECEXP (x
, i
, j
) = replace_rtx (XVECEXP (x
, i
, j
),
3402 from
, to
, all_regs
);
3408 /* Replace occurrences of the OLD_LABEL in *LOC with NEW_LABEL. Also track
3409 the change in LABEL_NUSES if UPDATE_LABEL_NUSES. */
3412 replace_label (rtx
*loc
, rtx old_label
, rtx new_label
, bool update_label_nuses
)
3414 /* Handle jump tables specially, since ADDR_{DIFF_,}VECs can be long. */
3416 if (JUMP_TABLE_DATA_P (x
))
3419 rtvec vec
= XVEC (x
, GET_CODE (x
) == ADDR_DIFF_VEC
);
3420 int len
= GET_NUM_ELEM (vec
);
3421 for (int i
= 0; i
< len
; ++i
)
3423 rtx ref
= RTVEC_ELT (vec
, i
);
3424 if (XEXP (ref
, 0) == old_label
)
3426 XEXP (ref
, 0) = new_label
;
3427 if (update_label_nuses
)
3429 ++LABEL_NUSES (new_label
);
3430 --LABEL_NUSES (old_label
);
3437 /* If this is a JUMP_INSN, then we also need to fix the JUMP_LABEL
3438 field. This is not handled by the iterator because it doesn't
3439 handle unprinted ('0') fields. */
3440 if (JUMP_P (x
) && JUMP_LABEL (x
) == old_label
)
3441 JUMP_LABEL (x
) = new_label
;
3443 subrtx_ptr_iterator::array_type array
;
3444 FOR_EACH_SUBRTX_PTR (iter
, array
, loc
, ALL
)
3449 if (GET_CODE (x
) == SYMBOL_REF
3450 && CONSTANT_POOL_ADDRESS_P (x
))
3452 rtx c
= get_pool_constant (x
);
3453 if (rtx_referenced_p (old_label
, c
))
3455 /* Create a copy of constant C; replace the label inside
3456 but do not update LABEL_NUSES because uses in constant pool
3458 rtx new_c
= copy_rtx (c
);
3459 replace_label (&new_c
, old_label
, new_label
, false);
3461 /* Add the new constant NEW_C to constant pool and replace
3462 the old reference to constant by new reference. */
3463 rtx new_mem
= force_const_mem (get_pool_mode (x
), new_c
);
3464 *loc
= replace_rtx (x
, x
, XEXP (new_mem
, 0));
3468 if ((GET_CODE (x
) == LABEL_REF
3469 || GET_CODE (x
) == INSN_LIST
)
3470 && XEXP (x
, 0) == old_label
)
3472 XEXP (x
, 0) = new_label
;
3473 if (update_label_nuses
)
3475 ++LABEL_NUSES (new_label
);
3476 --LABEL_NUSES (old_label
);
3484 replace_label_in_insn (rtx_insn
*insn
, rtx_insn
*old_label
,
3485 rtx_insn
*new_label
, bool update_label_nuses
)
3487 rtx insn_as_rtx
= insn
;
3488 replace_label (&insn_as_rtx
, old_label
, new_label
, update_label_nuses
);
3489 gcc_checking_assert (insn_as_rtx
== insn
);
3492 /* Return true if X is referenced in BODY. */
3495 rtx_referenced_p (const_rtx x
, const_rtx body
)
3497 subrtx_iterator::array_type array
;
3498 FOR_EACH_SUBRTX (iter
, array
, body
, ALL
)
3499 if (const_rtx y
= *iter
)
3501 /* Check if a label_ref Y refers to label X. */
3502 if (GET_CODE (y
) == LABEL_REF
3504 && label_ref_label (y
) == x
)
3507 if (rtx_equal_p (x
, y
))
3510 /* If Y is a reference to pool constant traverse the constant. */
3511 if (GET_CODE (y
) == SYMBOL_REF
3512 && CONSTANT_POOL_ADDRESS_P (y
))
3513 iter
.substitute (get_pool_constant (y
));
3518 /* If INSN is a tablejump return true and store the label (before jump table) to
3519 *LABELP and the jump table to *TABLEP. LABELP and TABLEP may be NULL. */
3522 tablejump_p (const rtx_insn
*insn
, rtx_insn
**labelp
,
3523 rtx_jump_table_data
**tablep
)
3528 rtx target
= JUMP_LABEL (insn
);
3529 if (target
== NULL_RTX
|| ANY_RETURN_P (target
))
3532 rtx_insn
*label
= as_a
<rtx_insn
*> (target
);
3533 rtx_insn
*table
= next_insn (label
);
3534 if (table
== NULL_RTX
|| !JUMP_TABLE_DATA_P (table
))
3540 *tablep
= as_a
<rtx_jump_table_data
*> (table
);
3544 /* For INSN known to satisfy tablejump_p, determine if it actually is a
3545 CASESI. Return the insn pattern if so, NULL_RTX otherwise. */
3548 tablejump_casesi_pattern (const rtx_insn
*insn
)
3552 if ((tmp
= single_set (insn
)) != NULL
3553 && SET_DEST (tmp
) == pc_rtx
3554 && GET_CODE (SET_SRC (tmp
)) == IF_THEN_ELSE
3555 && GET_CODE (XEXP (SET_SRC (tmp
), 2)) == LABEL_REF
)
3561 /* A subroutine of computed_jump_p, return true if X contains a REG or MEM or
3562 constant that is not in the constant pool and not in the condition
3563 of an IF_THEN_ELSE. */
3566 computed_jump_p_1 (const_rtx x
)
3568 const enum rtx_code code
= GET_CODE (x
);
3585 return ! (GET_CODE (XEXP (x
, 0)) == SYMBOL_REF
3586 && CONSTANT_POOL_ADDRESS_P (XEXP (x
, 0)));
3589 return (computed_jump_p_1 (XEXP (x
, 1))
3590 || computed_jump_p_1 (XEXP (x
, 2)));
3596 fmt
= GET_RTX_FORMAT (code
);
3597 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
3600 && computed_jump_p_1 (XEXP (x
, i
)))
3603 else if (fmt
[i
] == 'E')
3604 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
3605 if (computed_jump_p_1 (XVECEXP (x
, i
, j
)))
3612 /* Return true if INSN is an indirect jump (aka computed jump).
3614 Tablejumps and casesi insns are not considered indirect jumps;
3615 we can recognize them by a (use (label_ref)). */
3618 computed_jump_p (const rtx_insn
*insn
)
3623 rtx pat
= PATTERN (insn
);
3625 /* If we have a JUMP_LABEL set, we're not a computed jump. */
3626 if (JUMP_LABEL (insn
) != NULL
)
3629 if (GET_CODE (pat
) == PARALLEL
)
3631 int len
= XVECLEN (pat
, 0);
3632 bool has_use_labelref
= false;
3634 for (i
= len
- 1; i
>= 0; i
--)
3635 if (GET_CODE (XVECEXP (pat
, 0, i
)) == USE
3636 && (GET_CODE (XEXP (XVECEXP (pat
, 0, i
), 0))
3639 has_use_labelref
= true;
3643 if (! has_use_labelref
)
3644 for (i
= len
- 1; i
>= 0; i
--)
3645 if (GET_CODE (XVECEXP (pat
, 0, i
)) == SET
3646 && SET_DEST (XVECEXP (pat
, 0, i
)) == pc_rtx
3647 && computed_jump_p_1 (SET_SRC (XVECEXP (pat
, 0, i
))))
3650 else if (GET_CODE (pat
) == SET
3651 && SET_DEST (pat
) == pc_rtx
3652 && computed_jump_p_1 (SET_SRC (pat
)))
3660 /* MEM has a PRE/POST-INC/DEC/MODIFY address X. Extract the operands of
3661 the equivalent add insn and pass the result to FN, using DATA as the
3665 for_each_inc_dec_find_inc_dec (rtx mem
, for_each_inc_dec_fn fn
, void *data
)
3667 rtx x
= XEXP (mem
, 0);
3668 switch (GET_CODE (x
))
3673 poly_int64 size
= GET_MODE_SIZE (GET_MODE (mem
));
3674 rtx r1
= XEXP (x
, 0);
3675 rtx c
= gen_int_mode (size
, GET_MODE (r1
));
3676 return fn (mem
, x
, r1
, r1
, c
, data
);
3682 poly_int64 size
= GET_MODE_SIZE (GET_MODE (mem
));
3683 rtx r1
= XEXP (x
, 0);
3684 rtx c
= gen_int_mode (-size
, GET_MODE (r1
));
3685 return fn (mem
, x
, r1
, r1
, c
, data
);
3691 rtx r1
= XEXP (x
, 0);
3692 rtx add
= XEXP (x
, 1);
3693 return fn (mem
, x
, r1
, add
, NULL
, data
);
3701 /* Traverse *LOC looking for MEMs that have autoinc addresses.
3702 For each such autoinc operation found, call FN, passing it
3703 the innermost enclosing MEM, the operation itself, the RTX modified
3704 by the operation, two RTXs (the second may be NULL) that, once
3705 added, represent the value to be held by the modified RTX
3706 afterwards, and DATA. FN is to return 0 to continue the
3707 traversal or any other value to have it returned to the caller of
3708 for_each_inc_dec. */
3711 for_each_inc_dec (rtx x
,
3712 for_each_inc_dec_fn fn
,
3715 subrtx_var_iterator::array_type array
;
3716 FOR_EACH_SUBRTX_VAR (iter
, array
, x
, NONCONST
)
3721 && GET_RTX_CLASS (GET_CODE (XEXP (mem
, 0))) == RTX_AUTOINC
)
3723 int res
= for_each_inc_dec_find_inc_dec (mem
, fn
, data
);
3726 iter
.skip_subrtxes ();
3733 /* Searches X for any reference to REGNO, returning the rtx of the
3734 reference found if any. Otherwise, returns NULL_RTX. */
3737 regno_use_in (unsigned int regno
, rtx x
)
3743 if (REG_P (x
) && REGNO (x
) == regno
)
3746 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
3747 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
3751 if ((tem
= regno_use_in (regno
, XEXP (x
, i
))))
3754 else if (fmt
[i
] == 'E')
3755 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
3756 if ((tem
= regno_use_in (regno
, XVECEXP (x
, i
, j
))))
3763 /* Return a value indicating whether OP, an operand of a commutative
3764 operation, is preferred as the first or second operand. The more
3765 positive the value, the stronger the preference for being the first
3769 commutative_operand_precedence (rtx op
)
3771 enum rtx_code code
= GET_CODE (op
);
3773 /* Constants always become the second operand. Prefer "nice" constants. */
3774 if (code
== CONST_INT
)
3776 if (code
== CONST_WIDE_INT
)
3778 if (code
== CONST_POLY_INT
)
3780 if (code
== CONST_DOUBLE
)
3782 if (code
== CONST_FIXED
)
3784 op
= avoid_constant_pool_reference (op
);
3785 code
= GET_CODE (op
);
3787 switch (GET_RTX_CLASS (code
))
3790 if (code
== CONST_INT
)
3792 if (code
== CONST_WIDE_INT
)
3794 if (code
== CONST_POLY_INT
)
3796 if (code
== CONST_DOUBLE
)
3798 if (code
== CONST_FIXED
)
3803 /* SUBREGs of objects should come second. */
3804 if (code
== SUBREG
&& OBJECT_P (SUBREG_REG (op
)))
3809 /* Complex expressions should be the first, so decrease priority
3810 of objects. Prefer pointer objects over non pointer objects. */
3811 if ((REG_P (op
) && REG_POINTER (op
))
3812 || (MEM_P (op
) && MEM_POINTER (op
)))
3816 case RTX_COMM_ARITH
:
3817 /* Prefer operands that are themselves commutative to be first.
3818 This helps to make things linear. In particular,
3819 (and (and (reg) (reg)) (not (reg))) is canonical. */
3823 /* If only one operand is a binary expression, it will be the first
3824 operand. In particular, (plus (minus (reg) (reg)) (neg (reg)))
3825 is canonical, although it will usually be further simplified. */
3829 /* Then prefer NEG and NOT. */
3830 if (code
== NEG
|| code
== NOT
)
3839 /* Return true iff it is necessary to swap operands of commutative operation
3840 in order to canonicalize expression. */
3843 swap_commutative_operands_p (rtx x
, rtx y
)
3845 return (commutative_operand_precedence (x
)
3846 < commutative_operand_precedence (y
));
3849 /* Return true if X is an autoincrement side effect and the register is
3850 not the stack pointer. */
3852 auto_inc_p (const_rtx x
)
3854 switch (GET_CODE (x
))
3862 /* There are no REG_INC notes for SP. */
3863 if (XEXP (x
, 0) != stack_pointer_rtx
)
3871 /* Return true if IN contains a piece of rtl that has the address LOC. */
3873 loc_mentioned_in_p (rtx
*loc
, const_rtx in
)
3882 code
= GET_CODE (in
);
3883 fmt
= GET_RTX_FORMAT (code
);
3884 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
3888 if (loc
== &XEXP (in
, i
) || loc_mentioned_in_p (loc
, XEXP (in
, i
)))
3891 else if (fmt
[i
] == 'E')
3892 for (j
= XVECLEN (in
, i
) - 1; j
>= 0; j
--)
3893 if (loc
== &XVECEXP (in
, i
, j
)
3894 || loc_mentioned_in_p (loc
, XVECEXP (in
, i
, j
)))
3900 /* Reinterpret a subreg as a bit extraction from an integer and return
3901 the position of the least significant bit of the extracted value.
3902 In other words, if the extraction were performed as a shift right
3903 and mask, return the number of bits to shift right.
3905 The outer value of the subreg has OUTER_BYTES bytes and starts at
3906 byte offset SUBREG_BYTE within an inner value of INNER_BYTES bytes. */
3909 subreg_size_lsb (poly_uint64 outer_bytes
,
3910 poly_uint64 inner_bytes
,
3911 poly_uint64 subreg_byte
)
3913 poly_uint64 subreg_end
, trailing_bytes
, byte_pos
;
3915 /* A paradoxical subreg begins at bit position 0. */
3916 gcc_checking_assert (ordered_p (outer_bytes
, inner_bytes
));
3917 if (maybe_gt (outer_bytes
, inner_bytes
))
3919 gcc_checking_assert (known_eq (subreg_byte
, 0U));
3923 subreg_end
= subreg_byte
+ outer_bytes
;
3924 trailing_bytes
= inner_bytes
- subreg_end
;
3925 if (WORDS_BIG_ENDIAN
&& BYTES_BIG_ENDIAN
)
3926 byte_pos
= trailing_bytes
;
3927 else if (!WORDS_BIG_ENDIAN
&& !BYTES_BIG_ENDIAN
)
3928 byte_pos
= subreg_byte
;
3931 /* When bytes and words have opposite endianness, we must be able
3932 to split offsets into words and bytes at compile time. */
3933 poly_uint64 leading_word_part
3934 = force_align_down (subreg_byte
, UNITS_PER_WORD
);
3935 poly_uint64 trailing_word_part
3936 = force_align_down (trailing_bytes
, UNITS_PER_WORD
);
3937 /* If the subreg crosses a word boundary ensure that
3938 it also begins and ends on a word boundary. */
3939 gcc_assert (known_le (subreg_end
- leading_word_part
,
3940 (unsigned int) UNITS_PER_WORD
)
3941 || (known_eq (leading_word_part
, subreg_byte
)
3942 && known_eq (trailing_word_part
, trailing_bytes
)));
3943 if (WORDS_BIG_ENDIAN
)
3944 byte_pos
= trailing_word_part
+ (subreg_byte
- leading_word_part
);
3946 byte_pos
= leading_word_part
+ (trailing_bytes
- trailing_word_part
);
3949 return byte_pos
* BITS_PER_UNIT
;
3952 /* Given a subreg X, return the bit offset where the subreg begins
3953 (counting from the least significant bit of the reg). */
3956 subreg_lsb (const_rtx x
)
3958 return subreg_lsb_1 (GET_MODE (x
), GET_MODE (SUBREG_REG (x
)),
3962 /* Return the subreg byte offset for a subreg whose outer value has
3963 OUTER_BYTES bytes, whose inner value has INNER_BYTES bytes, and where
3964 there are LSB_SHIFT *bits* between the lsb of the outer value and the
3965 lsb of the inner value. This is the inverse of the calculation
3966 performed by subreg_lsb_1 (which converts byte offsets to bit shifts). */
3969 subreg_size_offset_from_lsb (poly_uint64 outer_bytes
, poly_uint64 inner_bytes
,
3970 poly_uint64 lsb_shift
)
3972 /* A paradoxical subreg begins at bit position 0. */
3973 gcc_checking_assert (ordered_p (outer_bytes
, inner_bytes
));
3974 if (maybe_gt (outer_bytes
, inner_bytes
))
3976 gcc_checking_assert (known_eq (lsb_shift
, 0U));
3980 poly_uint64 lower_bytes
= exact_div (lsb_shift
, BITS_PER_UNIT
);
3981 poly_uint64 upper_bytes
= inner_bytes
- (lower_bytes
+ outer_bytes
);
3982 if (WORDS_BIG_ENDIAN
&& BYTES_BIG_ENDIAN
)
3984 else if (!WORDS_BIG_ENDIAN
&& !BYTES_BIG_ENDIAN
)
3988 /* When bytes and words have opposite endianness, we must be able
3989 to split offsets into words and bytes at compile time. */
3990 poly_uint64 lower_word_part
= force_align_down (lower_bytes
,
3992 poly_uint64 upper_word_part
= force_align_down (upper_bytes
,
3994 if (WORDS_BIG_ENDIAN
)
3995 return upper_word_part
+ (lower_bytes
- lower_word_part
);
3997 return lower_word_part
+ (upper_bytes
- upper_word_part
);
4001 /* Fill in information about a subreg of a hard register.
4002 xregno - A regno of an inner hard subreg_reg (or what will become one).
4003 xmode - The mode of xregno.
4004 offset - The byte offset.
4005 ymode - The mode of a top level SUBREG (or what may become one).
4006 info - Pointer to structure to fill in.
4008 Rather than considering one particular inner register (and thus one
4009 particular "outer" register) in isolation, this function really uses
4010 XREGNO as a model for a sequence of isomorphic hard registers. Thus the
4011 function does not check whether adding INFO->offset to XREGNO gives
4012 a valid hard register; even if INFO->offset + XREGNO is out of range,
4013 there might be another register of the same type that is in range.
4014 Likewise it doesn't check whether targetm.hard_regno_mode_ok accepts
4015 the new register, since that can depend on things like whether the final
4016 register number is even or odd. Callers that want to check whether
4017 this particular subreg can be replaced by a simple (reg ...) should
4018 use simplify_subreg_regno. */
4021 subreg_get_info (unsigned int xregno
, machine_mode xmode
,
4022 poly_uint64 offset
, machine_mode ymode
,
4023 struct subreg_info
*info
)
4025 unsigned int nregs_xmode
, nregs_ymode
;
4027 gcc_assert (xregno
< FIRST_PSEUDO_REGISTER
);
4029 poly_uint64 xsize
= GET_MODE_SIZE (xmode
);
4030 poly_uint64 ysize
= GET_MODE_SIZE (ymode
);
4032 bool rknown
= false;
4034 /* If the register representation of a non-scalar mode has holes in it,
4035 we expect the scalar units to be concatenated together, with the holes
4036 distributed evenly among the scalar units. Each scalar unit must occupy
4037 at least one register. */
4038 if (HARD_REGNO_NREGS_HAS_PADDING (xregno
, xmode
))
4040 /* As a consequence, we must be dealing with a constant number of
4041 scalars, and thus a constant offset and number of units. */
4042 HOST_WIDE_INT coffset
= offset
.to_constant ();
4043 HOST_WIDE_INT cysize
= ysize
.to_constant ();
4044 nregs_xmode
= HARD_REGNO_NREGS_WITH_PADDING (xregno
, xmode
);
4045 unsigned int nunits
= GET_MODE_NUNITS (xmode
).to_constant ();
4046 scalar_mode xmode_unit
= GET_MODE_INNER (xmode
);
4047 gcc_assert (HARD_REGNO_NREGS_HAS_PADDING (xregno
, xmode_unit
));
4048 gcc_assert (nregs_xmode
4050 * HARD_REGNO_NREGS_WITH_PADDING (xregno
, xmode_unit
)));
4051 gcc_assert (hard_regno_nregs (xregno
, xmode
)
4052 == hard_regno_nregs (xregno
, xmode_unit
) * nunits
);
4054 /* You can only ask for a SUBREG of a value with holes in the middle
4055 if you don't cross the holes. (Such a SUBREG should be done by
4056 picking a different register class, or doing it in memory if
4057 necessary.) An example of a value with holes is XCmode on 32-bit
4058 x86 with -m128bit-long-double; it's represented in 6 32-bit registers,
4059 3 for each part, but in memory it's two 128-bit parts.
4060 Padding is assumed to be at the end (not necessarily the 'high part')
4062 if ((coffset
/ GET_MODE_SIZE (xmode_unit
) + 1 < nunits
)
4063 && (coffset
/ GET_MODE_SIZE (xmode_unit
)
4064 != ((coffset
+ cysize
- 1) / GET_MODE_SIZE (xmode_unit
))))
4066 info
->representable_p
= false;
4071 nregs_xmode
= hard_regno_nregs (xregno
, xmode
);
4073 nregs_ymode
= hard_regno_nregs (xregno
, ymode
);
4075 /* Subreg sizes must be ordered, so that we can tell whether they are
4076 partial, paradoxical or complete. */
4077 gcc_checking_assert (ordered_p (xsize
, ysize
));
4079 /* Paradoxical subregs are otherwise valid. */
4080 if (!rknown
&& known_eq (offset
, 0U) && maybe_gt (ysize
, xsize
))
4082 info
->representable_p
= true;
4083 /* If this is a big endian paradoxical subreg, which uses more
4084 actual hard registers than the original register, we must
4085 return a negative offset so that we find the proper highpart
4088 We assume that the ordering of registers within a multi-register
4089 value has a consistent endianness: if bytes and register words
4090 have different endianness, the hard registers that make up a
4091 multi-register value must be at least word-sized. */
4092 if (REG_WORDS_BIG_ENDIAN
)
4093 info
->offset
= (int) nregs_xmode
- (int) nregs_ymode
;
4096 info
->nregs
= nregs_ymode
;
4100 /* If registers store different numbers of bits in the different
4101 modes, we cannot generally form this subreg. */
4102 poly_uint64 regsize_xmode
, regsize_ymode
;
4103 if (!HARD_REGNO_NREGS_HAS_PADDING (xregno
, xmode
)
4104 && !HARD_REGNO_NREGS_HAS_PADDING (xregno
, ymode
)
4105 && multiple_p (xsize
, nregs_xmode
, ®size_xmode
)
4106 && multiple_p (ysize
, nregs_ymode
, ®size_ymode
))
4109 && ((nregs_ymode
> 1 && maybe_gt (regsize_xmode
, regsize_ymode
))
4110 || (nregs_xmode
> 1 && maybe_gt (regsize_ymode
, regsize_xmode
))))
4112 info
->representable_p
= false;
4113 if (!can_div_away_from_zero_p (ysize
, regsize_xmode
, &info
->nregs
)
4114 || !can_div_trunc_p (offset
, regsize_xmode
, &info
->offset
))
4115 /* Checked by validate_subreg. We must know at compile time
4116 which inner registers are being accessed. */
4120 /* It's not valid to extract a subreg of mode YMODE at OFFSET that
4121 would go outside of XMODE. */
4122 if (!rknown
&& maybe_gt (ysize
+ offset
, xsize
))
4124 info
->representable_p
= false;
4125 info
->nregs
= nregs_ymode
;
4126 if (!can_div_trunc_p (offset
, regsize_xmode
, &info
->offset
))
4127 /* Checked by validate_subreg. We must know at compile time
4128 which inner registers are being accessed. */
4132 /* Quick exit for the simple and common case of extracting whole
4133 subregisters from a multiregister value. */
4134 /* ??? It would be better to integrate this into the code below,
4135 if we can generalize the concept enough and figure out how
4136 odd-sized modes can coexist with the other weird cases we support. */
4137 HOST_WIDE_INT count
;
4139 && WORDS_BIG_ENDIAN
== REG_WORDS_BIG_ENDIAN
4140 && known_eq (regsize_xmode
, regsize_ymode
)
4141 && constant_multiple_p (offset
, regsize_ymode
, &count
))
4143 info
->representable_p
= true;
4144 info
->nregs
= nregs_ymode
;
4145 info
->offset
= count
;
4146 gcc_assert (info
->offset
+ info
->nregs
<= (int) nregs_xmode
);
4151 /* Lowpart subregs are otherwise valid. */
4152 if (!rknown
&& known_eq (offset
, subreg_lowpart_offset (ymode
, xmode
)))
4154 info
->representable_p
= true;
4157 if (known_eq (offset
, 0U) || nregs_xmode
== nregs_ymode
)
4160 info
->nregs
= nregs_ymode
;
4165 /* Set NUM_BLOCKS to the number of independently-representable YMODE
4166 values there are in (reg:XMODE XREGNO). We can view the register
4167 as consisting of this number of independent "blocks", where each
4168 block occupies NREGS_YMODE registers and contains exactly one
4169 representable YMODE value. */
4170 gcc_assert ((nregs_xmode
% nregs_ymode
) == 0);
4171 unsigned int num_blocks
= nregs_xmode
/ nregs_ymode
;
4173 /* Calculate the number of bytes in each block. This must always
4174 be exact, otherwise we don't know how to verify the constraint.
4175 These conditions may be relaxed but subreg_regno_offset would
4176 need to be redesigned. */
4177 poly_uint64 bytes_per_block
= exact_div (xsize
, num_blocks
);
4179 /* Get the number of the first block that contains the subreg and the byte
4180 offset of the subreg from the start of that block. */
4181 unsigned int block_number
;
4182 poly_uint64 subblock_offset
;
4183 if (!can_div_trunc_p (offset
, bytes_per_block
, &block_number
,
4185 /* Checked by validate_subreg. We must know at compile time which
4186 inner registers are being accessed. */
4191 /* Only the lowpart of each block is representable. */
4192 info
->representable_p
4193 = known_eq (subblock_offset
,
4194 subreg_size_lowpart_offset (ysize
, bytes_per_block
));
4198 /* We assume that the ordering of registers within a multi-register
4199 value has a consistent endianness: if bytes and register words
4200 have different endianness, the hard registers that make up a
4201 multi-register value must be at least word-sized. */
4202 if (WORDS_BIG_ENDIAN
!= REG_WORDS_BIG_ENDIAN
)
4203 /* The block number we calculated above followed memory endianness.
4204 Convert it to register endianness by counting back from the end.
4205 (Note that, because of the assumption above, each block must be
4206 at least word-sized.) */
4207 info
->offset
= (num_blocks
- block_number
- 1) * nregs_ymode
;
4209 info
->offset
= block_number
* nregs_ymode
;
4210 info
->nregs
= nregs_ymode
;
4213 /* This function returns the regno offset of a subreg expression.
4214 xregno - A regno of an inner hard subreg_reg (or what will become one).
4215 xmode - The mode of xregno.
4216 offset - The byte offset.
4217 ymode - The mode of a top level SUBREG (or what may become one).
4218 RETURN - The regno offset which would be used. */
4220 subreg_regno_offset (unsigned int xregno
, machine_mode xmode
,
4221 poly_uint64 offset
, machine_mode ymode
)
4223 struct subreg_info info
;
4224 subreg_get_info (xregno
, xmode
, offset
, ymode
, &info
);
4228 /* This function returns true when the offset is representable via
4229 subreg_offset in the given regno.
4230 xregno - A regno of an inner hard subreg_reg (or what will become one).
4231 xmode - The mode of xregno.
4232 offset - The byte offset.
4233 ymode - The mode of a top level SUBREG (or what may become one).
4234 RETURN - Whether the offset is representable. */
4236 subreg_offset_representable_p (unsigned int xregno
, machine_mode xmode
,
4237 poly_uint64 offset
, machine_mode ymode
)
4239 struct subreg_info info
;
4240 subreg_get_info (xregno
, xmode
, offset
, ymode
, &info
);
4241 return info
.representable_p
;
4244 /* Return the number of a YMODE register to which
4246 (subreg:YMODE (reg:XMODE XREGNO) OFFSET)
4248 can be simplified. Return -1 if the subreg can't be simplified.
4250 XREGNO is a hard register number. */
4253 simplify_subreg_regno (unsigned int xregno
, machine_mode xmode
,
4254 poly_uint64 offset
, machine_mode ymode
)
4256 struct subreg_info info
;
4257 unsigned int yregno
;
4259 /* Give the backend a chance to disallow the mode change. */
4260 if (GET_MODE_CLASS (xmode
) != MODE_COMPLEX_INT
4261 && GET_MODE_CLASS (xmode
) != MODE_COMPLEX_FLOAT
4262 && !REG_CAN_CHANGE_MODE_P (xregno
, xmode
, ymode
))
4265 /* We shouldn't simplify stack-related registers. */
4266 if ((!reload_completed
|| frame_pointer_needed
)
4267 && xregno
== FRAME_POINTER_REGNUM
)
4270 if (FRAME_POINTER_REGNUM
!= ARG_POINTER_REGNUM
4271 && xregno
== ARG_POINTER_REGNUM
)
4274 if (xregno
== STACK_POINTER_REGNUM
4275 /* We should convert hard stack register in LRA if it is
4277 && ! lra_in_progress
)
4280 /* Try to get the register offset. */
4281 subreg_get_info (xregno
, xmode
, offset
, ymode
, &info
);
4282 if (!info
.representable_p
)
4285 /* Make sure that the offsetted register value is in range. */
4286 yregno
= xregno
+ info
.offset
;
4287 if (!HARD_REGISTER_NUM_P (yregno
))
4290 /* See whether (reg:YMODE YREGNO) is valid.
4292 ??? We allow invalid registers if (reg:XMODE XREGNO) is also invalid.
4293 This is a kludge to work around how complex FP arguments are passed
4294 on IA-64 and should be fixed. See PR target/49226. */
4295 if (!targetm
.hard_regno_mode_ok (yregno
, ymode
)
4296 && targetm
.hard_regno_mode_ok (xregno
, xmode
))
4299 return (int) yregno
;
4302 /* A wrapper around simplify_subreg_regno that uses subreg_lowpart_offset
4303 (xmode, ymode) as the offset. */
4306 lowpart_subreg_regno (unsigned int regno
, machine_mode xmode
,
4309 poly_uint64 offset
= subreg_lowpart_offset (xmode
, ymode
);
4310 return simplify_subreg_regno (regno
, xmode
, offset
, ymode
);
4313 /* Return the final regno that a subreg expression refers to. */
4315 subreg_regno (const_rtx x
)
4318 rtx subreg
= SUBREG_REG (x
);
4319 int regno
= REGNO (subreg
);
4321 ret
= regno
+ subreg_regno_offset (regno
,
4329 /* Return the number of registers that a subreg expression refers
4332 subreg_nregs (const_rtx x
)
4334 return subreg_nregs_with_regno (REGNO (SUBREG_REG (x
)), x
);
4337 /* Return the number of registers that a subreg REG with REGNO
4338 expression refers to. This is a copy of the rtlanal.cc:subreg_nregs
4339 changed so that the regno can be passed in. */
4342 subreg_nregs_with_regno (unsigned int regno
, const_rtx x
)
4344 struct subreg_info info
;
4345 rtx subreg
= SUBREG_REG (x
);
4347 subreg_get_info (regno
, GET_MODE (subreg
), SUBREG_BYTE (x
), GET_MODE (x
),
4352 struct parms_set_data
4358 /* Helper function for noticing stores to parameter registers. */
4360 parms_set (rtx x
, const_rtx pat ATTRIBUTE_UNUSED
, void *data
)
4362 struct parms_set_data
*const d
= (struct parms_set_data
*) data
;
4363 if (REG_P (x
) && REGNO (x
) < FIRST_PSEUDO_REGISTER
4364 && TEST_HARD_REG_BIT (d
->regs
, REGNO (x
)))
4366 CLEAR_HARD_REG_BIT (d
->regs
, REGNO (x
));
4371 /* Look backward for first parameter to be loaded.
4372 Note that loads of all parameters will not necessarily be
4373 found if CSE has eliminated some of them (e.g., an argument
4374 to the outer function is passed down as a parameter).
4375 Do not skip BOUNDARY. */
4377 find_first_parameter_load (rtx_insn
*call_insn
, rtx_insn
*boundary
)
4379 struct parms_set_data parm
;
4381 rtx_insn
*before
, *first_set
;
4383 /* Since different machines initialize their parameter registers
4384 in different orders, assume nothing. Collect the set of all
4385 parameter registers. */
4386 CLEAR_HARD_REG_SET (parm
.regs
);
4388 for (p
= CALL_INSN_FUNCTION_USAGE (call_insn
); p
; p
= XEXP (p
, 1))
4389 if (GET_CODE (XEXP (p
, 0)) == USE
4390 && REG_P (XEXP (XEXP (p
, 0), 0))
4391 && !STATIC_CHAIN_REG_P (XEXP (XEXP (p
, 0), 0)))
4393 gcc_assert (REGNO (XEXP (XEXP (p
, 0), 0)) < FIRST_PSEUDO_REGISTER
);
4395 /* We only care about registers which can hold function
4397 if (!FUNCTION_ARG_REGNO_P (REGNO (XEXP (XEXP (p
, 0), 0))))
4400 SET_HARD_REG_BIT (parm
.regs
, REGNO (XEXP (XEXP (p
, 0), 0)));
4404 first_set
= call_insn
;
4406 /* Search backward for the first set of a register in this set. */
4407 while (parm
.nregs
&& before
!= boundary
)
4409 before
= PREV_INSN (before
);
4411 /* It is possible that some loads got CSEed from one call to
4412 another. Stop in that case. */
4413 if (CALL_P (before
))
4416 /* Our caller needs either ensure that we will find all sets
4417 (in case code has not been optimized yet), or take care
4418 for possible labels in a way by setting boundary to preceding
4420 if (LABEL_P (before
))
4422 gcc_assert (before
== boundary
);
4426 if (INSN_P (before
))
4428 int nregs_old
= parm
.nregs
;
4429 note_stores (before
, parms_set
, &parm
);
4430 /* If we found something that did not set a parameter reg,
4431 we're done. Do not keep going, as that might result
4432 in hoisting an insn before the setting of a pseudo
4433 that is used by the hoisted insn. */
4434 if (nregs_old
!= parm
.nregs
)
4443 /* Return true if we should avoid inserting code between INSN and preceding
4444 call instruction. */
4447 keep_with_call_p (const rtx_insn
*insn
)
4451 if (INSN_P (insn
) && (set
= single_set (insn
)) != NULL
)
4453 if (REG_P (SET_DEST (set
))
4454 && REGNO (SET_DEST (set
)) < FIRST_PSEUDO_REGISTER
4455 && fixed_regs
[REGNO (SET_DEST (set
))]
4456 && general_operand (SET_SRC (set
), VOIDmode
))
4458 if (REG_P (SET_SRC (set
))
4459 && targetm
.calls
.function_value_regno_p (REGNO (SET_SRC (set
)))
4460 && REG_P (SET_DEST (set
))
4461 && REGNO (SET_DEST (set
)) >= FIRST_PSEUDO_REGISTER
)
4463 /* There may be a stack pop just after the call and before the store
4464 of the return register. Search for the actual store when deciding
4465 if we can break or not. */
4466 if (SET_DEST (set
) == stack_pointer_rtx
)
4468 /* This CONST_CAST is okay because next_nonnote_insn just
4469 returns its argument and we assign it to a const_rtx
4472 = next_nonnote_insn (const_cast<rtx_insn
*> (insn
));
4473 if (i2
&& keep_with_call_p (i2
))
4480 /* Return true if LABEL is a target of JUMP_INSN. This applies only
4481 to non-complex jumps. That is, direct unconditional, conditional,
4482 and tablejumps, but not computed jumps or returns. It also does
4483 not apply to the fallthru case of a conditional jump. */
4486 label_is_jump_target_p (const_rtx label
, const rtx_insn
*jump_insn
)
4488 rtx tmp
= JUMP_LABEL (jump_insn
);
4489 rtx_jump_table_data
*table
;
4494 if (tablejump_p (jump_insn
, NULL
, &table
))
4496 rtvec vec
= table
->get_labels ();
4497 int i
, veclen
= GET_NUM_ELEM (vec
);
4499 for (i
= 0; i
< veclen
; ++i
)
4500 if (XEXP (RTVEC_ELT (vec
, i
), 0) == label
)
4504 if (find_reg_note (jump_insn
, REG_LABEL_TARGET
, label
))
4511 /* Return an estimate of the cost of computing rtx X.
4512 One use is in cse, to decide which expression to keep in the hash table.
4513 Another is in rtl generation, to pick the cheapest way to multiply.
4514 Other uses like the latter are expected in the future.
4516 X appears as operand OPNO in an expression with code OUTER_CODE.
4517 SPEED specifies whether costs optimized for speed or size should
4521 rtx_cost (rtx x
, machine_mode mode
, enum rtx_code outer_code
,
4522 int opno
, bool speed
)
4534 if (GET_CODE (x
) == SET
)
4535 /* A SET doesn't have a mode, so let's look at the SET_DEST to get
4536 the mode for the factor. */
4537 mode
= GET_MODE (SET_DEST (x
));
4538 else if (GET_MODE (x
) != VOIDmode
)
4539 mode
= GET_MODE (x
);
4541 mode_size
= estimated_poly_value (GET_MODE_SIZE (mode
));
4543 /* A size N times larger than UNITS_PER_WORD likely needs N times as
4544 many insns, taking N times as long. */
4545 factor
= mode_size
> UNITS_PER_WORD
? mode_size
/ UNITS_PER_WORD
: 1;
4547 /* Compute the default costs of certain things.
4548 Note that targetm.rtx_costs can override the defaults. */
4550 code
= GET_CODE (x
);
4559 /* Multiplication has time-complexity O(N*N), where N is the
4560 number of units (translated from digits) when using
4561 schoolbook long multiplication. */
4562 total
= factor
* factor
* COSTS_N_INSNS (5);
4570 /* Similarly, complexity for schoolbook long division. */
4571 total
= factor
* factor
* COSTS_N_INSNS (7);
4574 /* Used in combine.cc as a marker. */
4578 total
= factor
* COSTS_N_INSNS (1);
4588 /* If we can't tie these modes, make this expensive. The larger
4589 the mode, the more expensive it is. */
4590 if (!targetm
.modes_tieable_p (mode
, GET_MODE (SUBREG_REG (x
))))
4591 return COSTS_N_INSNS (2 + factor
);
4595 if (targetm
.modes_tieable_p (mode
, GET_MODE (XEXP (x
, 0))))
4602 if (targetm
.rtx_costs (x
, mode
, outer_code
, opno
, &total
, speed
))
4607 /* Sum the costs of the sub-rtx's, plus cost of this operation,
4608 which is already in total. */
4610 fmt
= GET_RTX_FORMAT (code
);
4611 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
4613 total
+= rtx_cost (XEXP (x
, i
), mode
, code
, i
, speed
);
4614 else if (fmt
[i
] == 'E')
4615 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
4616 total
+= rtx_cost (XVECEXP (x
, i
, j
), mode
, code
, i
, speed
);
4621 /* Fill in the structure C with information about both speed and size rtx
4622 costs for X, which is operand OPNO in an expression with code OUTER. */
4625 get_full_rtx_cost (rtx x
, machine_mode mode
, enum rtx_code outer
, int opno
,
4626 struct full_rtx_costs
*c
)
4628 c
->speed
= rtx_cost (x
, mode
, outer
, opno
, true);
4629 c
->size
= rtx_cost (x
, mode
, outer
, opno
, false);
4633 /* Return cost of address expression X.
4634 Expect that X is properly formed address reference.
4636 SPEED parameter specify whether costs optimized for speed or size should
4640 address_cost (rtx x
, machine_mode mode
, addr_space_t as
, bool speed
)
4642 /* We may be asked for cost of various unusual addresses, such as operands
4643 of push instruction. It is not worthwhile to complicate writing
4644 of the target hook by such cases. */
4646 if (!memory_address_addr_space_p (mode
, x
, as
))
4649 return targetm
.address_cost (x
, mode
, as
, speed
);
4652 /* If the target doesn't override, compute the cost as with arithmetic. */
4655 default_address_cost (rtx x
, machine_mode
, addr_space_t
, bool speed
)
4657 return rtx_cost (x
, Pmode
, MEM
, 0, speed
);
4661 unsigned HOST_WIDE_INT
4662 nonzero_bits (const_rtx x
, machine_mode mode
)
4664 if (mode
== VOIDmode
)
4665 mode
= GET_MODE (x
);
4666 scalar_int_mode int_mode
;
4667 if (!is_a
<scalar_int_mode
> (mode
, &int_mode
))
4668 return GET_MODE_MASK (mode
);
4669 return cached_nonzero_bits (x
, int_mode
, NULL_RTX
, VOIDmode
, 0);
4673 num_sign_bit_copies (const_rtx x
, machine_mode mode
)
4675 if (mode
== VOIDmode
)
4676 mode
= GET_MODE (x
);
4677 scalar_int_mode int_mode
;
4678 if (!is_a
<scalar_int_mode
> (mode
, &int_mode
))
4680 return cached_num_sign_bit_copies (x
, int_mode
, NULL_RTX
, VOIDmode
, 0);
4683 /* Return true if nonzero_bits1 might recurse into both operands
4687 nonzero_bits_binary_arith_p (const_rtx x
)
4689 if (!ARITHMETIC_P (x
))
4691 switch (GET_CODE (x
))
4713 /* The function cached_nonzero_bits is a wrapper around nonzero_bits1.
4714 It avoids exponential behavior in nonzero_bits1 when X has
4715 identical subexpressions on the first or the second level. */
4717 static unsigned HOST_WIDE_INT
4718 cached_nonzero_bits (const_rtx x
, scalar_int_mode mode
, const_rtx known_x
,
4719 machine_mode known_mode
,
4720 unsigned HOST_WIDE_INT known_ret
)
4722 if (x
== known_x
&& mode
== known_mode
)
4725 /* Try to find identical subexpressions. If found call
4726 nonzero_bits1 on X with the subexpressions as KNOWN_X and the
4727 precomputed value for the subexpression as KNOWN_RET. */
4729 if (nonzero_bits_binary_arith_p (x
))
4731 rtx x0
= XEXP (x
, 0);
4732 rtx x1
= XEXP (x
, 1);
4734 /* Check the first level. */
4736 return nonzero_bits1 (x
, mode
, x0
, mode
,
4737 cached_nonzero_bits (x0
, mode
, known_x
,
4738 known_mode
, known_ret
));
4740 /* Check the second level. */
4741 if (nonzero_bits_binary_arith_p (x0
)
4742 && (x1
== XEXP (x0
, 0) || x1
== XEXP (x0
, 1)))
4743 return nonzero_bits1 (x
, mode
, x1
, mode
,
4744 cached_nonzero_bits (x1
, mode
, known_x
,
4745 known_mode
, known_ret
));
4747 if (nonzero_bits_binary_arith_p (x1
)
4748 && (x0
== XEXP (x1
, 0) || x0
== XEXP (x1
, 1)))
4749 return nonzero_bits1 (x
, mode
, x0
, mode
,
4750 cached_nonzero_bits (x0
, mode
, known_x
,
4751 known_mode
, known_ret
));
4754 return nonzero_bits1 (x
, mode
, known_x
, known_mode
, known_ret
);
4757 /* We let num_sign_bit_copies recur into nonzero_bits as that is useful.
4758 We don't let nonzero_bits recur into num_sign_bit_copies, because that
4759 is less useful. We can't allow both, because that results in exponential
4760 run time recursion. There is a nullstone testcase that triggered
4761 this. This macro avoids accidental uses of num_sign_bit_copies. */
4762 #define cached_num_sign_bit_copies sorry_i_am_preventing_exponential_behavior
4764 /* Given an expression, X, compute which bits in X can be nonzero.
4765 We don't care about bits outside of those defined in MODE.
4767 For most X this is simply GET_MODE_MASK (GET_MODE (X)), but if X is
4768 an arithmetic operation, we can do better. */
4770 static unsigned HOST_WIDE_INT
4771 nonzero_bits1 (const_rtx x
, scalar_int_mode mode
, const_rtx known_x
,
4772 machine_mode known_mode
,
4773 unsigned HOST_WIDE_INT known_ret
)
4775 unsigned HOST_WIDE_INT nonzero
= GET_MODE_MASK (mode
);
4776 unsigned HOST_WIDE_INT inner_nz
;
4777 enum rtx_code code
= GET_CODE (x
);
4778 machine_mode inner_mode
;
4779 unsigned int inner_width
;
4780 scalar_int_mode xmode
;
4782 unsigned int mode_width
= GET_MODE_PRECISION (mode
);
4784 if (CONST_INT_P (x
))
4786 if (SHORT_IMMEDIATES_SIGN_EXTEND
4788 && mode_width
< BITS_PER_WORD
4789 && (UINTVAL (x
) & (HOST_WIDE_INT_1U
<< (mode_width
- 1))) != 0)
4790 return UINTVAL (x
) | (HOST_WIDE_INT_M1U
<< mode_width
);
4795 if (!is_a
<scalar_int_mode
> (GET_MODE (x
), &xmode
))
4797 unsigned int xmode_width
= GET_MODE_PRECISION (xmode
);
4799 /* If X is wider than MODE, use its mode instead. */
4800 if (xmode_width
> mode_width
)
4803 nonzero
= GET_MODE_MASK (mode
);
4804 mode_width
= xmode_width
;
4807 if (mode_width
> HOST_BITS_PER_WIDE_INT
)
4808 /* Our only callers in this case look for single bit values. So
4809 just return the mode mask. Those tests will then be false. */
4812 /* If MODE is wider than X, but both are a single word for both the host
4813 and target machines, we can compute this from which bits of the object
4814 might be nonzero in its own mode, taking into account the fact that, on
4815 CISC machines, accessing an object in a wider mode generally causes the
4816 high-order bits to become undefined, so they are not known to be zero.
4817 We extend this reasoning to RISC machines for operations that might not
4818 operate on the full registers. */
4819 if (mode_width
> xmode_width
4820 && xmode_width
<= BITS_PER_WORD
4821 && xmode_width
<= HOST_BITS_PER_WIDE_INT
4822 && !(WORD_REGISTER_OPERATIONS
&& word_register_operation_p (x
)))
4824 nonzero
&= cached_nonzero_bits (x
, xmode
,
4825 known_x
, known_mode
, known_ret
);
4826 nonzero
|= GET_MODE_MASK (mode
) & ~GET_MODE_MASK (xmode
);
4830 /* Please keep nonzero_bits_binary_arith_p above in sync with
4831 the code in the switch below. */
4835 #if defined(POINTERS_EXTEND_UNSIGNED)
4836 /* If pointers extend unsigned and this is a pointer in Pmode, say that
4837 all the bits above ptr_mode are known to be zero. */
4838 /* As we do not know which address space the pointer is referring to,
4839 we can do this only if the target does not support different pointer
4840 or address modes depending on the address space. */
4841 if (target_default_pointer_address_modes_p ()
4842 && POINTERS_EXTEND_UNSIGNED
4845 && !targetm
.have_ptr_extend ())
4846 nonzero
&= GET_MODE_MASK (ptr_mode
);
4849 /* Include declared information about alignment of pointers. */
4850 /* ??? We don't properly preserve REG_POINTER changes across
4851 pointer-to-integer casts, so we can't trust it except for
4852 things that we know must be pointers. See execute/960116-1.c. */
4853 if ((x
== stack_pointer_rtx
4854 || x
== frame_pointer_rtx
4855 || x
== arg_pointer_rtx
)
4856 && REGNO_POINTER_ALIGN (REGNO (x
)))
4858 unsigned HOST_WIDE_INT alignment
4859 = REGNO_POINTER_ALIGN (REGNO (x
)) / BITS_PER_UNIT
;
4861 #ifdef PUSH_ROUNDING
4862 /* If PUSH_ROUNDING is defined, it is possible for the
4863 stack to be momentarily aligned only to that amount,
4864 so we pick the least alignment. */
4865 if (x
== stack_pointer_rtx
&& targetm
.calls
.push_argument (0))
4867 poly_uint64 rounded_1
= PUSH_ROUNDING (poly_int64 (1));
4868 alignment
= MIN (known_alignment (rounded_1
), alignment
);
4872 nonzero
&= ~(alignment
- 1);
4876 unsigned HOST_WIDE_INT nonzero_for_hook
= nonzero
;
4877 rtx new_rtx
= rtl_hooks
.reg_nonzero_bits (x
, xmode
, mode
,
4881 nonzero_for_hook
&= cached_nonzero_bits (new_rtx
, mode
, known_x
,
4882 known_mode
, known_ret
);
4884 return nonzero_for_hook
;
4888 /* In many, if not most, RISC machines, reading a byte from memory
4889 zeros the rest of the register. Noticing that fact saves a lot
4890 of extra zero-extends. */
4891 if (load_extend_op (xmode
) == ZERO_EXTEND
)
4892 nonzero
&= GET_MODE_MASK (xmode
);
4896 case UNEQ
: case LTGT
:
4897 case GT
: case GTU
: case UNGT
:
4898 case LT
: case LTU
: case UNLT
:
4899 case GE
: case GEU
: case UNGE
:
4900 case LE
: case LEU
: case UNLE
:
4901 case UNORDERED
: case ORDERED
:
4902 /* If this produces an integer result, we know which bits are set.
4903 Code here used to clear bits outside the mode of X, but that is
4905 /* Mind that MODE is the mode the caller wants to look at this
4906 operation in, and not the actual operation mode. We can wind
4907 up with (subreg:DI (gt:V4HI x y)), and we don't have anything
4908 that describes the results of a vector compare. */
4909 if (GET_MODE_CLASS (xmode
) == MODE_INT
4910 && mode_width
<= HOST_BITS_PER_WIDE_INT
)
4911 nonzero
= STORE_FLAG_VALUE
;
4916 /* Disabled to avoid exponential mutual recursion between nonzero_bits
4917 and num_sign_bit_copies. */
4918 if (num_sign_bit_copies (XEXP (x
, 0), xmode
) == xmode_width
)
4922 if (xmode_width
< mode_width
)
4923 nonzero
|= (GET_MODE_MASK (mode
) & ~GET_MODE_MASK (xmode
));
4928 /* Disabled to avoid exponential mutual recursion between nonzero_bits
4929 and num_sign_bit_copies. */
4930 if (num_sign_bit_copies (XEXP (x
, 0), xmode
) == xmode_width
)
4936 nonzero
&= (cached_nonzero_bits (XEXP (x
, 0), mode
,
4937 known_x
, known_mode
, known_ret
)
4938 & GET_MODE_MASK (mode
));
4942 nonzero
&= cached_nonzero_bits (XEXP (x
, 0), mode
,
4943 known_x
, known_mode
, known_ret
);
4944 if (GET_MODE (XEXP (x
, 0)) != VOIDmode
)
4945 nonzero
&= GET_MODE_MASK (GET_MODE (XEXP (x
, 0)));
4949 /* If the sign bit is known clear, this is the same as ZERO_EXTEND.
4950 Otherwise, show all the bits in the outer mode but not the inner
4952 inner_nz
= cached_nonzero_bits (XEXP (x
, 0), mode
,
4953 known_x
, known_mode
, known_ret
);
4954 if (GET_MODE (XEXP (x
, 0)) != VOIDmode
)
4956 inner_nz
&= GET_MODE_MASK (GET_MODE (XEXP (x
, 0)));
4957 if (val_signbit_known_set_p (GET_MODE (XEXP (x
, 0)), inner_nz
))
4958 inner_nz
|= (GET_MODE_MASK (mode
)
4959 & ~GET_MODE_MASK (GET_MODE (XEXP (x
, 0))));
4962 nonzero
&= inner_nz
;
4966 nonzero
&= cached_nonzero_bits (XEXP (x
, 0), mode
,
4967 known_x
, known_mode
, known_ret
)
4968 & cached_nonzero_bits (XEXP (x
, 1), mode
,
4969 known_x
, known_mode
, known_ret
);
4973 case UMIN
: case UMAX
: case SMIN
: case SMAX
:
4975 unsigned HOST_WIDE_INT nonzero0
4976 = cached_nonzero_bits (XEXP (x
, 0), mode
,
4977 known_x
, known_mode
, known_ret
);
4979 /* Don't call nonzero_bits for the second time if it cannot change
4981 if ((nonzero
& nonzero0
) != nonzero
)
4983 | cached_nonzero_bits (XEXP (x
, 1), mode
,
4984 known_x
, known_mode
, known_ret
);
4988 case PLUS
: case MINUS
:
4990 case DIV
: case UDIV
:
4991 case MOD
: case UMOD
:
4992 /* We can apply the rules of arithmetic to compute the number of
4993 high- and low-order zero bits of these operations. We start by
4994 computing the width (position of the highest-order nonzero bit)
4995 and the number of low-order zero bits for each value. */
4997 unsigned HOST_WIDE_INT nz0
4998 = cached_nonzero_bits (XEXP (x
, 0), mode
,
4999 known_x
, known_mode
, known_ret
);
5000 unsigned HOST_WIDE_INT nz1
5001 = cached_nonzero_bits (XEXP (x
, 1), mode
,
5002 known_x
, known_mode
, known_ret
);
5003 int sign_index
= xmode_width
- 1;
5004 int width0
= floor_log2 (nz0
) + 1;
5005 int width1
= floor_log2 (nz1
) + 1;
5006 int low0
= ctz_or_zero (nz0
);
5007 int low1
= ctz_or_zero (nz1
);
5008 unsigned HOST_WIDE_INT op0_maybe_minusp
5009 = nz0
& (HOST_WIDE_INT_1U
<< sign_index
);
5010 unsigned HOST_WIDE_INT op1_maybe_minusp
5011 = nz1
& (HOST_WIDE_INT_1U
<< sign_index
);
5012 unsigned int result_width
= mode_width
;
5018 result_width
= MAX (width0
, width1
) + 1;
5019 result_low
= MIN (low0
, low1
);
5022 result_low
= MIN (low0
, low1
);
5025 result_width
= width0
+ width1
;
5026 result_low
= low0
+ low1
;
5031 if (!op0_maybe_minusp
&& !op1_maybe_minusp
)
5032 result_width
= width0
;
5037 result_width
= width0
;
5042 if (!op0_maybe_minusp
&& !op1_maybe_minusp
)
5043 result_width
= MIN (width0
, width1
);
5044 result_low
= MIN (low0
, low1
);
5049 result_width
= MIN (width0
, width1
);
5050 result_low
= MIN (low0
, low1
);
5056 /* Note that mode_width <= HOST_BITS_PER_WIDE_INT, see above. */
5057 if (result_width
< mode_width
)
5058 nonzero
&= (HOST_WIDE_INT_1U
<< result_width
) - 1;
5062 if (result_low
< HOST_BITS_PER_WIDE_INT
)
5063 nonzero
&= ~((HOST_WIDE_INT_1U
<< result_low
) - 1);
5071 if (CONST_INT_P (XEXP (x
, 1))
5072 && INTVAL (XEXP (x
, 1)) < HOST_BITS_PER_WIDE_INT
)
5073 nonzero
&= (HOST_WIDE_INT_1U
<< INTVAL (XEXP (x
, 1))) - 1;
5077 /* If this is a SUBREG formed for a promoted variable that has
5078 been zero-extended, we know that at least the high-order bits
5079 are zero, though others might be too. */
5080 if (SUBREG_PROMOTED_VAR_P (x
) && SUBREG_PROMOTED_UNSIGNED_P (x
))
5081 nonzero
= GET_MODE_MASK (xmode
)
5082 & cached_nonzero_bits (SUBREG_REG (x
), xmode
,
5083 known_x
, known_mode
, known_ret
);
5085 /* If the inner mode is a single word for both the host and target
5086 machines, we can compute this from which bits of the inner
5087 object might be nonzero. */
5088 inner_mode
= GET_MODE (SUBREG_REG (x
));
5089 if (GET_MODE_PRECISION (inner_mode
).is_constant (&inner_width
)
5090 && inner_width
<= BITS_PER_WORD
5091 && inner_width
<= HOST_BITS_PER_WIDE_INT
)
5093 nonzero
&= cached_nonzero_bits (SUBREG_REG (x
), mode
,
5094 known_x
, known_mode
, known_ret
);
5096 /* On a typical CISC machine, accessing an object in a wider mode
5097 causes the high-order bits to become undefined. So they are
5098 not known to be zero.
5100 On a typical RISC machine, we only have to worry about the way
5101 loads are extended. Otherwise, if we get a reload for the inner
5102 part, it may be loaded from the stack, and then we may lose all
5103 the zero bits that existed before the store to the stack. */
5105 if ((!WORD_REGISTER_OPERATIONS
5106 || ((extend_op
= load_extend_op (inner_mode
)) == SIGN_EXTEND
5107 ? val_signbit_known_set_p (inner_mode
, nonzero
)
5108 : extend_op
!= ZERO_EXTEND
)
5109 || !MEM_P (SUBREG_REG (x
)))
5110 && xmode_width
> inner_width
)
5112 |= (GET_MODE_MASK (GET_MODE (x
)) & ~GET_MODE_MASK (inner_mode
));
5121 /* The nonzero bits are in two classes: any bits within MODE
5122 that aren't in xmode are always significant. The rest of the
5123 nonzero bits are those that are significant in the operand of
5124 the shift when shifted the appropriate number of bits. This
5125 shows that high-order bits are cleared by the right shift and
5126 low-order bits by left shifts. */
5127 if (CONST_INT_P (XEXP (x
, 1))
5128 && INTVAL (XEXP (x
, 1)) >= 0
5129 && INTVAL (XEXP (x
, 1)) < HOST_BITS_PER_WIDE_INT
5130 && INTVAL (XEXP (x
, 1)) < xmode_width
)
5132 int count
= INTVAL (XEXP (x
, 1));
5133 unsigned HOST_WIDE_INT mode_mask
= GET_MODE_MASK (xmode
);
5134 unsigned HOST_WIDE_INT op_nonzero
5135 = cached_nonzero_bits (XEXP (x
, 0), mode
,
5136 known_x
, known_mode
, known_ret
);
5137 unsigned HOST_WIDE_INT inner
= op_nonzero
& mode_mask
;
5138 unsigned HOST_WIDE_INT outer
= 0;
5140 if (mode_width
> xmode_width
)
5141 outer
= (op_nonzero
& nonzero
& ~mode_mask
);
5156 /* If the sign bit may have been nonzero before the shift, we
5157 need to mark all the places it could have been copied to
5158 by the shift as possibly nonzero. */
5159 if (inner
& (HOST_WIDE_INT_1U
<< (xmode_width
- 1 - count
)))
5160 inner
|= (((HOST_WIDE_INT_1U
<< count
) - 1)
5161 << (xmode_width
- count
));
5165 inner
= (inner
<< (count
% xmode_width
)
5166 | (inner
>> (xmode_width
- (count
% xmode_width
))))
5171 inner
= (inner
>> (count
% xmode_width
)
5172 | (inner
<< (xmode_width
- (count
% xmode_width
))))
5180 nonzero
&= (outer
| inner
);
5186 /* This is at most the number of bits in the mode. */
5187 nonzero
= ((unsigned HOST_WIDE_INT
) 2 << (floor_log2 (mode_width
))) - 1;
5191 /* If CLZ has a known value at zero, then the nonzero bits are
5192 that value, plus the number of bits in the mode minus one. */
5193 if (CLZ_DEFINED_VALUE_AT_ZERO (mode
, nonzero
))
5195 |= (HOST_WIDE_INT_1U
<< (floor_log2 (mode_width
))) - 1;
5201 /* If CTZ has a known value at zero, then the nonzero bits are
5202 that value, plus the number of bits in the mode minus one. */
5203 if (CTZ_DEFINED_VALUE_AT_ZERO (mode
, nonzero
))
5205 |= (HOST_WIDE_INT_1U
<< (floor_log2 (mode_width
))) - 1;
5211 /* This is at most the number of bits in the mode minus 1. */
5212 nonzero
= (HOST_WIDE_INT_1U
<< (floor_log2 (mode_width
))) - 1;
5221 unsigned HOST_WIDE_INT nonzero_true
5222 = cached_nonzero_bits (XEXP (x
, 1), mode
,
5223 known_x
, known_mode
, known_ret
);
5225 /* Don't call nonzero_bits for the second time if it cannot change
5227 if ((nonzero
& nonzero_true
) != nonzero
)
5228 nonzero
&= nonzero_true
5229 | cached_nonzero_bits (XEXP (x
, 2), mode
,
5230 known_x
, known_mode
, known_ret
);
5241 /* See the macro definition above. */
5242 #undef cached_num_sign_bit_copies
5245 /* Return true if num_sign_bit_copies1 might recurse into both operands
5249 num_sign_bit_copies_binary_arith_p (const_rtx x
)
5251 if (!ARITHMETIC_P (x
))
5253 switch (GET_CODE (x
))
5271 /* The function cached_num_sign_bit_copies is a wrapper around
5272 num_sign_bit_copies1. It avoids exponential behavior in
5273 num_sign_bit_copies1 when X has identical subexpressions on the
5274 first or the second level. */
5277 cached_num_sign_bit_copies (const_rtx x
, scalar_int_mode mode
,
5278 const_rtx known_x
, machine_mode known_mode
,
5279 unsigned int known_ret
)
5281 if (x
== known_x
&& mode
== known_mode
)
5284 /* Try to find identical subexpressions. If found call
5285 num_sign_bit_copies1 on X with the subexpressions as KNOWN_X and
5286 the precomputed value for the subexpression as KNOWN_RET. */
5288 if (num_sign_bit_copies_binary_arith_p (x
))
5290 rtx x0
= XEXP (x
, 0);
5291 rtx x1
= XEXP (x
, 1);
5293 /* Check the first level. */
5296 num_sign_bit_copies1 (x
, mode
, x0
, mode
,
5297 cached_num_sign_bit_copies (x0
, mode
, known_x
,
5301 /* Check the second level. */
5302 if (num_sign_bit_copies_binary_arith_p (x0
)
5303 && (x1
== XEXP (x0
, 0) || x1
== XEXP (x0
, 1)))
5305 num_sign_bit_copies1 (x
, mode
, x1
, mode
,
5306 cached_num_sign_bit_copies (x1
, mode
, known_x
,
5310 if (num_sign_bit_copies_binary_arith_p (x1
)
5311 && (x0
== XEXP (x1
, 0) || x0
== XEXP (x1
, 1)))
5313 num_sign_bit_copies1 (x
, mode
, x0
, mode
,
5314 cached_num_sign_bit_copies (x0
, mode
, known_x
,
5319 return num_sign_bit_copies1 (x
, mode
, known_x
, known_mode
, known_ret
);
5322 /* Return the number of bits at the high-order end of X that are known to
5323 be equal to the sign bit. X will be used in mode MODE. The returned
5324 value will always be between 1 and the number of bits in MODE. */
5327 num_sign_bit_copies1 (const_rtx x
, scalar_int_mode mode
, const_rtx known_x
,
5328 machine_mode known_mode
,
5329 unsigned int known_ret
)
5331 enum rtx_code code
= GET_CODE (x
);
5332 unsigned int bitwidth
= GET_MODE_PRECISION (mode
);
5333 int num0
, num1
, result
;
5334 unsigned HOST_WIDE_INT nonzero
;
5336 if (CONST_INT_P (x
))
5338 /* If the constant is negative, take its 1's complement and remask.
5339 Then see how many zero bits we have. */
5340 nonzero
= UINTVAL (x
) & GET_MODE_MASK (mode
);
5341 if (bitwidth
<= HOST_BITS_PER_WIDE_INT
5342 && (nonzero
& (HOST_WIDE_INT_1U
<< (bitwidth
- 1))) != 0)
5343 nonzero
= (~nonzero
) & GET_MODE_MASK (mode
);
5345 return (nonzero
== 0 ? bitwidth
: bitwidth
- floor_log2 (nonzero
) - 1);
5348 scalar_int_mode xmode
, inner_mode
;
5349 if (!is_a
<scalar_int_mode
> (GET_MODE (x
), &xmode
))
5352 unsigned int xmode_width
= GET_MODE_PRECISION (xmode
);
5354 /* For a smaller mode, just ignore the high bits. */
5355 if (bitwidth
< xmode_width
)
5357 num0
= cached_num_sign_bit_copies (x
, xmode
,
5358 known_x
, known_mode
, known_ret
);
5359 return MAX (1, num0
- (int) (xmode_width
- bitwidth
));
5362 if (bitwidth
> xmode_width
)
5364 /* If this machine does not do all register operations on the entire
5365 register and MODE is wider than the mode of X, we can say nothing
5366 at all about the high-order bits. We extend this reasoning to RISC
5367 machines for operations that might not operate on full registers. */
5368 if (!(WORD_REGISTER_OPERATIONS
&& word_register_operation_p (x
)))
5371 /* Likewise on machines that do, if the mode of the object is smaller
5372 than a word and loads of that size don't sign extend, we can say
5373 nothing about the high order bits. */
5374 if (xmode_width
< BITS_PER_WORD
5375 && load_extend_op (xmode
) != SIGN_EXTEND
)
5379 /* Please keep num_sign_bit_copies_binary_arith_p above in sync with
5380 the code in the switch below. */
5385 #if defined(POINTERS_EXTEND_UNSIGNED)
5386 /* If pointers extend signed and this is a pointer in Pmode, say that
5387 all the bits above ptr_mode are known to be sign bit copies. */
5388 /* As we do not know which address space the pointer is referring to,
5389 we can do this only if the target does not support different pointer
5390 or address modes depending on the address space. */
5391 if (target_default_pointer_address_modes_p ()
5392 && ! POINTERS_EXTEND_UNSIGNED
&& xmode
== Pmode
5393 && mode
== Pmode
&& REG_POINTER (x
)
5394 && !targetm
.have_ptr_extend ())
5395 return GET_MODE_PRECISION (Pmode
) - GET_MODE_PRECISION (ptr_mode
) + 1;
5399 unsigned int copies_for_hook
= 1, copies
= 1;
5400 rtx new_rtx
= rtl_hooks
.reg_num_sign_bit_copies (x
, xmode
, mode
,
5404 copies
= cached_num_sign_bit_copies (new_rtx
, mode
, known_x
,
5405 known_mode
, known_ret
);
5407 if (copies
> 1 || copies_for_hook
> 1)
5408 return MAX (copies
, copies_for_hook
);
5410 /* Else, use nonzero_bits to guess num_sign_bit_copies (see below). */
5415 /* Some RISC machines sign-extend all loads of smaller than a word. */
5416 if (load_extend_op (xmode
) == SIGN_EXTEND
)
5417 return MAX (1, ((int) bitwidth
- (int) xmode_width
+ 1));
5421 /* If this is a SUBREG for a promoted object that is sign-extended
5422 and we are looking at it in a wider mode, we know that at least the
5423 high-order bits are known to be sign bit copies. */
5425 if (SUBREG_PROMOTED_VAR_P (x
) && SUBREG_PROMOTED_SIGNED_P (x
))
5427 num0
= cached_num_sign_bit_copies (SUBREG_REG (x
), mode
,
5428 known_x
, known_mode
, known_ret
);
5429 return MAX ((int) bitwidth
- (int) xmode_width
+ 1, num0
);
5432 if (is_a
<scalar_int_mode
> (GET_MODE (SUBREG_REG (x
)), &inner_mode
))
5434 /* For a smaller object, just ignore the high bits. */
5435 if (bitwidth
<= GET_MODE_PRECISION (inner_mode
))
5437 num0
= cached_num_sign_bit_copies (SUBREG_REG (x
), inner_mode
,
5438 known_x
, known_mode
,
5440 return MAX (1, num0
- (int) (GET_MODE_PRECISION (inner_mode
)
5444 /* For paradoxical SUBREGs on machines where all register operations
5445 affect the entire register, just look inside. Note that we are
5446 passing MODE to the recursive call, so the number of sign bit
5447 copies will remain relative to that mode, not the inner mode.
5449 This works only if loads sign extend. Otherwise, if we get a
5450 reload for the inner part, it may be loaded from the stack, and
5451 then we lose all sign bit copies that existed before the store
5453 if (WORD_REGISTER_OPERATIONS
5454 && load_extend_op (inner_mode
) == SIGN_EXTEND
5455 && paradoxical_subreg_p (x
)
5456 && MEM_P (SUBREG_REG (x
)))
5457 return cached_num_sign_bit_copies (SUBREG_REG (x
), mode
,
5458 known_x
, known_mode
, known_ret
);
5463 if (CONST_INT_P (XEXP (x
, 1)))
5464 return MAX (1, (int) bitwidth
- INTVAL (XEXP (x
, 1)));
5468 if (is_a
<scalar_int_mode
> (GET_MODE (XEXP (x
, 0)), &inner_mode
))
5469 return (bitwidth
- GET_MODE_PRECISION (inner_mode
)
5470 + cached_num_sign_bit_copies (XEXP (x
, 0), inner_mode
,
5471 known_x
, known_mode
, known_ret
));
5475 /* For a smaller object, just ignore the high bits. */
5476 inner_mode
= as_a
<scalar_int_mode
> (GET_MODE (XEXP (x
, 0)));
5477 num0
= cached_num_sign_bit_copies (XEXP (x
, 0), inner_mode
,
5478 known_x
, known_mode
, known_ret
);
5479 return MAX (1, (num0
- (int) (GET_MODE_PRECISION (inner_mode
)
5483 return cached_num_sign_bit_copies (XEXP (x
, 0), mode
,
5484 known_x
, known_mode
, known_ret
);
5486 case ROTATE
: case ROTATERT
:
5487 /* If we are rotating left by a number of bits less than the number
5488 of sign bit copies, we can just subtract that amount from the
5490 if (CONST_INT_P (XEXP (x
, 1))
5491 && INTVAL (XEXP (x
, 1)) >= 0
5492 && INTVAL (XEXP (x
, 1)) < (int) bitwidth
)
5494 num0
= cached_num_sign_bit_copies (XEXP (x
, 0), mode
,
5495 known_x
, known_mode
, known_ret
);
5496 return MAX (1, num0
- (code
== ROTATE
? INTVAL (XEXP (x
, 1))
5497 : (int) bitwidth
- INTVAL (XEXP (x
, 1))));
5502 /* In general, this subtracts one sign bit copy. But if the value
5503 is known to be positive, the number of sign bit copies is the
5504 same as that of the input. Finally, if the input has just one bit
5505 that might be nonzero, all the bits are copies of the sign bit. */
5506 num0
= cached_num_sign_bit_copies (XEXP (x
, 0), mode
,
5507 known_x
, known_mode
, known_ret
);
5508 if (bitwidth
> HOST_BITS_PER_WIDE_INT
)
5509 return num0
> 1 ? num0
- 1 : 1;
5511 nonzero
= nonzero_bits (XEXP (x
, 0), mode
);
5516 && ((HOST_WIDE_INT_1U
<< (bitwidth
- 1)) & nonzero
))
5521 case IOR
: case AND
: case XOR
:
5522 case SMIN
: case SMAX
: case UMIN
: case UMAX
:
5523 /* Logical operations will preserve the number of sign-bit copies.
5524 MIN and MAX operations always return one of the operands. */
5525 num0
= cached_num_sign_bit_copies (XEXP (x
, 0), mode
,
5526 known_x
, known_mode
, known_ret
);
5527 num1
= cached_num_sign_bit_copies (XEXP (x
, 1), mode
,
5528 known_x
, known_mode
, known_ret
);
5530 /* If num1 is clearing some of the top bits then regardless of
5531 the other term, we are guaranteed to have at least that many
5532 high-order zero bits. */
5535 && bitwidth
<= HOST_BITS_PER_WIDE_INT
5536 && CONST_INT_P (XEXP (x
, 1))
5537 && (UINTVAL (XEXP (x
, 1))
5538 & (HOST_WIDE_INT_1U
<< (bitwidth
- 1))) == 0)
5541 /* Similarly for IOR when setting high-order bits. */
5544 && bitwidth
<= HOST_BITS_PER_WIDE_INT
5545 && CONST_INT_P (XEXP (x
, 1))
5546 && (UINTVAL (XEXP (x
, 1))
5547 & (HOST_WIDE_INT_1U
<< (bitwidth
- 1))) != 0)
5550 return MIN (num0
, num1
);
5552 case PLUS
: case MINUS
:
5553 /* For addition and subtraction, we can have a 1-bit carry. However,
5554 if we are subtracting 1 from a positive number, there will not
5555 be such a carry. Furthermore, if the positive number is known to
5556 be 0 or 1, we know the result is either -1 or 0. */
5558 if (code
== PLUS
&& XEXP (x
, 1) == constm1_rtx
5559 && bitwidth
<= HOST_BITS_PER_WIDE_INT
)
5561 nonzero
= nonzero_bits (XEXP (x
, 0), mode
);
5562 if (((HOST_WIDE_INT_1U
<< (bitwidth
- 1)) & nonzero
) == 0)
5563 return (nonzero
== 1 || nonzero
== 0 ? bitwidth
5564 : bitwidth
- floor_log2 (nonzero
) - 1);
5567 num0
= cached_num_sign_bit_copies (XEXP (x
, 0), mode
,
5568 known_x
, known_mode
, known_ret
);
5569 num1
= cached_num_sign_bit_copies (XEXP (x
, 1), mode
,
5570 known_x
, known_mode
, known_ret
);
5571 result
= MAX (1, MIN (num0
, num1
) - 1);
5576 /* The number of bits of the product is the sum of the number of
5577 bits of both terms. However, unless one of the terms if known
5578 to be positive, we must allow for an additional bit since negating
5579 a negative number can remove one sign bit copy. */
5581 num0
= cached_num_sign_bit_copies (XEXP (x
, 0), mode
,
5582 known_x
, known_mode
, known_ret
);
5583 num1
= cached_num_sign_bit_copies (XEXP (x
, 1), mode
,
5584 known_x
, known_mode
, known_ret
);
5586 result
= bitwidth
- (bitwidth
- num0
) - (bitwidth
- num1
);
5588 && (bitwidth
> HOST_BITS_PER_WIDE_INT
5589 || (((nonzero_bits (XEXP (x
, 0), mode
)
5590 & (HOST_WIDE_INT_1U
<< (bitwidth
- 1))) != 0)
5591 && ((nonzero_bits (XEXP (x
, 1), mode
)
5592 & (HOST_WIDE_INT_1U
<< (bitwidth
- 1)))
5596 return MAX (1, result
);
5599 /* The result must be <= the first operand. If the first operand
5600 has the high bit set, we know nothing about the number of sign
5602 if (bitwidth
> HOST_BITS_PER_WIDE_INT
)
5604 else if ((nonzero_bits (XEXP (x
, 0), mode
)
5605 & (HOST_WIDE_INT_1U
<< (bitwidth
- 1))) != 0)
5608 return cached_num_sign_bit_copies (XEXP (x
, 0), mode
,
5609 known_x
, known_mode
, known_ret
);
5612 /* The result must be <= the second operand. If the second operand
5613 has (or just might have) the high bit set, we know nothing about
5614 the number of sign bit copies. */
5615 if (bitwidth
> HOST_BITS_PER_WIDE_INT
)
5617 else if ((nonzero_bits (XEXP (x
, 1), mode
)
5618 & (HOST_WIDE_INT_1U
<< (bitwidth
- 1))) != 0)
5621 return cached_num_sign_bit_copies (XEXP (x
, 1), mode
,
5622 known_x
, known_mode
, known_ret
);
5625 /* Similar to unsigned division, except that we have to worry about
5626 the case where the divisor is negative, in which case we have
5628 result
= cached_num_sign_bit_copies (XEXP (x
, 0), mode
,
5629 known_x
, known_mode
, known_ret
);
5631 && (bitwidth
> HOST_BITS_PER_WIDE_INT
5632 || (nonzero_bits (XEXP (x
, 1), mode
)
5633 & (HOST_WIDE_INT_1U
<< (bitwidth
- 1))) != 0))
5639 result
= cached_num_sign_bit_copies (XEXP (x
, 1), mode
,
5640 known_x
, known_mode
, known_ret
);
5642 && (bitwidth
> HOST_BITS_PER_WIDE_INT
5643 || (nonzero_bits (XEXP (x
, 1), mode
)
5644 & (HOST_WIDE_INT_1U
<< (bitwidth
- 1))) != 0))
5650 /* Shifts by a constant add to the number of bits equal to the
5652 num0
= cached_num_sign_bit_copies (XEXP (x
, 0), mode
,
5653 known_x
, known_mode
, known_ret
);
5654 if (CONST_INT_P (XEXP (x
, 1))
5655 && INTVAL (XEXP (x
, 1)) > 0
5656 && INTVAL (XEXP (x
, 1)) < xmode_width
)
5657 num0
= MIN ((int) bitwidth
, num0
+ INTVAL (XEXP (x
, 1)));
5662 /* Left shifts destroy copies. */
5663 if (!CONST_INT_P (XEXP (x
, 1))
5664 || INTVAL (XEXP (x
, 1)) < 0
5665 || INTVAL (XEXP (x
, 1)) >= (int) bitwidth
5666 || INTVAL (XEXP (x
, 1)) >= xmode_width
)
5669 num0
= cached_num_sign_bit_copies (XEXP (x
, 0), mode
,
5670 known_x
, known_mode
, known_ret
);
5671 return MAX (1, num0
- INTVAL (XEXP (x
, 1)));
5674 num0
= cached_num_sign_bit_copies (XEXP (x
, 1), mode
,
5675 known_x
, known_mode
, known_ret
);
5676 num1
= cached_num_sign_bit_copies (XEXP (x
, 2), mode
,
5677 known_x
, known_mode
, known_ret
);
5678 return MIN (num0
, num1
);
5680 case EQ
: case NE
: case GE
: case GT
: case LE
: case LT
:
5681 case UNEQ
: case LTGT
: case UNGE
: case UNGT
: case UNLE
: case UNLT
:
5682 case GEU
: case GTU
: case LEU
: case LTU
:
5683 case UNORDERED
: case ORDERED
:
5684 /* If the constant is negative, take its 1's complement and remask.
5685 Then see how many zero bits we have. */
5686 nonzero
= STORE_FLAG_VALUE
;
5687 if (bitwidth
<= HOST_BITS_PER_WIDE_INT
5688 && (nonzero
& (HOST_WIDE_INT_1U
<< (bitwidth
- 1))) != 0)
5689 nonzero
= (~nonzero
) & GET_MODE_MASK (mode
);
5691 return (nonzero
== 0 ? bitwidth
: bitwidth
- floor_log2 (nonzero
) - 1);
5697 /* If we haven't been able to figure it out by one of the above rules,
5698 see if some of the high-order bits are known to be zero. If so,
5699 count those bits and return one less than that amount. If we can't
5700 safely compute the mask for this mode, always return BITWIDTH. */
5702 bitwidth
= GET_MODE_PRECISION (mode
);
5703 if (bitwidth
> HOST_BITS_PER_WIDE_INT
)
5706 nonzero
= nonzero_bits (x
, mode
);
5707 return nonzero
& (HOST_WIDE_INT_1U
<< (bitwidth
- 1))
5708 ? 1 : bitwidth
- floor_log2 (nonzero
) - 1;
5711 /* Calculate the rtx_cost of a single instruction pattern. A return value of
5712 zero indicates an instruction pattern without a known cost. */
5715 pattern_cost (rtx pat
, bool speed
)
5720 /* Extract the single set rtx from the instruction pattern. We
5721 can't use single_set since we only have the pattern. We also
5722 consider PARALLELs of a normal set and a single comparison. In
5723 that case we use the cost of the non-comparison SET operation,
5724 which is most-likely to be the real cost of this operation. */
5725 if (GET_CODE (pat
) == SET
)
5727 else if (GET_CODE (pat
) == PARALLEL
)
5730 rtx comparison
= NULL_RTX
;
5732 for (i
= 0; i
< XVECLEN (pat
, 0); i
++)
5734 rtx x
= XVECEXP (pat
, 0, i
);
5735 if (GET_CODE (x
) == SET
)
5737 if (GET_CODE (SET_SRC (x
)) == COMPARE
)
5752 if (!set
&& comparison
)
5761 cost
= set_src_cost (SET_SRC (set
), GET_MODE (SET_DEST (set
)), speed
);
5762 return cost
> 0 ? cost
: COSTS_N_INSNS (1);
5765 /* Calculate the cost of a single instruction. A return value of zero
5766 indicates an instruction pattern without a known cost. */
5769 insn_cost (rtx_insn
*insn
, bool speed
)
5771 if (targetm
.insn_cost
)
5772 return targetm
.insn_cost (insn
, speed
);
5774 return pattern_cost (PATTERN (insn
), speed
);
5777 /* Returns estimate on cost of computing SEQ. */
5780 seq_cost (const rtx_insn
*seq
, bool speed
)
5785 for (; seq
; seq
= NEXT_INSN (seq
))
5787 set
= single_set (seq
);
5789 cost
+= set_rtx_cost (set
, speed
);
5790 else if (NONDEBUG_INSN_P (seq
))
5792 int this_cost
= insn_cost (CONST_CAST_RTX_INSN (seq
), speed
);
5803 /* Given an insn INSN and condition COND, return the condition in a
5804 canonical form to simplify testing by callers. Specifically:
5806 (1) The code will always be a comparison operation (EQ, NE, GT, etc.).
5807 (2) Both operands will be machine operands.
5808 (3) If an operand is a constant, it will be the second operand.
5809 (4) (LE x const) will be replaced with (LT x <const+1>) and similarly
5810 for GE, GEU, and LEU.
5812 If the condition cannot be understood, or is an inequality floating-point
5813 comparison which needs to be reversed, 0 will be returned.
5815 If REVERSE is nonzero, then reverse the condition prior to canonizing it.
5817 If EARLIEST is nonzero, it is a pointer to a place where the earliest
5818 insn used in locating the condition was found. If a replacement test
5819 of the condition is desired, it should be placed in front of that
5820 insn and we will be sure that the inputs are still valid.
5822 If WANT_REG is nonzero, we wish the condition to be relative to that
5823 register, if possible. Therefore, do not canonicalize the condition
5824 further. If ALLOW_CC_MODE is nonzero, allow the condition returned
5825 to be a compare to a CC mode register.
5827 If VALID_AT_INSN_P, the condition must be valid at both *EARLIEST
5831 canonicalize_condition (rtx_insn
*insn
, rtx cond
, int reverse
,
5832 rtx_insn
**earliest
,
5833 rtx want_reg
, int allow_cc_mode
, int valid_at_insn_p
)
5836 rtx_insn
*prev
= insn
;
5840 int reverse_code
= 0;
5842 basic_block bb
= BLOCK_FOR_INSN (insn
);
5844 code
= GET_CODE (cond
);
5845 mode
= GET_MODE (cond
);
5846 op0
= XEXP (cond
, 0);
5847 op1
= XEXP (cond
, 1);
5850 code
= reversed_comparison_code (cond
, insn
);
5851 if (code
== UNKNOWN
)
5857 /* If we are comparing a register with zero, see if the register is set
5858 in the previous insn to a COMPARE or a comparison operation. Perform
5859 the same tests as a function of STORE_FLAG_VALUE as find_comparison_args
5862 while ((GET_RTX_CLASS (code
) == RTX_COMPARE
5863 || GET_RTX_CLASS (code
) == RTX_COMM_COMPARE
)
5864 && op1
== CONST0_RTX (GET_MODE (op0
))
5867 /* Set nonzero when we find something of interest. */
5870 /* If this is a COMPARE, pick up the two things being compared. */
5871 if (GET_CODE (op0
) == COMPARE
)
5873 op1
= XEXP (op0
, 1);
5874 op0
= XEXP (op0
, 0);
5877 else if (!REG_P (op0
))
5880 /* Go back to the previous insn. Stop if it is not an INSN. We also
5881 stop if it isn't a single set or if it has a REG_INC note because
5882 we don't want to bother dealing with it. */
5884 prev
= prev_nonnote_nondebug_insn (prev
);
5887 || !NONJUMP_INSN_P (prev
)
5888 || FIND_REG_INC_NOTE (prev
, NULL_RTX
)
5889 /* In cfglayout mode, there do not have to be labels at the
5890 beginning of a block, or jumps at the end, so the previous
5891 conditions would not stop us when we reach bb boundary. */
5892 || BLOCK_FOR_INSN (prev
) != bb
)
5895 set
= set_of (op0
, prev
);
5898 && (GET_CODE (set
) != SET
5899 || !rtx_equal_p (SET_DEST (set
), op0
)))
5902 /* If this is setting OP0, get what it sets it to if it looks
5906 machine_mode inner_mode
= GET_MODE (SET_DEST (set
));
5907 #ifdef FLOAT_STORE_FLAG_VALUE
5908 REAL_VALUE_TYPE fsfv
;
5911 /* ??? We may not combine comparisons done in a CCmode with
5912 comparisons not done in a CCmode. This is to aid targets
5913 like Alpha that have an IEEE compliant EQ instruction, and
5914 a non-IEEE compliant BEQ instruction. The use of CCmode is
5915 actually artificial, simply to prevent the combination, but
5916 should not affect other platforms.
5918 However, we must allow VOIDmode comparisons to match either
5919 CCmode or non-CCmode comparison, because some ports have
5920 modeless comparisons inside branch patterns.
5922 ??? This mode check should perhaps look more like the mode check
5923 in simplify_comparison in combine. */
5924 if (((GET_MODE_CLASS (mode
) == MODE_CC
)
5925 != (GET_MODE_CLASS (inner_mode
) == MODE_CC
))
5927 && inner_mode
!= VOIDmode
)
5929 if (GET_CODE (SET_SRC (set
)) == COMPARE
5932 && val_signbit_known_set_p (inner_mode
,
5934 #ifdef FLOAT_STORE_FLAG_VALUE
5936 && SCALAR_FLOAT_MODE_P (inner_mode
)
5937 && (fsfv
= FLOAT_STORE_FLAG_VALUE (inner_mode
),
5938 REAL_VALUE_NEGATIVE (fsfv
)))
5941 && COMPARISON_P (SET_SRC (set
))))
5943 else if (((code
== EQ
5945 && val_signbit_known_set_p (inner_mode
,
5947 #ifdef FLOAT_STORE_FLAG_VALUE
5949 && SCALAR_FLOAT_MODE_P (inner_mode
)
5950 && (fsfv
= FLOAT_STORE_FLAG_VALUE (inner_mode
),
5951 REAL_VALUE_NEGATIVE (fsfv
)))
5954 && COMPARISON_P (SET_SRC (set
)))
5959 else if ((code
== EQ
|| code
== NE
)
5960 && GET_CODE (SET_SRC (set
)) == XOR
)
5961 /* Handle sequences like:
5964 ...(eq|ne op0 (const_int 0))...
5968 (eq op0 (const_int 0)) reduces to (eq X Y)
5969 (ne op0 (const_int 0)) reduces to (ne X Y)
5971 This is the form used by MIPS16, for example. */
5977 else if (reg_set_p (op0
, prev
))
5978 /* If this sets OP0, but not directly, we have to give up. */
5983 /* If the caller is expecting the condition to be valid at INSN,
5984 make sure X doesn't change before INSN. */
5985 if (valid_at_insn_p
)
5986 if (modified_in_p (x
, prev
) || modified_between_p (x
, prev
, insn
))
5988 if (COMPARISON_P (x
))
5989 code
= GET_CODE (x
);
5992 code
= reversed_comparison_code (x
, prev
);
5993 if (code
== UNKNOWN
)
5998 op0
= XEXP (x
, 0), op1
= XEXP (x
, 1);
6004 /* If constant is first, put it last. */
6005 if (CONSTANT_P (op0
))
6006 code
= swap_condition (code
), tem
= op0
, op0
= op1
, op1
= tem
;
6008 /* If OP0 is the result of a comparison, we weren't able to find what
6009 was really being compared, so fail. */
6011 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_CC
)
6014 /* Canonicalize any ordered comparison with integers involving equality
6015 if we can do computations in the relevant mode and we do not
6018 scalar_int_mode op0_mode
;
6019 if (CONST_INT_P (op1
)
6020 && is_a
<scalar_int_mode
> (GET_MODE (op0
), &op0_mode
)
6021 && GET_MODE_PRECISION (op0_mode
) <= HOST_BITS_PER_WIDE_INT
)
6023 HOST_WIDE_INT const_val
= INTVAL (op1
);
6024 unsigned HOST_WIDE_INT uconst_val
= const_val
;
6025 unsigned HOST_WIDE_INT max_val
6026 = (unsigned HOST_WIDE_INT
) GET_MODE_MASK (op0_mode
);
6031 if ((unsigned HOST_WIDE_INT
) const_val
!= max_val
>> 1)
6032 code
= LT
, op1
= gen_int_mode (const_val
+ 1, op0_mode
);
6035 /* When cross-compiling, const_val might be sign-extended from
6036 BITS_PER_WORD to HOST_BITS_PER_WIDE_INT */
6038 if ((const_val
& max_val
)
6039 != (HOST_WIDE_INT_1U
<< (GET_MODE_PRECISION (op0_mode
) - 1)))
6040 code
= GT
, op1
= gen_int_mode (const_val
- 1, op0_mode
);
6044 if (uconst_val
< max_val
)
6045 code
= LTU
, op1
= gen_int_mode (uconst_val
+ 1, op0_mode
);
6049 if (uconst_val
!= 0)
6050 code
= GTU
, op1
= gen_int_mode (uconst_val
- 1, op0_mode
);
6058 /* We promised to return a comparison. */
6059 rtx ret
= gen_rtx_fmt_ee (code
, VOIDmode
, op0
, op1
);
6060 if (COMPARISON_P (ret
))
6065 /* Given a jump insn JUMP, return the condition that will cause it to branch
6066 to its JUMP_LABEL. If the condition cannot be understood, or is an
6067 inequality floating-point comparison which needs to be reversed, 0 will
6070 If EARLIEST is nonzero, it is a pointer to a place where the earliest
6071 insn used in locating the condition was found. If a replacement test
6072 of the condition is desired, it should be placed in front of that
6073 insn and we will be sure that the inputs are still valid. If EARLIEST
6074 is null, the returned condition will be valid at INSN.
6076 If ALLOW_CC_MODE is nonzero, allow the condition returned to be a
6077 compare CC mode register.
6079 VALID_AT_INSN_P is the same as for canonicalize_condition. */
6082 get_condition (rtx_insn
*jump
, rtx_insn
**earliest
, int allow_cc_mode
,
6083 int valid_at_insn_p
)
6089 /* If this is not a standard conditional jump, we can't parse it. */
6091 || ! any_condjump_p (jump
))
6093 set
= pc_set (jump
);
6095 cond
= XEXP (SET_SRC (set
), 0);
6097 /* If this branches to JUMP_LABEL when the condition is false, reverse
6100 = GET_CODE (XEXP (SET_SRC (set
), 2)) == LABEL_REF
6101 && label_ref_label (XEXP (SET_SRC (set
), 2)) == JUMP_LABEL (jump
);
6103 return canonicalize_condition (jump
, cond
, reverse
, earliest
, NULL_RTX
,
6104 allow_cc_mode
, valid_at_insn_p
);
6107 /* Initialize the table NUM_SIGN_BIT_COPIES_IN_REP based on
6108 TARGET_MODE_REP_EXTENDED.
6110 Note that we assume that the property of
6111 TARGET_MODE_REP_EXTENDED(B, C) is sticky to the integral modes
6112 narrower than mode B. I.e., if A is a mode narrower than B then in
6113 order to be able to operate on it in mode B, mode A needs to
6114 satisfy the requirements set by the representation of mode B. */
6117 init_num_sign_bit_copies_in_rep (void)
6119 opt_scalar_int_mode in_mode_iter
;
6120 scalar_int_mode mode
;
6122 FOR_EACH_MODE_IN_CLASS (in_mode_iter
, MODE_INT
)
6123 FOR_EACH_MODE_UNTIL (mode
, in_mode_iter
.require ())
6125 scalar_int_mode in_mode
= in_mode_iter
.require ();
6128 /* Currently, it is assumed that TARGET_MODE_REP_EXTENDED
6129 extends to the next widest mode. */
6130 gcc_assert (targetm
.mode_rep_extended (mode
, in_mode
) == UNKNOWN
6131 || GET_MODE_WIDER_MODE (mode
).require () == in_mode
);
6133 /* We are in in_mode. Count how many bits outside of mode
6134 have to be copies of the sign-bit. */
6135 FOR_EACH_MODE (i
, mode
, in_mode
)
6137 /* This must always exist (for the last iteration it will be
6139 scalar_int_mode wider
= GET_MODE_WIDER_MODE (i
).require ();
6141 if (targetm
.mode_rep_extended (i
, wider
) == SIGN_EXTEND
6142 /* We can only check sign-bit copies starting from the
6143 top-bit. In order to be able to check the bits we
6144 have already seen we pretend that subsequent bits
6145 have to be sign-bit copies too. */
6146 || num_sign_bit_copies_in_rep
[in_mode
][mode
])
6147 num_sign_bit_copies_in_rep
[in_mode
][mode
]
6148 += GET_MODE_PRECISION (wider
) - GET_MODE_PRECISION (i
);
6153 /* Suppose that truncation from the machine mode of X to MODE is not a
6154 no-op. See if there is anything special about X so that we can
6155 assume it already contains a truncated value of MODE. */
6158 truncated_to_mode (machine_mode mode
, const_rtx x
)
6160 /* This register has already been used in MODE without explicit
6162 if (REG_P (x
) && rtl_hooks
.reg_truncated_to_mode (mode
, x
))
6165 /* See if we already satisfy the requirements of MODE. If yes we
6166 can just switch to MODE. */
6167 if (num_sign_bit_copies_in_rep
[GET_MODE (x
)][mode
]
6168 && (num_sign_bit_copies (x
, GET_MODE (x
))
6169 >= num_sign_bit_copies_in_rep
[GET_MODE (x
)][mode
] + 1))
6175 /* Return true if RTX code CODE has a single sequence of zero or more
6176 "e" operands and no rtvec operands. Initialize its rtx_all_subrtx_bounds
6177 entry in that case. */
6180 setup_reg_subrtx_bounds (unsigned int code
)
6182 const char *format
= GET_RTX_FORMAT ((enum rtx_code
) code
);
6184 for (; format
[i
] != 'e'; ++i
)
6187 /* No subrtxes. Leave start and count as 0. */
6189 if (format
[i
] == 'E' || format
[i
] == 'V')
6193 /* Record the sequence of 'e's. */
6194 rtx_all_subrtx_bounds
[code
].start
= i
;
6197 while (format
[i
] == 'e');
6198 rtx_all_subrtx_bounds
[code
].count
= i
- rtx_all_subrtx_bounds
[code
].start
;
6199 /* rtl-iter.h relies on this. */
6200 gcc_checking_assert (rtx_all_subrtx_bounds
[code
].count
<= 3);
6202 for (; format
[i
]; ++i
)
6203 if (format
[i
] == 'E' || format
[i
] == 'V' || format
[i
] == 'e')
6209 /* Initialize rtx_all_subrtx_bounds. */
6214 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
6216 if (!setup_reg_subrtx_bounds (i
))
6217 rtx_all_subrtx_bounds
[i
].count
= UCHAR_MAX
;
6218 if (GET_RTX_CLASS (i
) != RTX_CONST_OBJ
)
6219 rtx_nonconst_subrtx_bounds
[i
] = rtx_all_subrtx_bounds
[i
];
6222 init_num_sign_bit_copies_in_rep ();
6225 /* Check whether this is a constant pool constant. */
6227 constant_pool_constant_p (rtx x
)
6229 x
= avoid_constant_pool_reference (x
);
6230 return CONST_DOUBLE_P (x
);
6233 /* If M is a bitmask that selects a field of low-order bits within an item but
6234 not the entire word, return the length of the field. Return -1 otherwise.
6235 M is used in machine mode MODE. */
6238 low_bitmask_len (machine_mode mode
, unsigned HOST_WIDE_INT m
)
6240 if (mode
!= VOIDmode
)
6242 if (!HWI_COMPUTABLE_MODE_P (mode
))
6244 m
&= GET_MODE_MASK (mode
);
6247 return exact_log2 (m
+ 1);
6250 /* Return the mode of MEM's address. */
6253 get_address_mode (rtx mem
)
6257 gcc_assert (MEM_P (mem
));
6258 mode
= GET_MODE (XEXP (mem
, 0));
6259 if (mode
!= VOIDmode
)
6260 return as_a
<scalar_int_mode
> (mode
);
6261 return targetm
.addr_space
.address_mode (MEM_ADDR_SPACE (mem
));
6264 /* Split up a CONST_DOUBLE or integer constant rtx
6265 into two rtx's for single words,
6266 storing in *FIRST the word that comes first in memory in the target
6267 and in *SECOND the other.
6269 TODO: This function needs to be rewritten to work on any size
6273 split_double (rtx value
, rtx
*first
, rtx
*second
)
6275 if (CONST_INT_P (value
))
6277 if (HOST_BITS_PER_WIDE_INT
>= (2 * BITS_PER_WORD
))
6279 /* In this case the CONST_INT holds both target words.
6280 Extract the bits from it into two word-sized pieces.
6281 Sign extend each half to HOST_WIDE_INT. */
6282 unsigned HOST_WIDE_INT low
, high
;
6283 unsigned HOST_WIDE_INT mask
, sign_bit
, sign_extend
;
6284 unsigned bits_per_word
= BITS_PER_WORD
;
6286 /* Set sign_bit to the most significant bit of a word. */
6288 sign_bit
<<= bits_per_word
- 1;
6290 /* Set mask so that all bits of the word are set. We could
6291 have used 1 << BITS_PER_WORD instead of basing the
6292 calculation on sign_bit. However, on machines where
6293 HOST_BITS_PER_WIDE_INT == BITS_PER_WORD, it could cause a
6294 compiler warning, even though the code would never be
6296 mask
= sign_bit
<< 1;
6299 /* Set sign_extend as any remaining bits. */
6300 sign_extend
= ~mask
;
6302 /* Pick the lower word and sign-extend it. */
6303 low
= INTVAL (value
);
6308 /* Pick the higher word, shifted to the least significant
6309 bits, and sign-extend it. */
6310 high
= INTVAL (value
);
6311 high
>>= bits_per_word
- 1;
6314 if (high
& sign_bit
)
6315 high
|= sign_extend
;
6317 /* Store the words in the target machine order. */
6318 if (WORDS_BIG_ENDIAN
)
6320 *first
= GEN_INT (high
);
6321 *second
= GEN_INT (low
);
6325 *first
= GEN_INT (low
);
6326 *second
= GEN_INT (high
);
6331 /* The rule for using CONST_INT for a wider mode
6332 is that we regard the value as signed.
6333 So sign-extend it. */
6334 rtx high
= (INTVAL (value
) < 0 ? constm1_rtx
: const0_rtx
);
6335 if (WORDS_BIG_ENDIAN
)
6347 else if (GET_CODE (value
) == CONST_WIDE_INT
)
6349 /* All of this is scary code and needs to be converted to
6350 properly work with any size integer. */
6351 gcc_assert (CONST_WIDE_INT_NUNITS (value
) == 2);
6352 if (WORDS_BIG_ENDIAN
)
6354 *first
= GEN_INT (CONST_WIDE_INT_ELT (value
, 1));
6355 *second
= GEN_INT (CONST_WIDE_INT_ELT (value
, 0));
6359 *first
= GEN_INT (CONST_WIDE_INT_ELT (value
, 0));
6360 *second
= GEN_INT (CONST_WIDE_INT_ELT (value
, 1));
6363 else if (!CONST_DOUBLE_P (value
))
6365 if (WORDS_BIG_ENDIAN
)
6367 *first
= const0_rtx
;
6373 *second
= const0_rtx
;
6376 else if (GET_MODE (value
) == VOIDmode
6377 /* This is the old way we did CONST_DOUBLE integers. */
6378 || GET_MODE_CLASS (GET_MODE (value
)) == MODE_INT
)
6380 /* In an integer, the words are defined as most and least significant.
6381 So order them by the target's convention. */
6382 if (WORDS_BIG_ENDIAN
)
6384 *first
= GEN_INT (CONST_DOUBLE_HIGH (value
));
6385 *second
= GEN_INT (CONST_DOUBLE_LOW (value
));
6389 *first
= GEN_INT (CONST_DOUBLE_LOW (value
));
6390 *second
= GEN_INT (CONST_DOUBLE_HIGH (value
));
6397 /* Note, this converts the REAL_VALUE_TYPE to the target's
6398 format, splits up the floating point double and outputs
6399 exactly 32 bits of it into each of l[0] and l[1] --
6400 not necessarily BITS_PER_WORD bits. */
6401 REAL_VALUE_TO_TARGET_DOUBLE (*CONST_DOUBLE_REAL_VALUE (value
), l
);
6403 /* If 32 bits is an entire word for the target, but not for the host,
6404 then sign-extend on the host so that the number will look the same
6405 way on the host that it would on the target. See for instance
6406 simplify_unary_operation. The #if is needed to avoid compiler
6409 #if HOST_BITS_PER_LONG > 32
6410 if (BITS_PER_WORD
< HOST_BITS_PER_LONG
&& BITS_PER_WORD
== 32)
6412 if (l
[0] & ((long) 1 << 31))
6413 l
[0] |= ((unsigned long) (-1) << 32);
6414 if (l
[1] & ((long) 1 << 31))
6415 l
[1] |= ((unsigned long) (-1) << 32);
6419 *first
= GEN_INT (l
[0]);
6420 *second
= GEN_INT (l
[1]);
6424 /* Return true if X is a sign_extract or zero_extract from the least
6428 lsb_bitfield_op_p (rtx x
)
6430 if (GET_RTX_CLASS (GET_CODE (x
)) == RTX_BITFIELD_OPS
)
6432 machine_mode mode
= GET_MODE (XEXP (x
, 0));
6433 HOST_WIDE_INT len
= INTVAL (XEXP (x
, 1));
6434 HOST_WIDE_INT pos
= INTVAL (XEXP (x
, 2));
6435 poly_int64 remaining_bits
= GET_MODE_PRECISION (mode
) - len
;
6437 return known_eq (pos
, BITS_BIG_ENDIAN
? remaining_bits
: 0);
6442 /* Strip outer address "mutations" from LOC and return a pointer to the
6443 inner value. If OUTER_CODE is nonnull, store the code of the innermost
6444 stripped expression there.
6446 "Mutations" either convert between modes or apply some kind of
6447 extension, truncation or alignment. */
6450 strip_address_mutations (rtx
*loc
, enum rtx_code
*outer_code
)
6454 enum rtx_code code
= GET_CODE (*loc
);
6455 if (GET_RTX_CLASS (code
) == RTX_UNARY
)
6456 /* Things like SIGN_EXTEND, ZERO_EXTEND and TRUNCATE can be
6457 used to convert between pointer sizes. */
6458 loc
= &XEXP (*loc
, 0);
6459 else if (lsb_bitfield_op_p (*loc
))
6460 /* A [SIGN|ZERO]_EXTRACT from the least significant bit effectively
6461 acts as a combined truncation and extension. */
6462 loc
= &XEXP (*loc
, 0);
6463 else if (code
== AND
&& CONST_INT_P (XEXP (*loc
, 1)))
6464 /* (and ... (const_int -X)) is used to align to X bytes. */
6465 loc
= &XEXP (*loc
, 0);
6466 else if (code
== SUBREG
6467 && !OBJECT_P (SUBREG_REG (*loc
))
6468 && subreg_lowpart_p (*loc
))
6469 /* (subreg (operator ...) ...) inside and is used for mode
6471 loc
= &SUBREG_REG (*loc
);
6479 /* Return true if CODE applies some kind of scale. The scaled value is
6480 is the first operand and the scale is the second. */
6483 binary_scale_code_p (enum rtx_code code
)
6485 return (code
== MULT
6487 /* Needed by ARM targets. */
6491 || code
== ROTATERT
);
6494 /* If *INNER can be interpreted as a base, return a pointer to the inner term
6495 (see address_info). Return null otherwise. */
6498 get_base_term (rtx
*inner
)
6500 if (GET_CODE (*inner
) == LO_SUM
)
6501 inner
= strip_address_mutations (&XEXP (*inner
, 0));
6504 || GET_CODE (*inner
) == SUBREG
6505 || GET_CODE (*inner
) == SCRATCH
)
6510 /* If *INNER can be interpreted as an index, return a pointer to the inner term
6511 (see address_info). Return null otherwise. */
6514 get_index_term (rtx
*inner
)
6516 /* At present, only constant scales are allowed. */
6517 if (binary_scale_code_p (GET_CODE (*inner
)) && CONSTANT_P (XEXP (*inner
, 1)))
6518 inner
= strip_address_mutations (&XEXP (*inner
, 0));
6521 || GET_CODE (*inner
) == SUBREG
6522 || GET_CODE (*inner
) == SCRATCH
)
6527 /* Set the segment part of address INFO to LOC, given that INNER is the
6531 set_address_segment (struct address_info
*info
, rtx
*loc
, rtx
*inner
)
6533 gcc_assert (!info
->segment
);
6534 info
->segment
= loc
;
6535 info
->segment_term
= inner
;
6538 /* Set the base part of address INFO to LOC, given that INNER is the
6542 set_address_base (struct address_info
*info
, rtx
*loc
, rtx
*inner
)
6544 gcc_assert (!info
->base
);
6546 info
->base_term
= inner
;
6549 /* Set the index part of address INFO to LOC, given that INNER is the
6553 set_address_index (struct address_info
*info
, rtx
*loc
, rtx
*inner
)
6555 gcc_assert (!info
->index
);
6557 info
->index_term
= inner
;
6560 /* Set the displacement part of address INFO to LOC, given that INNER
6561 is the constant term. */
6564 set_address_disp (struct address_info
*info
, rtx
*loc
, rtx
*inner
)
6566 gcc_assert (!info
->disp
);
6568 info
->disp_term
= inner
;
6571 /* INFO->INNER describes a {PRE,POST}_{INC,DEC} address. Set up the
6572 rest of INFO accordingly. */
6575 decompose_incdec_address (struct address_info
*info
)
6577 info
->autoinc_p
= true;
6579 rtx
*base
= &XEXP (*info
->inner
, 0);
6580 set_address_base (info
, base
, base
);
6581 gcc_checking_assert (info
->base
== info
->base_term
);
6583 /* These addresses are only valid when the size of the addressed
6585 gcc_checking_assert (info
->mode
!= VOIDmode
);
6588 /* INFO->INNER describes a {PRE,POST}_MODIFY address. Set up the rest
6589 of INFO accordingly. */
6592 decompose_automod_address (struct address_info
*info
)
6594 info
->autoinc_p
= true;
6596 rtx
*base
= &XEXP (*info
->inner
, 0);
6597 set_address_base (info
, base
, base
);
6598 gcc_checking_assert (info
->base
== info
->base_term
);
6600 rtx plus
= XEXP (*info
->inner
, 1);
6601 gcc_assert (GET_CODE (plus
) == PLUS
);
6603 info
->base_term2
= &XEXP (plus
, 0);
6604 gcc_checking_assert (rtx_equal_p (*info
->base_term
, *info
->base_term2
));
6606 rtx
*step
= &XEXP (plus
, 1);
6607 rtx
*inner_step
= strip_address_mutations (step
);
6608 if (CONSTANT_P (*inner_step
))
6609 set_address_disp (info
, step
, inner_step
);
6611 set_address_index (info
, step
, inner_step
);
6614 /* Treat *LOC as a tree of PLUS operands and store pointers to the summed
6615 values in [PTR, END). Return a pointer to the end of the used array. */
6618 extract_plus_operands (rtx
*loc
, rtx
**ptr
, rtx
**end
)
6621 if (GET_CODE (x
) == PLUS
)
6623 ptr
= extract_plus_operands (&XEXP (x
, 0), ptr
, end
);
6624 ptr
= extract_plus_operands (&XEXP (x
, 1), ptr
, end
);
6628 gcc_assert (ptr
!= end
);
6634 /* Evaluate the likelihood of X being a base or index value, returning
6635 positive if it is likely to be a base, negative if it is likely to be
6636 an index, and 0 if we can't tell. Make the magnitude of the return
6637 value reflect the amount of confidence we have in the answer.
6639 MODE, AS, OUTER_CODE and INDEX_CODE are as for ok_for_base_p_1. */
6642 baseness (rtx x
, machine_mode mode
, addr_space_t as
,
6643 enum rtx_code outer_code
, enum rtx_code index_code
)
6645 /* Believe *_POINTER unless the address shape requires otherwise. */
6646 if (REG_P (x
) && REG_POINTER (x
))
6648 if (MEM_P (x
) && MEM_POINTER (x
))
6651 if (REG_P (x
) && HARD_REGISTER_P (x
))
6653 /* X is a hard register. If it only fits one of the base
6654 or index classes, choose that interpretation. */
6655 int regno
= REGNO (x
);
6656 bool base_p
= ok_for_base_p_1 (regno
, mode
, as
, outer_code
, index_code
);
6657 bool index_p
= REGNO_OK_FOR_INDEX_P (regno
);
6658 if (base_p
!= index_p
)
6659 return base_p
? 1 : -1;
6664 /* INFO->INNER describes a normal, non-automodified address.
6665 Fill in the rest of INFO accordingly. */
6668 decompose_normal_address (struct address_info
*info
)
6670 /* Treat the address as the sum of up to four values. */
6672 size_t n_ops
= extract_plus_operands (info
->inner
, ops
,
6673 ops
+ ARRAY_SIZE (ops
)) - ops
;
6675 /* If there is more than one component, any base component is in a PLUS. */
6677 info
->base_outer_code
= PLUS
;
6679 /* Try to classify each sum operand now. Leave those that could be
6680 either a base or an index in OPS. */
6683 for (size_t in
= 0; in
< n_ops
; ++in
)
6686 rtx
*inner
= strip_address_mutations (loc
);
6687 if (CONSTANT_P (*inner
))
6688 set_address_disp (info
, loc
, inner
);
6689 else if (GET_CODE (*inner
) == UNSPEC
)
6690 set_address_segment (info
, loc
, inner
);
6693 /* The only other possibilities are a base or an index. */
6694 rtx
*base_term
= get_base_term (inner
);
6695 rtx
*index_term
= get_index_term (inner
);
6696 gcc_assert (base_term
|| index_term
);
6698 set_address_index (info
, loc
, index_term
);
6699 else if (!index_term
)
6700 set_address_base (info
, loc
, base_term
);
6703 gcc_assert (base_term
== index_term
);
6705 inner_ops
[out
] = base_term
;
6711 /* Classify the remaining OPS members as bases and indexes. */
6714 /* If we haven't seen a base or an index yet, assume that this is
6715 the base. If we were confident that another term was the base
6716 or index, treat the remaining operand as the other kind. */
6718 set_address_base (info
, ops
[0], inner_ops
[0]);
6720 set_address_index (info
, ops
[0], inner_ops
[0]);
6724 /* In the event of a tie, assume the base comes first. */
6725 if (baseness (*inner_ops
[0], info
->mode
, info
->as
, PLUS
,
6727 >= baseness (*inner_ops
[1], info
->mode
, info
->as
, PLUS
,
6728 GET_CODE (*ops
[0])))
6730 set_address_base (info
, ops
[0], inner_ops
[0]);
6731 set_address_index (info
, ops
[1], inner_ops
[1]);
6735 set_address_base (info
, ops
[1], inner_ops
[1]);
6736 set_address_index (info
, ops
[0], inner_ops
[0]);
6740 gcc_assert (out
== 0);
6743 /* Describe address *LOC in *INFO. MODE is the mode of the addressed value,
6744 or VOIDmode if not known. AS is the address space associated with LOC.
6745 OUTER_CODE is MEM if *LOC is a MEM address and ADDRESS otherwise. */
6748 decompose_address (struct address_info
*info
, rtx
*loc
, machine_mode mode
,
6749 addr_space_t as
, enum rtx_code outer_code
)
6751 memset (info
, 0, sizeof (*info
));
6754 info
->addr_outer_code
= outer_code
;
6756 info
->inner
= strip_address_mutations (loc
, &outer_code
);
6757 info
->base_outer_code
= outer_code
;
6758 switch (GET_CODE (*info
->inner
))
6764 decompose_incdec_address (info
);
6769 decompose_automod_address (info
);
6773 decompose_normal_address (info
);
6778 /* Describe address operand LOC in INFO. */
6781 decompose_lea_address (struct address_info
*info
, rtx
*loc
)
6783 decompose_address (info
, loc
, VOIDmode
, ADDR_SPACE_GENERIC
, ADDRESS
);
6786 /* Describe the address of MEM X in INFO. */
6789 decompose_mem_address (struct address_info
*info
, rtx x
)
6791 gcc_assert (MEM_P (x
));
6792 decompose_address (info
, &XEXP (x
, 0), GET_MODE (x
),
6793 MEM_ADDR_SPACE (x
), MEM
);
6796 /* Update INFO after a change to the address it describes. */
6799 update_address (struct address_info
*info
)
6801 decompose_address (info
, info
->outer
, info
->mode
, info
->as
,
6802 info
->addr_outer_code
);
6805 /* Return the scale applied to *INFO->INDEX_TERM, or 0 if the index is
6806 more complicated than that. */
6809 get_index_scale (const struct address_info
*info
)
6811 rtx index
= *info
->index
;
6812 if (GET_CODE (index
) == MULT
6813 && CONST_INT_P (XEXP (index
, 1))
6814 && info
->index_term
== &XEXP (index
, 0))
6815 return INTVAL (XEXP (index
, 1));
6817 if (GET_CODE (index
) == ASHIFT
6818 && CONST_INT_P (XEXP (index
, 1))
6819 && info
->index_term
== &XEXP (index
, 0))
6820 return HOST_WIDE_INT_1
<< INTVAL (XEXP (index
, 1));
6822 if (info
->index
== info
->index_term
)
6828 /* Return the "index code" of INFO, in the form required by
6832 get_index_code (const struct address_info
*info
)
6835 return GET_CODE (*info
->index
);
6838 return GET_CODE (*info
->disp
);
6843 /* Return true if RTL X contains a SYMBOL_REF. */
6846 contains_symbol_ref_p (const_rtx x
)
6848 subrtx_iterator::array_type array
;
6849 FOR_EACH_SUBRTX (iter
, array
, x
, ALL
)
6850 if (SYMBOL_REF_P (*iter
))
6856 /* Return true if RTL X contains a SYMBOL_REF or LABEL_REF. */
6859 contains_symbolic_reference_p (const_rtx x
)
6861 subrtx_iterator::array_type array
;
6862 FOR_EACH_SUBRTX (iter
, array
, x
, ALL
)
6863 if (SYMBOL_REF_P (*iter
) || GET_CODE (*iter
) == LABEL_REF
)
6869 /* Return true if RTL X contains a constant pool address. */
6872 contains_constant_pool_address_p (const_rtx x
)
6874 subrtx_iterator::array_type array
;
6875 FOR_EACH_SUBRTX (iter
, array
, x
, ALL
)
6876 if (SYMBOL_REF_P (*iter
) && CONSTANT_POOL_ADDRESS_P (*iter
))
6883 /* Return true if X contains a thread-local symbol. */
6886 tls_referenced_p (const_rtx x
)
6888 if (!targetm
.have_tls
)
6891 subrtx_iterator::array_type array
;
6892 FOR_EACH_SUBRTX (iter
, array
, x
, ALL
)
6893 if (GET_CODE (*iter
) == SYMBOL_REF
&& SYMBOL_REF_TLS_MODEL (*iter
) != 0)
6898 /* Process recursively X of INSN and add REG_INC notes if necessary. */
6900 add_auto_inc_notes (rtx_insn
*insn
, rtx x
)
6902 enum rtx_code code
= GET_CODE (x
);
6906 if (code
== MEM
&& auto_inc_p (XEXP (x
, 0)))
6908 add_reg_note (insn
, REG_INC
, XEXP (XEXP (x
, 0), 0));
6912 /* Scan all X sub-expressions. */
6913 fmt
= GET_RTX_FORMAT (code
);
6914 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
6917 add_auto_inc_notes (insn
, XEXP (x
, i
));
6918 else if (fmt
[i
] == 'E')
6919 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
6920 add_auto_inc_notes (insn
, XVECEXP (x
, i
, j
));
6924 /* Return true if X is register asm. */
6927 register_asm_p (const_rtx x
)
6930 && REG_EXPR (x
) != NULL_TREE
6931 && HAS_DECL_ASSEMBLER_NAME_P (REG_EXPR (x
))
6932 && DECL_ASSEMBLER_NAME_SET_P (REG_EXPR (x
))
6933 && DECL_REGISTER (REG_EXPR (x
)));
6936 /* Return true if, for all OP of mode OP_MODE:
6938 (vec_select:RESULT_MODE OP SEL)
6940 is equivalent to the highpart RESULT_MODE of OP. */
6943 vec_series_highpart_p (machine_mode result_mode
, machine_mode op_mode
, rtx sel
)
6946 if (GET_MODE_NUNITS (op_mode
).is_constant (&nunits
)
6947 && targetm
.can_change_mode_class (op_mode
, result_mode
, ALL_REGS
))
6949 int offset
= BYTES_BIG_ENDIAN
? 0 : nunits
- XVECLEN (sel
, 0);
6950 return rtvec_series_p (XVEC (sel
, 0), offset
);
6955 /* Return true if, for all OP of mode OP_MODE:
6957 (vec_select:RESULT_MODE OP SEL)
6959 is equivalent to the lowpart RESULT_MODE of OP. */
6962 vec_series_lowpart_p (machine_mode result_mode
, machine_mode op_mode
, rtx sel
)
6965 if (GET_MODE_NUNITS (op_mode
).is_constant (&nunits
)
6966 && targetm
.can_change_mode_class (op_mode
, result_mode
, ALL_REGS
))
6968 int offset
= BYTES_BIG_ENDIAN
? nunits
- XVECLEN (sel
, 0) : 0;
6969 return rtvec_series_p (XVEC (sel
, 0), offset
);
6974 /* Return true if X contains a paradoxical subreg. */
6977 contains_paradoxical_subreg_p (rtx x
)
6979 subrtx_var_iterator::array_type array
;
6980 FOR_EACH_SUBRTX_VAR (iter
, array
, x
, NONCONST
)
6983 if (SUBREG_P (x
) && paradoxical_subreg_p (x
))