Hi,

On 2026-05-27 13:04:46 -0400, Greg Burd wrote:
> > Forgive me, while $subject only mentions popcount I couldn't help 
> > myself so I added a few more RISC-V patches including a bug fix that I 
> > hope makes greenfly happy again.
> >
> >
> > 0001 - This is a bug fix for DES/RISC-V/Clang DES initialization.

How confident are we that this bug just affects DES?


> > ------> Join me in "the rabbit hole" on this issue if you care to...
> >
> > The existing software DES (as shown by the build-farm animal "greenfly" 
> > [1]) fails because Clang 20 has an auto-vectorization bug that we 
> > trigger in the DES initialization code (des_init() function), not the 
> > DES encryption algorithm itself.
> >
> > I searched the LLVM issue tracker, here are the issues that caught my eye:
> >   1. Issue #176001 - "RISC-V Wrong code at -O1"
> >     - Vector peephole optimization with vmerge folding
> >     - Fixed by PR #176077 (merged Jan 2024)
> >     - Link: https://github.com/llvm/llvm-project/issues/176001
> >   2. Issue #187458 - "Wrong code for vector.extract.last.active"
> >     - Large index issues with zvl1024b
> >     - Partially fixed, still work ongoing
> >     - Link: https://github.com/llvm/llvm-project/issues/187458
> >   3. Issue #171978 - "RISC-V Wrong code at -O2/O3"
> >     - Illegal instruction from mismatched EEW
> >     - Under investigation
> >     - Link: https://github.com/llvm/llvm-project/issues/171978
> >   4. PR #176105 - "Fix i64 gather/scatter cost on rv32"
> >     - Cost model fixes for scatter/gather (merged Jan 2026)
> >     - Link: https://github.com/llvm/llvm-project/pull/176105

Have you confirmed that, by using a newer clang, the merging of the fixes
actually fixes the problem?

ISTM a perfectly viable patch would be to just reject building with a
non-very-recent clang on riscv.


> > My fix in 0001 is simply adding this in a few places in crypt-des.c:
> >
> >   #if defined(__riscv) && defined(__clang__)
> >       pg_memory_barrier();
> >   #endif

That seems like a pretty odd fix for the problem. If the problem is
auto-vectorization, we should stop auto-vectorization, not sprinkle memory
barriers around.  Either by pushing disabling of auto-vectorization on the
file scope (using a #pragma clang push), loop scope (using vectorize(disable))
or just globally (by disabling it on riscv + clang, if the compiler is too
old).


Greetings,

Andres Freund


Reply via email to