Issue 184055
Summary [x86-64 BMI] `~x | (x - 1)` should lower to `~blsi(x)`
Labels new issue
Assignees
Reporter Validark
    [C Godbolt](https://c.godbo.lt/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QAJgAMfAQQCqAZ0wAFAB6cpvAFYgupWkwagA%2BmeSll9ZATwDKjdAGFUtAK4sGkgKylHAGTwGTAA5DwAjTGIQXwAHVEVCOwYXd08fUnjE2wFA4LCWSOjfK0wbZKECJmICVI8vCRLMaxyGSuqCPNCIqJjLKpq69Mb%2Bjq6CopiASktUN2Jkdg4AUgkAZiDkdywAamW1p0UCfEEAOgR97GWpAEFrm7cgggA2ABYTAh3%2BVAhHwTePjs1FN7ssAOwAIXuOxhO2ImAI8wYOwAfmo9mCnDsIOiALQ7LggtZQ27ggAiHBmtE43l4Xg4WlIqE4WMUcwWmD26x4pAImkpMwA1jEABynCRcMFgrgATmez3WEgkCoMnFedP5TM4vEUIBkfIZlNIcFgMEQKFQLFidCi5EoaCtNuiyC2RmAH2IbgYgr4dAIUV1EHCmvCQWqAE9ODzQ8xiOGAPLhbRlA08h1sQTxhi0SOG0hYcJuYBOMS0XXcXhYFhu8R5/Dw8oAN0w5cZmDUZTc/qjvCezU1tDw4WIEZcWE1BGIeBYPdIzeI4QSmDJmGrxkHxn5MyohmAigAanhMAB3eOxRiz/iCERidhcV6yQRKVQaPO6CQGN0gMwmCyD8K6pAMyoLErTlri8ZrDsuLVgsFxrGSABeDDzrSTLzlOWCARAMylOU9gQI4QxeFwH4BEE3SFL0cQJEkAjEXoH5ZHRDDjD0xSWM0KYVAMtSuPUeicS0PFjBREy9PoRwdAxkm8WxVHRISszzIsehUjSGp5syHBAiKzy4m8OyusY2KTl6gpTNiuCECQXJrISvAGloUwzAgmBMFg0Q4aQwreDI1IcOqpAzt4aynFwoXSDKcpSq80ryqQ9KMtpOp6ryW7GmaEBIA61r0GQFAQLlTooHuzCxIoCCoAQvq0P6xCBsGeYxhGs4tXGibJjYs7powBBZjmmoFkWJa0GWs5VjWSyMvW3HNq2vDtp23YVuQgj9nm/4jnGY7TY5U4zqt86LsoK5rsAG6gIa267geR6nue9I8lewiiOI96PgoyjqJquj6IYm4/n%2BQ7YcBoHJOBkHQbByDwUhKFRGhqAYXgWHwLhXH4V4hEMM4/HpPo5H5OxgnMa0MmZLRrTyZMkmY607SDPjJFCdxAiM50Ykk7J0nM4JUk1DTEm4eyqlKQFaFJbw2m6fphnAC6pmet6lkQNZRDEHZDnpddrnuZ5lDqYFvAzq8zynCKZtgjKUhSGsSreBIIprIlmopZYaVOQKPkgK8XCnGCIpKiKdtrGCzxSmsIqqhwayacl2o685RsSCbei267WmJ17LlzgGyS%2B0AA%3D%3D)
[Zig Godbolt](https://zig.godbo.lt/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:16,fontUsePx:'0',j:1,lang:zig,selection:(endColumn:1,endLineNumber:4,positionColumn:1,positionLineNumber:4,selectionStartColumn:1,selectionStartLineNumber:4,startColumn:1,startLineNumber:4),source:'export+fn+foo(x:+u64)+u64+%7B%0A++++return+~x+%7C+(x+-+1)%3B%0A%7D%0A'),l:'5',n:'0',o:'Zig+source+%231',t:'0')),k:50.06587094166215,l:'4',m:100,n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:ztrunk,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:20,fontUsePx:'0',j:2,lang:zig,libs:!(),options:'-O+ReleaseFast+-target+x86_64-linux+-mcpu%3Dznver5+-fomit-frame-pointer',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:'+zig+trunk+(Editor+%231)',t:'0')),header:(),k:49.93412905833787,l:'4',m:100,n:'0',o:'',s:0,t:'0')),l:'2',m:100,n:'0',o:'',t:'0')),version:4)
[LLVM Godbolt](https://llvm.godbo.lt/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:llvm,selection:(endColumn:1,endLineNumber:8,positionColumn:1,positionLineNumber:8,selectionStartColumn:1,selectionStartLineNumber:8,startColumn:1,startLineNumber:8),source:'define+dso_local+i64+@foo(i64+%250)+local_unnamed_addr+%7B%0AEntry:%0A++%251+%3D+xor+i64+%250,+-1%0A++%252+%3D+add+i64+%250,+-1%0A++%253+%3D+or+i64+%252,+%251%0A++ret+i64+%253%0A%7D%0A'),l:'5',n:'0',o:'LLVM+IR+source+%231',t:'0')),k:50.76820307281229,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:llctrunk,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+-mcpu%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:'+llc+(trunk)+(Editor+%231)',t:'0')),k:49.23179692718771,l:'4',m:100,n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4)

```
~x | (x - 1)
```

Gives:

```asm
foo:
        lea     rax, [rdi - 1]
 not     rdi
        or      rax, rdi
        ret
```

Should be:

```asm
foo:
        blsi    rax, rdi
        not     rax
 ret
```

LLVM IR:

```llvm
define dso_local i64 @foo(i64 %0) local_unnamed_addr {
Entry:
  %1 = xor i64 %0, -1
  %2 = add i64 %0, -1
 %3 = or i64 %2, %1
  ret i64 %3
}
```

_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to