Issue 180262
Summary [DirectX] IR with vector PHI and shufflevector of larger dest than initalization is crashing the backend
Labels backend:DirectX, crash-on-valid
Assignees
Reporter farzonl
    
## Description of bug:
We are crashing in `llvm/lib/Target/DirectX/DXILResourceAccess.cpp` (ie the dxil-resource-access pass). When we try to erase this instruction `<badref> = shufflevector <16 x i32> %19, <16 x i32> poison, <4 x i32> zeroinitializer`.

## Thoughts
This shuffle has caused similar but distinct issues for spirv: https://github.com/llvm/llvm-project/issues/180258
I have a working theory that Finn's pr might fix this issue: https://github.com/llvm/llvm-project/pull/176797

The Control flow forming for the phi of <4 x i32> looks weird aswell.  Seems like it  is only defined on certain switch pathsVector formation pattern: insertelement into <16 x i32> + shufflevector to <4 x i32> and then extractelement lanes 0..3. 

## Repro
https://godbolt.org/z/o118T5Wr9

## lldb investigation
```gdb
(lldb) frame select 13
frame #13: 0x00000001003f07ac clang-dxc`phiNodeReplacement(II=0x000000012b619e70, PrevBBDeadInsts=0x000000016fdf3c58, DeadBB=0x000000016fdf3c18) at DXILResourceAccess.cpp:524:11
   521    }
   522    // Traverse the now-dead instructions in RPO and remove them.
   523    for (Instruction *Dead : llvm::reverse(CurrBBDeadInsts))
-> 524 Dead->eraseFromParent();
   525    CurrBBDeadInsts.clear();
   526  }
 527 
(lldb) expr Dead->dump()
  <badref> = shufflevector <16 x i32> %19, <16 x i32> poison, <4 x i32> zeroinitializer
(lldb) expr CurrBBDeadInsts.size()
(size_t) $0 = 4
(lldb) expr CurrBBDeadInsts[0]->dump()
  %.sink = phi ptr [ %14, %sw.epilog.i.thread15 ], [ %10, %sw.epilog.i.thread10 ], [ %6, %sw.epilog.i.thread5 ], [ %2, %sw.epilog.i.thread ]
(lldb) expr CurrBBDeadInsts[1]->dump()
  %18 = load i32, ptr %.sink, align 4
(lldb) expr CurrBBDeadInsts[2]->dump()
  %19 = insertelement <16 x i32> poison, i32 %18, i64 0
(lldb) expr CurrBBDeadInsts[3]->dump()
  <badref> = shufflevector <16 x i32> %19, <16 x i32> poison, <4 x i32> zeroinitializer
