From 5722f0d37143eb7765d6f551569430b3f42252d4 Mon Sep 17 00:00:00 2001 From: Xing Li Date: Fri, 2 Dec 2022 15:43:21 +0800 Subject: [PATCH] LoongArch: Fixup some errors Rename mt-loongnix-gnu to mt-loongarch-gnu fixup atomic_exchange error Signed-off-by: Xing Li --- ...rch-Rename-config-file-for-loongarch.patch | 18 ++ ...x-atomic_exchange-expanding-PR107713.patch | 164 ++++++++++++++++++ gcc.spec | 10 +- 3 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 0002-LoongArch-Rename-config-file-for-loongarch.patch create mode 100644 LoongArch-Fix-atomic_exchange-expanding-PR107713.patch diff --git a/0002-LoongArch-Rename-config-file-for-loongarch.patch b/0002-LoongArch-Rename-config-file-for-loongarch.patch new file mode 100644 index 0000000..5a9a86b --- /dev/null +++ b/0002-LoongArch-Rename-config-file-for-loongarch.patch @@ -0,0 +1,18 @@ +From 104cc4a48954cac2aeab9fa4a32bbd3afc784e7e Mon Sep 17 00:00:00 2001 +From: Xing Li +Date: Tue, 1 Nov 2022 09:41:17 +0800 +Subject: [PATCH 2/2] LoongArch: Rename config file for loongarch + +Signed-off-by: Xing Li +--- + config/{mt-loongnix-gnu => mt-loongarch-gnu} | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + rename config/{mt-loongnix-gnu => mt-loongarch-gnu} (100%) + +diff --git a/config/mt-loongnix-gnu b/config/mt-loongarch-gnu +similarity index 100% +rename from config/mt-loongnix-gnu +rename to config/mt-loongarch-gnu +-- +2.27.0 + diff --git a/LoongArch-Fix-atomic_exchange-expanding-PR107713.patch b/LoongArch-Fix-atomic_exchange-expanding-PR107713.patch new file mode 100644 index 0000000..1660289 --- /dev/null +++ b/LoongArch-Fix-atomic_exchange-expanding-PR107713.patch @@ -0,0 +1,164 @@ +From 438fe2208b9a219e3a3d729f39a55c6831082181 Mon Sep 17 00:00:00 2001 +From: Xing Li +Date: Fri, 2 Dec 2022 10:35:54 +0800 +Subject: [PATCH] LoongArch: Fix atomic_exchange expanding [PR107713] + +We used to expand atomic_exchange_n(ptr, new, mem_order) for subword types +into something like: + + { + __typeof__(*ptr) t = atomic_load_n(ptr, mem_order); + atomic_compare_exchange_n(ptr, &t, new, true, mem_order, mem_order); + return t; + } + +It's incorrect because another thread may store a different value into *ptr +after atomic_load_n. Then atomic_compare_exchange_n will not store into +*ptr, but atomic_exchange_n should always perform the store. + +gcc/ChangeLog: + + PR target/107713 + * config/loongarch/sync.md + (atomic_cas_value_exchange_7_): New define_insn. + (atomic_exchange): Use atomic_cas_value_exchange_7_si instead of + atomic_cas_value_cmp_and_7_si. + +gcc/testsuite/ChangeLog: + + PR target/107713 + * gcc.target/loongarch/pr107713-1.c: New test. + * gcc.target/loongarch/pr107713-2.c: New test. + +Signed-off-by: Xing Li +Signed-off-by: Jinyang He +--- + gcc/config/loongarch/sync.md | 27 +++++++++- + .../gcc.target/loongarch/pr107713-1.c | 50 +++++++++++++++++++ + .../gcc.target/loongarch/pr107713-2.c | 9 ++++ + 3 files changed, 84 insertions(+), 2 deletions(-) + create mode 100644 gcc/testsuite/gcc.target/loongarch/pr107713-1.c + create mode 100644 gcc/testsuite/gcc.target/loongarch/pr107713-2.c + +diff --git a/gcc/config/loongarch/sync.md b/gcc/config/loongarch/sync.md +index e3eb43e16..5a16c4fa3 100644 +--- a/gcc/config/loongarch/sync.md ++++ b/gcc/config/loongarch/sync.md +@@ -461,6 +461,29 @@ + } + [(set (attr "length") (const_int 32))]) + ++(define_insn "atomic_cas_value_exchange_7_" ++ [(set (match_operand:GPR 0 "register_operand" "=&r") ++ (match_operand:GPR 1 "memory_operand" "+ZC")) ++ (set (match_dup 1) ++ (unspec_volatile:GPR [(match_operand:GPR 2 "reg_or_0_operand" "rJ") ++ (match_operand:GPR 3 "reg_or_0_operand" "rJ") ++ (match_operand:GPR 4 "reg_or_0_operand" "rJ") ++ (match_operand:GPR 5 "reg_or_0_operand" "rJ") ++ (match_operand:SI 6 "const_int_operand")] ;; model ++ UNSPEC_SYNC_EXCHANGE)) ++ (clobber (match_scratch:GPR 7 "=&r"))] ++ "" ++{ ++ return "%G6\\n\\t" ++ "1:\\n\\t" ++ "ll.\\t%0,%1\\n\\t" ++ "and\\t%7,%0,%z3\\n\\t" ++ "or%i5\\t%7,%7,%5\\n\\t" ++ "sc.\\t%7,%1\\n\\t" ++ "beqz\\t%7,1b\\n\\t"; ++} ++ [(set (attr "length") (const_int 20))]) ++ + (define_expand "atomic_exchange" + [(set (match_operand:SHORT 0 "register_operand") + (unspec_volatile:SHORT +@@ -472,11 +495,11 @@ + "" + { + union loongarch_gen_fn_ptrs generator; +- generator.fn_7 = gen_atomic_cas_value_cmp_and_7_si; ++ generator.fn_7 = gen_atomic_cas_value_exchange_7_si; + loongarch_expand_atomic_qihi (generator, + operands[0], + operands[1], +- operands[1], ++ const0_rtx, + operands[2], + operands[3]); + DONE; +diff --git a/gcc/testsuite/gcc.target/loongarch/pr107713-1.c b/gcc/testsuite/gcc.target/loongarch/pr107713-1.c +new file mode 100644 +index 000000000..c307bf87b +--- /dev/null ++++ b/gcc/testsuite/gcc.target/loongarch/pr107713-1.c +@@ -0,0 +1,50 @@ ++/* { dg-do run } */ ++/* { dg-require-effective-target pthread } */ ++/* { dg-options "-pthread" } */ ++ ++#include ++ ++char x, x1, x2; ++ ++void * ++work1 (void *none) ++{ ++ for (int i = 0; i < 100; i++) ++ x1 = __atomic_exchange_n (&x, x1, __ATOMIC_SEQ_CST); ++ return NULL; ++} ++ ++void * ++work2 (void *none) ++{ ++ for (int i = 0; i < 100; i++) ++ x2 = __atomic_exchange_n (&x, x2, __ATOMIC_SEQ_CST); ++ return NULL; ++} ++ ++void ++test (void) ++{ ++ x = 0; ++ x1 = 1; ++ x2 = 2; ++ pthread_t w1, w2; ++ if (pthread_create (&w1, NULL, work1, NULL) != 0) ++ __builtin_abort (); ++ if (pthread_create (&w2, NULL, work2, NULL) != 0) ++ __builtin_abort (); ++ if (pthread_join (w1, NULL) != 0) ++ __builtin_abort (); ++ if (pthread_join (w2, NULL) != 0) ++ __builtin_abort (); ++ if ((x ^ x1 ^ x2) != 3) ++ __builtin_abort (); ++} ++ ++int ++main () ++{ ++ int i; ++ for (i = 0; i < 10000; i++) ++ test (); ++} +diff --git a/gcc/testsuite/gcc.target/loongarch/pr107713-2.c b/gcc/testsuite/gcc.target/loongarch/pr107713-2.c +new file mode 100644 +index 000000000..82d44db3d +--- /dev/null ++++ b/gcc/testsuite/gcc.target/loongarch/pr107713-2.c +@@ -0,0 +1,9 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2" } */ ++/* { dg-final { scan-assembler-times "beq|bne" 1 } } */ ++ ++char ++t (char *p, char x) ++{ ++ return __atomic_exchange_n (p, x, __ATOMIC_RELAXED); ++} +-- +2.27.0 + diff --git a/gcc.spec b/gcc.spec index 82e5158..b4e229f 100644 --- a/gcc.spec +++ b/gcc.spec @@ -1,4 +1,4 @@ -%define anolis_release .0.2 +%define anolis_release .0.3 %global DATE 20210514 %global gitrev a3253c88425835d5b339d6998a1110a66ccd8b44 %global gcc_version 8.5.0 @@ -302,6 +302,8 @@ Patch10000: 0001-gcc-anolis-Rebrand-for-OpenAnolis.patch Patch1003: 0001-Add-LoongArch-support-for-anolis-a8-gcc.patch Patch1004: 0002-loongarch-fix-multilib-osdirnames-to-lib64.patch Patch1005: 0001-LoongArch-Fixup-configure-file-error.patch +Patch1006: 0002-LoongArch-Rename-config-file-for-loongarch.patch +Patch1007: LoongArch-Fix-atomic_exchange-expanding-PR107713.patch # On ARM EABI systems, we do want -gnueabi to be part of the @@ -930,6 +932,8 @@ rm -f gcc/testsuite/go.test/test/chan/goroutines.go %patch1003 -p1 %patch1004 -p1 %patch1005 -p1 +%patch1006 -p1 +%patch1007 -p1 %endif %build @@ -3236,6 +3240,10 @@ fi %endif %changelog +* Fri Dec 2 2022 Xing Li 8.5.0-10.1.0.3 +- rename mt file for LoongArch. (lixing@loongson.cn) +- Fixup LoongArch atomic_exchange error. (lixing@loongson.cn) + * Mon Oct 31 2022 Xing Li 8.5.0-10.1.0.2 - Fixup LoongArch configure file error. (lixing@loongson.cn) -- Gitee