llvm / llvm/llvm-project

[RISC-V Zbkb] gpr <=> vector roundtrip for bitreverse.vXi8 should become `brev8`

Open
#201,762 3 comments 0 reactions 0 assignees View on GitHub
backend:RISC-V missed-optimization
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

[Clang godbolt](https://llvm.godbo.lt/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:llvm,selection:(endColumn:52,endLineNumber:9,positionColumn:52,positionLineNumber:9,selectionStartColumn:52,selectionStartLineNumber:9,startColumn:52,startLineNumber:9),source:'define+i64+@foo(i64+%250)+unnamed_addr+align+4+%7B%0AEntry:%0A++%251+%3D+bitcast+i64+%250+to+%3C8+x+i8%3E%0A++%252+%3D+tail+call+%3C8+x+i8%3E+@llvm.bitreverse.v8i8(%3C8+x+i8%3E+%251)%0A++%253+%3D+bitcast+%3C8+x+i8%3E+%252+to+i64%0A++ret+i64+%253%0A%7D%0A%0Adeclare+%3C8+x+i8%3E+@llvm.bitreverse.v8i8(%3C8+x+i8%3E)+%231'),l:'5',n:'0',o:'LLVM+IR+source+%231',t:'0')),k:43.33886124930901,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:irclangtrunk,filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'0',trim:'1',verboseDemangling:'0'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:1,lang:llvm,libs:!(),options:'-O3+-target+riscv64-linux+-mcpu%3Dxiangshan-kunminghu',overrides:!(),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+clang+(trunk)+(Editor+%231)',t:'0')),k:56.66113875069099,l:'4',m:100,n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4)
```llvm
define i64 @foo(i64 %0) unnamed_addr align 4 {
Entry:
%1 = bitcast i64 %0 to <8 x i8>
%2 = tail call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %1)
%3 = bitcast <8 x i8> %2 to i64
ret i64 %3
}

declare <8 x i8> @llvm.bitreverse.v8i8(<8 x i8>) #1
```

Currently:

```asm
foo:
vsetivli zero, 1, e64, m1, ta, ma
vmv.s.x v8, a0
vsetivli zero, 8, e8, mf2, ta, ma
vbrev.v v8, v8
vsetvli zero, zero, e64, m4, ta, ma
vmv.x.s a0, v8
ret
```

Could be:
```asm
foo:
brev8 a0, a0
ret
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.