Skip to content

Enzyme crash for partial accumulation #2711

@minansys

Description

@minansys

This is in CPU and is likely due to one function's return is a struct of 4 float number struct DiffusionVariables { float A; float B; float C; float D}. It works fine in O0 but not in O1 and O3. Here is a reproducer: https://tinyurl.com/22jnzhgk

 VT: <2 x float> idxs:{i32 0,} start=0 size=4 storeSize=8 val=  %13 = tail call { <2 x float>, <2 x float> } @_ZN8Cromwell11EnergyModel7Helpers32AnisotropicConductivityOperationILNS_13GeometryTools4Mesh17AdjacencyOrderingE2EE23GetAnisotropicDiffusionEjPKjbRKNS_10Containers21ColumnMajorMatrixViewIKfEESE_SE_(ptr noundef nonnull align 8 dereferenceable(336) %8, i32 noundef %1, ptr noundef %2, i1 noundef zeroext true, ptr noundef nonnull align 8 dereferenceable(12) %9, ptr noundef nonnull align 8 dereferenceable(12) %0, ptr noundef nonnull align 8 dereferenceable(12) %10) #45

[31mclang++: /home/user/Enzyme/enzyme/Enzyme/DiffeGradientUtils.cpp:352: llvm::SmallVector<llvm::SelectInst*, 4> DiffeGradientUtils::addToDiffe(llvm::Value*, llvm::Value*, llvm::IRBuilder<>&, llvm::Type*, unsigned int, unsigned int, llvm::ArrayRef<llvm::Value*>, llvm::Value*, size_t): Assertion `0 && "unhandled accumulate with partial sizes"' failed.


1.  <eof> parser at end of file
2.  Optimizer
3.  Running pass "EnzymeNewPM" on module "/home/mixu/dev/vNNN/Cromwell/Cromwell/CFD/EnergyModel/src/Operators/EnergyResidual.cxx"
 #0 0x00001507b3a8f86b llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/mixu/dev/vNNN/Cromwell/Dependencies/clang/linx64/bin/../lib/libLLVM.so.19.1+0x7f886b)
 #1 0x00001507b3a8d7e4 llvm::sys::CleanupOnSignal(unsigned long) (/home/mixu/dev/vNNN/Cromwell/Dependencies/clang/linx64/bin/../lib/libLLVM.so.19.1+0x7f67e4)
 #2 0x00001507b399ee48 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00001507bbf3bd20 __restore_rt (/lib64/libpthread.so.0+0x12d20)
 #4 0x00001507b296f52f raise (/lib64/libc.so.6+0x4e52f)
 #5 0x00001507b2942e65 abort (/lib64/libc.so.6+0x21e65)
 #6 0x00001507b2942d39 _nl_load_domain.cold.0 (/lib64/libc.so.6+0x21d39)
 #7 0x00001507b2967e86 (/lib64/libc.so.6+0x46e86)
 #8 0x00001507b130ea41 DiffeGradientUtils::addToDiffe(llvm::Value*, llvm::Value*, llvm::IRBuilder<llvm::ConstantFolder, llvm::IRBuilderDefaultInserter>&, llvm::Type*, unsigned int, unsigned int, llvm::ArrayRef<llvm::Value*>, llvm::Value*, unsigned long) (/home/mixu/dev/vNNN/Cromwell2/Dependencies/enzyme/lib/libClangEnzyme.so+0x33da41)
 #9 0x00001507b13fdd84 AdjointGenerator::visitExtractValueInst(llvm::ExtractValueInst&) (/home/mixu/dev/vNNN/Cromwell2/Dependencies/enzyme/lib/libClangEnzyme.so+0x42cd84)
#10 0x00001507b13c4be3 EnzymeLogic::CreatePrimalAndGradient(RequestContext, ReverseCacheKey const&&, TypeAnalysis&, AugmentedReturn const*, bool) (/home/mixu/dev/vNNN/Cromwell2/Dependencies/enzyme/lib/libClangEnzyme.so+0x3f3be3)
#11 0x00001507b1406ecf AdjointGenerator::recursivelyHandleSubfunction(llvm::CallInst&, llvm::Function*, bool, std::vector<bool, std::allocator<bool>> const&, bool, DIFFE_TYPE, bool) (/home/mixu/dev/vNNN/Cromwell2/Dependencies/enzyme/lib/libClangEnzyme.so+0x435ecf)
#12 0x00001507b140baa4 AdjointGenerator::visitCallInst(llvm::CallInst&) (/home/mixu/dev/vNNN/Cromwell2/Dependencies/enzyme/lib/libClangEnzyme.so+0x43aaa4)
#13 0x00001507b13c4be3 EnzymeLogic::CreatePrimalAndGradient(RequestContext, ReverseCacheKey const&&, TypeAnalysis&, AugmentedReturn const*, bool) (/home/mixu/dev/vNNN/Cromwell2/Dependencies/enzyme/lib/libClangEnzyme.so+0x3f3be3)
#14 0x00001507b1369790 (anonymous namespace)::EnzymeBase::HandleAutoDiff(llvm::Instruction*, unsigned int, llvm::Value*, llvm::Type*, llvm::SmallVectorImpl<llvm::Value*>&, std::map<int, llvm::Type*, std::less<int>, std::allocator<std::pair<int const, llvm::Type*>>> const&, std::vector<DIFFE_TYPE, std::allocator<DIFFE_TYPE>> const&, llvm::Function*, DerivativeMode, (anonymous namespace)::EnzymeBase::Options&, bool, llvm::SmallVectorImpl<llvm::CallInst*>&) Enzyme.cpp:0:0
#15 0x00001507b136bee1 (anonymous namespace)::EnzymeBase::HandleAutoDiffArguments(llvm::CallInst*, DerivativeMode, bool, llvm::SmallVectorImpl<llvm::CallInst*>&) Enzyme.cpp:0:0
#16 0x00001507b13756f1 (anonymous namespace)::EnzymeBase::lowerEnzymeCalls(llvm::Function&, std::set<llvm::Function*, std::less<llvm::Function*>, std::allocator<llvm::Function*>>&) Enzyme.cpp:0:0
#17 0x00001507b1377ba2 (anonymous namespace)::EnzymeBase::run(llvm::Module&) Enzyme.cpp:0:0
#18 0x00001507b138ace0 llvm::detail::PassModel<llvm::Module, EnzymeNewPM, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/mixu/dev/vNNN/Cromwell2/Dependencies/enzyme/lib/libClangEnzyme.so+0x3b9ce0)
#19 0x00001507b3c7ea73 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/mixu/dev/vNNN/Cromwell/Dependencies/clang/linx64/bin/../lib/libLLVM.so.19.1+0x9e7a73)
#20 0x00001507b9abb85a (anonymous namespace)::EmitAssemblyHelper::RunOptimizationPipeline(clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>&, std::unique_ptr<llvm::ToolOutputFile, std::default_delete<llvm::ToolOutputFile>>&, clang::BackendConsumer*) BackendUtil.cpp:0:0
#21 0x00001507b9abe954 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/mixu/dev/vNNN/Cromwell/Dependencies/clang/linx64/bin/../lib/libclang-cpp.so.19.1+0x20b6954)
#22 0x00001507b9f768f8 clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (/home/mixu/dev/vNNN/Cromwell/Dependencies/clang/linx64/bin/../lib/libclang-cpp.so.19.1+0x256e8f8)
#23 0x00001507ba9e7068 clang::MultiplexConsumer::HandleTranslationUnit(clang::ASTContext&) (/home/mixu/dev/vNNN/Cromwell/Dependencies/clang/linx64/bin/../lib/libclang-cpp.so.19.1+0x2fdf068)
#24 0x00001507b858837c clang::ParseAST(clang::Sema&, bool, bool) (/home/mixu/dev/vNNN/Cromwell/Dependencies/clang/linx64/bin/../lib/libclang-cpp.so.19.1+0xb8037c)
#25 0x00001507ba9a85d1 clang::FrontendAction::Execute() (/home/mixu/dev/vNNN/Cromwell/Dependencies/clang/linx64/bin/../lib/libclang-cpp.so.19.1+0x2fa05d1)
#26 0x00001507ba9195eb clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/home/mixu/dev/vNNN/Cromwell/Dependencies/clang/linx64/bin/../lib/libclang-cpp.so.19.1+0x2f115eb)
#27 0x00001507baa374f7 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/home/mixu/dev/vNNN/Cromwell/Dependencies/clang/linx64/bin/../lib/libclang-cpp.so.19.1+0x302f4f7)
#28 0x0000000000410e0a cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/home/mixu/dev/vNNN/Cromwell2/Dependencies/clang/linx64/bin/clang+++0x410e0a)
#29 0x000000000040b35a ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#30 0x00001507ba547b29 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::'lambda'()>(long) Job.cpp:0:0
#31 0x00001507b399f283 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/home/mixu/dev/vNNN/Cromwell/Dependencies/clang/linx64/bin/../lib/libLLVM.so.19.1+0x708283)
#32 0x00001507ba547eb9 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (.part.0) Job.cpp:0:0
#33 0x00001507ba50d6e5 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/home/mixu/dev/vNNN/Cromwell/Dependencies/clang/linx64/bin/../lib/libclang-cpp.so.19.1+0x2b056e5)
#34 0x00001507ba50e0fd clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/home/mixu/dev/vNNN/Cromwell/Dependencies/clang/linx64/bin/../lib/libclang-cpp.so.19.1+0x2b060fd)
#35 0x00001507ba52174c clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/home/mixu/dev/vNNN/Cromwell/Dependencies/clang/linx64/bin/../lib/libclang-cpp.so.19.1+0x2b1974c)
#36 0x000000000040e4a4 clang_main(int, char**, llvm::ToolContext const&) (/home/mixu/dev/vNNN/Cromwell2/Dependencies/clang/linx64/bin/clang+++0x40e4a4)
#37 0x000000000040ab13 main (/home/mixu/dev/vNNN/Cromwell2/Dependencies/clang/linx64/bin/clang+++0x40ab13)
#38 0x00001507b295b7e5 __libc_start_main (/lib64/libc.so.6+0x3a7e5)
#39 0x000000000040ab5e _start (/home/mixu/dev/vNNN/Cromwell2/Dependencies/clang/linx64/bin/clang+++0x40ab5e)
�[31mclang++: error: clang frontend command failed with exit code 134 (use -v to see invocation)�[0m
clang version 19.1.7 (https://github.com/llvm/llvm-project.git cd708029e0b2869e80abe31ddb175f7c35361f90)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /home/mixu/dev/vNNN/Cromwell/Dependencies/clang/linx64/bin
clang++: note: diagnostic msg:
********************
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang++: note: diagnostic msg: /tmp/EnergyResidual-43f54c.cpp
clang++: note: diagnostic msg: /tmp/EnergyResidual-43f54c.sh
clang++: note: diagnostic msg:
********************


here is the invesitgation from ChatGPT

You’ve already basically diagnosed it from Enzyme’s debug line:

VT: <2 x float> ... start=0 size=4 storeSize=8

That means: Enzyme is trying to accumulate a 4-byte float differential into only half of an 8-byte <2 x float> value. Enzyme’s DiffeGradientUtils::addToDiffe(val,dif, ..., start,size, idxs, ...) has partial-window support for structs/arrays, but not for vectors, so it hits:

assert(0 && "unhandled accumulate with partial sizes")
1) Why it happens at -O1/-O3 but not -O0

At -O1/-O3, LLVM optimizations (especially SROA / scalar replacement, sometimes plus ABI/return-value lowering patterns) frequently “pack” small aggregates into vector chunks, e.g. a “4-float” result becomes something like:

{ <2 x float>, <2 x float> } (two XMM chunks)

Then your caller only uses A (the first float), so TypeAnalysis sees bytes 0..3 as float, bytes 4..7 as “Anything/unused”, and visitExtractValueInst deliberately splits the accumulate into byte windows. That’s exactly how you end up with:

VT = <2 x float>

window = [start=0, size=4]

At -O0, the IR often stays as { float, float, float, float } (no packing), so the partial logic goes through the existing struct recursion and never trips the vector case.

2) Proposed fix (Enzyme-side)

Add vector partial-window handling to DiffeGradientUtils::addToDiffe(... start,size ...):

When VT is a fixed vector and (start,size) align to element boundaries, build a masked vector where only the lanes covered by the window are copied from dif and all other lanes are zero.

Then call the existing full addToDiffe(val, maskedVec, ..., idxs, mask) (which already knows how to add FP vectors).

I implemented this fix in your uploaded Enzyme tree here:

enzyme/Enzyme/DiffeGradientUtils.cpp (around the existing struct/array partial handling)

Patch (core idea)

This is the new block I inserted right before the old “unhandled accumulate” assert:

  if (auto VecT = dyn_cast<VectorType>(VT)) {
    if (!VecT->getElementCount().isScalable()) {
      Type *elemTy = VecT->getElementType();
      auto elemBytes = (DL.getTypeSizeInBits(elemTy) + 7) / 8;
      if (elemBytes != 0 && start % elemBytes == 0 && size % elemBytes == 0) {
        unsigned left_idx = start / elemBytes;
        unsigned right_idx = (start + size) / elemBytes;
        if (right_idx * elemBytes != start + size)
          right_idx++;

        auto maskVec = [&](Value *dsub) {
          Value *masked = Constant::getNullValue(VT);
          for (unsigned i = left_idx; i < right_idx; i++) {
            Value *vidx = ConstantInt::get(Type::getInt32Ty(val->getContext()), i);
            Value *el = BuilderM.CreateExtractElement(dsub, vidx);
            masked = BuilderM.CreateInsertElement(masked, el, vidx);
          }
          return masked;
        };

        // width==1 and width>1 handled by extracting the right slice from dif
        // and then calling the existing addToDiffe(val, masked, ..., idxs).
        ...
      }
    }
  }

This fixes your exact crash shape: <2 x float> with [0,4) or [4,4) windows.

Here is a reproducer: https://tinyurl.com/22jnzhgk

; ModuleID = 'repro'
source_filename = "repro"
target triple = "x86_64-pc-linux-gnu"

%ret2v = type { <2 x float>, <2 x float> }

define %ret2v @make(float %x) {
entry:
  %v0 = insertelement <2 x float> zeroinitializer, float %x, i32 0
  %r0 = insertvalue %ret2v undef, <2 x float> %v0, 0
  %r1 = insertvalue %ret2v %r0, <2 x float> zeroinitializer, 1
  ret %ret2v %r1
}

define float @tester(float %x) {
entry:
  %call = call %ret2v @make(float %x)
  %vec  = extractvalue %ret2v %call, 0

  ; Force "partial" use: only the first 4 bytes of the <2 x float>
  %tmp = alloca <2 x float>, align 8
  store <2 x float> %vec, <2 x float>* %tmp, align 8
  %fp  = bitcast <2 x float>* %tmp to float*
  %a   = load float, float* %fp, align 4

  ret float %a
}

define float @test_derivative(float %x) {
entry:
  %d = call float (float (float)*, ...) @__enzyme_autodiff(float (float)* @tester, float %x)
  ret float %d
}

declare float @__enzyme_autodiff(float (float)*, ...)

with the build info

/home/mixu/software/llvm-19.1.7/llvm-project-llvmorg-19.1.7/build/bin/opt -load-pass-plugin=/home/mixu/software/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-19.so \
    -passes="enzyme"  -enzyme-preopt=false -enzyme-loose-types=1 -S repro.ll -o out.ll

and the crash info

./make.sh
 VT: <2 x float> idxs:{i32 0,} start=0 size=4 storeSize=8 val=  %call = call %ret2v @make(float %x) #2
opt: /home/mixu/software/Enzyme/enzyme/Enzyme/DiffeGradientUtils.cpp:352: llvm::SmallVector<llvm::SelectInst*, 4> DiffeGradientUtils::addToDiffe(llvm::Value*, llvm::Value*, llvm::IRBuilder<>&, llvm::Type*, unsigned int, unsigned int, llvm::ArrayRef<llvm::Value*>, llvm::Value*, size_t): Assertion `0 && "unhandled accumulate with partial sizes"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /home/mixu/software/llvm-19.1.7/llvm-project-llvmorg-19.1.7/build/bin/opt -load-pass-plugin=/home/mixu/software/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-19.so -passes=enzyme -enzyme-preopt=false -enzyme-loose-types=1 -S repro.ll -o out.ll
1.      Running pass "EnzymeNewPM" on module "repro.ll"
 #0 0x0000153b61836f5b llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/mixu/software/llvm-19.1.7/llvm-project-llvmorg-19.1.7/build/bin/../lib/libLLVM.so.19.1+0x844f5b)
 #1 0x0000153b6183455b SignalHandler(int) Signals.cpp:0:0
 #2 0x0000153b657c4d20 __restore_rt (/lib64/libpthread.so.0+0x12d20)
 #3 0x0000153b606ca52f raise (/lib64/libc.so.6+0x4e52f)
 #4 0x0000153b6069de65 abort (/lib64/libc.so.6+0x21e65)
 #5 0x0000153b6069dd39 _nl_load_domain.cold.0 (/lib64/libc.so.6+0x21d39)
 #6 0x0000153b606c2e86 (/lib64/libc.so.6+0x46e86)
 #7 0x0000153b5fa6eed1 DiffeGradientUtils::addToDiffe(llvm::Value*, llvm::Value*, llvm::IRBuilder<llvm::ConstantFolder, llvm::IRBuilderDefaultInserter>&, llvm::Type*, unsigned int, unsigned int, llvm::ArrayRef<llvm::Value*>, llvm::Value*, unsigned long) (/home/mixu/software/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-19.so+0x348ed1)
 #8 0x0000153b5fb5f1c4 AdjointGenerator::visitExtractValueInst(llvm::ExtractValueInst&) (/home/mixu/software/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-19.so+0x4391c4)
 #9 0x0000153b5fb25c03 EnzymeLogic::CreatePrimalAndGradient(RequestContext, ReverseCacheKey const&&, TypeAnalysis&, AugmentedReturn const*, bool) (/home/mixu/software/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-19.so+0x3ffc03)
#10 0x0000153b5facc630 (anonymous namespace)::EnzymeBase::HandleAutoDiff(llvm::Instruction*, unsigned int, llvm::Value*, llvm::Type*, llvm::SmallVectorImpl<llvm::Value*>&, std::map<int, llvm::Type*, std::less<int>, std::allocator<std::pair<int const, llvm::Type*>>> const&, std::vector<DIFFE_TYPE, std::allocator<DIFFE_TYPE>> const&, llvm::Function*, DerivativeMode, (anonymous namespace)::EnzymeBase::Options&, bool, llvm::SmallVectorImpl<llvm::CallInst*>&) Enzyme.cpp:0:0
#11 0x0000153b5faced41 (anonymous namespace)::EnzymeBase::HandleAutoDiffArguments(llvm::CallInst*, DerivativeMode, bool, llvm::SmallVectorImpl<llvm::CallInst*>&) Enzyme.cpp:0:0
#12 0x0000153b5fad88c1 (anonymous namespace)::EnzymeBase::lowerEnzymeCalls(llvm::Function&, std::set<llvm::Function*, std::less<llvm::Function*>, std::allocator<llvm::Function*>>&) Enzyme.cpp:0:0
#13 0x0000153b5fadad5a (anonymous namespace)::EnzymeBase::run(llvm::Module&) Enzyme.cpp:0:0
#14 0x0000153b5faebe80 llvm::detail::PassModel<llvm::Module, EnzymeNewPM, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/mixu/software/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-19.so+0x3c5e80)
#15 0x0000153b61a28633 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/mixu/software/llvm-19.1.7/llvm-project-llvmorg-19.1.7/build/bin/../lib/libLLVM.so.19.1+0xa36633)
#16 0x000000000042b06c llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::StringRef, llvm::ArrayRef<llvm::PassPlugin>, llvm::ArrayRef<std::function<void (llvm::PassBuilder&)>>, llvm::opt_tool::OutputKind, llvm::opt_tool::VerifierKind, bool, bool, bool, bool, bool, bool, bool) (/home/mixu/software/llvm-19.1.7/llvm-project-llvmorg-19.1.7/build/bin/opt+0x42b06c)
#17 0x000000000041db30 optMain (/home/mixu/software/llvm-19.1.7/llvm-project-llvmorg-19.1.7/build/bin/opt+0x41db30)
#18 0x0000153b606b67e5 __libc_start_main (/lib64/libc.so.6+0x3a7e5)
#19 0x0000000000414dbe _start (/home/mixu/software/llvm-19.1.7/llvm-project-llvmorg-19.1.7/build/bin/opt+0x414dbe)
./make.sh: line 25: 2672427 Aborted                 (core dumped) /home/mixu/software/llvm-19.1.7/llvm-project-llvmorg-19.1.7/build/bin/opt -load-pass-plugin=/home/mixu/software/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-19.so -passes="enzyme" -enzyme-preopt=false -enzyme-loose-types=1 -S repro.ll -o out.ll
./make.sh: line 51: ./test: No such file or directory
[mixu@lebdit100 atomic]$ 

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions