From 894b6809822ba3a3a1bab3750abe29e03f2a3ad6 Mon Sep 17 00:00:00 2001
From: Jozef Lawrynowicz <jozef.l@mittosystems.com>
Date: Mon, 13 May 2019 17:52:19 +0100
Subject: [PATCH 3/4] MSP430: Do not use the performance optimized variant of a
shift by constant amount when optimizing for size
gcc/ChangeLog
2019-06-04 Jozef Lawrynowicz <jozef.l@mittosystems.com>
* config/msp430/msp430.md (ashlhi3): Use the const_variant of shift
library functions only when not optimizing for size.
(ashlsi3): Likewise.
(ashrhi3): Likewise.
(ashrsi3): Likewise.
(lshrhi3): Likewise.
(lshrsi3): Likewise.
gcc/testsuite/ChangeLog
2019-06-04 Jozef Lawrynowicz <jozef.l@mittosystems.com>
* gcc.target/msp430/size-optimized-shifts.c: New test.
---
gcc/config/msp430/msp430.md | 15 ++++++-----
.../gcc.target/msp430/size-optimized-shifts.c | 26 +++++++++++++++++++
2 files changed, 35 insertions(+), 6 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/msp430/size-optimized-shifts.c
@@ -769,7 +769,10 @@
&& INTVAL (operands[2]) == 1)
emit_insn (gen_slli_1 (operands[0], operands[1]));
else
- msp430_expand_helper (operands, \"__mspabi_slli\", true);
+ /* The const variants of mspabi shifts have larger code size than the
+ generic version, so use the generic version if optimizing for
+ size. */
+ msp430_expand_helper (operands, \"__mspabi_slli\", !optimize_size);
DONE;
}
)
@@ -815,7 +818,7 @@
(ashift:SI (match_operand:SI 1 "general_operand")
(match_operand:SI 2 "general_operand")))]
""
- "msp430_expand_helper (operands, \"__mspabi_slll\", true);
+ "msp430_expand_helper (operands, \"__mspabi_slll\", !optimize_size);
DONE;"
)
@@ -842,7 +845,7 @@
&& INTVAL (operands[2]) == 1)
emit_insn (gen_srai_1 (operands[0], operands[1]));
else
- msp430_expand_helper (operands, \"__mspabi_srai\", true);
+ msp430_expand_helper (operands, \"__mspabi_srai\", !optimize_size);
DONE;
}
)
@@ -904,7 +907,7 @@
(ashiftrt:SI (match_operand:SI 1 "general_operand")
(match_operand:SI 2 "general_operand")))]
""
- "msp430_expand_helper (operands, \"__mspabi_sral\", true);
+ "msp430_expand_helper (operands, \"__mspabi_sral\", !optimize_size);
DONE;"
)
@@ -931,7 +934,7 @@
&& INTVAL (operands[2]) == 1)
emit_insn (gen_srli_1 (operands[0], operands[1]));
else
- msp430_expand_helper (operands, \"__mspabi_srli\", true);
+ msp430_expand_helper (operands, \"__mspabi_srli\", !optimize_size);
DONE;
}
)
@@ -983,7 +986,7 @@
(lshiftrt:SI (match_operand:SI 1 "general_operand")
(match_operand:SI 2 "general_operand")))]
""
- "msp430_expand_helper (operands, \"__mspabi_srll\", true);
+ "msp430_expand_helper (operands, \"__mspabi_srll\", !optimize_size);
DONE;"
)
new file mode 100644
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+/* { dg-final { scan-assembler-not "__mspabi_sral_4" } } */
+/* { dg-final { scan-assembler-not "__mspabi_srll_4" } } */
+/* { dg-final { scan-assembler-not "__mspabi_slll_4" } } */
+/* { dg-final { scan-assembler "__mspabi_sral" } } */
+/* { dg-final { scan-assembler "__mspabi_srll" } } */
+/* { dg-final { scan-assembler "__mspabi_slll" } } */
+
+/* Ensure that SImode shifts by a constant amount do not use the const_variant
+ of the shift library code when optimizing for size. */
+
+long a;
+long b;
+long c;
+long d;
+unsigned long e;
+unsigned long f;
+
+void
+foo (void)
+{
+ a = b >> 4;
+ c = d << 4;
+ e = f >> 4;
+}
--
2.17.1