Commit 29ebe69a by Richard Kenner

*** empty log message ***

From-SVN: r666
parent d64be5ec
...@@ -3680,7 +3680,7 @@ fold (expr) ...@@ -3680,7 +3680,7 @@ fold (expr)
/* If this is A != 0 ? A : 0, this is simply A. For ==, it is /* If this is A != 0 ? A : 0, this is simply A. For ==, it is
always zero. */ always zero. */
if (integer_zerop (arg2)) if (integer_zerop (TREE_OPERAND (arg0, 1)) && integer_zerop (arg2))
{ {
if (comp_code == NE_EXPR) if (comp_code == NE_EXPR)
return arg1; return arg1;
......
...@@ -396,7 +396,7 @@ attr_rtx (va_alist) ...@@ -396,7 +396,7 @@ attr_rtx (va_alist)
{ {
rtx arg0 = va_arg (p, rtx); rtx arg0 = va_arg (p, rtx);
hashcode = (code + RTL_HASH (arg0)); hashcode = ((int) code + RTL_HASH (arg0));
for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next) for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
if (h->hashcode == hashcode if (h->hashcode == hashcode
&& GET_CODE (h->u.rtl) == code && GET_CODE (h->u.rtl) == code
...@@ -416,7 +416,7 @@ attr_rtx (va_alist) ...@@ -416,7 +416,7 @@ attr_rtx (va_alist)
rtx arg0 = va_arg (p, rtx); rtx arg0 = va_arg (p, rtx);
rtx arg1 = va_arg (p, rtx); rtx arg1 = va_arg (p, rtx);
hashcode = (code + RTL_HASH (arg0) + RTL_HASH (arg1)); hashcode = ((int) code + RTL_HASH (arg0) + RTL_HASH (arg1));
for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next) for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
if (h->hashcode == hashcode if (h->hashcode == hashcode
&& GET_CODE (h->u.rtl) == code && GET_CODE (h->u.rtl) == code
...@@ -436,7 +436,7 @@ attr_rtx (va_alist) ...@@ -436,7 +436,7 @@ attr_rtx (va_alist)
{ {
char * arg0 = va_arg (p, char *); char * arg0 = va_arg (p, char *);
hashcode = (code + RTL_HASH (arg0)); hashcode = ((int) code + RTL_HASH (arg0));
for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next) for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
if (h->hashcode == hashcode if (h->hashcode == hashcode
&& GET_CODE (h->u.rtl) == code && GET_CODE (h->u.rtl) == code
...@@ -456,7 +456,7 @@ attr_rtx (va_alist) ...@@ -456,7 +456,7 @@ attr_rtx (va_alist)
char * arg0 = va_arg (p, char *); char * arg0 = va_arg (p, char *);
char * arg1 = va_arg (p, char *); char * arg1 = va_arg (p, char *);
hashcode = (code + RTL_HASH (arg0) + RTL_HASH (arg1)); hashcode = ((int) code + RTL_HASH (arg0) + RTL_HASH (arg1));
for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next) for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
if (h->hashcode == hashcode if (h->hashcode == hashcode
&& GET_CODE (h->u.rtl) == code && GET_CODE (h->u.rtl) == code
......
...@@ -1315,6 +1315,16 @@ emit_no_conflict_block (insns, target, op0, op1, equiv) ...@@ -1315,6 +1315,16 @@ emit_no_conflict_block (insns, target, op0, op1, equiv)
an insn to move RESULT to TARGET. This last insn will have a REQ_EQUAL an insn to move RESULT to TARGET. This last insn will have a REQ_EQUAL
note with an operand of EQUIV. note with an operand of EQUIV.
Moving assignments to pseudos outside of the block is done to improve
the generated code, but is not required to generate correct code,
hence being unable to move an assignment is not grounds for not making
a libcall block. There are two reasons why it is safe to leave these
insns inside the block: First, we know that these pseudos cannot be
used in generated RTL outside the block since they are created for
temporary purposes within the block. Second, CSE will not record the
values of anything set inside a libcall block, so we know they must
be dead at the end of the block.
Except for the first group of insns (the ones setting pseudos), the Except for the first group of insns (the ones setting pseudos), the
block is delimited by REG_RETVAL and REG_LIBCALL notes. */ block is delimited by REG_RETVAL and REG_LIBCALL notes. */
...@@ -1328,7 +1338,9 @@ emit_libcall_block (insns, target, result, equiv) ...@@ -1328,7 +1338,9 @@ emit_libcall_block (insns, target, result, equiv)
rtx prev, next, first, last, insn; rtx prev, next, first, last, insn;
/* First emit all insns that set pseudos. Remove them from the list as /* First emit all insns that set pseudos. Remove them from the list as
we go. */ we go. Avoid insns that set pseudo which were referenced in previous
insns. These can be generated by move_by_pieces, for example,
to update an address. */
for (insn = insns; insn; insn = next) for (insn = insns; insn; insn = next)
{ {
...@@ -1337,7 +1349,9 @@ emit_libcall_block (insns, target, result, equiv) ...@@ -1337,7 +1349,9 @@ emit_libcall_block (insns, target, result, equiv)
next = NEXT_INSN (insn); next = NEXT_INSN (insn);
if (set != 0 && GET_CODE (SET_DEST (set)) == REG if (set != 0 && GET_CODE (SET_DEST (set)) == REG
&& REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER) && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER
&& ! reg_mentioned_p (SET_DEST (set), PATTERN (insns))
&& ! reg_used_between_p (SET_DEST (set), insns, insn))
{ {
if (PREV_INSN (insn)) if (PREV_INSN (insn))
NEXT_INSN (PREV_INSN (insn)) = next; NEXT_INSN (PREV_INSN (insn)) = next;
......
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