add patches to fixes gcc 4.2.x bugs: - fix gcc ICE when compiling package/ath9k (closes: #3816) http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37014 - fix "undefined reference to `fmsub'" error on powerpc http://bugs.uclibc.org/view.php?id=1588
SVN-Revision: 12623
This commit is contained in:
parent
a43e2d5ac6
commit
40f6992324
9 changed files with 472 additions and 0 deletions
76
toolchain/gcc/patches/4.2.0/951-bug_37014.patch
Normal file
76
toolchain/gcc/patches/4.2.0/951-bug_37014.patch
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37014
|
||||||
|
|
||||||
|
--- a/gcc/dojump.c
|
||||||
|
+++ b/gcc/dojump.c
|
||||||
|
@@ -307,8 +307,6 @@
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- case TRUTH_ANDIF_EXPR:
|
||||||
|
- case TRUTH_ORIF_EXPR:
|
||||||
|
case COMPOUND_EXPR:
|
||||||
|
/* Lowered by gimplify.c. */
|
||||||
|
gcc_unreachable ();
|
||||||
|
@@ -518,6 +516,7 @@
|
||||||
|
if (BRANCH_COST >= 4 || TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 1)))
|
||||||
|
goto normal;
|
||||||
|
|
||||||
|
+ case TRUTH_ANDIF_EXPR:
|
||||||
|
if (if_false_label == NULL_RTX)
|
||||||
|
{
|
||||||
|
drop_through_label = gen_label_rtx ();
|
||||||
|
@@ -538,6 +537,7 @@
|
||||||
|
if (BRANCH_COST >= 4 || TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 1)))
|
||||||
|
goto normal;
|
||||||
|
|
||||||
|
+ case TRUTH_ORIF_EXPR:
|
||||||
|
if (if_true_label == NULL_RTX)
|
||||||
|
{
|
||||||
|
drop_through_label = gen_label_rtx ();
|
||||||
|
--- a/gcc/expr.c
|
||||||
|
+++ b/gcc/expr.c
|
||||||
|
@@ -8466,7 +8466,10 @@
|
||||||
|
/* If no set-flag instruction, must generate a conditional store
|
||||||
|
into a temporary variable. Drop through and handle this
|
||||||
|
like && and ||. */
|
||||||
|
-
|
||||||
|
+ /* Although TRUTH_{AND,OR}IF_EXPR aren't present in GIMPLE, they
|
||||||
|
+ are occassionally created by folding during expansion. */
|
||||||
|
+ case TRUTH_ANDIF_EXPR:
|
||||||
|
+ case TRUTH_ORIF_EXPR:
|
||||||
|
if (! ignore
|
||||||
|
&& (target == 0
|
||||||
|
|| modifier == EXPAND_STACK_PARM
|
||||||
|
@@ -8664,8 +8667,6 @@
|
||||||
|
case POSTDECREMENT_EXPR:
|
||||||
|
case LOOP_EXPR:
|
||||||
|
case EXIT_EXPR:
|
||||||
|
- case TRUTH_ANDIF_EXPR:
|
||||||
|
- case TRUTH_ORIF_EXPR:
|
||||||
|
/* Lowered by gimplify.c. */
|
||||||
|
gcc_unreachable ();
|
||||||
|
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gcc.c-torture/compile/20080812-1.c
|
||||||
|
@@ -0,0 +1,21 @@
|
||||||
|
+/* PR middle-end/37014 */
|
||||||
|
+
|
||||||
|
+void bar (signed char *);
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+foo (int x, int y)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+ signed char a[123], b[123], c;
|
||||||
|
+ for (i = 0; i < 123; i++)
|
||||||
|
+ {
|
||||||
|
+ int e = y - x;
|
||||||
|
+ int d = e < 0 ? -e : e;
|
||||||
|
+ c = d < 75;
|
||||||
|
+ a[y] = c;
|
||||||
|
+ b[y] = c;
|
||||||
|
+ y--;
|
||||||
|
+ }
|
||||||
|
+ bar (b);
|
||||||
|
+ bar (a);
|
||||||
|
+}
|
23
toolchain/gcc/patches/4.2.1/920-soft-float.patch
Normal file
23
toolchain/gcc/patches/4.2.1/920-soft-float.patch
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
http://bugs.uclibc.org/view.php?id=1588
|
||||||
|
|
||||||
|
diff -uNpr gcc-4.2.1_orig/gcc/config/rs6000/darwin-ldouble.c gcc-4.2.1/gcc/config/rs6000/darwin-ldouble.c
|
||||||
|
--- gcc-4.2.1_orig/gcc/config/rs6000/darwin-ldouble.c 2007-03-05 11:54:00.000000000 -0500
|
||||||
|
+++ gcc-4.2.1/gcc/config/rs6000/darwin-ldouble.c 2008-01-31 17:51:24.000000000 -0500
|
||||||
|
@@ -70,6 +70,8 @@ Software Foundation, 51 Franklin Street,
|
||||||
|
but GCC currently generates poor code when a union is used to turn
|
||||||
|
a long double into a pair of doubles. */
|
||||||
|
|
||||||
|
+#if defined (_SOFT_FLOAT) && defined (__LONG_DOUBLE_128__)
|
||||||
|
+
|
||||||
|
long double __gcc_qadd (double, double, double, double);
|
||||||
|
long double __gcc_qsub (double, double, double, double);
|
||||||
|
long double __gcc_qmul (double, double, double, double);
|
||||||
|
@@ -219,8 +221,6 @@ __gcc_qdiv (double a, double b, double c
|
||||||
|
return z.ldval;
|
||||||
|
}
|
||||||
|
|
||||||
|
-#if defined (_SOFT_FLOAT) && defined (__LONG_DOUBLE_128__)
|
||||||
|
-
|
||||||
|
long double __gcc_qneg (double, double);
|
||||||
|
int __gcc_qeq (double, double, double, double);
|
||||||
|
int __gcc_qne (double, double, double, double);
|
76
toolchain/gcc/patches/4.2.1/951-bug_37014.patch
Normal file
76
toolchain/gcc/patches/4.2.1/951-bug_37014.patch
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37014
|
||||||
|
|
||||||
|
--- a/gcc/dojump.c
|
||||||
|
+++ b/gcc/dojump.c
|
||||||
|
@@ -307,8 +307,6 @@
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- case TRUTH_ANDIF_EXPR:
|
||||||
|
- case TRUTH_ORIF_EXPR:
|
||||||
|
case COMPOUND_EXPR:
|
||||||
|
/* Lowered by gimplify.c. */
|
||||||
|
gcc_unreachable ();
|
||||||
|
@@ -518,6 +516,7 @@
|
||||||
|
if (BRANCH_COST >= 4 || TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 1)))
|
||||||
|
goto normal;
|
||||||
|
|
||||||
|
+ case TRUTH_ANDIF_EXPR:
|
||||||
|
if (if_false_label == NULL_RTX)
|
||||||
|
{
|
||||||
|
drop_through_label = gen_label_rtx ();
|
||||||
|
@@ -538,6 +537,7 @@
|
||||||
|
if (BRANCH_COST >= 4 || TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 1)))
|
||||||
|
goto normal;
|
||||||
|
|
||||||
|
+ case TRUTH_ORIF_EXPR:
|
||||||
|
if (if_true_label == NULL_RTX)
|
||||||
|
{
|
||||||
|
drop_through_label = gen_label_rtx ();
|
||||||
|
--- a/gcc/expr.c
|
||||||
|
+++ b/gcc/expr.c
|
||||||
|
@@ -8563,7 +8563,10 @@
|
||||||
|
/* If no set-flag instruction, must generate a conditional store
|
||||||
|
into a temporary variable. Drop through and handle this
|
||||||
|
like && and ||. */
|
||||||
|
-
|
||||||
|
+ /* Although TRUTH_{AND,OR}IF_EXPR aren't present in GIMPLE, they
|
||||||
|
+ are occassionally created by folding during expansion. */
|
||||||
|
+ case TRUTH_ANDIF_EXPR:
|
||||||
|
+ case TRUTH_ORIF_EXPR:
|
||||||
|
if (! ignore
|
||||||
|
&& (target == 0
|
||||||
|
|| modifier == EXPAND_STACK_PARM
|
||||||
|
@@ -8761,8 +8774,6 @@
|
||||||
|
case POSTDECREMENT_EXPR:
|
||||||
|
case LOOP_EXPR:
|
||||||
|
case EXIT_EXPR:
|
||||||
|
- case TRUTH_ANDIF_EXPR:
|
||||||
|
- case TRUTH_ORIF_EXPR:
|
||||||
|
/* Lowered by gimplify.c. */
|
||||||
|
gcc_unreachable ();
|
||||||
|
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gcc.c-torture/compile/20080812-1.c
|
||||||
|
@@ -0,0 +1,21 @@
|
||||||
|
+/* PR middle-end/37014 */
|
||||||
|
+
|
||||||
|
+void bar (signed char *);
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+foo (int x, int y)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+ signed char a[123], b[123], c;
|
||||||
|
+ for (i = 0; i < 123; i++)
|
||||||
|
+ {
|
||||||
|
+ int e = y - x;
|
||||||
|
+ int d = e < 0 ? -e : e;
|
||||||
|
+ c = d < 75;
|
||||||
|
+ a[y] = c;
|
||||||
|
+ b[y] = c;
|
||||||
|
+ y--;
|
||||||
|
+ }
|
||||||
|
+ bar (b);
|
||||||
|
+ bar (a);
|
||||||
|
+}
|
23
toolchain/gcc/patches/4.2.2/920-soft-float.patch
Normal file
23
toolchain/gcc/patches/4.2.2/920-soft-float.patch
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
http://bugs.uclibc.org/view.php?id=1588
|
||||||
|
|
||||||
|
diff -uNpr gcc-4.2.1_orig/gcc/config/rs6000/darwin-ldouble.c gcc-4.2.1/gcc/config/rs6000/darwin-ldouble.c
|
||||||
|
--- gcc-4.2.1_orig/gcc/config/rs6000/darwin-ldouble.c 2007-03-05 11:54:00.000000000 -0500
|
||||||
|
+++ gcc-4.2.1/gcc/config/rs6000/darwin-ldouble.c 2008-01-31 17:51:24.000000000 -0500
|
||||||
|
@@ -70,6 +70,8 @@ Software Foundation, 51 Franklin Street,
|
||||||
|
but GCC currently generates poor code when a union is used to turn
|
||||||
|
a long double into a pair of doubles. */
|
||||||
|
|
||||||
|
+#if defined (_SOFT_FLOAT) && defined (__LONG_DOUBLE_128__)
|
||||||
|
+
|
||||||
|
long double __gcc_qadd (double, double, double, double);
|
||||||
|
long double __gcc_qsub (double, double, double, double);
|
||||||
|
long double __gcc_qmul (double, double, double, double);
|
||||||
|
@@ -219,8 +221,6 @@ __gcc_qdiv (double a, double b, double c
|
||||||
|
return z.ldval;
|
||||||
|
}
|
||||||
|
|
||||||
|
-#if defined (_SOFT_FLOAT) && defined (__LONG_DOUBLE_128__)
|
||||||
|
-
|
||||||
|
long double __gcc_qneg (double, double);
|
||||||
|
int __gcc_qeq (double, double, double, double);
|
||||||
|
int __gcc_qne (double, double, double, double);
|
76
toolchain/gcc/patches/4.2.2/951-bug_37014.patch
Normal file
76
toolchain/gcc/patches/4.2.2/951-bug_37014.patch
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37014
|
||||||
|
|
||||||
|
--- a/gcc/dojump.c
|
||||||
|
+++ b/gcc/dojump.c
|
||||||
|
@@ -307,8 +307,6 @@
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- case TRUTH_ANDIF_EXPR:
|
||||||
|
- case TRUTH_ORIF_EXPR:
|
||||||
|
case COMPOUND_EXPR:
|
||||||
|
/* Lowered by gimplify.c. */
|
||||||
|
gcc_unreachable ();
|
||||||
|
@@ -518,6 +516,7 @@
|
||||||
|
if (BRANCH_COST >= 4 || TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 1)))
|
||||||
|
goto normal;
|
||||||
|
|
||||||
|
+ case TRUTH_ANDIF_EXPR:
|
||||||
|
if (if_false_label == NULL_RTX)
|
||||||
|
{
|
||||||
|
drop_through_label = gen_label_rtx ();
|
||||||
|
@@ -538,6 +537,7 @@
|
||||||
|
if (BRANCH_COST >= 4 || TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 1)))
|
||||||
|
goto normal;
|
||||||
|
|
||||||
|
+ case TRUTH_ORIF_EXPR:
|
||||||
|
if (if_true_label == NULL_RTX)
|
||||||
|
{
|
||||||
|
drop_through_label = gen_label_rtx ();
|
||||||
|
--- a/gcc/expr.c
|
||||||
|
+++ b/gcc/expr.c
|
||||||
|
@@ -8514,7 +8514,10 @@
|
||||||
|
/* If no set-flag instruction, must generate a conditional store
|
||||||
|
into a temporary variable. Drop through and handle this
|
||||||
|
like && and ||. */
|
||||||
|
-
|
||||||
|
+ /* Although TRUTH_{AND,OR}IF_EXPR aren't present in GIMPLE, they
|
||||||
|
+ are occassionally created by folding during expansion. */
|
||||||
|
+ case TRUTH_ANDIF_EXPR:
|
||||||
|
+ case TRUTH_ORIF_EXPR:
|
||||||
|
if (! ignore
|
||||||
|
&& (target == 0
|
||||||
|
|| modifier == EXPAND_STACK_PARM
|
||||||
|
@@ -8712,8 +8725,6 @@
|
||||||
|
case POSTDECREMENT_EXPR:
|
||||||
|
case LOOP_EXPR:
|
||||||
|
case EXIT_EXPR:
|
||||||
|
- case TRUTH_ANDIF_EXPR:
|
||||||
|
- case TRUTH_ORIF_EXPR:
|
||||||
|
/* Lowered by gimplify.c. */
|
||||||
|
gcc_unreachable ();
|
||||||
|
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gcc.c-torture/compile/20080812-1.c
|
||||||
|
@@ -0,0 +1,21 @@
|
||||||
|
+/* PR middle-end/37014 */
|
||||||
|
+
|
||||||
|
+void bar (signed char *);
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+foo (int x, int y)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+ signed char a[123], b[123], c;
|
||||||
|
+ for (i = 0; i < 123; i++)
|
||||||
|
+ {
|
||||||
|
+ int e = y - x;
|
||||||
|
+ int d = e < 0 ? -e : e;
|
||||||
|
+ c = d < 75;
|
||||||
|
+ a[y] = c;
|
||||||
|
+ b[y] = c;
|
||||||
|
+ y--;
|
||||||
|
+ }
|
||||||
|
+ bar (b);
|
||||||
|
+ bar (a);
|
||||||
|
+}
|
23
toolchain/gcc/patches/4.2.3/920-soft-float.patch
Normal file
23
toolchain/gcc/patches/4.2.3/920-soft-float.patch
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
http://bugs.uclibc.org/view.php?id=1588
|
||||||
|
|
||||||
|
diff -uNpr gcc-4.2.1_orig/gcc/config/rs6000/darwin-ldouble.c gcc-4.2.1/gcc/config/rs6000/darwin-ldouble.c
|
||||||
|
--- gcc-4.2.1_orig/gcc/config/rs6000/darwin-ldouble.c 2007-03-05 11:54:00.000000000 -0500
|
||||||
|
+++ gcc-4.2.1/gcc/config/rs6000/darwin-ldouble.c 2008-01-31 17:51:24.000000000 -0500
|
||||||
|
@@ -70,6 +70,8 @@ Software Foundation, 51 Franklin Street,
|
||||||
|
but GCC currently generates poor code when a union is used to turn
|
||||||
|
a long double into a pair of doubles. */
|
||||||
|
|
||||||
|
+#if defined (_SOFT_FLOAT) && defined (__LONG_DOUBLE_128__)
|
||||||
|
+
|
||||||
|
long double __gcc_qadd (double, double, double, double);
|
||||||
|
long double __gcc_qsub (double, double, double, double);
|
||||||
|
long double __gcc_qmul (double, double, double, double);
|
||||||
|
@@ -219,8 +221,6 @@ __gcc_qdiv (double a, double b, double c
|
||||||
|
return z.ldval;
|
||||||
|
}
|
||||||
|
|
||||||
|
-#if defined (_SOFT_FLOAT) && defined (__LONG_DOUBLE_128__)
|
||||||
|
-
|
||||||
|
long double __gcc_qneg (double, double);
|
||||||
|
int __gcc_qeq (double, double, double, double);
|
||||||
|
int __gcc_qne (double, double, double, double);
|
76
toolchain/gcc/patches/4.2.3/951-bug_37014.patch
Normal file
76
toolchain/gcc/patches/4.2.3/951-bug_37014.patch
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37014
|
||||||
|
|
||||||
|
--- a/gcc/dojump.c
|
||||||
|
+++ b/gcc/dojump.c
|
||||||
|
@@ -307,8 +307,6 @@
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- case TRUTH_ANDIF_EXPR:
|
||||||
|
- case TRUTH_ORIF_EXPR:
|
||||||
|
case COMPOUND_EXPR:
|
||||||
|
/* Lowered by gimplify.c. */
|
||||||
|
gcc_unreachable ();
|
||||||
|
@@ -518,6 +516,7 @@
|
||||||
|
if (BRANCH_COST >= 4 || TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 1)))
|
||||||
|
goto normal;
|
||||||
|
|
||||||
|
+ case TRUTH_ANDIF_EXPR:
|
||||||
|
if (if_false_label == NULL_RTX)
|
||||||
|
{
|
||||||
|
drop_through_label = gen_label_rtx ();
|
||||||
|
@@ -538,6 +537,7 @@
|
||||||
|
if (BRANCH_COST >= 4 || TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 1)))
|
||||||
|
goto normal;
|
||||||
|
|
||||||
|
+ case TRUTH_ORIF_EXPR:
|
||||||
|
if (if_true_label == NULL_RTX)
|
||||||
|
{
|
||||||
|
drop_through_label = gen_label_rtx ();
|
||||||
|
--- a/gcc/expr.c
|
||||||
|
+++ b/gcc/expr.c
|
||||||
|
@@ -8563,7 +8563,10 @@
|
||||||
|
/* If no set-flag instruction, must generate a conditional store
|
||||||
|
into a temporary variable. Drop through and handle this
|
||||||
|
like && and ||. */
|
||||||
|
-
|
||||||
|
+ /* Although TRUTH_{AND,OR}IF_EXPR aren't present in GIMPLE, they
|
||||||
|
+ are occassionally created by folding during expansion. */
|
||||||
|
+ case TRUTH_ANDIF_EXPR:
|
||||||
|
+ case TRUTH_ORIF_EXPR:
|
||||||
|
if (! ignore
|
||||||
|
&& (target == 0
|
||||||
|
|| modifier == EXPAND_STACK_PARM
|
||||||
|
@@ -8761,8 +8774,6 @@
|
||||||
|
case POSTDECREMENT_EXPR:
|
||||||
|
case LOOP_EXPR:
|
||||||
|
case EXIT_EXPR:
|
||||||
|
- case TRUTH_ANDIF_EXPR:
|
||||||
|
- case TRUTH_ORIF_EXPR:
|
||||||
|
/* Lowered by gimplify.c. */
|
||||||
|
gcc_unreachable ();
|
||||||
|
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gcc.c-torture/compile/20080812-1.c
|
||||||
|
@@ -0,0 +1,21 @@
|
||||||
|
+/* PR middle-end/37014 */
|
||||||
|
+
|
||||||
|
+void bar (signed char *);
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+foo (int x, int y)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+ signed char a[123], b[123], c;
|
||||||
|
+ for (i = 0; i < 123; i++)
|
||||||
|
+ {
|
||||||
|
+ int e = y - x;
|
||||||
|
+ int d = e < 0 ? -e : e;
|
||||||
|
+ c = d < 75;
|
||||||
|
+ a[y] = c;
|
||||||
|
+ b[y] = c;
|
||||||
|
+ y--;
|
||||||
|
+ }
|
||||||
|
+ bar (b);
|
||||||
|
+ bar (a);
|
||||||
|
+}
|
23
toolchain/gcc/patches/4.2.4/920-soft-float.patch
Normal file
23
toolchain/gcc/patches/4.2.4/920-soft-float.patch
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
http://bugs.uclibc.org/view.php?id=1588
|
||||||
|
|
||||||
|
diff -uNpr gcc-4.2.1_orig/gcc/config/rs6000/darwin-ldouble.c gcc-4.2.1/gcc/config/rs6000/darwin-ldouble.c
|
||||||
|
--- gcc-4.2.1_orig/gcc/config/rs6000/darwin-ldouble.c 2007-03-05 11:54:00.000000000 -0500
|
||||||
|
+++ gcc-4.2.1/gcc/config/rs6000/darwin-ldouble.c 2008-01-31 17:51:24.000000000 -0500
|
||||||
|
@@ -70,6 +70,8 @@ Software Foundation, 51 Franklin Street,
|
||||||
|
but GCC currently generates poor code when a union is used to turn
|
||||||
|
a long double into a pair of doubles. */
|
||||||
|
|
||||||
|
+#if defined (_SOFT_FLOAT) && defined (__LONG_DOUBLE_128__)
|
||||||
|
+
|
||||||
|
long double __gcc_qadd (double, double, double, double);
|
||||||
|
long double __gcc_qsub (double, double, double, double);
|
||||||
|
long double __gcc_qmul (double, double, double, double);
|
||||||
|
@@ -219,8 +221,6 @@ __gcc_qdiv (double a, double b, double c
|
||||||
|
return z.ldval;
|
||||||
|
}
|
||||||
|
|
||||||
|
-#if defined (_SOFT_FLOAT) && defined (__LONG_DOUBLE_128__)
|
||||||
|
-
|
||||||
|
long double __gcc_qneg (double, double);
|
||||||
|
int __gcc_qeq (double, double, double, double);
|
||||||
|
int __gcc_qne (double, double, double, double);
|
76
toolchain/gcc/patches/4.2.4/951-bug_37014.patch
Normal file
76
toolchain/gcc/patches/4.2.4/951-bug_37014.patch
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37014
|
||||||
|
|
||||||
|
--- a/gcc/dojump.c
|
||||||
|
+++ b/gcc/dojump.c
|
||||||
|
@@ -307,8 +307,6 @@
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- case TRUTH_ANDIF_EXPR:
|
||||||
|
- case TRUTH_ORIF_EXPR:
|
||||||
|
case COMPOUND_EXPR:
|
||||||
|
/* Lowered by gimplify.c. */
|
||||||
|
gcc_unreachable ();
|
||||||
|
@@ -518,6 +516,7 @@
|
||||||
|
if (BRANCH_COST >= 4 || TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 1)))
|
||||||
|
goto normal;
|
||||||
|
|
||||||
|
+ case TRUTH_ANDIF_EXPR:
|
||||||
|
if (if_false_label == NULL_RTX)
|
||||||
|
{
|
||||||
|
drop_through_label = gen_label_rtx ();
|
||||||
|
@@ -538,6 +537,7 @@
|
||||||
|
if (BRANCH_COST >= 4 || TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 1)))
|
||||||
|
goto normal;
|
||||||
|
|
||||||
|
+ case TRUTH_ORIF_EXPR:
|
||||||
|
if (if_true_label == NULL_RTX)
|
||||||
|
{
|
||||||
|
drop_through_label = gen_label_rtx ();
|
||||||
|
--- a/gcc/expr.c
|
||||||
|
+++ b/gcc/expr.c
|
||||||
|
@@ -8556,7 +8556,10 @@
|
||||||
|
/* If no set-flag instruction, must generate a conditional store
|
||||||
|
into a temporary variable. Drop through and handle this
|
||||||
|
like && and ||. */
|
||||||
|
-
|
||||||
|
+ /* Although TRUTH_{AND,OR}IF_EXPR aren't present in GIMPLE, they
|
||||||
|
+ are occassionally created by folding during expansion. */
|
||||||
|
+ case TRUTH_ANDIF_EXPR:
|
||||||
|
+ case TRUTH_ORIF_EXPR:
|
||||||
|
if (! ignore
|
||||||
|
&& (target == 0
|
||||||
|
|| modifier == EXPAND_STACK_PARM
|
||||||
|
@@ -8754,8 +8767,6 @@
|
||||||
|
case POSTDECREMENT_EXPR:
|
||||||
|
case LOOP_EXPR:
|
||||||
|
case EXIT_EXPR:
|
||||||
|
- case TRUTH_ANDIF_EXPR:
|
||||||
|
- case TRUTH_ORIF_EXPR:
|
||||||
|
/* Lowered by gimplify.c. */
|
||||||
|
gcc_unreachable ();
|
||||||
|
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gcc.c-torture/compile/20080812-1.c
|
||||||
|
@@ -0,0 +1,21 @@
|
||||||
|
+/* PR middle-end/37014 */
|
||||||
|
+
|
||||||
|
+void bar (signed char *);
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+foo (int x, int y)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+ signed char a[123], b[123], c;
|
||||||
|
+ for (i = 0; i < 123; i++)
|
||||||
|
+ {
|
||||||
|
+ int e = y - x;
|
||||||
|
+ int d = e < 0 ? -e : e;
|
||||||
|
+ c = d < 75;
|
||||||
|
+ a[y] = c;
|
||||||
|
+ b[y] = c;
|
||||||
|
+ y--;
|
||||||
|
+ }
|
||||||
|
+ bar (b);
|
||||||
|
+ bar (a);
|
||||||
|
+}
|
Loading…
Reference in a new issue