re PR rtl-optimization/6822 (GCC 3.1.1 - Internal compiler error in extract_insn...
authorRichard Henderson <rth@redhat.com>
Thu, 30 May 2002 23:08:27 +0000 (16:08 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Thu, 30 May 2002 23:08:27 +0000 (16:08 -0700)
        PR optimization/6822
        * config/i386/i386.c (ix86_expand_int_movcc): Don't cast INTVAL
        to unsigned int for op1 comparisons.  Use gen_int_mode.

* gcc.c-torture/compile/20020530-1.c: New.

Co-Authored-By: Eric Botcazou <ebotcazou@multimania.com>
From-SVN: r54076

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/gcc.c-torture/compile/20020530-1.c [new file with mode: 0644]

index 07443b6363b56d6777b44f609b4fecbef5bbd8f7..b53bcf60fcc5ac5613efdfa455c51a0efff36c1e 100644 (file)
@@ -1,3 +1,10 @@
+2002-05-30  Richard Henderson  <rth@redhat.com>
+           Eric Botcazou  <ebotcazou@multimania.com>
+
+       PR optimization/6822
+       * config/i386/i386.c (ix86_expand_int_movcc): Don't cast INTVAL
+       to unsigned int for op1 comparisons.  Use gen_int_mode.
+
 2002-05-30  Eric Botcazou  <ebotcazou@multimania.com>
 
        * expmed.c (const_mult_add_overflow_p): New.
index f89d1630bb9829dce5cd5cdc55d626c59c3a285f..3486046c3ddfd4e0ada569aa82528b3ddf6e4564 100644 (file)
@@ -8677,11 +8677,12 @@ ix86_expand_int_movcc (operands)
   if ((code == LEU || code == GTU)
       && GET_CODE (ix86_compare_op1) == CONST_INT
       && mode != HImode
-      && (unsigned int) INTVAL (ix86_compare_op1) != 0xffffffff
-      /* The operand still must be representable as sign extended value.  */
+      && INTVAL (ix86_compare_op1) != -1
+      /* For x86-64, the immediate field in the instruction is 32-bit
+        signed, so we can't increment a DImode value above 0x7fffffff.  */
       && (!TARGET_64BIT
          || GET_MODE (ix86_compare_op0) != DImode
-         || (unsigned int) INTVAL (ix86_compare_op1) != 0x7fffffff)
+         || INTVAL (ix86_compare_op1) != 0x7fffffff)
       && GET_CODE (operands[2]) == CONST_INT
       && GET_CODE (operands[3]) == CONST_INT)
     {
@@ -8689,9 +8690,8 @@ ix86_expand_int_movcc (operands)
        code = LTU;
       else
        code = GEU;
-      ix86_compare_op1
-       = gen_int_mode (INTVAL (ix86_compare_op1) + 1,
-                       GET_MODE (ix86_compare_op0));
+      ix86_compare_op1 = gen_int_mode (INTVAL (ix86_compare_op1) + 1,
+                                      GET_MODE (ix86_compare_op0));
     }
 
   start_sequence ();
diff --git a/gcc/testsuite/gcc.c-torture/compile/20020530-1.c b/gcc/testsuite/gcc.c-torture/compile/20020530-1.c
new file mode 100644 (file)
index 0000000..a679489
--- /dev/null
@@ -0,0 +1,16 @@
+/* PR optimization/6822 */
+
+extern unsigned char foo1 (void);
+extern unsigned short foo2 (void);
+
+int bar1 (void)
+{
+  unsigned char q = foo1 ();
+  return (q < 0x80) ? 64 : 0;
+}
+
+int bar2 (void)
+{
+  unsigned short h = foo2 ();
+  return (h < 0x8000) ? 64 : 0;
+}