Commit 73a39fc4 by Eric Christopher

combine.c (can_combine_p): Allow ZERO_EXTRACT and STRICT_LOW_PART.

2003-03-31  Eric Christopher  <echristo@redhat.com>

	* combine.c (can_combine_p): Allow ZERO_EXTRACT and STRICT_LOW_PART.
	(combinable_i3pat): Remove call to expand_field_assignment and
	#if 0'd code.

From-SVN: r65118
parent 6b665219
2003-03-31 Eric Christopher <echristo@redhat.com>
* combine.c (can_combine_p): Allow ZERO_EXTRACT and STRICT_LOW_PART.
(combinable_i3pat): Remove call to expand_field_assignment and
#if 0'd code.
2003-03-31 Mark Mitchell <mark@codesourcery.com> 2003-03-31 Mark Mitchell <mark@codesourcery.com>
PR c++/10278 PR c++/10278
...@@ -9596,4 +9602,3 @@ Mon Mar 24 20:03:03 CET 2003 Jan Hubicka <jh@suse.cz> ...@@ -9596,4 +9602,3 @@ Mon Mar 24 20:03:03 CET 2003 Jan Hubicka <jh@suse.cz>
* doc/tm.texi (REGISTER_TARGET_PRAGMAS): Update * doc/tm.texi (REGISTER_TARGET_PRAGMAS): Update
See ChangeLog.8 for earlier changes. See ChangeLog.8 for earlier changes.
...@@ -1065,8 +1065,6 @@ can_combine_p (insn, i3, pred, succ, pdest, psrc) ...@@ -1065,8 +1065,6 @@ can_combine_p (insn, i3, pred, succ, pdest, psrc)
/* Don't eliminate a store in the stack pointer. */ /* Don't eliminate a store in the stack pointer. */
if (dest == stack_pointer_rtx if (dest == stack_pointer_rtx
/* If we couldn't eliminate a field assignment, we can't combine. */
|| GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == STRICT_LOW_PART
/* Don't combine with an insn that sets a register to itself if it has /* Don't combine with an insn that sets a register to itself if it has
a REG_EQUAL note. This may be part of a REG_NO_CONFLICT sequence. */ a REG_EQUAL note. This may be part of a REG_NO_CONFLICT sequence. */
|| (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX)) || (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX))
...@@ -1319,46 +1317,16 @@ combinable_i3pat (i3, loc, i2dest, i1dest, i1_not_in_src, pi3dest_killed) ...@@ -1319,46 +1317,16 @@ combinable_i3pat (i3, loc, i2dest, i1dest, i1_not_in_src, pi3dest_killed)
if (GET_CODE (x) == SET) if (GET_CODE (x) == SET)
{ {
rtx set = expand_field_assignment (x); rtx set = x ;
rtx dest = SET_DEST (set); rtx dest = SET_DEST (set);
rtx src = SET_SRC (set); rtx src = SET_SRC (set);
rtx inner_dest = dest; rtx inner_dest = dest;
#if 0
rtx inner_src = src;
#endif
SUBST (*loc, set);
while (GET_CODE (inner_dest) == STRICT_LOW_PART while (GET_CODE (inner_dest) == STRICT_LOW_PART
|| GET_CODE (inner_dest) == SUBREG || GET_CODE (inner_dest) == SUBREG
|| GET_CODE (inner_dest) == ZERO_EXTRACT) || GET_CODE (inner_dest) == ZERO_EXTRACT)
inner_dest = XEXP (inner_dest, 0); inner_dest = XEXP (inner_dest, 0);
/* We probably don't need this any more now that LIMIT_RELOAD_CLASS
was added. */
#if 0
while (GET_CODE (inner_src) == STRICT_LOW_PART
|| GET_CODE (inner_src) == SUBREG
|| GET_CODE (inner_src) == ZERO_EXTRACT)
inner_src = XEXP (inner_src, 0);
/* If it is better that two different modes keep two different pseudos,
avoid combining them. This avoids producing the following pattern
on a 386:
(set (subreg:SI (reg/v:QI 21) 0)
(lshiftrt:SI (reg/v:SI 20)
(const_int 24)))
If that were made, reload could not handle the pair of
reg 20/21, since it would try to get any GENERAL_REGS
but some of them don't handle QImode. */
if (rtx_equal_p (inner_src, i2dest)
&& GET_CODE (inner_dest) == REG
&& ! MODES_TIEABLE_P (GET_MODE (i2dest), GET_MODE (inner_dest)))
return 0;
#endif
/* Check for the case where I3 modifies its output, as /* Check for the case where I3 modifies its output, as
discussed above. */ discussed above. */
if ((inner_dest != dest if ((inner_dest != dest
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment