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. R.