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)

Reply via email to