gcc: add llvm-gcc and llvm from trunk (does not successfully compile a target yet...
[openwrt.git] / toolchain / gcc / patches / llvm / 951-bug_37014.patch
diff --git a/toolchain/gcc/patches/llvm/951-bug_37014.patch b/toolchain/gcc/patches/llvm/951-bug_37014.patch
new file mode 100644 (file)
index 0000000..9f8aaf7
--- /dev/null
@@ -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 @@ do_jump (tree exp, rtx if_false_label, r
+       break;
+       }
+-    case TRUTH_ANDIF_EXPR:
+-    case TRUTH_ORIF_EXPR:
+     case COMPOUND_EXPR:
+       /* Lowered by gimplify.c.  */
+       gcc_unreachable ();
+@@ -518,6 +516,7 @@ do_jump (tree exp, rtx if_false_label, r
+       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 @@ do_jump (tree exp, rtx if_false_label, r
+       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
+@@ -8634,7 +8634,10 @@ expand_expr_real_1 (tree exp, rtx target
+       /* 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
+@@ -8832,8 +8835,6 @@ expand_expr_real_1 (tree exp, rtx target
+     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);
++}
This page took 0.020421 seconds and 4 git commands to generate.