re PR target/39633 ([avr] loop bug: missing 8-bit comparison (*cmpqi))
authorGeorg-Johann Lay <avr@gjlay.de>
Mon, 11 Jul 2011 10:13:30 +0000 (10:13 +0000)
committerGeorg-Johann Lay <gjl@gcc.gnu.org>
Mon, 11 Jul 2011 10:13:30 +0000 (10:13 +0000)
gcc/
PR target/39633
* config/avr/avr.c (notice_update_cc): For ashiftrt:QI, only
offsets 1..5 set cc0 in a usable way.

testsuite/
PR target/39633
* gcc.target/avr/torture/pr39633.c: New test case.

From-SVN: r176141

gcc/ChangeLog
gcc/config/avr/avr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/avr/torture/pr39633.c [new file with mode: 0644]

index e43ef791e20b8f235ff6362bfb9bef99377aa829..95977050f4908c63cf1cf920939e2909a9498f6c 100644 (file)
@@ -1,3 +1,9 @@
+2011-07-11  Georg-Johann Lay  <avr@gjlay.de>
+       
+       PR target/39633
+       * config/avr/avr.c (notice_update_cc): For ashiftrt:QI, only
+       offsets 1..5 set cc0 in a usable way.
+
 2011-07-11  Romain Geissler  <romain.geissler@gmail.com>
 
        * tree.h (call_expr_arg): Remove.
index 5d1a127ea27480087f52409ba07400e119bc45ab..128706d677603a3217558a0e0f33485f310cb1b7 100644 (file)
@@ -1479,9 +1479,8 @@ notice_update_cc (rtx body ATTRIBUTE_UNUSED, rtx insn)
            {
              rtx x = XEXP (src, 1);
 
-             if (GET_CODE (x) == CONST_INT
-                 && INTVAL (x) > 0
-                 && INTVAL (x) != 6)
+             if (CONST_INT_P (x)
+                 && IN_RANGE (INTVAL (x), 1, 5))
                {
                  cc_status.value1 = SET_DEST (set);
                  cc_status.flags |= CC_OVERFLOW_UNUSABLE;
index 3ae096ec44f02eb0e2c6f7b49f33dd67b31a36e5..e87be0dc15070257358572f0b9714dbea7ee3536 100644 (file)
@@ -1,3 +1,8 @@
+2011-07-11  Georg-Johann Lay  <avr@gjlay.de>
+       
+       PR target/39633
+       * gcc.target/avr/torture/pr39633.c: New test case.
+
 2011-07-11  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/18918
diff --git a/gcc/testsuite/gcc.target/avr/torture/pr39633.c b/gcc/testsuite/gcc.target/avr/torture/pr39633.c
new file mode 100644 (file)
index 0000000..c5f5b04
--- /dev/null
@@ -0,0 +1,25 @@
+/* { dg-do run } */
+
+#include <stdlib.h>
+
+char c = 42;
+
+void __attribute__((noinline,noclone))
+pr39633 (char a)
+{
+  a >>= 7;
+  if (a)
+    c = a;
+}
+
+int main()
+{
+  pr39633 (6);
+
+  if (c != 42)
+    abort();
+
+  exit(0);
+    
+  return 0;
+}