diff options
author | pfg <pfg@FreeBSD.org> | 2014-01-11 01:44:22 +0000 |
---|---|---|
committer | pfg <pfg@FreeBSD.org> | 2014-01-11 01:44:22 +0000 |
commit | f5cc643aac5d41bb91ac947f2257c70e8c8a353a (patch) | |
tree | 56ff9ed81cad6900d7329a224ab4e25c564688dd /contrib/gcc | |
parent | 6b686ee50aa7ef91e77ead42af6e89e77fd7057a (diff) | |
download | FreeBSD-src-f5cc643aac5d41bb91ac947f2257c70e8c8a353a.zip FreeBSD-src-f5cc643aac5d41bb91ac947f2257c70e8c8a353a.tar.gz |
MFC r260361:
gcc: Fix optimization bug.
GCC-PR rtl-optimization/34628
* combine.c (try_combine): Stop and undo after the first combination
if an autoincrement side-effect on the first insn has effectively
been lost.
Diffstat (limited to 'contrib/gcc')
-rw-r--r-- | contrib/gcc/combine.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/contrib/gcc/combine.c b/contrib/gcc/combine.c index f44b246..2053381 100644 --- a/contrib/gcc/combine.c +++ b/contrib/gcc/combine.c @@ -2370,12 +2370,17 @@ try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p) if (i1 && GET_CODE (newpat) != CLOBBER) { - /* Before we can do this substitution, we must redo the test done - above (see detailed comments there) that ensures that I1DEST - isn't mentioned in any SETs in NEWPAT that are field assignments. */ - - if (! combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX, - 0, (rtx*) 0)) + /* Check that an autoincrement side-effect on I1 has not been lost. + This happens if I1DEST is mentioned in I2 and dies there, and + has disappeared from the new pattern. */ + if ((FIND_REG_INC_NOTE (i1, NULL_RTX) != 0 + && !i1_feeds_i3 + && dead_or_set_p (i2, i1dest) + && !reg_overlap_mentioned_p (i1dest, newpat)) + /* Before we can do this substitution, we must redo the test done + above (see detailed comments there) that ensures that I1DEST + isn't mentioned in any SETs in NEWPAT that are field assignments. */ + || !combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX, 0, 0)) { undo_all (); return 0; |