https://gcc.gnu.org/g:57da36bed1004d2b78057568176b76cb0a50d149
commit r16-2110-g57da36bed1004d2b78057568176b76cb0a50d149 Author: Takayuki 'January June' Suwa <jjsuwa_sys3...@yahoo.co.jp> Date: Mon Jul 7 23:40:17 2025 +0900 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. Diff: --- gcc/config/xtensa/xtensa.cc | 17 +++++------------ 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 8c43a69f4cd9..b75cec13b28a 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: @@ -450,15 +451,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) { @@ -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 000000000000..05873b896896 --- /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 } } */