diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-11-25 19:00:47 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-11-25 19:00:47 +0100 |
commit | 01e512e27c88362c0be9e76617a026babeaff603 (patch) | |
tree | c6ab0e183d73e53aef30128acd6690f703e71220 /gcc/combine.c | |
parent | 27f2c348e9664b741a9fec6d577efc450001130d (diff) | |
download | gcc-01e512e27c88362c0be9e76617a026babeaff603.zip gcc-01e512e27c88362c0be9e76617a026babeaff603.tar.gz gcc-01e512e27c88362c0be9e76617a026babeaff603.tar.bz2 |
re PR middle-end/46637 (SIGSEGV in if_then_else_cond - too deep recursion)
PR middle-end/46637
* combine.c (try_combine): When substing i2dest for i2src, pass
1 as last argument even if
i0_feeds_i1_n && i1_feeds_i2_n && i0dest_in_i0src.
* gcc.c-torture/compile/pr46637.c: New test.
From-SVN: r167148
Diffstat (limited to 'gcc/combine.c')
-rw-r--r-- | gcc/combine.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/gcc/combine.c b/gcc/combine.c index c557e8c..a8ce701 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -3096,10 +3096,12 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p) /* If I1 feeds into I2 and I1DEST is in I1SRC, we need to make a unique copy of I2SRC each time we substitute it, in order to avoid creating self-referential RTL when we will be substituting I1SRC for I1DEST - later. Likewise if I0 feeds into I2 and I0DEST is in I0SRC. */ + later. Likewise if I0 feeds into I2, either directly or indirectly + through I1, and I0DEST is in I0SRC. */ newpat = subst (PATTERN (i3), i2dest, i2src, 0, (i1_feeds_i2_n && i1dest_in_i1src) - || (i0_feeds_i2_n && i0dest_in_i0src)); + || ((i0_feeds_i2_n || (i0_feeds_i1_n && i1_feeds_i2_n)) + && i0dest_in_i0src)); substed_i2 = 1; /* Record whether I2's body now appears within I3's body. */ |