aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2010-11-16 22:30:19 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2010-11-16 22:30:19 +0000
commita05c8f23516bdeec9f2bfa3092f031b081405aaa (patch)
tree1798120234e788be245c8b883c0ab40e1499142f /gcc
parentcfc76ec4d063ce5c7b80db4a3466f7974b0a554b (diff)
downloadgcc-a05c8f23516bdeec9f2bfa3092f031b081405aaa.zip
gcc-a05c8f23516bdeec9f2bfa3092f031b081405aaa.tar.gz
gcc-a05c8f23516bdeec9f2bfa3092f031b081405aaa.tar.bz2
re PR rtl-optimization/46490 (ACATS c460007 fails at -O2 or above)
PR rtl-optimization/46490 * combine.c (expand_compound_operation): Fix thinko. From-SVN: r166830
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/combine.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gnat.dg/opt12.adb18
-rw-r--r--gcc/testsuite/gnat.dg/opt12_pkg.adb8
-rw-r--r--gcc/testsuite/gnat.dg/opt12_pkg.ads11
6 files changed, 50 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 50f9383..30d1e26 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2010-11-16 Eric Botcazou <ebotcazou@adacore.com>
+
+ PR rtl-optimization/46490
+ * combine.c (expand_compound_operation): Fix thinko.
+
2010-11-16 Richard Henderson <rth@redhat.com>
PR target/46470
diff --git a/gcc/combine.c b/gcc/combine.c
index ee26c90..d55ce31 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -6761,11 +6761,11 @@ expand_compound_operation (rtx x)
count. This can happen in a case like (x >> 31) & 255 on machines
that can't shift by a constant. On those machines, we would first
combine the shift with the AND to produce a variable-position
- extraction. Then the constant of 31 would be substituted in to produce
- a such a position. */
+ extraction. Then the constant of 31 would be substituted in
+ to produce such a position. */
modewidth = GET_MODE_BITSIZE (GET_MODE (x));
- if (modewidth + len >= pos)
+ if (modewidth >= pos + len)
{
enum machine_mode mode = GET_MODE (x);
tem = gen_lowpart (mode, XEXP (x, 0));
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index afb99ff..10a7c3e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2010-11-16 Eric Botcazou <ebotcazou@adacore.com>
+ * gnat.dg/opt12.adb: New test.
+ * gnat.dg/opt12_pkg.ad[sb]: New helper.
+
+2010-11-16 Eric Botcazou <ebotcazou@adacore.com>
+
* gcc.target/rx/pack.c: New test.
2010-11-16 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
diff --git a/gcc/testsuite/gnat.dg/opt12.adb b/gcc/testsuite/gnat.dg/opt12.adb
new file mode 100644
index 0000000..e8b5c47
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/opt12.adb
@@ -0,0 +1,18 @@
+-- { dg-do run }
+-- { dg-options "-O2" }
+
+with Opt12_Pkg; use Opt12_Pkg;
+
+procedure Opt12 is
+
+ Static_Target : Static_Integer_Subtype;
+
+begin
+
+ Static_Target := Static_Integer_Subtype(Fix_Half);
+
+ if not Equal(Static_Target, 1) then
+ raise Program_Error;
+ end if;
+
+end Opt12;
diff --git a/gcc/testsuite/gnat.dg/opt12_pkg.adb b/gcc/testsuite/gnat.dg/opt12_pkg.adb
new file mode 100644
index 0000000..646c873
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/opt12_pkg.adb
@@ -0,0 +1,8 @@
+package body Opt12_Pkg is
+
+ function Equal (L, R: Static_Integer_Subtype) return Boolean is
+ begin
+ return (L = R);
+ end;
+
+end Opt12_Pkg;
diff --git a/gcc/testsuite/gnat.dg/opt12_pkg.ads b/gcc/testsuite/gnat.dg/opt12_pkg.ads
new file mode 100644
index 0000000..4defe2b
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/opt12_pkg.ads
@@ -0,0 +1,11 @@
+package Opt12_Pkg is
+
+ type Static_Integer_Subtype is range -32_000 .. 32_000;
+
+ function Equal (L, R: Static_Integer_Subtype) return Boolean;
+
+ type My_Fixed is delta 0.1 range -5.0 .. 5.0;
+
+ Fix_Half : My_Fixed := 0.5;
+
+end Opt12_Pkg;