aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakayuki 'January June' Suwa <jjsuwa_sys3175@yahoo.co.jp>2025-07-07 23:40:17 +0900
committerMax Filippov <jcmvbkbc@gmail.com>2025-07-08 10:28:48 -0700
commit57da36bed1004d2b78057568176b76cb0a50d149 (patch)
treef46adc04bc942cdff32caf2849c22280447c0afd
parent1f3bf202355f16d6ec0a9b37cb6a71be5f76b77f (diff)
downloadgcc-57da36bed1004d2b78057568176b76cb0a50d149.zip
gcc-57da36bed1004d2b78057568176b76cb0a50d149.tar.gz
gcc-57da36bed1004d2b78057568176b76cb0a50d149.tar.bz2
xtensa: Fix B[GE/LT]UI instructions with immediate values of 32768 or 65536 not being emitted
This is because in canonicalize_comparison() in gcc/expmed.cc, the COMPARE rtx_cost() for the immediate values in the title does not change between the old and new versions. This patch fixes that. (note: Currently, this patch only works if some constant propagation optimizations are enabled (-O2 or higher) or if bare large constant assignments are possible (-mconst16 or -mauto-litpools). In the future I hope to make it work at -O1...) gcc/ChangeLog: * config/xtensa/xtensa.cc (xtensa_b4const_or_zero): Remove. (xtensa_b4const): Add a case where the value is 0, and rename to xtensa_b4const_or_zero. (xtensa_rtx_costs): Fix to also consider the result of xtensa_b4constu(). gcc/testsuite/ChangeLog: * gcc.target/xtensa/BGEUI-BLTUI-32k-64k.c: New.
-rw-r--r--gcc/config/xtensa/xtensa.cc17
-rw-r--r--gcc/testsuite/gcc.target/xtensa/BGEUI-BLTUI-32k-64k.c19
2 files changed, 24 insertions, 12 deletions
diff --git a/gcc/config/xtensa/xtensa.cc b/gcc/config/xtensa/xtensa.cc
index 8c43a69..b75cec1 100644
--- a/gcc/config/xtensa/xtensa.cc
+++ b/gcc/config/xtensa/xtensa.cc
@@ -423,12 +423,13 @@ xtensa_uimm8x4 (HOST_WIDE_INT v)
}
-static bool
-xtensa_b4const (HOST_WIDE_INT v)
+bool
+xtensa_b4const_or_zero (HOST_WIDE_INT v)
{
switch (v)
{
case -1:
+ case 0:
case 1:
case 2:
case 3:
@@ -451,15 +452,6 @@ xtensa_b4const (HOST_WIDE_INT v)
bool
-xtensa_b4const_or_zero (HOST_WIDE_INT v)
-{
- if (v == 0)
- return true;
- return xtensa_b4const (v);
-}
-
-
-bool
xtensa_b4constu (HOST_WIDE_INT v)
{
switch (v)
@@ -4512,7 +4504,8 @@ xtensa_rtx_costs (rtx x, machine_mode mode, int outer_code,
}
break;
case COMPARE:
- if ((INTVAL (x) == 0) || xtensa_b4const (INTVAL (x)))
+ if (xtensa_b4const_or_zero (INTVAL (x))
+ || xtensa_b4constu (INTVAL (x)))
{
*total = 0;
return true;
diff --git a/gcc/testsuite/gcc.target/xtensa/BGEUI-BLTUI-32k-64k.c b/gcc/testsuite/gcc.target/xtensa/BGEUI-BLTUI-32k-64k.c
new file mode 100644
index 0000000..05873b8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/xtensa/BGEUI-BLTUI-32k-64k.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+extern void foo(void);
+
+void BGEUI_test(unsigned int a)
+{
+ if (a < 32768U)
+ foo();
+}
+
+void BLTUI_test(unsigned int a)
+{
+ if (a >= 65536U)
+ foo();
+}
+
+/* { dg-final { scan-assembler-times "bgeui" 1 } } */
+/* { dg-final { scan-assembler-times "bltui" 1 } } */