Re: New parameters to control stringop expansion libcall strategy

2013-08-09 Thread Xinliang David Li
Is this version ok for trunk?

thanks,

David

On Thu, Aug 8, 2013 at 9:31 AM, Xinliang David Li davi...@google.com wrote:
 Updated.

 thanks,

 David

 On Thu, Aug 8, 2013 at 8:18 AM, Joseph S. Myers jos...@codesourcery.com 
 wrote:
 On Wed, 7 Aug 2013, Xinliang David Li wrote:

 Updated patch attached (fixed header, buffer overflow, and warning --
 error problems).

 You still have diagnostics starting with a capital letter, contrary to the
 GNU Coding Standards.

 --
 Joseph S. Myers
 jos...@codesourcery.com


Re: New parameters to control stringop expansion libcall strategy

2013-08-09 Thread Jan Hubicka
 Is this version ok for trunk?

It looks resonable, but I still do not like much the removal of const for 
tables.
Doing so will push them all into David Malcom's per-thread global universe.

Currently the algorithm is selected based on cost-memset/cost-memcpy.
Instead of removing the const of all the CPU tables, I would preffer
introducing two readwrite global variables memset_algs/memcpy_algs and feed
them with proper table at a time we set up ix86_tune_features.

This has chance to do the right thing with optimize attribute specifying 
algorithms
and with the longer term threading plan.

Honza
 
 thanks,
 
 David
 
 On Thu, Aug 8, 2013 at 9:31 AM, Xinliang David Li davi...@google.com wrote:
  Updated.
 
  thanks,
 
  David
 
  On Thu, Aug 8, 2013 at 8:18 AM, Joseph S. Myers jos...@codesourcery.com 
  wrote:
  On Wed, 7 Aug 2013, Xinliang David Li wrote:
 
  Updated patch attached (fixed header, buffer overflow, and warning --
  error problems).
 
  You still have diagnostics starting with a capital letter, contrary to the
  GNU Coding Standards.
 
  --
  Joseph S. Myers
  jos...@codesourcery.com


Re: New parameters to control stringop expansion libcall strategy

2013-08-09 Thread Xinliang David Li
On Fri, Aug 9, 2013 at 11:33 AM, Jan Hubicka hubi...@ucw.cz wrote:
 Is this version ok for trunk?

 It looks resonable, but I still do not like much the removal of const for 
 tables.
 Doing so will push them all into David Malcom's per-thread global universe.

 Currently the algorithm is selected based on cost-memset/cost-memcpy.
 Instead of removing the const of all the CPU tables, I would preffer
 introducing two readwrite global variables memset_algs/memcpy_algs and feed
 them with proper table at a time we set up ix86_tune_features.


I can do that in this patch. In the future, when we need to do tunings
for those constants, we can revisit it.

thanks,

David

 This has chance to do the right thing with optimize attribute specifying 
 algorithms
 and with the longer term threading plan.

 Honza

 thanks,

 David

 On Thu, Aug 8, 2013 at 9:31 AM, Xinliang David Li davi...@google.com wrote:
  Updated.
 
  thanks,
 
  David
 
  On Thu, Aug 8, 2013 at 8:18 AM, Joseph S. Myers jos...@codesourcery.com 
  wrote:
  On Wed, 7 Aug 2013, Xinliang David Li wrote:
 
  Updated patch attached (fixed header, buffer overflow, and warning --
  error problems).
 
  You still have diagnostics starting with a capital letter, contrary to the
  GNU Coding Standards.
 
  --
  Joseph S. Myers
  jos...@codesourcery.com


Re: New parameters to control stringop expansion libcall strategy

2013-08-09 Thread Jan Hubicka
 On Fri, Aug 9, 2013 at 11:33 AM, Jan Hubicka hubi...@ucw.cz wrote:
  Is this version ok for trunk?
 
  It looks resonable, but I still do not like much the removal of const for 
  tables.
  Doing so will push them all into David Malcom's per-thread global universe.
 
  Currently the algorithm is selected based on cost-memset/cost-memcpy.
  Instead of removing the const of all the CPU tables, I would preffer
  introducing two readwrite global variables memset_algs/memcpy_algs and feed
  them with proper table at a time we set up ix86_tune_features.
 
 
 I can do that in this patch. In the future, when we need to do tunings
 for those constants, we can revisit it.

Yep, I think we can follow same strategy and just move them to a global 
constant.
Those are part of the context/universum since they will be user rewritable then.

Thanks, the patch is OK with this change.
Honza
 
 thanks,
 
 David
 
  This has chance to do the right thing with optimize attribute specifying 
  algorithms
  and with the longer term threading plan.
 
  Honza
 
  thanks,
 
  David
 
  On Thu, Aug 8, 2013 at 9:31 AM, Xinliang David Li davi...@google.com 
  wrote:
   Updated.
  
   thanks,
  
   David
  
   On Thu, Aug 8, 2013 at 8:18 AM, Joseph S. Myers 
   jos...@codesourcery.com wrote:
   On Wed, 7 Aug 2013, Xinliang David Li wrote:
  
   Updated patch attached (fixed header, buffer overflow, and warning --
   error problems).
  
   You still have diagnostics starting with a capital letter, contrary to 
   the
   GNU Coding Standards.
  
   --
   Joseph S. Myers
   jos...@codesourcery.com


Re: New parameters to control stringop expansion libcall strategy

2013-08-08 Thread Xinliang David Li
Updated patch attached (fixed header, buffer overflow, and warning --
error problems).

Ok for trunk?

thanks,

David

On Wed, Aug 7, 2013 at 6:04 PM, Joseph S. Myers jos...@codesourcery.com wrote:
 On Wed, 7 Aug 2013, Xinliang David Li wrote:

  Why the exception?  This should only be used on the host, not the target.

 Sorry, I copied the boiler-plate header from i386.h -- is it wrong there too?

 tm.h gets included in target code because we haven't finished separating
 target macros used on the target from those used on the host.

 --
 Joseph S. Myers
 jos...@codesourcery.com
Index: config/i386/stringop.def
===
--- config/i386/stringop.def(revision 0)
+++ config/i386/stringop.def(revision 0)
@@ -0,0 +1,37 @@
+/* Definitions for stringop strategy for IA-32.
+   Copyright (C) 2013 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License 
+along with GCC; see the files COPYING3.  If not,
+see http://www.gnu.org/licenses/.  */
+
+DEF_ENUM
+DEF_ALG (no_stringop, no_stringop)
+DEF_ENUM
+DEF_ALG (libcall, libcall)
+DEF_ENUM
+DEF_ALG (rep_prefix_1_byte, rep_byte)
+DEF_ENUM
+DEF_ALG (rep_prefix_4_byte, rep_4byte)
+DEF_ENUM
+DEF_ALG (rep_prefix_8_byte, rep_8byte)
+DEF_ENUM
+DEF_ALG (loop_1_byte, byte_loop)
+DEF_ENUM
+DEF_ALG (loop, loop)
+DEF_ENUM
+DEF_ALG (unrolled_loop, unrolled_loop)
+DEF_ENUM
+DEF_ALG (vector_loop, vector_loop)
Index: config/i386/stringop.opt
===
--- config/i386/stringop.opt(revision 0)
+++ config/i386/stringop.opt(revision 0)
@@ -0,0 +1,31 @@
+/* Definitions for stringop option handling for IA-32.
+   Copyright (C) 2013 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the files COPYING3.  If not,
+see http://www.gnu.org/licenses/.  */
+
+Enum(stringop_alg) String(rep_byte) Value(rep_prefix_1_byte)
+
+#undef DEF_ENUM
+#define DEF_ENUM EnumValue
+
+#undef DEF_ALG
+#define DEF_ALG(alg, name) Enum(stringop_alg) String(name) Value(alg)
+
+#include stringop.def
+
+#undef DEF_ENUM
+#undef DEF_ALG
Index: config/i386/i386-opts.h
===
--- config/i386/i386-opts.h (revision 201581)
+++ config/i386/i386-opts.h (working copy)
@@ -28,15 +28,17 @@ see the files COPYING3 and COPYING.RUNTI
 /* Algorithm to expand string function with.  */
 enum stringop_alg
 {
-   no_stringop,
-   libcall,
-   rep_prefix_1_byte,
-   rep_prefix_4_byte,
-   rep_prefix_8_byte,
-   loop_1_byte,
-   loop,
-   unrolled_loop,
-   vector_loop
+#undef DEF_ENUM
+#define DEF_ENUM
+
+#undef DEF_ALG
+#define DEF_ALG(alg, name) alg, 
+
+#include stringop.def
+last_alg
+
+#undef DEF_ENUM
+#undef DEF_ALG
 };
 
 /* Available call abi.  */
Index: config/i386/i386.c
===
--- config/i386/i386.c  (revision 201582)
+++ config/i386/i386.c  (working copy)
@@ -158,7 +158,7 @@ struct processor_costs ix86_size_cost =
 };
 
 /* Processor costs (relative to an add) */
