summaryrefslogtreecommitdiff
path: root/recipes/gcc/gcc-4.3.1/debian/pr33148.dpatch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/gcc/gcc-4.3.1/debian/pr33148.dpatch')
-rw-r--r--recipes/gcc/gcc-4.3.1/debian/pr33148.dpatch94
1 files changed, 94 insertions, 0 deletions
diff --git a/recipes/gcc/gcc-4.3.1/debian/pr33148.dpatch b/recipes/gcc/gcc-4.3.1/debian/pr33148.dpatch
new file mode 100644
index 0000000000..bcf30ffb56
--- /dev/null
+++ b/recipes/gcc/gcc-4.3.1/debian/pr33148.dpatch
@@ -0,0 +1,94 @@
+#! /bin/sh -e
+
+# DP: Fix (neg (lt X 0)) optimization (PR rtl-optimization/33148)
+
+dir=
+if [ $# -eq 3 -a "$2" = '-d' ]; then
+ pdir="-d $3"
+ dir="$3/"
+elif [ $# -ne 1 ]; then
+ echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+ exit 1
+fi
+case "$1" in
+ -patch)
+ patch $pdir -f --no-backup-if-mismatch -p0 < $0
+ ;;
+ -unpatch)
+ patch $pdir -f --no-backup-if-mismatch -R -p0 < $0
+ ;;
+ *)
+ echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+ exit 1
+esac
+exit 0
+
+
+From: Jakub Jelinek <jakub@redhat.com>
+Sender: gcc-patches-owner@gcc.gnu.org
+To: gcc-patches@gcc.gnu.org
+Subject: [PATCH] Fix (neg (lt X 0)) optimization (PR rtl-optimization/33148)
+Date: Mon, 27 Aug 2007 07:22:44 -0400
+
+Hi!
+
+PR25600 change introduced an optimization of (neg (lt x 0)) to
+(ashirtrt x C), but it is not checking whether x's mode is suitable
+for it. As it checks that op1 is const0_rtx, I believe MODE_FLOAT
+or VECTOR_MODE_P modes are not a problem, CC modes can certainly appear
+in LT's first operand with second operand const0_rtx.
+So, when we optimize
+(neg:DI (lt:DI (reg:CC ...) (const_int 0)))
+we create something like
+(sign_extend:DI (ashirtrt:CC (reg:CC ...) (const_int 31)))
+which is IMHO invalid RTL, ashirtrt is documented on fixed point modes
+only (guess vector modes aren't listed just by omission) and so is
+sign_extend.
+
+Ok for 4.2/trunk?
+
+2007-08-27 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/33148
+ * simplify-rtx.c (simplify_unary_operation_1): Only optimize
+ (neg (lt X 0)) if X has scalar int mode.
+
+ * gcc.c-torture/compile/20070827-1.c: New test.
+
+--- gcc/simplify-rtx.c.jj 2007-08-27 10:15:33.000000000 +0200
++++ gcc/simplify-rtx.c 2007-08-27 12:12:51.000000000 +0200
+@@ -583,7 +583,8 @@ simplify_unary_operation_1 (enum rtx_cod
+ /* (neg (lt x 0)) is (ashiftrt X C) if STORE_FLAG_VALUE is 1. */
+ /* (neg (lt x 0)) is (lshiftrt X C) if STORE_FLAG_VALUE is -1. */
+ if (GET_CODE (op) == LT
+- && XEXP (op, 1) == const0_rtx)
++ && XEXP (op, 1) == const0_rtx
++ && SCALAR_INT_MODE_P (GET_MODE (XEXP (op, 0))))
+ {
+ enum machine_mode inner = GET_MODE (XEXP (op, 0));
+ int isize = GET_MODE_BITSIZE (inner);
+--- gcc/testsuite/gcc.c-torture/compile/20070827-1.c.jj 2007-08-27 12:17:20.000000000 +0200
++++ gcc/testsuite/gcc.c-torture/compile/20070827-1.c 2007-08-27 12:15:45.000000000 +0200
+@@ -0,0 +1,20 @@
++/* PR rtl-optimization/33148 */
++
++int
++foo (unsigned int *p, int *q, unsigned int w, unsigned int b)
++{
++ unsigned int i;
++ int mask;
++
++ if (q[0] < q[1])
++ mask = 0xff;
++ else
++ mask = 0;
++
++ for (i = 0; 8 * i < w; i++)
++ {
++ b ^= mask;
++ *p++ = b;
++ }
++ return 0;
++}
+
+ Jakub