re PR rtl-optimization/46490 (ACATS c460007 fails at -O2 or above)
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 16 Nov 2010 22:30:19 +0000 (22:30 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 16 Nov 2010 22:30:19 +0000 (22:30 +0000)
PR rtl-optimization/46490
* combine.c (expand_compound_operation): Fix thinko.

From-SVN: r166830

gcc/ChangeLog
gcc/combine.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/opt12.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt12_pkg.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt12_pkg.ads [new file with mode: 0644]

index 50f9383..30d1e26 100644 (file)
@@ -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
index ee26c90..d55ce31 100644 (file)
@@ -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));
index afb99ff..10a7c3e 100644 (file)
@@ -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 (file)
index 0000000..e8b5c47
--- /dev/null
@@ -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 (file)
index 0000000..646c873
--- /dev/null
@@ -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 (file)
index 0000000..4defe2b
--- /dev/null
@@ -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;