-static const
+static
 struct processor_costs i386_cost = {   /* 386 specific costs */
   COSTS_N_INSNS (1),   /* cost of an add instruction */
   COSTS_N_INSNS (1),   /* cost of a lea instruction */
@@ -228,7 +228,7 @@ struct processor_costs i386_cost = {/*
   1,   /* cond_not_taken_branch_cost.  */
 };
 
-static const
+static
 struct processor_costs i486_cost = {   /* 486 specific costs */
   COSTS_N_INSNS (1),   /* cost of an add instruction */
   COSTS_N_INSNS (1),   /* cost of a lea instruction */
@@ -300,7 +300,7 @@ struct processor_costs i486_cost = {/*
   1,   /* cond_not_taken_branch_cost.  */
 };
 
-static const
+static
 struct processor_costs pentium_cost = {
   COSTS_N_INSNS (1),   /* cost 

Re: New parameters to control stringop expansion libcall strategy

2013-08-08 Thread Joseph S. Myers
On Wed, 7 Aug 2013, Xinliang David Li wrote:

 Updated patch attached (fixed header, buffer overflow, and warning --
 error problems).

You still have diagnostics starting with a capital letter, contrary to the 
GNU Coding Standards.

-- 
Joseph S. Myers
jos...@codesourcery.com


Re: New parameters to control stringop expansion libcall strategy

2013-08-08 Thread Xinliang David Li
Updated.

thanks,

David

On Thu, Aug 8, 2013 at 8:18 AM, Joseph S. Myers jos...@codesourcery.com wrote:
 On Wed, 7 Aug 2013, Xinliang David Li wrote:

 Updated patch attached (fixed header, buffer overflow, and warning --
 error problems).

 You still have diagnostics starting with a capital letter, contrary to the
 GNU Coding Standards.

 --
 Joseph S. Myers
 jos...@codesourcery.com
Index: testsuite/gcc.target/i386/memcpy-strategy-1.c
===
--- testsuite/gcc.target/i386/memcpy-strategy-1.c   (revision 0)
+++ testsuite/gcc.target/i386/memcpy-strategy-1.c   (revision 0)
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options -O2 -march=atom -mmemcpy-strategy=vector_loop:-1:align } */
+/* { dg-final { scan-assembler-times movdqa 8 { target { ! { ia32 } } } } } 
*/
+/* { dg-final { scan-assembler-times movdqa 4 { target { ia32 } } } } */
+
+char a[2048];
+char b[2048];
+void t (void)
+{
+  __builtin_memcpy (a, b, 2048);
+}
+
Index: testsuite/gcc.target/i386/memcpy-strategy-2.c
===
--- testsuite/gcc.target/i386/memcpy-strategy-2.c   (revision 0)
+++ testsuite/gcc.target/i386/memcpy-strategy-2.c   (revision 0)
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options -O2 -march=atom 
-mmemcpy-strategy=vector_loop:3000:align,libcall:-1:align } */
+/* { dg-final { scan-assembler-times movdqa 8 { target { ! { ia32 } } } } } 
*/
+/* { dg-final { scan-assembler-times movdqa 4 { target { ia32 } } } } */
+
+char a[2048];
+char b[2048];
+void t (void)
+{
+  __builtin_memcpy (a, b, 2048);
+}
+
Index: testsuite/gcc.target/i386/memset-strategy-1.c
===
--- testsuite/gcc.target/i386/memset-strategy-1.c   (revision 0)
+++ testsuite/gcc.target/i386/memset-strategy-1.c   (revision 0)
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options -O2 -march=atom -mmemset-strategy=libcall:-1:align } */
+/* { dg-final { scan-assembler-times memset 2  } } */
+
+char a[2048];
+void t (void)
+{
+  __builtin_memset (a, 1, 2048);
+}
+
Index: testsuite/gcc.target/i386/memcpy-strategy-3.c
===
--- testsuite/gcc.target/i386/memcpy-strategy-3.c   (revision 0)
+++ testsuite/gcc.target/i386/memcpy-strategy-3.c   (revision 0)
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options -O2 -march=atom 
-mmemcpy-strategy=vector_loop:2000:align,libcall:-1:align } */
+/* { dg-final { scan-assembler-times memcpy 2  } } */
+
+char a[2048];
+char b[2048];
+void t (void)
+{
+  __builtin_memcpy (a, b, 2048);
+}
Index: doc/invoke.texi
===
--- doc/invoke.texi (revision 201581)
+++ doc/invoke.texi (working copy)
@@ -652,6 +652,7 @@ Objective-C and Objective-C++ Dialects}.
 -mbmi2 -mrtm -mlwp -mthreads @gol
 -mno-align-stringops  -minline-all-stringops @gol
 -minline-stringops-dynamically -mstringop-strategy=@var{alg} @gol
+-mmemcpy-strategy=@var{strategy} -mmemset-strategy=@var{strategy} 
 -mpush-args  -maccumulate-outgoing-args  -m128bit-long-double @gol
 -m96bit-long-double -mlong-double-64 -mlong-double-80 @gol
 -mregparm=@var{num}  -msseregparm @gol
@@ -14651,6 +14652,24 @@ Expand into an inline loop.
 Always use a library call.
 @end table
 
+@item -mmemcpy-strategy=@var{strategy}
+@opindex mmemcpy-strategy=@var{strategy}
+Override the internal decision heuristic to decide if @code{__builtin_memcpy}
+should be inlined and what inline algorithm to use when the expected size
+of the copy operation is known. @var{strategy} 
+is a comma-separated list of @var{alg}:@var{max_size}:@var{dest_align} 
triplets. 
+@var{alg} is specified in @option{-mstringop-strategy}, @var{max_size} 
specifies
+the max byte size with which inline algorithm @var{alg} is allowed.  For the 
last
+triplet, the @var{max_size} must be @code{-1}. The @var{max_size} of the 
triplets
+in the list must be specified in increasing order.  The minimal byte size for 
+@var{alg} is @code{0} for the first triplet and @code{@var{max_size} + 1} of 
the 
+preceding range.
+
+@item -mmemset-strategy=@var{strategy}
+@opindex mmemset-strategy=@var{strategy}
+The option is similar to @option{-mmemcpy-strategy=} except that it is to 
control
+@code{__builtin_memset} expansion.
+
 @item -momit-leaf-frame-pointer
 @opindex momit-leaf-frame-pointer
 Don't keep the frame pointer in a register for leaf functions.  This
