]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/44481 (__builtin_parity() causes ICE in trunc_int_for_mode())
authorUros Bizjak <ubizjak@gmail.com>
Sun, 13 Jun 2010 08:51:51 +0000 (10:51 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Sun, 13 Jun 2010 08:51:51 +0000 (10:51 +0200)
PR target/44481
* config/i386/i386.md (UNSPEC_PARITY): New unspec.
(paritydi2_cmp): Use UNSPEC_PARITY unspec insted of parity RTX.
(partiysi2_cmp): Ditto.
(*partiyhi2_cmp): Ditto.
(*parityqi2_cmp): Remove.

testsuite/ChangeLog:

PR target/44481
* gcc.target/i386/pr44481.c: New test.

From-SVN: r160672

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr44481.c [new file with mode: 0644]

index 26aadfa1c8d17aa3c62940f4e02527745001d6df..f831d45445748e6747af3aa1dc04ee747ece4de2 100644 (file)
@@ -1,3 +1,12 @@
+2010-06-13  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/44481
+       * config/i386/i386.md (UNSPEC_PARITY): New unspec.
+       (paritydi2_cmp): Use UNSPEC_PARITY unspec insted of parity RTX.
+       (partiysi2_cmp): Ditto.
+       (*partiyhi2_cmp): Ditto.
+       (*parityqi2_cmp): Remove.
+
 2010-06-08  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.md (*movsi_1) <TYPE_LEA>: Use %a modifier
index 990c4715bc05eb4ab6da268348843a1785c12cb5..a523bc9923f67ea4ebfd270fe505e99fb76b0a71 100644 (file)
    (UNSPEC_TLSDESC             23)
 
    ; Other random patterns
+   (UNSPEC_EH_RETURN           29)
    (UNSPEC_SCAS                        30)
    (UNSPEC_FNSTSW              31)
    (UNSPEC_SAHF                        32)
-   (UNSPEC_FSTCW               33)
-   (UNSPEC_ADD_CARRY           34)
-   (UNSPEC_FLDCW               35)
-   (UNSPEC_REP                 36)
-   (UNSPEC_EH_RETURN           37)
+   (UNSPEC_PARITY              33)
+   (UNSPEC_FSTCW               34)
+   (UNSPEC_ADD_CARRY           35)
+   (UNSPEC_FLDCW               36)
+   (UNSPEC_REP                 37)
    (UNSPEC_LD_MPIC             38)     ; load_macho_picbase
    (UNSPEC_TRUNC_NOOP          39)
 
 
 (define_insn_and_split "paritydi2_cmp"
   [(set (reg:CC FLAGS_REG)
-       (parity:CC (match_operand:DI 3 "register_operand" "0")))
+       (unspec:CC [(match_operand:DI 3 "register_operand" "0")]
+                  UNSPEC_PARITY))
    (clobber (match_scratch:DI 0 "=r"))
    (clobber (match_scratch:SI 1 "=&r"))
    (clobber (match_scratch:HI 2 "=Q"))]
       (clobber (reg:CC FLAGS_REG))])
    (parallel
      [(set (reg:CC FLAGS_REG)
-          (parity:CC (match_dup 1)))
+          (unspec:CC [(match_dup 1)] UNSPEC_PARITY))
       (clobber (match_dup 1))
       (clobber (match_dup 2))])]
 {
 
 (define_insn_and_split "paritysi2_cmp"
   [(set (reg:CC FLAGS_REG)
-       (parity:CC (match_operand:SI 2 "register_operand" "0")))
+       (unspec:CC [(match_operand:SI 2 "register_operand" "0")]
+                  UNSPEC_PARITY))
    (clobber (match_scratch:SI 0 "=r"))
    (clobber (match_scratch:HI 1 "=&Q"))]
   "! TARGET_POPCNT"
       (clobber (reg:CC FLAGS_REG))])
    (parallel
      [(set (reg:CC FLAGS_REG)
-          (parity:CC (match_dup 1)))
+          (unspec:CC [(match_dup 1)] UNSPEC_PARITY))
       (clobber (match_dup 1))])]
 {
   operands[3] = gen_lowpart (HImode, operands[2]);
 
 (define_insn "*parityhi2_cmp"
   [(set (reg:CC FLAGS_REG)
-       (parity:CC (match_operand:HI 1 "register_operand" "0")))
+       (unspec:CC [(match_operand:HI 1 "register_operand" "0")]
+                  UNSPEC_PARITY))
    (clobber (match_scratch:HI 0 "=Q"))]
   "! TARGET_POPCNT"
   "xor{b}\t{%h0, %b0|%b0, %h0}"
   [(set_attr "length" "2")
    (set_attr "mode" "HI")])
-
-(define_insn "*parityqi2_cmp"
-  [(set (reg:CC FLAGS_REG)
-       (parity:CC (match_operand:QI 0 "register_operand" "q")))]
-  "! TARGET_POPCNT"
-  "test{b}\t%0, %0"
-  [(set_attr "length" "2")
-   (set_attr "mode" "QI")])
 \f
 ;; Thread-local storage patterns for ELF.
 ;;
index a646a165a3ea63e4ff942c1ac692ac26997c8841..44021f1cdd12f1aec53dbc419c0ebc142d7873c8 100644 (file)
@@ -1,3 +1,8 @@
+2010-06-13  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/44481
+       * gcc.target/i386/pr44481.c: New test.
+
 2010-05-27  Jason Merrill  <jason@redhat.com>
 
        PR c++/43555
diff --git a/gcc/testsuite/gcc.target/i386/pr44481.c b/gcc/testsuite/gcc.target/i386/pr44481.c
new file mode 100644 (file)
index 0000000..701268b
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+static inline unsigned
+parity (unsigned x)
+{
+  return (unsigned) __builtin_parity (x);
+}
+
+unsigned
+f (unsigned rpoly)
+{
+  return parity (rpoly & 1) ^ parity (rpoly & 6);
+}