Re: [PATCH 1/2] [ARC] Improve code gen when compiling for size

2019-06-10 Thread Claudiu Zissulescu
Committed with your feedback taken into account. Thank you for your review,
Claudiu

On Sat, Jun 8, 2019 at 12:57 AM Jeff Law  wrote:
>
> On 6/6/19 1:42 AM, Claudiu Zissulescu wrote:
> > When optimizing for size, try to avoid using long immediate by
> > employing alternative (short) instructions.
> >
> > Ok to apply?
> > Claudiu
> >
> > gcc/
> > -xx-xx  Claudiu Zissulescu  
> >
> >   * config/arc/arc-protos.h (arc_check_ior_const): Declare.
> >   (arc_split_ior): Likewise.
> >   (arc_check_mov_const): Likewise.
> >   (arc_split_mov_const): Likewise.
> >   * config/arc/arc.c (arc_print_operand): Fix 'z' letter.
> >   (arc_rtx_costs): Replace check Crr with Cax constraint.
> >   (prepare_move_operands): Cleanup, remove unused code.
> >   (arc_split_ior): New function.
> >   (arc_check_ior_const): Likewise.
> >   (arc_split_mov_const): Likewise.
> >   (arc_check_mov_const): Likewise.
> >   * config/arc/arc.md (movsi_insn): Restructure it, and convert it
> >   in define_insn_and_split pattern.
> >   (iorsi3): Likewise.
> >   (mulsi3_v2): Add new matching variant.
> >   (andsi3_i): Cleanup pattern.
> >   (rotrsi3_cnt1): Update pattern.
> >   (rotrsi3_cnt8): New pattern.
> >   (ashlsi2_cnt8): Likewise.
> >   (ashlsi2_cnt16): Likewise.
> >   * config/arc/constraints.md (C0p): Update constraint.
> >   (Crr): Remove it.
> >   (C0x): New pattern.
> >   (Cax): New pattern.
> >
> > testsuite/
> > -xx-xx  Claudiu Zissulescu  
> >
> >   * gcc.target/arc/and-cnst-size.c: New test.
> >   * gcc.target/arc/mov-cnst-size.c: Likewise.
> >   * gcc.target/arc/or-cnst-size.c: Likewise.
> >   * gcc.target/arc/store-merge-1.c: Update test.
> >   * gcc.target/arc/arc700-stld-hazard.c: Likewise.
> >   * gcc.target/arc/cmem-1.c: Likewise.
> >   * gcc.target/arc/cmem-2.c: Likewise.
> >   * gcc.target/arc/cmem-3.c: Likewise.
> >   * gcc.target/arc/cmem-4.c: Likewise.
> >   * gcc.target/arc/cmem-5.c: Likewise.
> >   * gcc.target/arc/cmem-6.c: Likewise.
> >   * gcc.target/arc/loop-4.c: Likewise.
> >   * gcc.target/arc/movh_cl-1.c: Likewise.
> >   * gcc.target/arc/sdata-3.c: Likewise.
> > ---
> >
> > diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
> > index b49f2539408..f398c4a0086 100644
> > --- a/gcc/config/arc/arc.c
> > +++ b/gcc/config/arc/arc.c
> > @@ -11457,6 +11429,198 @@ arc_memory_move_cost (machine_mode mode,
> >return (2 * GET_MODE_SIZE (mode));
> >  }
> >
> > +/* Split an OR instruction into multiple BSET/OR instructions in a
> > +   tentative to avoid long immediate constants.  The next strategies
> > +   are employed when destination is 'q' reg.
> s/tentative/attempt/ ?
>
> > +
> > +   1. if there are up to three bits set in the mask, a succesion of
> s/succesion/succession/
>
> OK with the nits fixed.
>
> jeff


Re: [PATCH 1/2] [ARC] Improve code gen when compiling for size

2019-06-07 Thread Jeff Law
On 6/6/19 1:42 AM, Claudiu Zissulescu wrote:
> When optimizing for size, try to avoid using long immediate by
> employing alternative (short) instructions.
> 
> Ok to apply?
> Claudiu
> 
> gcc/
> -xx-xx  Claudiu Zissulescu  
> 
>   * config/arc/arc-protos.h (arc_check_ior_const): Declare.
>   (arc_split_ior): Likewise.
>   (arc_check_mov_const): Likewise.
>   (arc_split_mov_const): Likewise.
>   * config/arc/arc.c (arc_print_operand): Fix 'z' letter.
>   (arc_rtx_costs): Replace check Crr with Cax constraint.
>   (prepare_move_operands): Cleanup, remove unused code.
>   (arc_split_ior): New function.
>   (arc_check_ior_const): Likewise.
>   (arc_split_mov_const): Likewise.
>   (arc_check_mov_const): Likewise.
>   * config/arc/arc.md (movsi_insn): Restructure it, and convert it
>   in define_insn_and_split pattern.
>   (iorsi3): Likewise.
>   (mulsi3_v2): Add new matching variant.
>   (andsi3_i): Cleanup pattern.
>   (rotrsi3_cnt1): Update pattern.
>   (rotrsi3_cnt8): New pattern.
>   (ashlsi2_cnt8): Likewise.
>   (ashlsi2_cnt16): Likewise.
>   * config/arc/constraints.md (C0p): Update constraint.
>   (Crr): Remove it.
>   (C0x): New pattern.
>   (Cax): New pattern.
> 
> testsuite/
> -xx-xx  Claudiu Zissulescu  
> 
>   * gcc.target/arc/and-cnst-size.c: New test.
>   * gcc.target/arc/mov-cnst-size.c: Likewise.
>   * gcc.target/arc/or-cnst-size.c: Likewise.
>   * gcc.target/arc/store-merge-1.c: Update test.
>   * gcc.target/arc/arc700-stld-hazard.c: Likewise.
>   * gcc.target/arc/cmem-1.c: Likewise.
>   * gcc.target/arc/cmem-2.c: Likewise.
>   * gcc.target/arc/cmem-3.c: Likewise.
>   * gcc.target/arc/cmem-4.c: Likewise.
>   * gcc.target/arc/cmem-5.c: Likewise.
>   * gcc.target/arc/cmem-6.c: Likewise.
>   * gcc.target/arc/loop-4.c: Likewise.
>   * gcc.target/arc/movh_cl-1.c: Likewise.
>   * gcc.target/arc/sdata-3.c: Likewise.
> ---
> 
> diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
> index b49f2539408..f398c4a0086 100644
> --- a/gcc/config/arc/arc.c
> +++ b/gcc/config/arc/arc.c
> @@ -11457,6 +11429,198 @@ arc_memory_move_cost (machine_mode mode,
>return (2 * GET_MODE_SIZE (mode));
>  }
>  
> +/* Split an OR instruction into multiple BSET/OR instructions in a
> +   tentative to avoid long immediate constants.  The next strategies
> +   are employed when destination is 'q' reg.
s/tentative/attempt/ ?

> +
> +   1. if there are up to three bits set in the mask, a succesion of
s/succesion/succession/

OK with the nits fixed.

jeff


[PATCH 1/2] [ARC] Improve code gen when compiling for size

2019-06-06 Thread Claudiu Zissulescu
When optimizing for size, try to avoid using long immediate by
employing alternative (short) instructions.

Ok to apply?
Claudiu

gcc/
-xx-xx  Claudiu Zissulescu  

* config/arc/arc-protos.h (arc_check_ior_const): Declare.
(arc_split_ior): Likewise.
(arc_check_mov_const): Likewise.
(arc_split_mov_const): Likewise.
* config/arc/arc.c (arc_print_operand): Fix 'z' letter.
(arc_rtx_costs): Replace check Crr with Cax constraint.
(prepare_move_operands): Cleanup, remove unused code.
(arc_split_ior): New function.
(arc_check_ior_const): Likewise.
(arc_split_mov_const): Likewise.
(arc_check_mov_const): Likewise.
* config/arc/arc.md (movsi_insn): Restructure it, and convert it
in define_insn_and_split pattern.
(iorsi3): Likewise.
(mulsi3_v2): Add new matching variant.
(andsi3_i): Cleanup pattern.
(rotrsi3_cnt1): Update pattern.
(rotrsi3_cnt8): New pattern.
(ashlsi2_cnt8): Likewise.
(ashlsi2_cnt16): Likewise.
* config/arc/constraints.md (C0p): Update constraint.
(Crr): Remove it.
(C0x): New pattern.
(Cax): New pattern.

testsuite/
-xx-xx  Claudiu Zissulescu  

* gcc.target/arc/and-cnst-size.c: New test.
* gcc.target/arc/mov-cnst-size.c: Likewise.
* gcc.target/arc/or-cnst-size.c: Likewise.
* gcc.target/arc/store-merge-1.c: Update test.
* gcc.target/arc/arc700-stld-hazard.c: Likewise.
* gcc.target/arc/cmem-1.c: Likewise.
* gcc.target/arc/cmem-2.c: Likewise.
* gcc.target/arc/cmem-3.c: Likewise.
* gcc.target/arc/cmem-4.c: Likewise.
* gcc.target/arc/cmem-5.c: Likewise.
* gcc.target/arc/cmem-6.c: Likewise.
* gcc.target/arc/loop-4.c: Likewise.
* gcc.target/arc/movh_cl-1.c: Likewise.
* gcc.target/arc/sdata-3.c: Likewise.
---
 gcc/config/arc/arc-protos.h   |   4 +
 gcc/config/arc/arc.c  | 222 +++---
 gcc/config/arc/arc.md | 215 ++---
 gcc/config/arc/constraints.md |  22 +-
 gcc/testsuite/gcc.target/arc/and-cnst-size.c  |  16 ++
 .../gcc.target/arc/arc700-stld-hazard.c   |   4 +-
 gcc/testsuite/gcc.target/arc/cmem-1.c |   6 +-
 gcc/testsuite/gcc.target/arc/cmem-2.c |   6 +-
 gcc/testsuite/gcc.target/arc/cmem-3.c |   6 +-
 gcc/testsuite/gcc.target/arc/cmem-4.c |   6 +-
 gcc/testsuite/gcc.target/arc/cmem-5.c |   6 +-
 gcc/testsuite/gcc.target/arc/cmem-6.c |   6 +-
 gcc/testsuite/gcc.target/arc/loop-4.c |   3 +-
 gcc/testsuite/gcc.target/arc/mov-cnst-size.c  |  42 
 gcc/testsuite/gcc.target/arc/movh_cl-1.c  |   2 +-
 gcc/testsuite/gcc.target/arc/or-cnst-size.c   |  16 ++
 gcc/testsuite/gcc.target/arc/sdata-3.c|  18 +-
 gcc/testsuite/gcc.target/arc/store-merge-1.c  |   2 +-
 18 files changed, 449 insertions(+), 153 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/arc/and-cnst-size.c
 create mode 100644 gcc/testsuite/gcc.target/arc/mov-cnst-size.c
 create mode 100644 gcc/testsuite/gcc.target/arc/or-cnst-size.c

diff --git a/gcc/config/arc/arc-protos.h b/gcc/config/arc/arc-protos.h
index ac0de6b2874..f501bc30ee7 100644
--- a/gcc/config/arc/arc-protos.h
+++ b/gcc/config/arc/arc-protos.h
@@ -48,6 +48,10 @@ extern bool arc_is_uncached_mem_p (rtx);
 extern bool gen_operands_ldd_std (rtx *operands, bool load, bool commute);
 extern bool arc_check_multi (rtx, bool);
 extern void arc_adjust_reg_alloc_order (void);
+extern bool arc_check_ior_const (HOST_WIDE_INT );
+extern void arc_split_ior (rtx *);
+extern bool arc_check_mov_const (HOST_WIDE_INT );
+extern bool arc_split_mov_const (rtx *);
 #endif /* RTX_CODE */
 
 extern unsigned int arc_compute_frame_size (int);
diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
index b49f2539408..f398c4a0086 100644
--- a/gcc/config/arc/arc.c
+++ b/gcc/config/arc/arc.c
@@ -4232,7 +4232,7 @@ arc_print_operand (FILE *file, rtx x, int code)
 
 case 'z':
   if (GET_CODE (x) == CONST_INT)
-   fprintf (file, "%d",exact_log2(INTVAL (x)) );
+   fprintf (file, "%d",exact_log2 (INTVAL (x) & 0x));
   else
output_operand_lossage ("invalid operand to %%z code");
 
@@ -5597,9 +5597,6 @@ arc_rtx_costs (rtx x, machine_mode mode, int outer_code,
if (satisfies_constraint_C0p (x)) /* bxor */
  nolimm = fast = condexec = true;
break;
- case SET:
-   if (satisfies_constraint_Crr (x)) /* ror b,u6 */
- nolimm = true;
  default:
break;
  }
@@ -9088,31 +9085,6 @@ prepare_move_operands (rtx *operands, machine_mode mode)
  MEM_COPY_ATTRIBUTES (pat, operands[0]);
  operands[0] = pat;
}
-  if (!cse_not_expected)
-   {
- rtx pat =