Index: config/i386/stringop.def
===
--- config/i386/stringop.def(revision 0)
+++ config/i386/stringop.def(revision 0)
@@ -0,0 +1,37 @@
+/* Definitions for stringop strategy for IA-32.
+   Copyright (C) 2013 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General 

Re: New parameters to control stringop expansion libcall strategy

2013-08-07 Thread Michael Zolotukhin
 the option is designed for purpose like this.
That's great, thanks!

Michael
 David

On 6 August 2013 20:42, Xinliang David Li davi...@google.com wrote:
 Corrected two small problems reported by the style checker (The
 warnings about the EnumValue for options  in stringopt.opt are not
 valid).

 On Tue, Aug 6, 2013 at 1:46 AM, Michael Zolotukhin
 michael.v.zolotuk...@gmail.com wrote:
 There are still some formatting issues (like 8 spaces instead of a
 tab, wrong indentation of do-loop and some other places) - to reveal
 some of them you could use contrib/check_GNU_style.sh script.
 But that was a nitpicking again:) Actually I wanted to ask whether
 you're going to use this option for some performance experiments
 involving memmov/memset - if so, probably you could tune existing
 cost-models as well? Is it possible?

 the option is designed for purpose like this.

 thanks,

 David


 Michael

 On 5 August 2013 20:44, Xinliang David Li davi...@google.com wrote:
 thanks. Updated patch attached.

 David

 On Mon, Aug 5, 2013 at 3:57 AM, Michael V. Zolotukhin
 michael.v.zolotuk...@gmail.com wrote:
 Hi,
 This is a really convenient option, thanks for working on it.
 I can't approve it as I'm not a maintainer, but it looks ok to me,
 except fot a small nitpicking: afair, comments should end with
 dot-space-space.

 Michael

 On 04 Aug 20:01, Xinliang David Li wrote:
 The attached is a new patch implementing the stringop inline strategy
 control using two new -m options:

 -mmemcpy-strategy=
 -mmemset-strategy=

 See changes in doc/invoke.texi for description of the new options. 
 Example:
   
 -mmemcpy-strategy=rep_8byte:64:unaligned,unrolled_loop:2048:unaligned,libcall:-1:unaligned

 tells compiler to inline memcpy using rep_8byte when the size is no
 larger than 64 byte, using unrolled_loop when size is no larger than
 2048, and for size  2048, using library call. In all cases,
 destination alignment adjustment is not done.

 Tested on x86-64/linux. Ok for trunk?

 thanks,

 David

 2013-08-02  Xinliang David Li  davi...@google.com

 * config/i386/stringop.def: New file.
 * config/i386/stringop.opt: New file.
 * config/i386/i386-opts.h: Include stringopt.def.
 * config/i386/i386.opt: Include stringopt.opt.
 * config/i386/i386.c (ix86_option_override_internal):
 Override default size based stringop inline strategies
 with options.
 * config/i386/i386.c (ix86_parse_stringop_strategy_string):
 New function.

 2013-08-04  Xinliang David Li  davi...@google.com

 * testsuite/gcc.target/i386/memcpy-strategy-1.c: New test.
 * testsuite/gcc.target/i386/memcpy-strategy-2.c: Ditto.
 * testsuite/gcc.target/i386/memset-strategy-1.c: Ditto.
 * testsuite/gcc.target/i386/memcpy-strategy-3.c: Ditto.




 On Fri, Aug 2, 2013 at 9:21 PM, Xinliang David Li davi...@google.com 
 wrote:
  On x86_64, when the expected size of memcpy/memset is known (e.g, with
  FDO), libcall strategy is used with the size is  8192. This value is
  hard coded, which makes it hard to do performance tuning. This patch
  adds two new parameters to do that. Potential usage includes
  per-application libcall strategy min-size tuning based on summary data
  with FDO (e.g, instruction workset size).
 
  Bootstrap and tested on x86_64/linux. Ok for trunk?
 
  thanks,
 
  David
 
 
  2013-08-02  Xinliang David Li  davi...@google.com
 
  * params.def: New parameters.
  * config/i386/i386.c (ix86_option_override_internal):
  Override default libcall size limit with parameters.

 Index: config/i386/stringop.def
 ===
 --- config/i386/stringop.def  (revision 0)
 +++ config/i386/stringop.def  (revision 0)
 @@ -0,0 +1,42 @@
 +/* Definitions for option handling for IA-32.
 +   Copyright (C) 2013 Free Software Foundation, Inc.
 +
 +This file is part of GCC.
 +
 +GCC is free software; you can redistribute it and/or modify
 +it under the terms of the GNU General Public License as published by
 +the Free Software Foundation; either version 3, or (at your option)
 +any later version.
 +
 +GCC is distributed in the hope that it will be useful,
 +but WITHOUT ANY WARRANTY; without even the implied warranty of
 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +GNU General Public License for more details.
 +
 +Under Section 7 of GPL version 3, you are granted additional
 +permissions described in the GCC Runtime Library Exception, version
 +3.1, as published by the Free Software Foundation.
 +
 +You should have received a copy of the GNU General Public License and
 +a copy of the GCC Runtime Library Exception along with this program;
 +see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 +http://www.gnu.org/licenses/.  */
 +
 +DEF_ENUM
 +DEF_ALG (no_stringop, no_stringop)
 +DEF_ENUM
 +DEF_ALG (libcall, libcall)
 +DEF_ENUM
 +DEF_ALG (rep_prefix_1_byte, 

Re: New parameters to control stringop expansion libcall strategy

2013-08-07 Thread Xinliang David Li
Fixed the do while formatting.  Ok for trunk with this version?

thanks,

David

On Tue, Aug 6, 2013 at 2:42 AM, Jan Hubicka hubi...@ucw.cz wrote:
  2013-08-02  Xinliang David Li  davi...@google.com
 
  * config/i386/stringop.def: New file.
  * config/i386/stringop.opt: New file.
  * config/i386/i386-opts.h: Include stringopt.def.
  * config/i386/i386.opt: Include stringopt.opt.
  * config/i386/i386.c (ix86_option_override_internal):
  Override default size based stringop inline strategies
  with options.
  * config/i386/i386.c (ix86_parse_stringop_strategy_string):
  New function.
 
  2013-08-04  Xinliang David Li  davi...@google.com
 
  * testsuite/gcc.target/i386/memcpy-strategy-1.c: New test.
  * testsuite/gcc.target/i386/memcpy-strategy-2.c: Ditto.
  * testsuite/gcc.target/i386/memset-strategy-1.c: Ditto.
  * testsuite/gcc.target/i386/memcpy-strategy-3.c: Ditto.

 The patch looks resonable to me in general.  I wonder why we need to bring
 all the cost tables non-const instead of just having writable storage for
 the current strategy like we do with other flags anyway.

 Your strings are definitely more readable than the in-memory representation
 I came up with. Perhaps we can even turn the cost tables into strings
 for easier maintenance?  I guess they are bit confusing for people
 not familiar with a code.

 Honza
 
 
 
 
  On Fri, Aug 2, 2013 at 9:21 PM, Xinliang David Li davi...@google.com 
  wrote:
   On x86_64, when the expected size of memcpy/memset is known (e.g, with
   FDO), libcall strategy is used with the size is  8192. This value is
   hard coded, which makes it hard to do performance tuning. This patch
   adds two new parameters to do that. Potential usage includes
   per-application libcall strategy min-size tuning based on summary data
   with FDO (e.g, instruction workset size).
  
   Bootstrap and tested on x86_64/linux. Ok for trunk?
  
   thanks,
  
   David
  
  
   2013-08-02  Xinliang David Li  davi...@google.com
  
   * params.def: New parameters.
   * config/i386/i386.c (ix86_option_override_internal):
   Override default libcall size limit with parameters.
 
  Index: config/i386/stringop.def
  ===
  --- config/i386/stringop.def  (revision 0)
  +++ config/i386/stringop.def  (revision 0)
  @@ -0,0 +1,42 @@
  +/* Definitions for option handling for IA-32.
  +   Copyright (C) 2013 Free Software Foundation, Inc.
  +
  +This file is part of GCC.
  +
  +GCC is free software; you can redistribute it and/or modify
  +it under the terms of the GNU General Public License as published by
  +the Free Software Foundation; either version 3, or (at your option)
  +any later version.
  +
  +GCC is distributed in the hope that it will be useful,
  +but WITHOUT ANY WARRANTY; without even the implied warranty of
  +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  +GNU General Public License for more details.
  +
  +Under Section 7 of GPL version 3, you are granted additional
  +permissions described in the GCC Runtime Library Exception, version
  +3.1, as published by the Free Software Foundation.
  +
  +You should have received a copy of the GNU General Public License and
  +a copy of the GCC Runtime Library Exception along with this program;
  +see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
  +http://www.gnu.org/licenses/.  */
  +
  +DEF_ENUM
  +DEF_ALG (no_stringop, no_stringop)
  +DEF_ENUM
  +DEF_ALG (libcall, libcall)
  +DEF_ENUM
  +DEF_ALG (rep_prefix_1_byte, rep_byte)
  +DEF_ENUM
  +DEF_ALG (rep_prefix_4_byte, rep_4byte)
  +DEF_ENUM
  +DEF_ALG (rep_prefix_8_byte, rep_8byte)
  +DEF_ENUM
  +DEF_ALG (loop_1_byte, byte_loop)
  +DEF_ENUM
  +DEF_ALG (loop, loop)
  +DEF_ENUM
  +DEF_ALG (unrolled_loop, unrolled_loop)
  +DEF_ENUM
  +DEF_ALG (vector_loop, vector_loop)
  Index: config/i386/i386.opt
  ===
  --- config/i386/i386.opt  (revision 201458)
  +++ config/i386/i386.opt  (working copy)
  @@ -316,6 +316,14 @@ mstack-arg-probe
   Target Report Mask(STACK_PROBE) Save
   Enable stack probing
 
  +mmemcpy-strategy=
  +Target RejectNegative Joined Var(ix86_tune_memcpy_strategy)
  +Specify memcpy expansion strategy when expected size is known
  +
  +mmemset-strategy=
  +Target RejectNegative Joined Var(ix86_tune_memset_strategy)
  +Specify memset expansion strategy when expected size is known
  +
   mstringop-strategy=
   Target RejectNegative Joined Enum(stringop_alg) Var(ix86_stringop_alg) 
  Init(no_stringop)
   Chose strategy to generate stringop using
  Index: config/i386/stringop.opt
  ===
  --- config/i386/stringop.opt  (revision 0)
  +++ config/i386/stringop.opt  (revision 0)
  @@ -0,0 +1,36 @@
  +/* Definitions for option handling 

Re: New parameters to control stringop expansion libcall strategy

2013-08-07 Thread Joseph S. Myers
On Wed, 7 Aug 2013, Xinliang David Li wrote:

 Index: config/i386/stringop.def
 ===
 --- config/i386/stringop.def  (revision 0)
 +++ config/i386/stringop.def  (revision 0)
 @@ -0,0 +1,42 @@
 +/* Definitions for option handling for IA-32.
 +   Copyright (C) 2013 Free Software Foundation, Inc.
 +
 +This file is part of GCC.
 +
 +GCC is free software; you can redistribute it and/or modify
 +it under the terms of the GNU General Public License as published by
 +the Free Software Foundation; either version 3, or (at your option)
 +any later version.
 +
 +GCC is distributed in the hope that it will be useful,
 +but WITHOUT ANY WARRANTY; without even the implied warranty of
 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +GNU General Public License for more details.
 +
 +Under Section 7 of GPL version 3, you are granted additional
 +permissions described in the GCC Runtime Library Exception, version
 +3.1, as published by the Free Software Foundation.

Why the exception?  This should only be used on the host, not the target.

 +  do
 +{
 +  int mins, maxs;
 +  stringop_alg alg;
 +  char alg_name[128];
 +  char align[16];
 +
 +  next_range_str = strchr (curr_range_str, ',');
 +  if (next_range_str)
 +*next_range_str++ = '\0';
 +
 +  if (3 != sscanf (curr_range_str, %[^:]:%d:%s, alg_name, maxs, 
 align))

This appears to introduce buffer overruns, which is never OK - whatever 
the length of strings in the command-line arguments, you must not overflow 
fixed-width buffers, so you must specify maximum field widths for the %[] 
and %s.

 +{
 +  warning (0, Wrong arg %s to option %s, curr_range_str,
 +   is_memset ? -mmemset_strategy= : -mmemcpy_strategy=);
 +  return;

Invalid option arguments should be errors, not warnings, and diagnostics 
should not start with a capital letter.  Same applies to other diagnostics 
here.

 Index: config/i386/stringop.opt
 ===
 --- config/i386/stringop.opt  (revision 0)
 +++ config/i386/stringop.opt  (revision 0)
 @@ -0,0 +1,36 @@
 +/* Definitions for option handling for IA-32.
 +   Copyright (C) 2013 Free Software Foundation, Inc.
 +
 +This file is part of GCC.
 +
 +GCC is free software; you can redistribute it and/or modify
 +it under the terms of the GNU General Public License as published by
 +the Free Software Foundation; either version 3, or (at your option)
 +any later version.
 +
 +GCC is distributed in the hope that it will be useful,
 +but WITHOUT ANY WARRANTY; without even the implied warranty of
 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +GNU General Public License for more details.
 +
 +Under Section 7 of GPL version 3, you are granted additional
 +permissions described in the GCC Runtime Library Exception, version
 +3.1, as published by the Free Software Foundation.

Again, why the exception?

-- 
Joseph S. Myers
jos...@codesourcery.com


Re: New parameters to control stringop expansion libcall strategy

2013-08-07 Thread Xinliang David Li
On Wed, Aug 7, 2013 at 5:23 PM, Joseph S. Myers jos...@codesourcery.com wrote:
 On Wed, 7 Aug 2013, Xinliang David Li wrote:

 Index: config/i386/stringop.def
 ===
 --- config/i386/stringop.def  (revision 0)
 +++ config/i386/stringop.def  (revision 0)
 @@ -0,0 +1,42 @@
 +/* Definitions for option handling for IA-32.
 +   Copyright (C) 2013 Free Software Foundation, Inc.
 +
 +This file is part of GCC.
 +
 +GCC is free software; you can redistribute it and/or modify
 +it under the terms of the GNU General Public License as published by
 +the Free Software Foundation; either version 3, or (at your option)
 +any later version.
 +
 +GCC is distributed in the hope that it will be useful,
 +but WITHOUT ANY WARRANTY; without even the implied warranty of
 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +GNU General Public License for more details.
 +
 +Under Section 7 of GPL version 3, you are granted additional
 +permissions described in the GCC Runtime Library Exception, version
 +3.1, as published by the Free Software Foundation.

 Why the exception?  This should only be used on the host, not the target.


Sorry, I copied the boiler-plate header from i386.h -- is it wrong there too?



 +  do
 +{
 +  int mins, maxs;
 +  stringop_alg alg;
 +  char alg_name[128];
 +  char align[16];
 +
 +  next_range_str = strchr (curr_range_str, ',');
 +  if (next_range_str)
 +*next_range_str++ = '\0';
 +
 +  if (3 != sscanf (curr_range_str, %[^:]:%d:%s, alg_name, maxs, 
 align))

 This appears to introduce buffer overruns, which is never OK - whatever
 the length of strings in the command-line arguments, you must not overflow
 fixed-width buffers, so you must specify maximum field widths for the %[]
 and %s.


Ok will fix.


 +{
 +  warning (0, Wrong arg %s to option %s, curr_range_str,
 +   is_memset ? -mmemset_strategy= : -mmemcpy_strategy=);
 +  return;

 Invalid option arguments should be errors, not warnings, and diagnostics
 should not start with a capital letter.  Same applies to other diagnostics
 here.


Ok will fix.


 Index: config/i386/stringop.opt
 ===
 --- config/i386/stringop.opt  (revision 0)
 +++ config/i386/stringop.opt  (revision 0)
 @@ -0,0 +1,36 @@
 +/* Definitions for option handling for IA-32.
 +   Copyright (C) 2013 Free Software Foundation, Inc.
 +
 +This file is part of GCC.
 +
 +GCC is free software; you can redistribute it and/or modify
 +it under the terms of the GNU General Public License as published by
 +the Free Software Foundation; either version 3, or (at your option)
 +any later version.
 +
 +GCC is distributed in the hope that it will be useful,
 +but WITHOUT ANY WARRANTY; without even the implied warranty of
 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +GNU General Public License for more details.
 +
 +Under Section 7 of GPL version 3, you are granted additional
 +permissions described in the GCC Runtime Library Exception, version
 +3.1, as published by the Free Software Foundation.

 Again, why the exception?

Wrong template used.

thanks,

David


 --
 Joseph S. Myers
 jos...@codesourcery.com


Re: New parameters to control stringop expansion libcall strategy

2013-08-07 Thread Joseph S. Myers
On Wed, 7 Aug 2013, Xinliang David Li wrote:

  Why the exception?  This should only be used on the host, not the target.
 
 Sorry, I copied the boiler-plate header from i386.h -- is it wrong there too?

tm.h gets included in target code because we haven't finished separating 
target macros used on the target from those used on the host.

-- 
Joseph S. Myers
jos...@codesourcery.com


Re: New parameters to control stringop expansion libcall strategy

2013-08-06 Thread Michael Zolotukhin
There are still some formatting issues (like 8 spaces instead of a
tab, wrong indentation of do-loop and some other places) - to reveal
some of them you could use contrib/check_GNU_style.sh script.
But that was a nitpicking again:) Actually I wanted to ask whether
you're going to use this option for some performance experiments
involving memmov/memset - if so, probably you could tune existing
cost-models as well? Is it possible?

Michael

On 5 August 2013 20:44, Xinliang David Li davi...@google.com wrote:
 thanks. Updated patch attached.

 David

 On Mon, Aug 5, 2013 at 3:57 AM, Michael V. Zolotukhin
 michael.v.zolotuk...@gmail.com wrote:
 Hi,
 This is a really convenient option, thanks for working on it.
 I can't approve it as I'm not a maintainer, but it looks ok to me,
 except fot a small nitpicking: afair, comments should end with
 dot-space-space.

 Michael

 On 04 Aug 20:01, Xinliang David Li wrote:
 The attached is a new patch implementing the stringop inline strategy
 control using two new -m options:

 -mmemcpy-strategy=
 -mmemset-strategy=

 See changes in doc/invoke.texi for description of the new options. Example:
   
 -mmemcpy-strategy=rep_8byte:64:unaligned,unrolled_loop:2048:unaligned,libcall:-1:unaligned

 tells compiler to inline memcpy using rep_8byte when the size is no
 larger than 64 byte, using unrolled_loop when size is no larger than
 2048, and for size  2048, using library call. In all cases,
 destination alignment adjustment is not done.

 Tested on x86-64/linux. Ok for trunk?

 thanks,

 David

 2013-08-02  Xinliang David Li  davi...@google.com

 * config/i386/stringop.def: New file.
 * config/i386/stringop.opt: New file.
 * config/i386/i386-opts.h: Include stringopt.def.
 * config/i386/i386.opt: Include stringopt.opt.
 * config/i386/i386.c (ix86_option_override_internal):
 Override default size based stringop inline strategies
 with options.
 * config/i386/i386.c (ix86_parse_stringop_strategy_string):
 New function.

 2013-08-04  Xinliang David Li  davi...@google.com

 * testsuite/gcc.target/i386/memcpy-strategy-1.c: New test.
 * testsuite/gcc.target/i386/memcpy-strategy-2.c: Ditto.
 * testsuite/gcc.target/i386/memset-strategy-1.c: Ditto.
 * testsuite/gcc.target/i386/memcpy-strategy-3.c: Ditto.




 On Fri, Aug 2, 2013 at 9:21 PM, Xinliang David Li davi...@google.com 
 wrote:
  On x86_64, when the expected size of memcpy/memset is known (e.g, with
  FDO), libcall strategy is used with the size is  8192. This value is
  hard coded, which makes it hard to do performance tuning. This patch
  adds two new parameters to do that. Potential usage includes
  per-application libcall strategy min-size tuning based on summary data
  with FDO (e.g, instruction workset size).
 
  Bootstrap and tested on x86_64/linux. Ok for trunk?
 
  thanks,
 
  David
 
 
  2013-08-02  Xinliang David Li  davi...@google.com
 
  * params.def: New parameters.
  * config/i386/i386.c (ix86_option_override_internal):
  Override default libcall size limit with parameters.

 Index: config/i386/stringop.def
 ===
 --- config/i386/stringop.def  (revision 0)
 +++ config/i386/stringop.def  (revision 0)
 @@ -0,0 +1,42 @@
 +/* Definitions for option handling for IA-32.
 +   Copyright (C) 2013 Free Software Foundation, Inc.
 +
 +This file is part of GCC.
 +
 +GCC is free software; you can redistribute it and/or modify
 +it under the terms of the GNU General Public License as published by
 +the Free Software Foundation; either version 3, or (at your option)
 +any later version.
 +
 +GCC is distributed in the hope that it will be useful,
 +but WITHOUT ANY WARRANTY; without even the implied warranty of
 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +GNU General Public License for more details.
 +
 +Under Section 7 of GPL version 3, you are granted additional
 +permissions described in the GCC Runtime Library Exception, version
 +3.1, as published by the Free Software Foundation.
 +
 +You should have received a copy of the GNU General Public License and
 +a copy of the GCC Runtime Library Exception along with this program;
 +see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 +http://www.gnu.org/licenses/.  */
 +
 +DEF_ENUM
 +DEF_ALG (no_stringop, no_stringop)
 +DEF_ENUM
 +DEF_ALG (libcall, libcall)
 +DEF_ENUM
 +DEF_ALG (rep_prefix_1_byte, rep_byte)
 +DEF_ENUM
 +DEF_ALG (rep_prefix_4_byte, rep_4byte)
 +DEF_ENUM
 +DEF_ALG (rep_prefix_8_byte, rep_8byte)
 +DEF_ENUM
 +DEF_ALG (loop_1_byte, byte_loop)
 +DEF_ENUM
 +DEF_ALG (loop, loop)
 +DEF_ENUM
 +DEF_ALG (unrolled_loop, unrolled_loop)
 +DEF_ENUM
 +DEF_ALG (vector_loop, vector_loop)
 Index: config/i386/i386.opt
 ===
 --- config/i386/i386.opt  (revision 201458)
 +++ config/i386/i386.opt 

Re: New parameters to control stringop expansion libcall strategy

2013-08-06 Thread Jan Hubicka
  2013-08-02  Xinliang David Li  davi...@google.com
 
  * config/i386/stringop.def: New file.
  * config/i386/stringop.opt: New file.
  * config/i386/i386-opts.h: Include stringopt.def.
  * config/i386/i386.opt: Include stringopt.opt.
  * config/i386/i386.c (ix86_option_override_internal):
  Override default size based stringop inline strategies
  with options.
  * config/i386/i386.c (ix86_parse_stringop_strategy_string):
  New function.
 
  2013-08-04  Xinliang David Li  davi...@google.com
 
  * testsuite/gcc.target/i386/memcpy-strategy-1.c: New test.
  * testsuite/gcc.target/i386/memcpy-strategy-2.c: Ditto.
  * testsuite/gcc.target/i386/memset-strategy-1.c: Ditto.
  * testsuite/gcc.target/i386/memcpy-strategy-3.c: Ditto.

The patch looks resonable to me in general.  I wonder why we need to bring
all the cost tables non-const instead of just having writable storage for
the current strategy like we do with other flags anyway.

Your strings are definitely more readable than the in-memory representation
I came up with. Perhaps we can even turn the cost tables into strings
for easier maintenance?  I guess they are bit confusing for people
not familiar with a code.

Honza
 
 
 
 
  On Fri, Aug 2, 2013 at 9:21 PM, Xinliang David Li davi...@google.com 
  wrote:
   On x86_64, when the expected size of memcpy/memset is known (e.g, with
   FDO), libcall strategy is used with the size is  8192. This value is
   hard coded, which makes it hard to do performance tuning. This patch
   adds two new parameters to do that. Potential usage includes
   per-application libcall strategy min-size tuning based on summary data
   with FDO (e.g, instruction workset size).
  
   Bootstrap and tested on x86_64/linux. Ok for trunk?
  
   thanks,
  
   David
  
  
   2013-08-02  Xinliang David Li  davi...@google.com
  
   * params.def: New parameters.
   * config/i386/i386.c (ix86_option_override_internal):
   Override default libcall size limit with parameters.
 
  Index: config/i386/stringop.def
  ===
  --- config/i386/stringop.def  (revision 0)
  +++ config/i386/stringop.def  (revision 0)
  @@ -0,0 +1,42 @@
  +/* Definitions for option handling for IA-32.
  +   Copyright (C) 2013 Free Software Foundation, Inc.
  +
  +This file is part of GCC.
  +
  +GCC is free software; you can redistribute it and/or modify
  +it under the terms of the GNU General Public License as published by
  +the Free Software Foundation; either version 3, or (at your option)
  +any later version.
  +
  +GCC is distributed in the hope that it will be useful,
  +but WITHOUT ANY WARRANTY; without even the implied warranty of
  +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  +GNU General Public License for more details.
  +
  +Under Section 7 of GPL version 3, you are granted additional
  +permissions described in the GCC Runtime Library Exception, version
  +3.1, as published by the Free Software Foundation.
  +
  +You should have received a copy of the GNU General Public License and
  +a copy of the GCC Runtime Library Exception along with this program;
  +see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
  +http://www.gnu.org/licenses/.  */
  +
  +DEF_ENUM
  +DEF_ALG (no_stringop, no_stringop)
  +DEF_ENUM
  +DEF_ALG (libcall, libcall)
  +DEF_ENUM
  +DEF_ALG (rep_prefix_1_byte, rep_byte)
  +DEF_ENUM
  +DEF_ALG (rep_prefix_4_byte, rep_4byte)
  +DEF_ENUM
  +DEF_ALG (rep_prefix_8_byte, rep_8byte)
  +DEF_ENUM
  +DEF_ALG (loop_1_byte, byte_loop)
  +DEF_ENUM
  +DEF_ALG (loop, loop)
  +DEF_ENUM
  +DEF_ALG (unrolled_loop, unrolled_loop)
  +DEF_ENUM
  +DEF_ALG (vector_loop, vector_loop)
  Index: config/i386/i386.opt
  ===
  --- config/i386/i386.opt  (revision 201458)
  +++ config/i386/i386.opt  (working copy)
  @@ -316,6 +316,14 @@ mstack-arg-probe
   Target Report Mask(STACK_PROBE) Save
   Enable stack probing
 
  +mmemcpy-strategy=
  +Target RejectNegative Joined Var(ix86_tune_memcpy_strategy)
  +Specify memcpy expansion strategy when expected size is known
  +
  +mmemset-strategy=
  +Target RejectNegative Joined Var(ix86_tune_memset_strategy)
  +Specify memset expansion strategy when expected size is known
  +
   mstringop-strategy=
   Target RejectNegative Joined Enum(stringop_alg) Var(ix86_stringop_alg) 
  Init(no_stringop)
   Chose strategy to generate stringop using
  Index: config/i386/stringop.opt
  ===
  --- config/i386/stringop.opt  (revision 0)
  +++ config/i386/stringop.opt  (revision 0)
  @@ -0,0 +1,36 @@
  +/* Definitions for option handling for IA-32.
  +   Copyright (C) 2013 Free Software Foundation, Inc.
  +
  +This file is part of GCC.
  +
  +GCC is free software; you can redistribute it 

Re: New parameters to control stringop expansion libcall strategy

2013-08-06 Thread Xinliang David Li
On Tue, Aug 6, 2013 at 2:42 AM, Jan Hubicka hubi...@ucw.cz wrote:
  2013-08-02  Xinliang David Li  davi...@google.com
 
  * config/i386/stringop.def: New file.
  * config/i386/stringop.opt: New file.
  * config/i386/i386-opts.h: Include stringopt.def.
  * config/i386/i386.opt: Include stringopt.opt.
  * config/i386/i386.c (ix86_option_override_internal):
  Override default size based stringop inline strategies
  with options.
  * config/i386/i386.c (ix86_parse_stringop_strategy_string):
  New function.
 
  2013-08-04  Xinliang David Li  davi...@google.com
 
  * testsuite/gcc.target/i386/memcpy-strategy-1.c: New test.
  * testsuite/gcc.target/i386/memcpy-strategy-2.c: Ditto.
  * testsuite/gcc.target/i386/memset-strategy-1.c: Ditto.
  * testsuite/gcc.target/i386/memcpy-strategy-3.c: Ditto.

 The patch looks resonable to me in general.  I wonder why we need to bring
 all the cost tables non-const instead of just having writable storage for
 the current strategy like we do with other flags anyway.

Having const on those arrays do not bring us anything -- those tables
will be accessed indirectly so const-prop won't happen anyways.
current_strategy is an embedded struct in the cost array so it ends up
in RO data when top level array is const.


 Your strings are definitely more readable than the in-memory representation
 I came up with. Perhaps we can even turn the cost tables into strings
 for easier maintenance?  I guess they are bit confusing for people
 not familiar with a code.

I think the in memory representation is fine -- if there is a need for
internal representation cleanup, it should done as another patch.
WDTY?

thanks,

David


 Honza
 
 
 
 
  On Fri, Aug 2, 2013 at 9:21 PM, Xinliang David Li davi...@google.com 
  wrote:
   On x86_64, when the expected size of memcpy/memset is known (e.g, with
   FDO), libcall strategy is used with the size is  8192. This value is
   hard coded, which makes it hard to do performance tuning. This patch
   adds two new parameters to do that. Potential usage includes
   per-application libcall strategy min-size tuning based on summary data
   with FDO (e.g, instruction workset size).
  
   Bootstrap and tested on x86_64/linux. Ok for trunk?
  
   thanks,
  
   David
  
  
   2013-08-02  Xinliang David Li  davi...@google.com
  
   * params.def: New parameters.
   * config/i386/i386.c (ix86_option_override_internal):
   Override default libcall size limit with parameters.
 
  Index: config/i386/stringop.def
  ===
  --- config/i386/stringop.def  (revision 0)
  +++ config/i386/stringop.def  (revision 0)
  @@ -0,0 +1,42 @@
  +/* Definitions for option handling for IA-32.
  +   Copyright (C) 2013 Free Software Foundation, Inc.
  +
  +This file is part of GCC.
  +
  +GCC is free software; you can redistribute it and/or modify
  +it under the terms of the GNU General Public License as published by
  +the Free Software Foundation; either version 3, or (at your option)
  +any later version.
  +
  +GCC is distributed in the hope that it will be useful,
  +but WITHOUT ANY WARRANTY; without even the implied warranty of
  +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  +GNU General Public License for more details.
  +
  +Under Section 7 of GPL version 3, you are granted additional
  +permissions described in the GCC Runtime Library Exception, version
  +3.1, as published by the Free Software Foundation.
  +
  +You should have received a copy of the GNU General Public License and
  +a copy of the GCC Runtime Library Exception along with this program;
  +see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
  +http://www.gnu.org/licenses/.  */
  +
  +DEF_ENUM
  +DEF_ALG (no_stringop, no_stringop)
  +DEF_ENUM
  +DEF_ALG (libcall, libcall)
  +DEF_ENUM
  +DEF_ALG (rep_prefix_1_byte, rep_byte)
  +DEF_ENUM
  +DEF_ALG (rep_prefix_4_byte, rep_4byte)
  +DEF_ENUM
  +DEF_ALG (rep_prefix_8_byte, rep_8byte)
  +DEF_ENUM
  +DEF_ALG (loop_1_byte, byte_loop)
  +DEF_ENUM
  +DEF_ALG (loop, loop)
  +DEF_ENUM
  +DEF_ALG (unrolled_loop, unrolled_loop)
  +DEF_ENUM
  +DEF_ALG (vector_loop, vector_loop)
  Index: config/i386/i386.opt
  ===
  --- config/i386/i386.opt  (revision 201458)
  +++ config/i386/i386.opt  (working copy)
  @@ -316,6 +316,14 @@ mstack-arg-probe
   Target Report Mask(STACK_PROBE) Save
   Enable stack probing
 
  +mmemcpy-strategy=
  +Target RejectNegative Joined Var(ix86_tune_memcpy_strategy)
  +Specify memcpy expansion strategy when expected size is known
  +
  +mmemset-strategy=
  +Target RejectNegative Joined Var(ix86_tune_memset_strategy)
  +Specify memset expansion strategy when expected size is known
  +
   mstringop-strategy=
   Target RejectNegative Joined Enum(stringop_alg) 

Re: New parameters to control stringop expansion libcall strategy

2013-08-06 Thread Xinliang David Li
Corrected two small problems reported by the style checker (The
warnings about the EnumValue for options  in stringopt.opt are not
valid).

On Tue, Aug 6, 2013 at 1:46 AM, Michael Zolotukhin
michael.v.zolotuk...@gmail.com wrote:
 There are still some formatting issues (like 8 spaces instead of a
 tab, wrong indentation of do-loop and some other places) - to reveal
 some of them you could use contrib/check_GNU_style.sh script.
 But that was a nitpicking again:) Actually I wanted to ask whether
 you're going to use this option for some performance experiments
 involving memmov/memset - if so, probably you could tune existing
 cost-models as well? Is it possible?

