On 2025-03-04 16:44, Richard Earnshaw (lists) wrote:
On 04/03/2025 14:49, Torbjorn SVENSSON wrote:


On 2025-03-03 18:00, Richard Earnshaw wrote:
On 28/02/2025 16:18, Richard Earnshaw wrote:
On 28/02/2025 16:12, Richard Earnshaw wrote:
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.

I said, >= 9 above, but it should be > 9 (hence condition code 'hi'). That does 
affect the rest of the argument.

R.

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)



I've just pushed a patch to eliminate one of the redundant zero-extends.  The 
other is harder to eliminate, so I've adjusted the test to xfail when compiling 
for thumb1.

Hi Richard,

Can this be backported to releases/gcc-14 too?
I can do the backport if you just approve it.

Kind regards,
Torbjörn

By all means backport the testsuite change, but not the change to thumb1.md, 
please.

Partial backport done in r14.2.0-853-g7fb1d7bff18.

Kind regards,
Torbjörn

Reply via email to