[llvm] [DAG] Add legalization handling for ABDS/ABDU (PR #92576)

Nathan Chancellor via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 7 14:53:31 PDT 2024


nathanchance wrote:

@RKSimon I noticed an assertion failure when building the Linux kernel with `-fsanitize=thread` after this change. I am not sure if it is the same as the other issues mentioned but here is a C reproducer:

```c
enum {
  false,
  IQK_S1_RX_X,
  IQK_S1_RX_Y,
  IQK_S0_TX_X,
  IQK_S0_TX_Y,
  IQK_S0_RX_X,
  IQK_NR
} iqkxy_to_s32___trans_tmp_2;
int __rtw8723x_iqk_similarity_cmp_i, __rtw8723x_iqk_similarity_cmp_diff,
    __rtw8723x_iqk_similarity_cmp___trans_tmp_2,
    __rtw8723x_iqk_similarity_cmp_candidate_0,
    __rtw8723x_iqk_similarity_cmp_tmp1, __rtw8723x_iqk_similarity_cmp_tmp2,
    __rtw8723x_iqk_similarity_cmp_val;
_Bool __rtw8723x_iqk_similarity_cmp(int result[][IQK_NR]) {
  int bitmap = 0;
  for (__rtw8723x_iqk_similarity_cmp_i = 0;
       __rtw8723x_iqk_similarity_cmp_i < IQK_NR;
       __rtw8723x_iqk_similarity_cmp_i++) {
    int index = 9;
    char shift = index;
    iqkxy_to_s32___trans_tmp_2 =
        result[1][__rtw8723x_iqk_similarity_cmp_i] << shift >> shift;
    __rtw8723x_iqk_similarity_cmp_tmp1 = iqkxy_to_s32___trans_tmp_2;
    __rtw8723x_iqk_similarity_cmp_val =
        result[2][__rtw8723x_iqk_similarity_cmp_i];
    iqkxy_to_s32___trans_tmp_2 =
        __rtw8723x_iqk_similarity_cmp_val << shift >> shift;
    __rtw8723x_iqk_similarity_cmp___trans_tmp_2 =
        __rtw8723x_iqk_similarity_cmp_tmp2 = iqkxy_to_s32___trans_tmp_2;
    __rtw8723x_iqk_similarity_cmp_diff = __builtin_choose_expr(
        __builtin_types_compatible_p(typeof(__rtw8723x_iqk_similarity_cmp_tmp2),
                                     long),
        0,
        __builtin_choose_expr(
            __builtin_types_compatible_p(
                typeof(__rtw8723x_iqk_similarity_cmp_tmp2), long),
            0,
            __builtin_choose_expr(
                __builtin_types_compatible_p(
                    typeof(__rtw8723x_iqk_similarity_cmp_tmp2), int),
                ({
                  int __x = __rtw8723x_iqk_similarity_cmp_tmp1 -
                            __rtw8723x_iqk_similarity_cmp_tmp2;
                  __x < 0 ? -__x : __x;
                }),
                __builtin_choose_expr(
                    __builtin_types_compatible_p(
                        typeof(__rtw8723x_iqk_similarity_cmp_tmp2), short),
                    0,
                    __builtin_choose_expr(
                        __builtin_types_compatible_p(
                            typeof(__rtw8723x_iqk_similarity_cmp_tmp2), char),
                        0,
                        __builtin_choose_expr(
                            __builtin_types_compatible_p(
                                typeof(__rtw8723x_iqk_similarity_cmp_tmp2),
                                char),
                            0, 0))))));
    if (__rtw8723x_iqk_similarity_cmp_diff)
      continue;
    if ((__rtw8723x_iqk_similarity_cmp_i == IQK_S1_RX_X ||
         __rtw8723x_iqk_similarity_cmp_i == IQK_S0_RX_X) &&
        bitmap)
      if (result[1][1])
        __rtw8723x_iqk_similarity_cmp_candidate_0 = 2;
    bitmap |= __rtw8723x_iqk_similarity_cmp_i;
  }
  return false;
}

```

```
$ clang --target=aarch64-linux-gnu -O2 -fsanitize=thread -c -o /dev/null rtw8723x.i
clang: /home/nathan/tmp/cvise.NoOV35mHWo/src/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:974: void (anonymous namespace)::SelectionDAGLegalize::LegalizeOp(SDNode *): Assertion `(TLI.getTypeAction(*DAG.getContext(), Op.getValueType()) == TargetLowering::TypeLegal || Op.getOpcode() == ISD::TargetConstant || Op.getOpcode() == ISD::Register) && "Unexpected illegal type!"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.	Program arguments: clang --target=aarch64-linux-gnu -O2 -fsanitize=thread -c -o /dev/null rtw8723x.i
1.	<eof> parser at end of file
2.	Code generation
3.	Running pass 'Function Pass Manager' on module 'rtw8723x.i'.
4.	Running pass 'AArch64 Instruction Selection' on function '@__rtw8723x_iqk_similarity_cmp'
 #0 0x000055e018b61416 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x565f416)
 #1 0x000055e018b5eede llvm::sys::RunSignalHandlers() (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x565cede)
 #2 0x000055e018ae103d CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00007f1b2d9091d0 (/usr/lib/libc.so.6+0x3d1d0)
 #4 0x00007f1b2d9623f4 (/usr/lib/libc.so.6+0x963f4)
 #5 0x00007f1b2d909120 raise (/usr/lib/libc.so.6+0x3d120)
 #6 0x00007f1b2d8f04c3 abort (/usr/lib/libc.so.6+0x244c3)
 #7 0x00007f1b2d8f03df (/usr/lib/libc.so.6+0x243df)
 #8 0x00007f1b2d901177 (/usr/lib/libc.so.6+0x35177)
 #9 0x000055e019d7039c (anonymous namespace)::SelectionDAGLegalize::LegalizeOp(llvm::SDNode*) LegalizeDAG.cpp:0:0
#10 0x000055e019d70058 llvm::SelectionDAG::Legalize() (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x686e058)
#11 0x000055e019e639a7 llvm::SelectionDAGISel::CodeGenAndEmitDAG() (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x69619a7)
#12 0x000055e019e616c7 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x695f6c7)
#13 0x000055e019e5ee41 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x695ce41)
#14 0x000055e019e5c7c6 llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x695a7c6)
#15 0x000055e0180d2452 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x4bd0452)
#16 0x000055e018658cc8 llvm::FPPassManager::runOnFunction(llvm::Function&) (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x5156cc8)
#17 0x000055e018661682 llvm::FPPassManager::runOnModule(llvm::Module&) (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x515f682)
#18 0x000055e0186597f2 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x51577f2)
#19 0x000055e0193a0760 clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>, clang::BackendConsumer*) (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x5e9e760)
#20 0x000055e0193c79b7 clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x5ec59b7)
#21 0x000055e01a85a799 clang::ParseAST(clang::Sema&, bool, bool) (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x7358799)
#22 0x000055e01985e67d clang::FrontendAction::Execute() (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x635c67d)
#23 0x000055e0197c261d clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x62c061d)
#24 0x000055e01993b67c clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x643967c)
#25 0x000055e016bb5095 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x36b3095)
#26 0x000055e016bb16dd ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#27 0x000055e0195e6bd9 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::$_0>(long) Job.cpp:0:0
#28 0x000055e018ae0d76 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x55ded76)
#29 0x000055e0195e6273 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x60e4273)
#30 0x000055e01959dea7 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x609bea7)
#31 0x000055e01959e407 clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x609c407)
#32 0x000055e0195c0b39 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x60beb39)
#33 0x000055e016bb0b7d clang_main(int, char**, llvm::ToolContext const&) (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x36aeb7d)
#34 0x000055e016bc24f6 main (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x36c04f6)
#35 0x00007f1b2d8f1e08 (/usr/lib/libc.so.6+0x25e08)
#36 0x00007f1b2d8f1ecc __libc_start_main (/usr/lib/libc.so.6+0x25ecc)
#37 0x000055e016baefa5 _start (/home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin/clang-20+0x36acfa5)
clang: error: clang frontend command failed with exit code 134 (use -v to see invocation)
ClangBuiltLinux clang version 20.0.0git (https://github.com/llvm/llvm-project.git b1234ddbe2652aa7948242a57107ca7ab12fd2f8)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/nathan/tmp/cvise.NoOV35mHWo/install/llvm-bad/bin
Build config: +assertions
clang: note: diagnostic msg: Error generating preprocessed source(s) - no preprocessable inputs.

```

https://github.com/llvm/llvm-project/pull/92576


More information about the llvm-commits mailing list