the option is designed for purpose like this.

thanks,

David


 Michael

 On 5 August 2013 20:44, Xinliang David Li davi...@google.com wrote:
 thanks. Updated patch attached.

 David

 On Mon, Aug 5, 2013 at 3:57 AM, Michael V. Zolotukhin
 michael.v.zolotuk...@gmail.com wrote:
 Hi,
 This is a really convenient option, thanks for working on it.
 I can't approve it as I'm not a maintainer, but it looks ok to me,
 except fot a small nitpicking: afair, comments should end with
 dot-space-space.

 Michael

 On 04 Aug 20:01, Xinliang David Li wrote:
 The attached is a new patch implementing the stringop inline strategy
 control using two new -m options:

 -mmemcpy-strategy=
 -mmemset-strategy=

 See changes in doc/invoke.texi for description of the new options. Example:
   
 -mmemcpy-strategy=rep_8byte:64:unaligned,unrolled_loop:2048:unaligned,libcall:-1:unaligned

 tells compiler to inline memcpy using rep_8byte when the size is no
 larger than 64 byte, using unrolled_loop when size is no larger than
 2048, and for size  2048, using library call. In all cases,
 destination alignment adjustment is not done.

 Tested on x86-64/linux. Ok for trunk?

 thanks,

 David

 2013-08-02  Xinliang David Li  davi...@google.com

 * config/i386/stringop.def: New file.
 * config/i386/stringop.opt: New file.
 * config/i386/i386-opts.h: Include stringopt.def.
 * config/i386/i386.opt: Include stringopt.opt.
 * config/i386/i386.c (ix86_option_override_internal):
 Override default size based stringop inline strategies
 with options.
 * config/i386/i386.c (ix86_parse_stringop_strategy_string):
 New function.

 2013-08-04  Xinliang David Li  davi...@google.com

 * testsuite/gcc.target/i386/memcpy-strategy-1.c: New test.
 * testsuite/gcc.target/i386/memcpy-strategy-2.c: Ditto.
 * testsuite/gcc.target/i386/memset-strategy-1.c: Ditto.
 * testsuite/gcc.target/i386/memcpy-strategy-3.c: Ditto.




 On Fri, Aug 2, 2013 at 9:21 PM, Xinliang David Li davi...@google.com 
 wrote:
  On x86_64, when the expected size of memcpy/memset is known (e.g, with
  FDO), libcall strategy is used with the size is  8192. This value is
  hard coded, which makes it hard to do performance tuning. This patch
  adds two new parameters to do that. Potential usage includes
  per-application libcall strategy min-size tuning based on summary data
  with FDO (e.g, instruction workset size).
 
  Bootstrap and tested on x86_64/linux. Ok for trunk?
 
  thanks,
 
  David
 
 
  2013-08-02  Xinliang David Li  davi...@google.com
 
  * params.def: New parameters.
  * config/i386/i386.c (ix86_option_override_internal):
  Override default libcall size limit with parameters.

 Index: config/i386/stringop.def
 ===
 --- config/i386/stringop.def  (revision 0)
 +++ config/i386/stringop.def  (revision 0)
 @@ -0,0 +1,42 @@
 +/* Definitions for option handling for IA-32.
 +   Copyright (C) 2013 Free Software Foundation, Inc.
 +
 +This file is part of GCC.
 +
 +GCC is free software; you can redistribute it and/or modify
 +it under the terms of the GNU General Public License as published by
 +the Free Software Foundation; either version 3, or (at your option)
 +any later version.
 +
 +GCC is distributed in the hope that it will be useful,
 +but WITHOUT ANY WARRANTY; without even the implied warranty of
 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +GNU General Public License for more details.
 +
 +Under Section 7 of GPL version 3, you are granted additional
 +permissions described in the GCC Runtime Library Exception, version
 +3.1, as published by the Free Software Foundation.
 +
 +You should have received a copy of the GNU General Public License and
 +a copy of the GCC Runtime Library Exception along with this program;
 +see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 +http://www.gnu.org/licenses/.  */
 +
 +DEF_ENUM
 +DEF_ALG (no_stringop, no_stringop)
 +DEF_ENUM
 +DEF_ALG (libcall, libcall)
 +DEF_ENUM
 +DEF_ALG (rep_prefix_1_byte, rep_byte)
 +DEF_ENUM
 +DEF_ALG (rep_prefix_4_byte, rep_4byte)
 +DEF_ENUM
 +DEF_ALG (rep_prefix_8_byte, rep_8byte)
 +DEF_ENUM
 +DEF_ALG (loop_1_byte, byte_loop)
 

