Issue 147883
Summary "LLVM ERROR: Cannot select: ... X86ISD::VPERMV3" (with constant vector splat)
Labels new issue
Assignees
Reporter thurstond
    ## Test case

```
$ cat reduced.ll 
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

define <32 x i16> @shuffle_vpermv3_v32i16(<32 x i16> %0) {
  %2 = call <32 x i16> @llvm.x86.avx512.vpermi2var.hi.512(<32 x i16> %0, <32 x i16> splat (i16 1), <32 x i16> zeroinitializer)
  ret <32 x i16> %2
}

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(none)
declare <32 x i16> @llvm.x86.avx512.vpermi2var.hi.512(<32 x i16>, <32 x i16>, <32 x i16>) #0

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(none) }
```

The test case passes `opt -passes=verify`.

## Repro command

With llc at head (1ae99f5894d70d11545f3a657665e5a3b8437d9a):
```
$ build/bin/llc < reduced.ll -mtriple=x86_64-unknown-unknown -mattr=+avx512vl > b.s
LLVM ERROR: Cannot select: t13: v32i16 = X86ISD::VPERMV3 t2, t16, undef:v32i16
 t2: v32i16,ch = CopyFromReg t0, Register:v32i16 %0
  t16: v32i16,ch = load<(load (s512) from constant-pool)> t0, t18, undef:i64
    t18: i64 = X86ISD::Wrapper TargetConstantPool:i64<<32 x i16> splat (i16 1)> 0
In function: shuffle_vpermv3_v32i16
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.	Program arguments: bin/llc -mtriple=x86_64-unknown-unknown -mattr=+avx512vl
1.	Running pass 'Function Pass Manager' on module '<stdin>'.
2.	Running pass 'X86 DAG->DAG Instruction Selection' on function '@shuffle_vpermv3_v32i16'
 #0 0x000055cfe0d1a7a1 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /usr/local/google/home/thurston/llvm-project/llvm/lib/Support/Unix/Signals.inc:819:11
 #1 0x000055cfe0d1ad2b PrintStackTraceSignalHandler(void*) /usr/local/google/home/thurston/llvm-project/llvm/lib/Support/Unix/Signals.inc:903:1
 #2 0x000055cfe0d18a76 llvm::sys::RunSignalHandlers() /usr/local/google/home/thurston/llvm-project/llvm/lib/Support/Signals.cpp:104:5
 #3 0x000055cfe0d1b4ad SignalHandler(int, siginfo_t*, void*) /usr/local/google/home/thurston/llvm-project/llvm/lib/Support/Unix/Signals.inc:418:7
 #4 0x00007fdff8a1cdf0 (/lib/x86_64-linux-gnu/libc.so.6+0x3fdf0)
 #5 0x00007fdff8a7195c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #6 0x00007fdff8a1ccc2 raise ./signal/../sysdeps/posix/raise.c:27:6
 #7 0x00007fdff8a054ac abort ./stdlib/abort.c:81:3
 #8 0x000055cfe0c37aed llvm::report_fatal_error(llvm::Twine const&, bool) /usr/local/google/home/thurston/llvm-project/llvm/lib/Support/ErrorHandling.cpp:137:5
 #9 0x000055cfe0a317f8 /usr/local/google/home/thurston/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:4443:3
#10 0x000055cfe0a2e814 llvm::SelectionDAGISel::SelectCodeCommon(llvm::SDNode*, unsigned char const*, unsigned int) /usr/local/google/home/thurston/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:4344:9
#11 0x000055cfde544669 (anonymous namespace)::X86DAGToDAGISel::SelectCode(llvm::SDNode*) /usr/local/google/home/thurston/llvm-project/build/lib/Target/X86/X86GenDAGISel.inc:374205:1
#12 0x000055cfde5389a3 (anonymous namespace)::X86DAGToDAGISel::Select(llvm::SDNode*) /usr/local/google/home/thurston/llvm-project/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:6754:1
#13 0x000055cfe0a205bf llvm::SelectionDAGISel::DoInstructionSelection() /usr/local/google/home/thurston/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1343:5
#14 0x000055cfe0a1f69f llvm::SelectionDAGISel::CodeGenAndEmitDAG() /usr/local/google/home/thurston/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1112:3
#15 0x000055cfe0a1df03 llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator_w_bits<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void, true, llvm::BasicBlock>, false, true>, llvm::ilist_iterator_w_bits<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void, true, llvm::BasicBlock>, false, true>, bool&) /usr/local/google/home/thurston/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:867:1
#16 0x000055cfe0a1dad4 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) /usr/local/google/home/thurston/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1891:11
#17 0x000055cfe0a1aab1 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) /usr/local/google/home/thurston/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:604:3
#18 0x000055cfde524e82 (anonymous namespace)::X86DAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) /usr/local/google/home/thurston/llvm-project/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:187:7
#19 0x000055cfe0a19831 llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) /usr/local/google/home/thurston/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:372:3
#20 0x000055cfdf6a8d1b llvm::MachineFunctionPass::runOnFunction(llvm::Function&) /usr/local/google/home/thurston/llvm-project/llvm/lib/CodeGen/MachineFunctionPass.cpp:108:8
#21 0x000055cfdfeea66a llvm::FPPassManager::runOnFunction(llvm::Function&) /usr/local/google/home/thurston/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1399:23
#22 0x000055cfdfeef042 llvm::FPPassManager::runOnModule(llvm::Module&) /usr/local/google/home/thurston/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1445:16
#23 0x000055cfdfeeaf1b (anonymous namespace)::MPPassManager::runOnModule(llvm::Module&) /usr/local/google/home/thurston/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1514:23
#24 0x000055cfdfeeaa9a llvm::legacy::PassManagerImpl::run(llvm::Module&) /usr/local/google/home/thurston/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:532:16
#25 0x000055cfdfeef321 llvm::legacy::PassManager::run(llvm::Module&) /usr/local/google/home/thurston/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1641:3
#26 0x000055cfdc38c95a compileModule(char**, llvm::LLVMContext&) /usr/local/google/home/thurston/llvm-project/llvm/tools/llc/llc.cpp:755:9
#27 0x000055cfdc38aa31 main /usr/local/google/home/thurston/llvm-project/llvm/tools/llc/llc.cpp:400:13
#28 0x00007fdff8a06ca8 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#29 0x00007fdff8a06d65 call_init ./csu/../csu/libc-start.c:128:20
#30 0x00007fdff8a06d65 __libc_start_main ./csu/../csu/libc-start.c:347:5
#31 0x000055cfdc38a1e1 _start (bin/llc+0xe901e1)
Aborted (core dumped)
```

## Maybe relevant observation

Older versions of llc (prior to https://github.com/llvm/llvm-project/commit/9c6693f9012dbf59cf9ebabc9097ce3f25f05cb6 ?) don't support the constant vector splat syntax:
```
llc-17: error: llc-17: <stdin>:5:85: error: expected value token
  %2 = call <32 x i16> @llvm.x86.avx512.vpermi2var.hi.512(<32 x i16> %0, <32 x i16> splat (i16 1), <32 x i16> zeroinitializer)
```

Perhaps nobody expects the Splat-ish instruction?
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to