aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-11-25 19:00:47 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2010-11-25 19:00:47 +0100
commit01e512e27c88362c0be9e76617a026babeaff603 (patch)
treec6ab0e183d73e53aef30128acd6690f703e71220 /gcc
parent27f2c348e9664b741a9fec6d577efc450001130d (diff)
downloadgcc-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')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/combine.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr46637.c11
4 files changed, 27 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 57536cd..d67f499 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2010-11-25 Jakub Jelinek <jakub@redhat.com>
+
+ 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.
+
2010-11-25 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/46647
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. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 798012f..b19b812 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-11-25 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/46637
+ * gcc.c-torture/compile/pr46637.c: New test.
+
2010-11-25 H.J. Lu <hongjiu.lu@intel.com>
* gfortran.dg/pr46519-1.f: Add -mtune=generic.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr46637.c b/gcc/testsuite/gcc.c-torture/compile/pr46637.c
new file mode 100644
index 0000000..c765949
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr46637.c
@@ -0,0 +1,11 @@
+/* PR middle-end/46637 */
+
+struct S { int s[5]; } *p;
+
+void
+foo (long x)
+{
+ long a = x == 1 ? 4L : 1L;
+ asm ("" : "+m" (p->s[a]));
+ p->s[0]++;
+}