diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2011-10-02 17:45:10 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2011-10-02 17:45:10 +0000 |
commit | 31045a25f33215ed30bfc4f7166c461a2cc92094 (patch) | |
tree | 642730cfd3b37021971ee340f695e284f6cc1711 /gcc | |
parent | 4762f56169a78b4a15e8c7b6bb96ed3ceedfcc4c (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/mips/sync.md | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr49696.c | 29 |
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); +} |