From 31045a25f33215ed30bfc4f7166c461a2cc92094 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Sun, 2 Oct 2011 17:45:10 +0000 Subject: [PATCH] re PR target/49696 (ICE on mips when compiling drizzle) gcc/ PR target/49696 * config/mips/sync.md (sync__12): Allow zero operands. (sync_old__12, sync_new__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 --- gcc/ChangeLog | 7 +++++++ gcc/config/mips/sync.md | 14 +++++++------- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/pr49696.c | 29 +++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr49696.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4aa277aac4b..b8197fa033c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2011-10-02 Richard Sandiford + + PR target/49696 + * config/mips/sync.md (sync__12): Allow zero operands. + (sync_old__12, sync_new__12, sync_nand_12): Likewise. + (sync_old_nand_12, sync_new_nand_12, test_and_set_12): Likewise. + 2011-10-02 Jan Hubicka * cgraphunit.c (verify_edge_count_and_frequency): Bounds check. diff --git a/gcc/config/mips/sync.md b/gcc/config/mips/sync.md index b3098b434ed..1b4097ec225 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 37a71e5e4d8..56a9cc1f4c2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-10-02 Richard Sandiford + + * gcc.dg/pr49696.c: New test. + 2011-10-02 Jan Hubicka * 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 00000000000..8e5a018fc02 --- /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); +}