On 08/11/2024 18:47, Torbjörn SVENSSON wrote:
Ok for trunk and releases/gcc-14?
--
A long time ago, this test forced -march=armv6.
With -marm, the generated assembler is:
foo:
sub r0, r0, #48
cmp r0, #9
movhi r0, #0
movls r0, #1
bx lr
With -mthumb, the generated assembler is:
foo:
subs r0, r0, #48
movs r2, #9
uxtb r3, r0
movs r0, #0
cmp r2, r3
adcs r0, r0, r0
uxtb r0, r0
bx lr
Looking at this code, I think both the uxtb instructions are unnecessary.
For the first UXTB. On entry, 'c' is a char (unsigned) so the value is
passed by the caller in a 32-bit reg, but range-limited (by the ABI) to
values between 0 and 255.
We subtract 48 from that, so the range now, is from -48 to 207, but
we're going to look at this as an unsigned value, so it's effectively
0..207 or UINT_MAX-48..UINT_MAX.
The UXTB instruction then converts the range so that the range becomes
0..255 again (but importantly, the values between UINT_MAX-48 and
UINT_MAX are mapped to the range 208..255. We then do an unsigned
comparison between that value and the constant 9 to test whether the
result is >= 9.
Now, importantly, all the values that are in the range 208..255 are >=
9, but were also >= 9 before the UXTB instruction. In effect, the UXTB
is completely redundant.
The second UXTB is even more egregious. We have 0 in r0 and we then
conditionally add 1 to it, so r0 is in the range 0..1. Zero extending
that with a UXTB is therefore clearly pointless.
So neither of the UXTB instructions should be present, even if
generating Thumb1 code.
I think the failures are, therefore, real and we should look to fix the
compiler rather than 'fix' the scope of the test.
R.
Require effective-target arm_arm_ok to skip the test for thumb-only
targets (Cortex-M).
gcc/testsuite/ChangeLog:
* gcc.target/arm/unsigned-extend-1.c: Use effective-target
arm_arm_ok.
Signed-off-by: Torbjörn SVENSSON <torbjorn.svens...@foss.st.com>
---
gcc/testsuite/gcc.target/arm/unsigned-extend-1.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/gcc/testsuite/gcc.target/arm/unsigned-extend-1.c
b/gcc/testsuite/gcc.target/arm/unsigned-extend-1.c
index 3b4ab048fb0..73f2e1a556d 100644
--- a/gcc/testsuite/gcc.target/arm/unsigned-extend-1.c
+++ b/gcc/testsuite/gcc.target/arm/unsigned-extend-1.c
@@ -1,4 +1,5 @@
/* { dg-do compile } */
+/* { dg-require-effective-target arm_arm_ok } */
/* { dg-options "-O2" } */
unsigned char foo (unsigned char c)