diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-04-28 19:10:14 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-04-28 19:10:14 +0200 |
commit | 81262dad15795720e197df259bf690967bc57a2b (patch) | |
tree | 879304333dc392a536812778fa544a55b9084e3e /gcc | |
parent | 7ff75c4966baf4853ac837b097a6cd2b4f8495d3 (diff) | |
download | gcc-81262dad15795720e197df259bf690967bc57a2b.zip gcc-81262dad15795720e197df259bf690967bc57a2b.tar.gz gcc-81262dad15795720e197df259bf690967bc57a2b.tar.bz2 |
re PR target/70821 (x86_64: __atomic_fetch_add/sub() uses XADD rather than DECL in some cases)
PR target/70821
* config/i386/sync.md (define_peephole2 *atomic_fetch_add_cmp<mode>):
Add new peephole2 where the first insn is *mov<mode>_or instead of
*mov<mode>_internal.
* gcc.target/i386/pr70821.c: New test.
From-SVN: r235586
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/i386/sync.md | 30 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr70821.c | 16 |
4 files changed, 58 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4a1de89..d18013e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-04-28 Jakub Jelinek <jakub@redhat.com> + + PR target/70821 + * config/i386/sync.md (define_peephole2 *atomic_fetch_add_cmp<mode>): + Add new peephole2 where the first insn is *mov<mode>_or instead of + *mov<mode>_internal. + 2016-04-28 Segher Boesssenkool <segher@kernel.crashing.org> * tracer.c (bb_seen): Make static. diff --git a/gcc/config/i386/sync.md b/gcc/config/i386/sync.md index 85a2b9a..bc4fd34 100644 --- a/gcc/config/i386/sync.md +++ b/gcc/config/i386/sync.md @@ -467,6 +467,36 @@ (plus:SWI (match_dup 1) (match_dup 2)))])]) +;; Likewise, but for the -Os special case of *mov<mode>_or. +(define_peephole2 + [(parallel [(set (match_operand:SWI 0 "register_operand") + (match_operand:SWI 2 "constm1_operand")) + (clobber (reg:CC FLAGS_REG))]) + (parallel [(set (match_dup 0) + (unspec_volatile:SWI + [(match_operand:SWI 1 "memory_operand") + (match_operand:SI 4 "const_int_operand")] + UNSPECV_XCHG)) + (set (match_dup 1) + (plus:SWI (match_dup 1) + (match_dup 0))) + (clobber (reg:CC FLAGS_REG))]) + (set (reg:CCZ FLAGS_REG) + (compare:CCZ (match_dup 0) + (match_operand:SWI 3 "const_int_operand")))] + "peep2_reg_dead_p (3, operands[0]) + && (unsigned HOST_WIDE_INT) INTVAL (operands[2]) + == -(unsigned HOST_WIDE_INT) INTVAL (operands[3]) + && !reg_overlap_mentioned_p (operands[0], operands[1])" + [(parallel [(set (reg:CCZ FLAGS_REG) + (compare:CCZ + (unspec_volatile:SWI [(match_dup 1) (match_dup 4)] + UNSPECV_XCHG) + (match_dup 3))) + (set (match_dup 1) + (plus:SWI (match_dup 1) + (match_dup 2)))])]) + (define_insn "*atomic_fetch_add_cmp<mode>" [(set (reg:CCZ FLAGS_REG) (compare:CCZ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 00616c8..b787d4a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-04-28 Jakub Jelinek <jakub@redhat.com> + + PR target/70821 + * gcc.target/i386/pr70821.c: New test. + 2016-04-28 Bill Seurer <seurer@linux.vnet.ibm.com> * gcc.target/powerpc/vec-adde.c: New test. diff --git a/gcc/testsuite/gcc.target/i386/pr70821.c b/gcc/testsuite/gcc.target/i386/pr70821.c new file mode 100644 index 0000000..3b5de2f --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr70821.c @@ -0,0 +1,16 @@ +/* PR target/70821 */ +/* { dg-do compile } */ +/* { dg-options "-Os" } */ +/* { dg-additional-options "-march=i686" { target ia32 } } */ + +void bar (void); + +void +foo (int *p) +{ + if (__atomic_sub_fetch (p, 1, __ATOMIC_SEQ_CST)) + bar (); +} + +/* { dg-final { scan-assembler "lock;? dec" } } */ +/* { dg-final { scan-assembler-not "lock;? xadd" } } */ |