Compiler hazard on `1ULL << (63 - clz(d))) / d`
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
[Godbolt link](https://c.godbo.lt/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:___c,selection:(endColumn:1,endLineNumber:6,positionColumn:1,positionLineNumber:6,selectionStartColumn:1,selectionStartLineNumber:6,startColumn:1,startLineNumber:6),source:'%23include+%3Cstdint.h%3E%0A%0Auint64_t+bar(uint32_t+divisor)+%7B%0A++++return+(1ULL+%3C%3C+(63+-+__builtin_clz(divisor)))+/+divisor%3B%0A%7D%0A'),l:'5',n:'0',o:'C+source+%231',t:'0')),k:47.14192766144739,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:cclang_trunk,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:___c,libs:!(),options:'-O3+--target%3Dx86_64-linux+-march%3Dznver5',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:'+x86-64+clang+(trunk)+(Editor+%231)',t:'0')),k:52.858072338552596,l:'4',m:100,n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4)
```c
#include
uint64_t bar(uint32_t divisor) {
return (1ULL << (63 - __builtin_clz(divisor))) / divisor;
}
```
This compiled to:
```asm
bar:
lzcnt edx, edi
mov eax, 1
movabs rsi, -4294967296
mov ecx, edi
xor dl, 63
shlx rax, rax, rdx
movzx edx, dl
bt rsi, rdx
jae .LBB0_1
xor edx, edx
div rcx
ret
.LBB0_1:
xor edx, edx
div ecx
ret
```
I was expecting:
```asm
bar:
lzcnt ecx, edi
not cl
mov eax, 1
shlx rax, rax, rcx
xor rdx, rdx
div rdi
ret
```
This snippet seems fine:
```c
uint64_t bar(uint32_t divisor) {
return (1ULL << (__builtin_clz(divisor))) / divisor;
}
```
```asm
baz:
lzcnt eax, edi
mov ecx, 1
xor edx, edx
shlx eax, ecx, eax
div edi
ret
```
Contributor guide
Assessment
This issue has not been assessed yet.