diff options
author | Takayuki 'January June' Suwa <jjsuwa_sys3175@yahoo.co.jp> | 2025-07-07 23:40:17 +0900 |
---|---|---|
committer | Max Filippov <jcmvbkbc@gmail.com> | 2025-07-08 10:28:48 -0700 |
commit | 57da36bed1004d2b78057568176b76cb0a50d149 (patch) | |
tree | f46adc04bc942cdff32caf2849c22280447c0afd | |
parent | 1f3bf202355f16d6ec0a9b37cb6a71be5f76b77f (diff) | |
download | gcc-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.cc | 17 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/xtensa/BGEUI-BLTUI-32k-64k.c | 19 |
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 } } */ |