On Wed, 2 Apr 2025 13:41:33 -0600, Jeff Law wrote: > > > On 4/2/25 1:01 AM, Jin Ma wrote: > > Assuming we have the following variables: > > > > unsigned long long a0, a1; > > unsigned int a2; > > > > For the expression: > > > > a0 = (a0 << 50) >> 49; // slli a0, a0, 50 + srli a0, a0, 49 > > a2 = a1 + a0; // addw a2, a1, a0 + slli a2, a2, 32 + srli a2, a2, > > 32 > > > > In the optimization process of ZBA (combine pass), it would be optimized to: > > > > a2 = a0 << 1 + a1; // sh1add a2, a0, a1 + zext.w a2, a2 > > > > This is clearly incorrect, as it overlooks the fact that a0=a0&0x7ffe, > > meaning > > that the bits a0[32:14] are set to zero. > > > > gcc/ChangeLog: > > > > * config/riscv/bitmanip.md: The optimization can only be applied if > > the high bit of operands[3] is set to 1. > > > > gcc/testsuite/ChangeLog: > > > > * gcc.target/riscv/zba-shNadd-09.c: New test. > > * gcc.target/riscv/zba-shNadd-10.c: New test. > Thanks. > > While there isn't a regression bug in bugzilla, this is almost certainly > a 13, 14, 15 regression since the problematic pattern was integrated in > late 2022.
Okay, I've backported this GCC patch to the `releases/gcc-13` and `releases/gcc-14` branches. Thanks.! :) Best regards, Jin Ma > With that in mind, I went ahead and pushed this to the trunk. > > Thanks again! > > jeff