From dcca1b0510693e6e8c1fac3fef2cde2362772720 Mon Sep 17 00:00:00 2001 From: Kazu Kirata Date: Sun, 13 Dec 2015 06:06:12 -0700 Subject: [PATCH] [PATCH][PR target/19201] Peephole to improve clearing items in structure for m68k [PATCH][PR target/19201] Peephole to improve clearing items in structure for m68k * config/m68k/m68k.md (load feeding clear byte): New peephole2. * gcc.target/m68k/pr19201.c: New test. From-SVN: r231597 --- gcc/ChangeLog | 4 +++ gcc/config/m68k/m68k.md | 33 +++++++++++++++++++++++++ gcc/testsuite/ChangeLog | 2 ++ gcc/testsuite/gcc.target/m68k/pr19201.c | 13 ++++++++++ 4 files changed, 52 insertions(+) create mode 100644 gcc/testsuite/gcc.target/m68k/pr19201.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eee44a7cdda..730c79f118f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2015-12-13 Kazu Kirata + + * config/m68k/m68k.md (load feeding clear byte): New peephole2. + 2015-12-13 Tom de Vries * tree-ssa-structalias.c (find_func_clobbers): Handle sizes and kinds diff --git a/gcc/config/m68k/m68k.md b/gcc/config/m68k/m68k.md index 1eaf58fc334..444515aea68 100644 --- a/gcc/config/m68k/m68k.md +++ b/gcc/config/m68k/m68k.md @@ -7601,3 +7601,36 @@ (include "cf.md") (include "sync.md") + +;; Convert +;; +;; move.l 4(%a0),%a0 +;; clr.b (%a0,%a1.l) +;; +;; into +;; +;; add.l 4(%a0),%a1 +;; clr.b (%a1) +;; +;; The latter is smaller. It is faster on all models except m68060. + +(define_peephole2 + [(set (match_operand:SI 0 "register_operand" "") + (mem:SI (plus:SI (match_operand:SI 1 "register_operand" "") + (match_operand:SI 2 "const_int_operand" "")))) + (set (mem:QI (plus:SI (match_operand:SI 3 "register_operand" "") + (match_operand:SI 4 "register_operand" ""))) + (const_int 0))] + "(optimize_size || !TUNE_68060) + && (operands[0] == operands[3] || operands[0] == operands[4]) + && ADDRESS_REG_P (operands[1]) + && ADDRESS_REG_P ((operands[0] == operands[3]) ? operands[4] : operands[3]) + && peep2_reg_dead_p (2, operands[3]) + && peep2_reg_dead_p (2, operands[4])" + [(set (match_dup 5) + (plus:SI (match_dup 5) + (mem:SI (plus:SI (match_dup 1) + (match_dup 2))))) + (set (mem:QI (match_dup 5)) + (const_int 0))] + "operands[5] = (operands[0] == operands[3]) ? operands[4] : operands[3];") diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 38d1dbea8d1..3f0862e3abe 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2015-12-13 Jeff Law + * gcc.target/m68k/pr19201.c: New test. + * gcc.target/m68k/pr63347.c: Remove #include add -w to command line options. * gcc.target/m68k/20090709-1.c: Adjust expected output. diff --git a/gcc/testsuite/gcc.target/m68k/pr19201.c b/gcc/testsuite/gcc.target/m68k/pr19201.c new file mode 100644 index 00000000000..dd81857f3f3 --- /dev/null +++ b/gcc/testsuite/gcc.target/m68k/pr19201.c @@ -0,0 +1,13 @@ +/* { dg-options "-w -O2 -fomit-frame-pointer" } */ +/* { dg-final { scan-assembler-not "%a.,%\[ad\]..l" } } */ + +struct X { + char *a; + /* other members */ + int b; +}; + +void f (struct X *x) +{ + x->a[x->b] = 0; +} -- 2.30.2