re PR rtl-optimization/64916 (ira.c update_equiv_regs patch causes gcc/testsuite/gcc.target/arm/pr43920-2.c regression)
PR rtl-optimization/64916 * cfgcleanup.c (values_equal_p): New function. (can_replace_by): Use it. From-SVN: r222256
This commit is contained in:
parent
fadf02a4e0
commit
3e87f2d6dd
@ -1,3 +1,9 @@
|
||||
2015-04-20 Shiva Chen <shiva0217@gmail.com>
|
||||
|
||||
PR rtl-optimization/64916
|
||||
* cfgcleanup.c (values_equal_p): New function.
|
||||
(can_replace_by): Use it.
|
||||
|
||||
2015-04-20 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/65801
|
||||
|
@ -1038,6 +1038,45 @@ equal_different_set_p (rtx p1, rtx s1, rtx p2, rtx s2)
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/* NOTE1 is the REG_EQUAL note, if any, attached to an insn
|
||||
that is a single_set with a SET_SRC of SRC1. Similarly
|
||||
for NOTE2/SRC2.
|
||||
|
||||
So effectively NOTE1/NOTE2 are an alternate form of
|
||||
SRC1/SRC2 respectively.
|
||||
|
||||
Return nonzero if SRC1 or NOTE1 has the same constant
|
||||
integer value as SRC2 or NOTE2. Else return zero. */
|
||||
static int
|
||||
values_equal_p (rtx note1, rtx note2, rtx src1, rtx src2)
|
||||
{
|
||||
if (note1
|
||||
&& note2
|
||||
&& CONST_INT_P (XEXP (note1, 0))
|
||||
&& rtx_equal_p (XEXP (note1, 0), XEXP (note2, 0)))
|
||||
return 1;
|
||||
|
||||
if (!note1
|
||||
&& !note2
|
||||
&& CONST_INT_P (src1)
|
||||
&& CONST_INT_P (src2)
|
||||
&& rtx_equal_p (src1, src2))
|
||||
return 1;
|
||||
|
||||
if (note1
|
||||
&& CONST_INT_P (src2)
|
||||
&& rtx_equal_p (XEXP (note1, 0), src2))
|
||||
return 1;
|
||||
|
||||
if (note2
|
||||
&& CONST_INT_P (src1)
|
||||
&& rtx_equal_p (XEXP (note2, 0), src1))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Examine register notes on I1 and I2 and return:
|
||||
- dir_forward if I1 can be replaced by I2, or
|
||||
- dir_backward if I2 can be replaced by I1, or
|
||||
@ -1066,8 +1105,11 @@ can_replace_by (rtx_insn *i1, rtx_insn *i2)
|
||||
set dest to the same value. */
|
||||
note1 = find_reg_equal_equiv_note (i1);
|
||||
note2 = find_reg_equal_equiv_note (i2);
|
||||
if (!note1 || !note2 || !rtx_equal_p (XEXP (note1, 0), XEXP (note2, 0))
|
||||
|| !CONST_INT_P (XEXP (note1, 0)))
|
||||
|
||||
src1 = SET_SRC (s1);
|
||||
src2 = SET_SRC (s2);
|
||||
|
||||
if (!values_equal_p (note1, note2, src1, src2))
|
||||
return dir_none;
|
||||
|
||||
if (!equal_different_set_p (PATTERN (i1), s1, PATTERN (i2), s2))
|
||||
@ -1079,8 +1121,6 @@ can_replace_by (rtx_insn *i1, rtx_insn *i2)
|
||||
(set (dest) (reg))
|
||||
because we don't know if the reg is live and has the same value at the
|
||||
location of replacement. */
|
||||
src1 = SET_SRC (s1);
|
||||
src2 = SET_SRC (s2);
|
||||
c1 = CONST_INT_P (src1);
|
||||
c2 = CONST_INT_P (src2);
|
||||
if (c1 && c2)
|
||||
|
Loading…
Reference in New Issue
Block a user