From 356c32e2f4b9d44140a8333da5381813f9aad516 Mon Sep 17 00:00:00 2001 From: Matthew Wahab Date: Fri, 14 Aug 2015 15:05:42 +0000 Subject: [PATCH] re PR target/67143 (ICE (could not split insn) on aarch64-linux-gnu) gcc/ 2015-08-14 Matthew Wahab PR target/67143 * config/aarch64/atomics.md (atomic_): Replace 'lconst_atomic' with 'const_atomic'. (atomic_fetch_): Likewise. (atomic__fetch): Likewise. * config/aarch64/iterators.md (lconst-atomic): Move below 'const_atomic'. (const_atomic): New. gcc/testsuite/ 2015-08-14 Matthew Wahab Matthias Klose PR target/67143 * gcc.c-torture/compile/pr67143.c: New * gcc.target/aarch64/atomic-op-imm.c (atomic_fetch_add_negative_RELAXED): New. (atomic_fetch_sub_negative_ACQUIRE): New. Co-Authored-By: Matthias Klose From-SVN: r226895 --- gcc/ChangeLog | 11 ++++++++++ gcc/config/aarch64/atomics.md | 6 +++--- gcc/config/aarch64/iterators.md | 13 +++++++++--- gcc/testsuite/ChangeLog | 9 ++++++++ gcc/testsuite/gcc.c-torture/compile/pr67143.c | 21 +++++++++++++++++++ .../gcc.target/aarch64/atomic-op-imm.c | 14 ++++++++++++- 6 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr67143.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 154c0778c53..afade5dfea4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2015-08-14 Matthew Wahab + + PR target/67143 + * config/aarch64/atomics.md (atomic_): Replace + 'lconst_atomic' with 'const_atomic'. + (atomic_fetch_): Likewise. + (atomic__fetch): Likewise. + * config/aarch64/iterators.md (lconst-atomic): Move below + 'const_atomic'. + (const_atomic): New. + 2015-08-14 Thomas Schwinge Bernd Schmidt diff --git a/gcc/config/aarch64/atomics.md b/gcc/config/aarch64/atomics.md index 7082f619696..65d2cc911be 100644 --- a/gcc/config/aarch64/atomics.md +++ b/gcc/config/aarch64/atomics.md @@ -171,7 +171,7 @@ [(set (match_operand:ALLI 0 "aarch64_sync_memory_operand" "+Q") (unspec_volatile:ALLI [(atomic_op:ALLI (match_dup 0) - (match_operand:ALLI 1 "" "r")) + (match_operand:ALLI 1 "" "r")) (match_operand:SI 2 "const_int_operand")] ;; model UNSPECV_ATOMIC_OP)) (clobber (reg:CC CC_REGNUM)) @@ -216,7 +216,7 @@ (set (match_dup 1) (unspec_volatile:ALLI [(atomic_op:ALLI (match_dup 1) - (match_operand:ALLI 2 "" "r")) + (match_operand:ALLI 2 "" "r")) (match_operand:SI 3 "const_int_operand")] ;; model UNSPECV_ATOMIC_OP)) (clobber (reg:CC CC_REGNUM)) @@ -261,7 +261,7 @@ [(set (match_operand:ALLI 0 "register_operand" "=&r") (atomic_op:ALLI (match_operand:ALLI 1 "aarch64_sync_memory_operand" "+Q") - (match_operand:ALLI 2 "" "r"))) + (match_operand:ALLI 2 "" "r"))) (set (match_dup 1) (unspec_volatile:ALLI [(match_dup 1) (match_dup 2) diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md index 5d7966d7adf..b8a45d1d6ed 100644 --- a/gcc/config/aarch64/iterators.md +++ b/gcc/config/aarch64/iterators.md @@ -345,9 +345,6 @@ ;; Attribute to describe constants acceptable in logical operations (define_mode_attr lconst [(SI "K") (DI "L")]) -;; Attribute to describe constants acceptable in atomic logical operations -(define_mode_attr lconst_atomic [(QI "K") (HI "K") (SI "K") (DI "L")]) - ;; Map a mode to a specific constraint character. (define_mode_attr cmode [(QI "q") (HI "h") (SI "s") (DI "d")]) @@ -843,6 +840,16 @@ (plus "aarch64_plus_operand") (minus "aarch64_plus_operand")]) +;; Constants acceptable for atomic operations. +;; This definition must appear in this file before the iterators it refers to. +(define_code_attr const_atomic + [(plus "IJ") (minus "IJ") + (xor "") (ior "") + (and "")]) + +;; Attribute to describe constants acceptable in atomic logical operations +(define_mode_attr lconst_atomic [(QI "K") (HI "K") (SI "K") (DI "L")]) + ;; ------------------------------------------------------------------- ;; Int Iterators. ;; ------------------------------------------------------------------- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c4dc432d951..9a4cd14860f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2015-08-14 Matthew Wahab + Matthias Klose + + PR target/67143 + * gcc.c-torture/compile/pr67143.c: New + * gcc.target/aarch64/atomic-op-imm.c + (atomic_fetch_add_negative_RELAXED): New. + (atomic_fetch_sub_negative_ACQUIRE): New. + 2015-08-14 Kyrylo Tkachov * gcc.target/aarch64/target_attr_5.c: Add static modifier to bar. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr67143.c b/gcc/testsuite/gcc.c-torture/compile/pr67143.c new file mode 100644 index 00000000000..62c4186fc71 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr67143.c @@ -0,0 +1,21 @@ +long a, c; +int b; +int d; +void ut_dbg_assertion_failed() __attribute__((noreturn)); +long dict_index_is_spatial(int *); +void btr_block_get_func(char *); +long btr_page_get_level_low(unsigned char *); +void btr_validate_level(long p1) { + unsigned char *e; + while (p1 != btr_page_get_level_low(e)) { + if (__builtin_expect(b, 0)) + ut_dbg_assertion_failed(); + if (dict_index_is_spatial(&d)) + while (c != 5535) { + __sync_add_and_fetch(&a, 536870912); + btr_block_get_func(""); + } + } + for (long i; i; ++i) + btr_validate_level(-i); +} diff --git a/gcc/testsuite/gcc.target/aarch64/atomic-op-imm.c b/gcc/testsuite/gcc.target/aarch64/atomic-op-imm.c index 6c6f7e16dfe..47d7a96aa12 100644 --- a/gcc/testsuite/gcc.target/aarch64/atomic-op-imm.c +++ b/gcc/testsuite/gcc.target/aarch64/atomic-op-imm.c @@ -15,6 +15,18 @@ atomic_fetch_sub_ACQUIRE () return __atomic_fetch_sub (&v, 4096, __ATOMIC_ACQUIRE); } +int +atomic_fetch_add_negative_RELAXED () +{ + return __atomic_fetch_add (&v, -4096, __ATOMIC_RELAXED); +} + +int +atomic_fetch_sub_negative_ACQUIRE () +{ + return __atomic_fetch_sub (&v, -4096, __ATOMIC_ACQUIRE); +} + int atomic_fetch_and_SEQ_CST () { @@ -75,4 +87,4 @@ atomic_or_fetch_CONSUME () return __atomic_or_fetch (&v, 4096, __ATOMIC_CONSUME); } -/* { dg-final { scan-assembler-times "\tw\[0-9\]+, w\[0-9\]+, #*4096" 12 } } */ +/* { dg-final { scan-assembler-times "\tw\[0-9\]+, w\[0-9\]+, #*4096" 14 } } */ -- 2.30.2