aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-03-20 13:44:18 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-03-20 13:44:18 +0000
commitd491d2af314a455227666dd245dc27ea0dfdea8e (patch)
tree4b97c99c8dd9e98f9e5f57b7f470ee45624f13c1 /gcc
parent39bac0102c930a6d38486f5716793d531dc90302 (diff)
downloadgcc-d491d2af314a455227666dd245dc27ea0dfdea8e.zip
gcc-d491d2af314a455227666dd245dc27ea0dfdea8e.tar.gz
gcc-d491d2af314a455227666dd245dc27ea0dfdea8e.tar.bz2
re PR rtl-optimization/43438 (possible wrong code bug)
2010-03-20 Richard Guenther <rguenther@suse.de> PR rtl-optimization/43438 * combine.c (make_extraction): Properly zero-/sign-extend an extraction of the low part of a CONST_INT. Also handle CONST_DOUBLE. * gcc.c-torture/execute/pr43438.c: New testcase. From-SVN: r157592
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/execute/pr43438.c23
4 files changed, 39 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 77cc3ce..d753fb3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2010-03-20 Richard Guenther <rguenther@suse.de>
+
+ PR rtl-optimization/43438
+ * combine.c (make_extraction): Properly zero-/sign-extend an
+ extraction of the low part of a CONST_INT. Also handle
+ CONST_DOUBLE.
+
2010-03-19 Mike Stump <mikestump@comcast.net>
* config/i386/darwin.h (SUBTARGET32_DEFAULT_CPU): Add.
diff --git a/gcc/combine.c b/gcc/combine.c
index f4f2fa0..a5240c9 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -6793,8 +6793,10 @@ make_extraction (enum machine_mode mode, rtx inner, HOST_WIDE_INT pos,
if (mode == tmode)
return new_rtx;
- if (CONST_INT_P (new_rtx))
- return gen_int_mode (INTVAL (new_rtx), mode);
+ if (CONST_INT_P (new_rtx)
+ || GET_CODE (new_rtx) == CONST_DOUBLE)
+ return simplify_unary_operation (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
+ mode, new_rtx, tmode);
/* If we know that no extraneous bits are set, and that the high
bit is not set, convert the extraction to the cheaper of
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f0d88f0..22ea531 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-03-20 Richard Guenther <rguenther@suse.de>
+
+ PR rtl-optimization/43438
+ * gcc.c-torture/execute/pr43438.c: New testcase.
+
2010-03-20 Dodji Seketeli <dodji@redhat.com>
PR c++/43375
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr43438.c b/gcc/testsuite/gcc.c-torture/execute/pr43438.c
new file mode 100644
index 0000000..aa901ce
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr43438.c
@@ -0,0 +1,23 @@
+extern void abort (void);
+
+static unsigned char g_2 = 1;
+static int g_9;
+static int *l_8 = &g_9;
+
+static void func_12(int p_13)
+{
+ int * l_17 = &g_9;
+ *l_17 &= 0 < p_13;
+}
+
+int main(void)
+{
+ unsigned char l_11 = 254;
+ *l_8 |= g_2;
+ l_11 |= *l_8;
+ func_12(l_11);
+ if (g_9 != 1)
+ abort ();
+ return 0;
+}
+