Re: New parameters to control stringop expansion libcall strategy

2013-08-06 Thread Xinliang David Li
Forgot the patch.

David

On Tue, Aug 6, 2013 at 9:42 AM, Xinliang David Li davi...@google.com wrote:
 Corrected two small problems reported by the style checker (The
 warnings about the EnumValue for options  in stringopt.opt are not
 valid).

 On Tue, Aug 6, 2013 at 1:46 AM, Michael Zolotukhin
 michael.v.zolotuk...@gmail.com wrote:
 There are still some formatting issues (like 8 spaces instead of a
 tab, wrong indentation of do-loop and some other places) - to reveal
 some of them you could use contrib/check_GNU_style.sh script.
 But that was a nitpicking again:) Actually I wanted to ask whether
 you're going to use this option for some performance experiments
 involving memmov/memset - if so, probably you could tune existing
 cost-models as well? Is it possible?

 the option is designed for purpose like this.

 thanks,

 David


 Michael

 On 5 August 2013 20:44, Xinliang David Li davi...@google.com wrote:
 thanks. Updated patch attached.

 David

 On Mon, Aug 5, 2013 at 3:57 AM, Michael V. Zolotukhin
 michael.v.zolotuk...@gmail.com wrote:
 Hi,
 This is a really convenient option, thanks for working on it.
 I can't approve it as I'm not a maintainer, but it looks ok to me,
 except fot a small nitpicking: afair, comments should end with
 dot-space-space.

 Michael

 On 04 Aug 20:01, Xinliang David Li wrote:
 The attached is a new patch implementing the stringop inline strategy
 control using two new -m options:

 -mmemcpy-strategy=
 -mmemset-strategy=

 See changes in doc/invoke.texi for description of the new options. 
 Example:
   
 -mmemcpy-strategy=rep_8byte:64:unaligned,unrolled_loop:2048:unaligned,libcall:-1:unaligned

 tells compiler to inline memcpy using rep_8byte when the size is no
 larger than 64 byte, using unrolled_loop when size is no larger than
 2048, and for size  2048, using library call. In all cases,
 destination alignment adjustment is not done.

 Tested on x86-64/linux. Ok for trunk?

 thanks,

 David

 2013-08-02  Xinliang David Li  davi...@google.com

 * config/i386/stringop.def: New file.
 * config/i386/stringop.opt: New file.
 * config/i386/i386-opts.h: Include stringopt.def.
 * config/i386/i386.opt: Include stringopt.opt.
 * config/i386/i386.c (ix86_option_override_internal):
 Override default size based stringop inline strategies
 with options.
 * config/i386/i386.c (ix86_parse_stringop_strategy_string):
 New function.

 2013-08-04  Xinliang David Li  davi...@google.com

 * testsuite/gcc.target/i386/memcpy-strategy-1.c: New test.
 * testsuite/gcc.target/i386/memcpy-strategy-2.c: Ditto.
 * testsuite/gcc.target/i386/memset-strategy-1.c: Ditto.
 * testsuite/gcc.target/i386/memcpy-strategy-3.c: Ditto.




 On Fri, Aug 2, 2013 at 9:21 PM, Xinliang David Li davi...@google.com 
 wrote:
  On x86_64, when the expected size of memcpy/memset is known (e.g, with
  FDO), libcall strategy is used with the size is  8192. This value is
  hard coded, which makes it hard to do performance tuning. This patch
  adds two new parameters to do that. Potential usage includes
  per-application libcall strategy min-size tuning based on summary data
  with FDO (e.g, instruction workset size).
 
  Bootstrap and tested on x86_64/linux. Ok for trunk?
 
  thanks,
 
  David
 
 
  2013-08-02  Xinliang David Li  davi...@google.com
 
  * params.def: New parameters.
  * config/i386/i386.c (ix86_option_override_internal):
  Override default libcall size limit with parameters.

 Index: config/i386/stringop.def
 ===
 --- config/i386/stringop.def  (revision 0)
 +++ config/i386/stringop.def  (revision 0)
 @@ -0,0 +1,42 @@
 +/* Definitions for option handling for IA-32.
 +   Copyright (C) 2013 Free Software Foundation, Inc.
 +
 +This file is part of GCC.
 +
 +GCC is free software; you can redistribute it and/or modify
 +it under the terms of the GNU General Public License as published by
 +the Free Software Foundation; either version 3, or (at your option)
 +any later version.
 +
 +GCC is distributed in the hope that it will be useful,
 +but WITHOUT ANY WARRANTY; without even the implied warranty of
 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +GNU General Public License for more details.
 +
 +Under Section 7 of GPL version 3, you are granted additional
 +permissions described in the GCC Runtime Library Exception, version
 +3.1, as published by the Free Software Foundation.
 +
 +You should have received a copy of the GNU General Public License and
 +a copy of the GCC Runtime Library Exception along with this program;
 +see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 +http://www.gnu.org/licenses/.  */
 +
 +DEF_ENUM
 +DEF_ALG (no_stringop, no_stringop)
 +DEF_ENUM
 +DEF_ALG (libcall, libcall)
 +DEF_ENUM
 +DEF_ALG (rep_prefix_1_byte, rep_byte)
 +DEF_ENUM
 +DEF_ALG (rep_prefix_4_byte, 

Re: New parameters to control stringop expansion libcall strategy

2013-08-05 Thread Michael V. Zolotukhin
Hi,
This is a really convenient option, thanks for working on it.
I can't approve it as I'm not a maintainer, but it looks ok to me,
except fot a small nitpicking: afair, comments should end with
dot-space-space.

Michael

On 04 Aug 20:01, Xinliang David Li wrote:
 The attached is a new patch implementing the stringop inline strategy
 control using two new -m options:
 
 -mmemcpy-strategy=
 -mmemset-strategy=
 
 See changes in doc/invoke.texi for description of the new options. Example:
   
 -mmemcpy-strategy=rep_8byte:64:unaligned,unrolled_loop:2048:unaligned,libcall:-1:unaligned
 
 tells compiler to inline memcpy using rep_8byte when the size is no
 larger than 64 byte, using unrolled_loop when size is no larger than
 2048, and for size  2048, using library call. In all cases,
 destination alignment adjustment is not done.
 
 Tested on x86-64/linux. Ok for trunk?
 
 thanks,
 
 David
 
 2013-08-02  Xinliang David Li  davi...@google.com
 
 * config/i386/stringop.def: New file.
 * config/i386/stringop.opt: New file.
 * config/i386/i386-opts.h: Include stringopt.def.
 * config/i386/i386.opt: Include stringopt.opt.
 * config/i386/i386.c (ix86_option_override_internal):
 Override default size based stringop inline strategies
 with options.
 * config/i386/i386.c (ix86_parse_stringop_strategy_string):
 New function.
 
 2013-08-04  Xinliang David Li  davi...@google.com
 
 * testsuite/gcc.target/i386/memcpy-strategy-1.c: New test.
 * testsuite/gcc.target/i386/memcpy-strategy-2.c: Ditto.
 * testsuite/gcc.target/i386/memset-strategy-1.c: Ditto.
 * testsuite/gcc.target/i386/memcpy-strategy-3.c: Ditto.
 
 
 
 
 On Fri, Aug 2, 2013 at 9:21 PM, Xinliang David Li davi...@google.com wrote:
  On x86_64, when the expected size of memcpy/memset is known (e.g, with
  FDO), libcall strategy is used with the size is  8192. This value is
  hard coded, which makes it hard to do performance tuning. This patch
  adds two new parameters to do that. Potential usage includes
  per-application libcall strategy min-size tuning based on summary data
  with FDO (e.g, instruction workset size).
 
  Bootstrap and tested on x86_64/linux. Ok for trunk?
 
  thanks,
 
  David
 
 
  2013-08-02  Xinliang David Li  davi...@google.com
 
  * params.def: New parameters.
  * config/i386/i386.c (ix86_option_override_internal):
  Override default libcall size limit with parameters.

 Index: config/i386/stringop.def
 ===
 --- config/i386/stringop.def  (revision 0)
 +++ config/i386/stringop.def  (revision 0)
 @@ -0,0 +1,42 @@
 +/* Definitions for option handling for IA-32.
 +   Copyright (C) 2013 Free Software Foundation, Inc.
 +
 +This file is part of GCC.
 +
 +GCC is free software; you can redistribute it and/or modify
 +it under the terms of the GNU General Public License as published by
 +the Free Software Foundation; either version 3, or (at your option)
 +any later version.
 +
 +GCC is distributed in the hope that it will be useful,
 +but WITHOUT ANY WARRANTY; without even the implied warranty of
 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +GNU General Public License for more details.
 +
 +Under Section 7 of GPL version 3, you are granted additional
 +permissions described in the GCC Runtime Library Exception, version
 +3.1, as published by the Free Software Foundation.
 +
 +You should have received a copy of the GNU General Public License and
 +a copy of the GCC Runtime Library Exception along with this program;
 +see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 +http://www.gnu.org/licenses/.  */
 +
 +DEF_ENUM
 +DEF_ALG (no_stringop, no_stringop)
 +DEF_ENUM
 +DEF_ALG (libcall, libcall)
 +DEF_ENUM
 +DEF_ALG (rep_prefix_1_byte, rep_byte)
 +DEF_ENUM
 +DEF_ALG (rep_prefix_4_byte, rep_4byte)
 +DEF_ENUM
 +DEF_ALG (rep_prefix_8_byte, rep_8byte)
 +DEF_ENUM
 +DEF_ALG (loop_1_byte, byte_loop)
 +DEF_ENUM
 +DEF_ALG (loop, loop)
 +DEF_ENUM
 +DEF_ALG (unrolled_loop, unrolled_loop)
 +DEF_ENUM
 +DEF_ALG (vector_loop, vector_loop)
 Index: config/i386/i386.opt
 ===
 --- config/i386/i386.opt  (revision 201458)
 +++ config/i386/i386.opt  (working copy)
 @@ -316,6 +316,14 @@ mstack-arg-probe
  Target Report Mask(STACK_PROBE) Save
  Enable stack probing
  
 +mmemcpy-strategy=
 +Target RejectNegative Joined Var(ix86_tune_memcpy_strategy)
 +Specify memcpy expansion strategy when expected size is known
 +
 +mmemset-strategy=
 +Target RejectNegative Joined Var(ix86_tune_memset_strategy)
 +Specify memset expansion strategy when expected size is known
 +
  mstringop-strategy=
  Target RejectNegative Joined Enum(stringop_alg) Var(ix86_stringop_alg) 
 Init(no_stringop)
  Chose strategy to generate stringop using
 Index: config/i386/stringop.opt
 

Re: New parameters to control stringop expansion libcall strategy

2013-08-05 Thread Xinliang David Li
thanks. Updated patch attached.

David

On Mon, Aug 5, 2013 at 3:57 AM, Michael V. Zolotukhin
michael.v.zolotuk...@gmail.com wrote:
 Hi,
 This is a really convenient option, thanks for working on it.
 I can't approve it as I'm not a maintainer, but it looks ok to me,
 except fot a small nitpicking: afair, comments should end with
 dot-space-space.

 Michael

 On 04 Aug 20:01, Xinliang David Li wrote:
 The attached is a new patch implementing the stringop inline strategy
 control using two new -m options:

 -mmemcpy-strategy=
 -mmemset-strategy=

 See changes in doc/invoke.texi for description of the new options. Example:
   
 -mmemcpy-strategy=rep_8byte:64:unaligned,unrolled_loop:2048:unaligned,libcall:-1:unaligned

 tells compiler to inline memcpy using rep_8byte when the size is no
 larger than 64 byte, using unrolled_loop when size is no larger than
 2048, and for size  2048, using library call. In all cases,
 destination alignment adjustment is not done.

 Tested on x86-64/linux. Ok for trunk?

 thanks,

 David

 2013-08-02  Xinliang David Li  davi...@google.com

 * config/i386/stringop.def: New file.
 * config/i386/stringop.opt: New file.
 * config/i386/i386-opts.h: Include stringopt.def.
 * config/i386/i386.opt: Include stringopt.opt.
 * config/i386/i386.c (ix86_option_override_internal):
 Override default size based stringop inline strategies
 with options.
 * config/i386/i386.c (ix86_parse_stringop_strategy_string):
 New function.

 2013-08-04  Xinliang David Li  davi...@google.com

 * testsuite/gcc.target/i386/memcpy-strategy-1.c: New test.
 * testsuite/gcc.target/i386/memcpy-strategy-2.c: Ditto.
 * testsuite/gcc.target/i386/memset-strategy-1.c: Ditto.
 * testsuite/gcc.target/i386/memcpy-strategy-3.c: Ditto.




 On Fri, Aug 2, 2013 at 9:21 PM, Xinliang David Li davi...@google.com wrote:
  On x86_64, when the expected size of memcpy/memset is known (e.g, with
  FDO), libcall strategy is used with the size is  8192. This value is
  hard coded, which makes it hard to do performance tuning. This patch
  adds two new parameters to do that. Potential usage includes
  per-application libcall strategy min-size tuning based on summary data
  with FDO (e.g, instruction workset size).
 
  Bootstrap and tested on x86_64/linux. Ok for trunk?
 
  thanks,
 
  David
 
 
  2013-08-02  Xinliang David Li  davi...@google.com
 
  * params.def: New parameters.
  * config/i386/i386.c (ix86_option_override_internal):
  Override default libcall size limit with parameters.

 Index: config/i386/stringop.def
 ===
 --- config/i386/stringop.def  (revision 0)
 +++ config/i386/stringop.def  (revision 0)
 @@ -0,0 +1,42 @@
 +/* Definitions for option handling for IA-32.
 +   Copyright (C) 2013 Free Software Foundation, Inc.
 +
 +This file is part of GCC.
 +
 +GCC is free software; you can redistribute it and/or modify
 +it under the terms of the GNU General Public License as published by
 +the Free Software Foundation; either version 3, or (at your option)
 +any later version.
 +
 +GCC is distributed in the hope that it will be useful,
 +but WITHOUT ANY WARRANTY; without even the implied warranty of
 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +GNU General Public License for more details.
 +
 +Under Section 7 of GPL version 3, you are granted additional
 +permissions described in the GCC Runtime Library Exception, version
 +3.1, as published by the Free Software Foundation.
 +
 +You should have received a copy of the GNU General Public License and
 +a copy of the GCC Runtime Library Exception along with this program;
 +see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 +http://www.gnu.org/licenses/.  */
 +
 +DEF_ENUM
 +DEF_ALG (no_stringop, no_stringop)
 +DEF_ENUM
 +DEF_ALG (libcall, libcall)
 +DEF_ENUM
 +DEF_ALG (rep_prefix_1_byte, rep_byte)
 +DEF_ENUM
 +DEF_ALG (rep_prefix_4_byte, rep_4byte)
 +DEF_ENUM
 +DEF_ALG (rep_prefix_8_byte, rep_8byte)
 +DEF_ENUM
 +DEF_ALG (loop_1_byte, byte_loop)
 +DEF_ENUM
 +DEF_ALG (loop, loop)
 +DEF_ENUM
 +DEF_ALG (unrolled_loop, unrolled_loop)
 +DEF_ENUM
 +DEF_ALG (vector_loop, vector_loop)
 Index: config/i386/i386.opt
 ===
 --- config/i386/i386.opt  (revision 201458)
 +++ config/i386/i386.opt  (working copy)
 @@ -316,6 +316,14 @@ mstack-arg-probe
  Target Report Mask(STACK_PROBE) Save
  Enable stack probing

 +mmemcpy-strategy=
 +Target RejectNegative Joined Var(ix86_tune_memcpy_strategy)
 +Specify memcpy expansion strategy when expected size is known
 +
 +mmemset-strategy=
 +Target RejectNegative Joined Var(ix86_tune_memset_strategy)
 +Specify memset expansion strategy when expected size is known
 +
  mstringop-strategy=
  Target RejectNegative Joined Enum(stringop_alg) Var(ix86_stringop_alg) 
 

Re: New parameters to control stringop expansion libcall strategy

2013-08-04 Thread Xinliang David Li
The attached is a new patch implementing the stringop inline strategy
control using two new -m options:

-mmemcpy-strategy=
-mmemset-strategy=

See changes in doc/invoke.texi for description of the new options. Example:
  
-mmemcpy-strategy=rep_8byte:64:unaligned,unrolled_loop:2048:unaligned,libcall:-1:unaligned

tells compiler to inline memcpy using rep_8byte when the size is no
larger than 64 byte, using unrolled_loop when size is no larger than
2048, and for size  2048, using library call. In all cases,
destination alignment adjustment is not done.

Tested on x86-64/linux. Ok for trunk?

thanks,

David

2013-08-02  Xinliang David Li  davi...@google.com

* config/i386/stringop.def: New file.
* config/i386/stringop.opt: New file.
* config/i386/i386-opts.h: Include stringopt.def.
* config/i386/i386.opt: Include stringopt.opt.
* config/i386/i386.c (ix86_option_override_internal):
Override default size based stringop inline strategies
with options.
* config/i386/i386.c (ix86_parse_stringop_strategy_string):
New function.

2013-08-04  Xinliang David Li  davi...@google.com

* testsuite/gcc.target/i386/memcpy-strategy-1.c: New test.
* testsuite/gcc.target/i386/memcpy-strategy-2.c: Ditto.
* testsuite/gcc.target/i386/memset-strategy-1.c: Ditto.
* testsuite/gcc.target/i386/memcpy-strategy-3.c: Ditto.




On Fri, Aug 2, 2013 at 9:21 PM, Xinliang David Li davi...@google.com wrote:
 On x86_64, when the expected size of memcpy/memset is known (e.g, with
 FDO), libcall strategy is used with the size is  8192. This value is
 hard coded, which makes it hard to do performance tuning. This patch
 adds two new parameters to do that. Potential usage includes
 per-application libcall strategy min-size tuning based on summary data
 with FDO (e.g, instruction workset size).

 Bootstrap and tested on x86_64/linux. Ok for trunk?

 thanks,

 David


 2013-08-02  Xinliang David Li  davi...@google.com

 * params.def: New parameters.
 * config/i386/i386.c (ix86_option_override_internal):
 Override default libcall size limit with parameters.
Index: config/i386/stringop.def
===
--- config/i386/stringop.def(revision 0)
+++ config/i386/stringop.def(revision 0)
@@ -0,0 +1,42 @@
+/* Definitions for option handling for IA-32.
+   Copyright (C) 2013 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+http://www.gnu.org/licenses/.  */
+
+DEF_ENUM
+DEF_ALG (no_stringop, no_stringop)
+DEF_ENUM
+DEF_ALG (libcall, libcall)
+DEF_ENUM
+DEF_ALG (rep_prefix_1_byte, rep_byte)
+DEF_ENUM
+DEF_ALG (rep_prefix_4_byte, rep_4byte)
+DEF_ENUM
+DEF_ALG (rep_prefix_8_byte, rep_8byte)
+DEF_ENUM
+DEF_ALG (loop_1_byte, byte_loop)
+DEF_ENUM
+DEF_ALG (loop, loop)
+DEF_ENUM
+DEF_ALG (unrolled_loop, unrolled_loop)
+DEF_ENUM
+DEF_ALG (vector_loop, vector_loop)
Index: config/i386/i386.opt
===
--- config/i386/i386.opt(revision 201458)
+++ config/i386/i386.opt(working copy)
@@ -316,6 +316,14 @@ mstack-arg-probe
 Target Report Mask(STACK_PROBE) Save
 Enable stack probing
 
+mmemcpy-strategy=
+Target RejectNegative Joined Var(ix86_tune_memcpy_strategy)
+Specify memcpy expansion strategy when expected size is known
+
+mmemset-strategy=
+Target RejectNegative Joined Var(ix86_tune_memset_strategy)
+Specify memset expansion strategy when expected size is known
+
 mstringop-strategy=
 Target RejectNegative Joined Enum(stringop_alg) Var(ix86_stringop_alg) 
Init(no_stringop)
 Chose strategy to generate stringop using
Index: config/i386/stringop.opt
===
--- config/i386/stringop.opt(revision 0)
+++ config/i386/stringop.opt(revision 0)
@@ -0,0 +1,36 @@
+/* Definitions for option handling for IA-32.
+   Copyright (C) 2013 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public 

Backend specific params.def? (Was Re: New parameters to control stringop expansion libcall strategy)

2013-08-03 Thread Jan Hubicka
 On x86_64, when the expected size of memcpy/memset is known (e.g, with
 FDO), libcall strategy is used with the size is  8192. This value is
 hard coded, which makes it hard to do performance tuning. This patch
 adds two new parameters to do that. Potential usage includes
 per-application libcall strategy min-size tuning based on summary data
 with FDO (e.g, instruction workset size).
 
 Bootstrap and tested on x86_64/linux. Ok for trunk?
 
 thanks,
 
 David
 
 
 2013-08-02  Xinliang David Li  davi...@google.com
 
 * params.def: New parameters.
 * config/i386/i386.c (ix86_option_override_internal):
 Override default libcall size limit with parameters.

Hi,
problem with this is that we introduce generic --param that is used only
by x86 backend.  I am not really guru on the command line options, but I think
this is first time we try to do such thing.  I wonder if
1) We want to introduce target specific params.def
2) We want to use usual -msomething= options
3) We want to go this way?

Honza


Re: Backend specific params.def? (Was Re: New parameters to control stringop expansion libcall strategy)

2013-08-03 Thread Xinliang David Li
On Sat, Aug 3, 2013 at 1:06 AM, Jan Hubicka hubi...@ucw.cz wrote:
 On x86_64, when the expected size of memcpy/memset is known (e.g, with
 FDO), libcall strategy is used with the size is  8192. This value is
 hard coded, which makes it hard to do performance tuning. This patch
 adds two new parameters to do that. Potential usage includes
 per-application libcall strategy min-size tuning based on summary data
 with FDO (e.g, instruction workset size).

 Bootstrap and tested on x86_64/linux. Ok for trunk?

 thanks,

 David


 2013-08-02  Xinliang David Li  davi...@google.com

 * params.def: New parameters.
 * config/i386/i386.c (ix86_option_override_internal):
 Override default libcall size limit with parameters.

 Hi,
 problem with this is that we introduce generic --param that is used only
 by x86 backend.  I am not really guru on the command line options, but I think
 this is first time we try to do such thing.  I wonder if
 1) We want to introduce target specific params.def

We do have target specific tuning code for parameters though  --
backend overrides the default value -- I think this is essentially
target specific params.

 2) We want to use usual -msomething= options
 3) We want to go this way?

I don't have strong opinion either way. To avoid controversy, let me
work on a -mxxx= version of the patch -- and hopefully it will be more
powerful.

thanks,

David


 Honza