This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PING] [PATCH, ARM] Set max_insns_skipped to MAX_INSN_PER_IT_BLOCK when optimize_size for THUMB2
- From: "Zhenqiang Chen" <zhenqiang dot chen at arm dot com>
- To: <gcc-patches at gcc dot gnu dot org>
- Cc: "Ramana Radhakrishnan" <Ramana dot Radhakrishnan at arm dot com>
- Date: Tue, 29 Apr 2014 17:37:33 +0800
- Subject: [PING] [PATCH, ARM] Set max_insns_skipped to MAX_INSN_PER_IT_BLOCK when optimize_size for THUMB2
- Authentication-results: sourceware.org; auth=none
Ping? OK for trunk?
Thanks!
-Zhenqiang
> -----Original Message-----
> From: gcc-patches-owner@gcc.gnu.org [mailto:gcc-patches-
> owner@gcc.gnu.org] On Behalf Of Zhenqiang Chen
> Sent: Tuesday, February 25, 2014 5:35 PM
> To: gcc-patches@gcc.gnu.org
> Cc: Ramana Radhakrishnan
> Subject: [PATCH, ARM] Set max_insns_skipped to
> MAX_INSN_PER_IT_BLOCK when optimize_size for THUMB2
>
> Hi,
>
> Current value for max_insns_skipped is 6. For THUMB2, it needs 2 (IF-THEN)
> or 3 (IF-THEN-ELSE) IT blocks to hold all the instructions. The overhead
of IT is
> 4 or 6 BYTES.
>
> If we do not generate IT blocks, for IF-THEN, the overhead of conditional
> jump is 2 or 4; for IF-THEN-ELSE, the overhead is 4, 6, or 8.
>
> Most THUMB2 jump instructions are 2 BYTES. Tests on CSiBE show no one file
> has code size regression. So The patch sets max_insns_skipped to
> MAX_INSN_PER_IT_BLOCK.
>
> No make check regression on cortex-m3.
> For CSiBE, no any file has code size regression. And overall there is
>0.01%
> code size improvement for cortex-a9 and cortex-m4.
>
> Is it OK?
>
> Thanks!
> -Zhenqiang
>
> 2014-02-25 Zhenqiang Chen <zhenqiang.chen@arm.com>
>
> * config/arm/arm.c (arm_option_override): Set max_insns_skipped
> to MAX_INSN_PER_IT_BLOCK when optimize_size for THUMB2.
>
> testsuite/ChangeLog:
> 2014-02-25 Zhenqiang Chen <zhenqiang.chen@arm.com>
>
> * gcc.target/arm/max-insns-skipped.c: New test.
>
> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index
> b49f43e..99cdbc4 100644
> --- a/gcc/config/arm/arm.c
> +++ b/gcc/config/arm/arm.c
> @@ -2743,6 +2743,15 @@ arm_option_override (void)
> /* If optimizing for size, bump the number of instructions that we
> are prepared to conditionally execute (even on a StrongARM). */
> max_insns_skipped = 6;
> +
> + /* For THUMB2, it needs 2 (IF-THEN) or 3 (IF-THEN-ELSE) IT blocks
to
> + hold all the instructions. The overhead of IT is 4 or 6 BYTES.
> + If we do not generate IT blocks, for IF-THEN, the overhead of
> + conditional jump is 2 or 4; for IF-THEN-ELSE, the overhead is 4, 6
> + or 8. Most THUMB2 jump instructions are 2 BYTES.
> + So set max_insns_skipped to MAX_INSN_PER_IT_BLOCK. */
> + if (TARGET_THUMB2)
> + max_insns_skipped = MAX_INSN_PER_IT_BLOCK;
> }
> else
> max_insns_skipped = current_tune->max_insns_skipped; diff --git
> a/gcc/testsuite/gcc.target/arm/max-insns-skipped.c
> b/gcc/testsuite/gcc.target/arm/max-insns-skipped.c
> new file mode 100644
> index 0000000..0a11554
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/arm/max-insns-skipped.c
> @@ -0,0 +1,21 @@
> +/* { dg-do assemble { target arm_thumb2 } } */
> +/* { dg-options " -Os " } */
> +
> +int t (int a, int b, int c, int d)
> +{
> + int r;
> + if (a > 0) {
> + r = a + b;
> + r += 0x456;
> + r *= 0x1234567;
> + }
> + else {
> + r = b - a;
> + r -= 0x123;
> + r *= 0x12387;
> + r += d;
> + }
> + return r;
> +}
> +
> +/* { dg-final { object-size text <= 40 } } */
>
>
>