aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2011-10-02 17:45:10 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2011-10-02 17:45:10 +0000
commit31045a25f33215ed30bfc4f7166c461a2cc92094 (patch)
tree642730cfd3b37021971ee340f695e284f6cc1711 /gcc
parent4762f56169a78b4a15e8c7b6bb96ed3ceedfcc4c (diff)
downloadgcc-31045a25f33215ed30bfc4f7166c461a2cc92094.zip
gcc-31045a25f33215ed30bfc4f7166c461a2cc92094.tar.gz
gcc-31045a25f33215ed30bfc4f7166c461a2cc92094.tar.bz2
re PR target/49696 (ICE on mips when compiling drizzle)
gcc/ PR target/49696 * config/mips/sync.md (sync_<optab>_12): Allow zero operands. (sync_old_<optab>_12, sync_new_<optab>_12, sync_nand_12): Likewise. (sync_old_nand_12, sync_new_nand_12, test_and_set_12): Likewise. gcc/testsuite/ * gcc.dg/pr49696.c: New test. From-SVN: r179431
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/mips/sync.md14
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/pr49696.c29
4 files changed, 47 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4aa277a..b8197fa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2011-10-02 Richard Sandiford <rdsandiford@googlemail.com>
+
+ PR target/49696
+ * config/mips/sync.md (sync_<optab>_12): Allow zero operands.
+ (sync_old_<optab>_12, sync_new_<optab>_12, sync_nand_12): Likewise.
+ (sync_old_nand_12, sync_new_nand_12, test_and_set_12): Likewise.
+
2011-10-02 Jan Hubicka <jh@suse.cz>
* cgraphunit.c (verify_edge_count_and_frequency): Bounds check.
diff --git a/gcc/config/mips/sync.md b/gcc/config/mips/sync.md
index b3098b4..1b4097e 100644
--- a/gcc/config/mips/sync.md
+++ b/gcc/config/mips/sync.md
@@ -136,7 +136,7 @@
[(match_operand:SI 1 "register_operand" "d")
(match_operand:SI 2 "register_operand" "d")
(atomic_hiqi_op:SI (match_dup 0)
- (match_operand:SI 3 "register_operand" "dJ"))]
+ (match_operand:SI 3 "reg_or_0_operand" "dJ"))]
UNSPEC_SYNC_OLD_OP_12))
(clobber (match_scratch:SI 4 "=&d"))]
"GENERATE_LL_SC"
@@ -177,7 +177,7 @@
[(match_operand:SI 2 "register_operand" "d")
(match_operand:SI 3 "register_operand" "d")
(atomic_hiqi_op:SI (match_dup 0)
- (match_operand:SI 4 "register_operand" "dJ"))]
+ (match_operand:SI 4 "reg_or_0_operand" "dJ"))]
UNSPEC_SYNC_OLD_OP_12))
(clobber (match_scratch:SI 5 "=&d"))]
"GENERATE_LL_SC"
@@ -218,7 +218,7 @@
(match_operand:SI 2 "register_operand" "d")
(match_operand:SI 3 "register_operand" "d")
(atomic_hiqi_op:SI (match_dup 0)
- (match_operand:SI 4 "register_operand" "dJ"))]
+ (match_operand:SI 4 "reg_or_0_operand" "dJ"))]
UNSPEC_SYNC_NEW_OP_12))
(set (match_dup 1)
(unspec_volatile:SI
@@ -259,7 +259,7 @@
[(match_operand:SI 1 "register_operand" "d")
(match_operand:SI 2 "register_operand" "d")
(match_dup 0)
- (match_operand:SI 3 "register_operand" "dJ")]
+ (match_operand:SI 3 "reg_or_0_operand" "dJ")]
UNSPEC_SYNC_OLD_OP_12))
(clobber (match_scratch:SI 4 "=&d"))]
"GENERATE_LL_SC"
@@ -298,7 +298,7 @@
(unspec_volatile:SI
[(match_operand:SI 2 "register_operand" "d")
(match_operand:SI 3 "register_operand" "d")
- (match_operand:SI 4 "register_operand" "dJ")]
+ (match_operand:SI 4 "reg_or_0_operand" "dJ")]
UNSPEC_SYNC_OLD_OP_12))
(clobber (match_scratch:SI 5 "=&d"))]
"GENERATE_LL_SC"
@@ -337,7 +337,7 @@
[(match_operand:SI 1 "memory_operand" "+R")
(match_operand:SI 2 "register_operand" "d")
(match_operand:SI 3 "register_operand" "d")
- (match_operand:SI 4 "register_operand" "dJ")]
+ (match_operand:SI 4 "reg_or_0_operand" "dJ")]
UNSPEC_SYNC_NEW_OP_12))
(set (match_dup 1)
(unspec_volatile:SI
@@ -546,7 +546,7 @@
(set (match_dup 1)
(unspec_volatile:SI [(match_operand:SI 2 "register_operand" "d")
(match_operand:SI 3 "register_operand" "d")
- (match_operand:SI 4 "arith_operand" "dJ")]
+ (match_operand:SI 4 "reg_or_0_operand" "dJ")]
UNSPEC_SYNC_EXCHANGE_12))]
"GENERATE_LL_SC"
{ return mips_output_sync_loop (insn, operands); }
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 37a71e5..56a9cc1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2011-10-02 Richard Sandiford <rdsandiford@googlemail.com>
+
+ * gcc.dg/pr49696.c: New test.
+
2011-10-02 Jan Hubicka <jh@suse.cz>
* gcc.dg/ipa/ctor-empty-1.c: Update dump file.
diff --git a/gcc/testsuite/gcc.dg/pr49696.c b/gcc/testsuite/gcc.dg/pr49696.c
new file mode 100644
index 0000000..8e5a018
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr49696.c
@@ -0,0 +1,29 @@
+/* { dg-require-effective-target sync_char_short } */
+
+/* { dg-message "note: '__sync_fetch_and_nand' changed semantics in GCC 4.4" "" { target *-*-* } 0 } */
+
+void
+foo (short *x)
+{
+ __sync_val_compare_and_swap (x, 1, 0);
+ __sync_bool_compare_and_swap (x, 1, 0);
+ __sync_lock_test_and_set (x, 0);
+
+ __sync_fetch_and_add (x, 0);
+ __sync_fetch_and_add (x, 0);
+ __sync_fetch_and_add (x, 0);
+ __sync_fetch_and_sub (x, 0);
+ __sync_fetch_and_and (x, 0);
+ __sync_fetch_and_or (x, 0);
+ __sync_fetch_and_xor (x, 0);
+ __sync_fetch_and_nand (x, 0);
+
+ __sync_add_and_fetch (x, 0);
+ __sync_add_and_fetch (x, 0);
+ __sync_add_and_fetch (x, 0);
+ __sync_sub_and_fetch (x, 0);
+ __sync_and_and_fetch (x, 0);
+ __sync_or_and_fetch (x, 0);
+ __sync_xor_and_fetch (x, 0);
+ __sync_nand_and_fetch (x, 0);
+}