Blame SOURCES/gcc48-pr52714.patch

25c7f1
2014-02-27  Jeff Law  <law@redhat.com>
25c7f1
25c7f1
	PR rtl-optimization/52714
25c7f1
	* combine.c (try_combine): When splitting an unrecognized PARALLEL
25c7f1
	into two independent simple sets, if I3 is a jump, ensure the
25c7f1
	pattern we place into I3 is a (set (pc) ...)
25c7f1
25c7f1
	* gcc.c-torture/compile/pr52714.c: New test.
25c7f1
25c7f1
2016-06-15  Jakub Jelinek  <jakub@redhat.com>
25c7f1
25c7f1
	* gcc.c-torture/compile/20160615-1.c: New test.
25c7f1
25c7f1
--- gcc/combine.c	(revision 208203)
25c7f1
+++ gcc/combine.c	(revision 208204)
25c7f1
@@ -3706,6 +3706,9 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx
25c7f1
 #ifdef HAVE_cc0
25c7f1
 	  && !reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 0))
25c7f1
 #endif
25c7f1
+	  /* If I3 is a jump, ensure that set0 is a jump so that
25c7f1
+	     we do not create invalid RTL.  */
25c7f1
+	  && (!JUMP_P (i3) || SET_DEST (XVECEXP (newpat, 0, 0)) == pc_rtx)
25c7f1
 	 )
25c7f1
 	{
25c7f1
 	  newi2pat = XVECEXP (newpat, 0, 1);
25c7f1
@@ -3716,6 +3719,9 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx
25c7f1
 #ifdef HAVE_cc0
25c7f1
 	       && !reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 1))
25c7f1
 #endif
25c7f1
+	       /* If I3 is a jump, ensure that set1 is a jump so that
25c7f1
+		  we do not create invalid RTL.  */
25c7f1
+	       && (!JUMP_P (i3) || SET_DEST (XVECEXP (newpat, 0, 1)) == pc_rtx)
25c7f1
 	      )
25c7f1
 	{
25c7f1
 	  newi2pat = XVECEXP (newpat, 0, 0);
25c7f1
--- gcc/testsuite/gcc.c-torture/compile/pr52714.c	(revision 0)
25c7f1
+++ gcc/testsuite/gcc.c-torture/compile/pr52714.c	(revision 208204)
25c7f1
@@ -0,0 +1,25 @@
25c7f1
+
25c7f1
+int __re_compile_fastmap(unsigned char *p)
25c7f1
+{
25c7f1
+    unsigned char **stack;
25c7f1
+    unsigned size;
25c7f1
+    unsigned avail;
25c7f1
+
25c7f1
+    stack = __builtin_alloca(5 * sizeof(unsigned char*));
25c7f1
+    if (stack == 0)
25c7f1
+	return -2;
25c7f1
+    size = 5;
25c7f1
+    avail = 0;
25c7f1
+
25c7f1
+    for (;;) {
25c7f1
+	switch (*p++) {
25c7f1
+	case 0:
25c7f1
+	    if (avail == size)
25c7f1
+		return -2;
25c7f1
+	    stack[avail++] = p;
25c7f1
+	}
25c7f1
+    }
25c7f1
+
25c7f1
+    return 0;
25c7f1
+}
25c7f1
+
25c7f1
--- gcc/testsuite/gcc.c-torture/compile/20160615-1.c.jj	2016-06-15 11:17:54.690689056 +0200
25c7f1
+++ gcc/testsuite/gcc.c-torture/compile/20160615-1.c	2016-06-15 11:17:48.811765657 +0200
25c7f1
@@ -0,0 +1,10 @@
25c7f1
+int a;
25c7f1
+void bar (int, unsigned, unsigned);
25c7f1
+
25c7f1
+void
25c7f1
+foo (unsigned x)
25c7f1
+{
25c7f1
+  unsigned b = a ? x : 0;
25c7f1
+  if (x || b)
25c7f1
+    bar (0, x, b);
25c7f1
+}