[PATCH] D140939: [X86] Transform AtomicRMW logic operations to BT{R|C|S} if only changing/testing a single bit.
Noah Goldstein via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 23 01:53:53 PST 2023
goldstein.w.n added a comment.
In D140939#4072488 <https://reviews.llvm.org/D140939#4072488>, @alexfh wrote:
> In D140939#4072474 <https://reviews.llvm.org/D140939#4072474>, @alexfh wrote:
>
>> In D140939#4072473 <https://reviews.llvm.org/D140939#4072473>, @alexfh wrote:
>>
>>> Unfortunately, there's another problem, which doesn't get fixed by https://reviews.llvm.org/D142166 / 2e25204779e5b972d668bf66a0014c1325813b35 <https://reviews.llvm.org/rG2e25204779e5b972d668bf66a0014c1325813b35>:
>>>
>>> assert.h assertion failed at llvm/lib/Target/X86/X86ISelLowering.cpp:31466 in std::pair<Value *, BitTestKind> FindSingleBitChange(Value *): I != nullptr
>>> @ 0x56257abc9524 __assert_fail
>>> @ 0x562578c7fd1c FindSingleBitChange()
>>> @ 0x562578c7f6dd llvm::X86TargetLowering::shouldExpandLogicAtomicRMWInIR()
>>> @ 0x562578c8098b llvm::X86TargetLowering::shouldExpandAtomicRMWInIR()
>>> @ 0x5625790a6099 (anonymous namespace)::AtomicExpand::tryExpandAtomicRMW()
>>> @ 0x5625790a59dd (anonymous namespace)::AtomicExpand::runOnFunction()
>>> @ 0x56257a86e87d llvm::FPPassManager::runOnFunction()
>>> @ 0x56257a876104 llvm::FPPassManager::runOnModule()
>>> @ 0x56257a86ef7c llvm::legacy::PassManagerImpl::run()
>>> @ 0x562575bad581 clang::EmitBackendOutput()
>>> @ 0x562575baabe9 clang::BackendConsumer::HandleTranslationUnit()
>>> @ 0x562576a85e5c clang::ParseAST()
>>> @ 0x5625767cbf23 clang::FrontendAction::Execute()
>>> @ 0x562576741cad clang::CompilerInstance::ExecuteAction()
>>> @ 0x5625757871e8 clang::ExecuteCompilerInvocation()
>>> @ 0x56257577ae41 cc1_main()
>>> @ 0x562575776ec8 ExecuteCC1Tool()
>>> @ 0x5625768ed317 llvm::function_ref<>::callback_fn<>()
>>> @ 0x56257aa23d20 llvm::CrashRecoveryContext::RunSafely()
>>> @ 0x5625768ecb63 clang::driver::CC1Command::Execute()
>>> @ 0x5625768ab2e6 clang::driver::Compilation::ExecuteCommand()
>>> @ 0x5625768ab60f clang::driver::Compilation::ExecuteJobs()
>>> @ 0x5625768caf70 clang::driver::Driver::ExecuteCompilation()
>>> @ 0x562575776027 clang_main()
>>> @ 0x7f8f04be3633 __libc_start_main
>>> @ 0x562575772bea _start
>>
>> I'd suggest to revert while investigating. I'm working on an isolated test case.
>
>
>
> $ cat reduced.ll
> target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
> target triple = "x86_64-unknown-linux-gnu"
>
> define weak_odr void @f() {
> entry:
> br label %if.end19
>
> cont11: ; No predecessors!
> %not = xor i32 0, -1
> %0 = atomicrmw and ptr null, i32 %not monotonic, align 4
> %and13 = and i32 %0, 0
> br label %if.end19
>
> if.end19: ; preds = %cont11, %entry
> ret void
> }
> $ ./good-clang -c reduced.ll -o good.o
> $ ./bad-clang -c reduced.ll -o bad.o
> assert.h assertion failed at llvm/lib/Target/X86/X86ISelLowering.cpp:31466 in std::pair<Value *, BitTestKind> FindSingleBitChange(Value *): I != nullptr
> @ 0x559d015c9524 __assert_fail
> @ 0x559cff67fd1c FindSingleBitChange()
> @ 0x559cff67f6dd llvm::X86TargetLowering::shouldExpandLogicAtomicRMWInIR()
> @ 0x559cff68098b llvm::X86TargetLowering::shouldExpandAtomicRMWInIR()
> @ 0x559cffaa6099 (anonymous namespace)::AtomicExpand::tryExpandAtomicRMW()
> @ 0x559cffaa59dd (anonymous namespace)::AtomicExpand::runOnFunction()
> @ 0x559d0126e87d llvm::FPPassManager::runOnFunction()
> @ 0x559d01276104 llvm::FPPassManager::runOnModule()
> @ 0x559d0126ef7c llvm::legacy::PassManagerImpl::run()
> @ 0x559cfc5ad581 clang::EmitBackendOutput()
> @ 0x559cfc5a94f8 clang::CodeGenAction::ExecuteAction()
> @ 0x559cfd1cbf23 clang::FrontendAction::Execute()
> @ 0x559cfd141cad clang::CompilerInstance::ExecuteAction()
> @ 0x559cfc1871e8 clang::ExecuteCompilerInvocation()
> @ 0x559cfc17ae41 cc1_main()
Thank you for finding the case. A another one (and probably more realistic one is):
define weak_odr void @f(i32 %0) {
entry:
br label %if.end19
cont11: ; No predecessors!
%not = xor i32 %0, -1
%1 = atomicrmw and ptr null, i32 %not monotonic, align 4
%and13 = and i32 %1, 0
br label %if.end19
if.end19: ; preds = %cont11, %entry
ret void
}
So the fix is:
- assert(I != nullptr);
+
+ // If constant it will fold and we can evaluate later. If its an argument
+ // or something of that nature, we can't analyze.
+ if (I == nullptr)
+ return {nullptr, UndefBit};
I'm happy to post that as a patch.
If you still want to revert, however, happy to do so as well and then repost the full version.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D140939/new/
https://reviews.llvm.org/D140939
More information about the llvm-commits
mailing list