```

# Crash stack
```gdb
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
  * frame #0: 0x000000019c20e388 libsystem_kernel.dylib`__pthread_kill + 8
    frame #1: 0x000000019c247848 libsystem_pthread.dylib`pthread_kill + 296
    frame #2: 0x000000019c1509e4 libsystem_c.dylib`abort + 124
    frame #3: 0x000000010339008c clang-dxc`llvm::llvm_unreachable_internal(msg="Uses remain when a value is destroyed!", file="/Users/farzonlotfi/Projects/llvm-project/llvm/lib/IR/Value.cpp", line=102) at ErrorHandling.cpp:244:3
    frame #4: 0x000000010223c368 clang-dxc`llvm::Value::~Value(this=0x000000012b61cc20) at Value.cpp:102:5
 frame #5: 0x000000010223b608 clang-dxc`llvm::User::~User(this=0x000000012b61cc20) at User.cpp:232:1
 frame #6: 0x00000001020dbbd0 clang-dxc`llvm::Instruction::~Instruction(this=0x000000012b61cc20) at Instruction.cpp:80:1
    frame #7: 0x0000000102245a40 clang-dxc`llvm::ShuffleVectorInst::~ShuffleVectorInst(this=0x000000012b61cc20) at Instructions.h:1935:7
    frame #8: 0x000000010223e24c clang-dxc`llvm::ShuffleVectorInst::~ShuffleVectorInst(this=0x000000012b61cc20) at Instructions.h:1935:7
    frame #9: 0x000000010223d5e8 clang-dxc`llvm::Value::deleteValue(this=0x000000012b61cc20) at Instruction.def:217:1
    frame #10: 0x0000000101edd720 clang-dxc`llvm::ilist_alloc_traits<llvm::Instruction>::deleteNode(V=0x000000012b61cc20) at Instruction.h:1087:6
    frame #11: 0x0000000101edd6ec clang-dxc`llvm::iplist_impl<llvm::simple_ilist<llvm::Instruction, llvm::ilist_iterator_bits<true>, llvm::ilist_parent<llvm::BasicBlock>>, llvm::SymbolTableListTraits<llvm::Instruction, llvm::ilist_iterator_bits<true>, llvm::ilist_parent<llvm::BasicBlock>>>::erase(this=0x000000012b6150a0, where=llvm::iplist_impl<llvm::simple_ilist<llvm::Instruction, llvm::ilist_iterator_bits<true>, llvm::ilist_parent<llvm::BasicBlock> >, llvm::SymbolTableListTraits<llvm::Instruction, llvm::ilist_iterator_bits<true>, llvm::ilist_parent<llvm::BasicBlock> > >::iterator @ 0x000000016fdf3770) at ilist.h:205:5
    frame #12: 0x00000001020dbdcc clang-dxc`llvm::Instruction::eraseFromParent(this=0x000000012b61cc20) at Instruction.cpp:110:37
    frame #13: 0x00000001003f07ac clang-dxc`phiNodeReplacement(II=0x000000012b619e70, PrevBBDeadInsts=0x000000016fdf3c58, DeadBB=0x000000016fdf3c18) at DXILResourceAccess.cpp:524:11
    frame #14: 0x00000001003efe9c clang-dxc`transformResourcePointers(F=0x000000012b611668, DRTM=0x000000012b618490) at DXILResourceAccess.cpp:569:11
    frame #15: 0x00000001003fb678 clang-dxc`(anonymous namespace)::DXILResourceAccessLegacy::runOnFunction(this=0x000000012b618450, F=0x000000012b611668) at DXILResourceAccess.cpp:614:12
    frame #16: 0x0000000102145a08 clang-dxc`llvm::FPPassManager::runOnFunction(this=0x000000012b614bc0, F=0x000000012b611668) at LegacyPassManager.cpp:1398:27
    frame #17: 0x000000010214bcbc clang-dxc`llvm::FPPassManager::runOnModule(this=0x000000012b614bc0, M=0x000000014c826000) at LegacyPassManager.cpp:1444:16
    frame #18: 0x000000010214628c clang-dxc`(anonymous namespace)::MPPassManager::runOnModule(this=0x000000012b6105b0, M=0x000000014c826000) at LegacyPassManager.cpp:1513:27
    frame #19: 0x0000000102145e10 clang-dxc`llvm::legacy::PassManagerImpl::run(this=0x000000012b83b000, M=0x000000014c826000) at LegacyPassManager.cpp:531:44
    frame #20: 0x000000010214c0c4 clang-dxc`llvm::legacy::PassManager::run(this=0x000000016fdf4360, M=0x000000014c826000) at LegacyPassManager.cpp:1640:14
    frame #21: 0x0000000103f6fcf8 clang-dxc`(anonymous namespace)::EmitAssemblyHelper::RunCodegenPipeline(this=0x000000016fdf48e8, Action="" OS=llvm::raw_pwrite_stream @ 0x000000014c00e730, DwoOS=nullptr) at BackendUtil.cpp:1277:19
    frame #22: 0x0000000103f5fc5c clang-dxc`(anonymous namespace)::EmitAssemblyHelper::emitAssembly(this=0x000000016fdf48e8, Action="" OS=llvm::raw_pwrite_stream @ 0x000000014c00e730, BC=0x000000014c00e7e0) at BackendUtil.cpp:1301:3
    frame #23: 0x0000000103f5f11c clang-dxc`clang::emitBackendOutput(CI=0x000000014b612b30, CGOpts=0x000000014b816c18, TDesc=(Data = "" Length = 109), M=0x000000014c826000, Action="" VFS=IntrusiveRefCntPtr<llvm::vfs::FileSystem> @ 0x000000016fdf4bf8, OS=nullptr, BC=0x000000014c00e7e0) at BackendUtil.cpp:1473:13
    frame #24: 0x0000000104743b7c clang-dxc`clang::BackendConsumer::HandleTranslationUnit(this=0x000000014c00e7e0, C=0x000000014c81c800) at CodeGenAction.cpp:310:3
    frame #25: 0x0000000106ea3cac clang-dxc`clang::ParseAST(S=0x000000014c83ee00, PrintStats=false, SkipFunctionBodies=false) at ParseAST.cpp:183:13
    frame #26: 0x00000001051454d0 clang-dxc`clang::ASTFrontendAction::ExecuteAction(this=0x000000014b6125f0) at FrontendAction.cpp:1433:3
    frame #27: 0x0000000104749690 clang-dxc`clang::CodeGenAction::ExecuteAction(this=0x000000014b6125f0) at CodeGenAction.cpp:1107:30
    frame #28: 0x00000001051457a4 clang-dxc`clang::WrapperFrontendAction::ExecuteAction(this=0x000000014b613b70) at FrontendAction.cpp:1465:18
    frame #29: 0x0000000105168fc4 clang-dxc`clang::HLSLFrontendAction::ExecuteAction(this=0x000000014b613b70) at FrontendActions.cpp:1325:35
    frame #30: 0x0000000105144ce0 clang-dxc`clang::FrontendAction::Execute(this=0x000000014b613b70) at FrontendAction.cpp:1313:3
    frame #31: 0x0000000105050094 clang-dxc`clang::CompilerInstance::ExecuteAction(this=0x000000014b612b30, Act=0x000000014b613b70) at CompilerInstance.cpp:1007:33
    frame #32: 0x000000010529a430 clang-dxc`clang::ExecuteCompilerInvocation(Clang=0x000000014b612b30) at ExecuteCompilerInvocation.cpp:310:25
    frame #33: 0x00000001000152ec clang-dxc`cc1_main(Argv=ArrayRef<const char *> @ 0x000000016fdf5f68, Argv0="/Users/farzonlotfi/Projects/builds/llvm_debug_offload/bin/clang-23", MainAddr=0x0000000100005dd0) at cc1_main.cpp:304:15
    frame #34: 0x00000001000077b4 clang-dxc`ExecuteCC1Tool(ArgV=0x000000016fdf9898, ToolContext=0x000000016fdfe858, VFS=IntrusiveRefCntPtr<llvm::vfs::FileSystem> @ 0x000000016fdf9698) at driver.cpp:226:12
    frame #35: 0x0000000100013cdc clang-dxc`clang_main(int, char**, llvm::ToolContext const&)::$_0::operator()(this=0x000000016fdfa3e0, ArgV=0x000000016fdf9898) const at driver.cpp:376:12
    frame #36: 0x0000000100013c88 clang-dxc`int llvm::function_ref<int (llvm::SmallVectorImpl<char const*>&)>::callback_fn<clang_main(int, char**, llvm::ToolContext const&)::$_0>(callable=6171894752, params=0x000000016fdf9898) at STLFunctionalExtras.h:46:12
    frame #37: 0x0000000104d44890 clang-dxc`llvm::function_ref<int (llvm::SmallVectorImpl<char const*>&)>::operator()(this=0x000000016fdfaa78, params=0x000000016fdf9898) const at STLFunctionalExtras.h:69:12
    frame #38: 0x0000000104d44850 clang-dxc`clang::driver::CC1Command::Execute(llvm::ArrayRef<std::__1::optional<llvm::StringRef>>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>*, bool*) const::$_0::operator()(this=0x000000016fdf97f0) const at Job.cpp:442:34
 frame #39: 0x0000000104d4481c clang-dxc`void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<std::__1::optional<llvm::StringRef>>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>*, bool*) const::$_0>(callable=6171891696) at STLFunctionalExtras.h:46:12
    frame #40: 0x00000001012e1584 clang-dxc`llvm::function_ref<void ()>::operator()(this=0x000000016fdf9788) const at STLFunctionalExtras.h:69:12
    frame #41: 0x000000010337b0c4 clang-dxc`llvm::CrashRecoveryContext::RunSafely(this=0x000000016fdf9830, Fn=function_ref<void ()> @ 0x000000016fdf9788) at CrashRecoveryContext.cpp:426:3
    frame #42: 0x0000000104d40d50 clang-dxc`clang::driver::CC1Command::Execute(this=0x000000014b60f420, Redirects=ArrayRef<std::__1::optional<llvm::StringRef> > @ 0x000000016fdf9880, ErrMsg="", ExecutionFailed=0x000000016fdf9d8f) const at Job.cpp:442:12
    frame #43: 0x0000000104cc7650 clang-dxc`clang::driver::Compilation::ExecuteCommand(this=0x000000014b60e1d0, C=0x000000014b60f420, FailingCommand=0x000000016fdf9ea8, LogOnly=false) const at Compilation.cpp:196:15
    frame #44: 0x0000000104cc78e0 clang-dxc`clang::driver::Compilation::ExecuteJobs(this=0x000000014b60e1d0, Jobs=0x000000014b60e250, FailingCommands=0x000000016fdfa750, LogOnly=false) const at Compilation.cpp:246:19
    frame #45: 0x0000000104cf243c clang-dxc`clang::driver::Driver::ExecuteCompilation(this=0x000000016fdfa7a0, C=0x000000014b60e1d0, FailingCommands=0x000000016fdfa750) at Driver.cpp:2278:5
    frame #46: 0x0000000100006efc clang-dxc`clang_main(Argc=4, Argv=0x000000016fdfef98, ToolContext=0x000000016fdfe858) at driver.cpp:414:21
    frame #47: 0x0000000100041aec clang-dxc`main(argc=4, argv=0x000000016fdfef98) at clang-driver.cpp:17:10
    frame #48: 0x000000019bea6b98 dyld`start + 6076
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to