[llvm] [VectorCombine] Scalarize binop-like intrinsics (PR #138095)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Thu May 1 01:51:41 PDT 2025


================
@@ -1016,21 +1017,29 @@ bool VectorCombine::scalarizeVPIntrinsic(Instruction &I) {
   return true;
 }
 
-/// Match a vector binop or compare instruction with at least one inserted
-/// scalar operand and convert to scalar binop/cmp followed by insertelement.
+/// Match a vector binop, compare or binop-like intrinsic with at least one
+/// inserted scalar operand and convert to scalar binop/cmp/intrinsic followed
+/// by insertelement.
 bool VectorCombine::scalarizeBinopOrCmp(Instruction &I) {
   CmpPredicate Pred = CmpInst::BAD_ICMP_PREDICATE;
   Value *Ins0, *Ins1;
   if (!match(&I, m_BinOp(m_Value(Ins0), m_Value(Ins1))) &&
-      !match(&I, m_Cmp(Pred, m_Value(Ins0), m_Value(Ins1))))
-    return false;
+      !match(&I, m_Cmp(Pred, m_Value(Ins0), m_Value(Ins1)))) {
+    if (auto *II = dyn_cast<IntrinsicInst>(&I);
+        II && II->arg_size() == 2 &&
+        isTriviallyVectorizable(II->getIntrinsicID())) {
+      Ins0 = II->getArgOperand(0);
+      Ins1 = II->getArgOperand(1);
----------------
dtcxzyw wrote:

We need more checks to ensure this is a binop-like intrinsic.
Counterexamples:
```
define <4 x i1> @test1(float %x) {
  %x.insert = insertelement <4 x float> poison, float %x, i32 0
  %v = call <4 x i1> @llvm.is.fpclass(<4 x float> %x.insert, i32 512)
  ret <4 x i1> %v
}
```
```
opt: /home/dtcxzyw/WorkSpace/Projects/compilers/llvm-project/llvm/include/llvm/Support/Casting.h:578: decltype(auto) llvm::cast(From*) [with To = VectorType; From = Type]: Assertion `isa<To>(Val) && "cast<Ty>() argument of incompatible type!"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: bin/opt -passes=vector-combine test.ll -S
1.      Running pass "function(vector-combine)" on module "test.ll"
2.      Running pass "vector-combine" on function "test1"
 #0 0x0000712543426082 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMSupport.so.21.0git+0x226082)
 #1 0x0000712543422f5f llvm::sys::RunSignalHandlers() (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMSupport.so.21.0git+0x222f5f)
 #2 0x00007125434230a4 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #3 0x0000712542e45330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
 #4 0x0000712542e9eb2c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x0000712542e9eb2c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #6 0x0000712542e9eb2c pthread_kill ./nptl/pthread_kill.c:89:10
 #7 0x0000712542e4527e raise ./signal/../sysdeps/posix/raise.c:27:6
 #8 0x0000712542e288ff abort ./stdlib/abort.c:81:7
 #9 0x0000712542e2881b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x0000712542e3b517 (/lib/x86_64-linux-gnu/libc.so.6+0x3b517)
#11 0x000071253b2a1507 decltype(auto) llvm::cast<llvm::VectorType, llvm::Type>(llvm::Type*) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMVectorize.so.21.0git+0xa1507)
#12 0x000071253b4708f1 (anonymous namespace)::VectorCombine::scalarizeBinopOrCmp(llvm::Instruction&) VectorCombine.cpp:0:0
#13 0x000071253b480c5e (anonymous namespace)::VectorCombine::run()::'lambda'(llvm::Instruction&)::operator()(llvm::Instruction&) const VectorCombine.cpp:0:0
#14 0x000071253b482daf llvm::VectorCombinePass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMVectorize.so.21.0git+0x282daf)
#15 0x000071253d2e7785 llvm::detail::PassModel<llvm::Function, llvm::VectorCombinePass, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMPasses.so.21.0git+0xe7785)
#16 0x000071253a12b124 llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMCore.so.21.0git+0x32b124)
#17 0x00007125420d9835 llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMX86CodeGen.so.21.0git+0xd9835)
#18 0x000071253a129a00 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMCore.so.21.0git+0x329a00)
#19 0x00007125420da1f5 llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMX86CodeGen.so.21.0git+0xda1f5)
#20 0x000071253a129ff5 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMCore.so.21.0git+0x329ff5)
#21 0x000071254365e329 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/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMOptDriver.so.21.0git+0x2c329)
#22 0x0000712543669346 optMain (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMOptDriver.so.21.0git+0x37346)
#23 0x0000712542e2a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#24 0x0000712542e2a28b call_init ./csu/../csu/libc-start.c:128:20
#25 0x0000712542e2a28b __libc_start_main ./csu/../csu/libc-start.c:347:5
#26 0x00005af5e73a6095 _start (bin/opt+0x1095)

Aborted (core dumped)
```
```
define <4 x i8> @test2(i32 %x, i32 %y) {
  %x.insert = insertelement <4 x i32> poison, i32 %x, i32 0
  %y.insert = insertelement <4 x i32> poison, i32 %y, i32 0
  %v = call <4 x i8> @llvm.scmp.v4i8.v4i32(<4 x i32> %x.insert, <4 x i32> %y.insert)
  ret <4 x i8> %v
}
```
```
opt: /home/dtcxzyw/WorkSpace/Projects/compilers/llvm-project/llvm/lib/IR/Instructions.cpp:1686: llvm::InsertElementInst::InsertElementInst(llvm::Value*, llvm::Value*, llvm::Value*, const llvm::Twine&, llvm::InsertPosition): Assertion `isValidOperands(Vec, Elt, Index) && "Invalid insertelement instruction operands!"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: bin/opt -passes=vector-combine test.ll -S
1.      Running pass "function(vector-combine)" on module "test.ll"
2.      Running pass "vector-combine" on function "test2"
 #0 0x000079af90e26082 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMSupport.so.21.0git+0x226082)
 #1 0x000079af90e22f5f llvm::sys::RunSignalHandlers() (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMSupport.so.21.0git+0x222f5f)
 #2 0x000079af90e230a4 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #3 0x000079af90845330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
 #4 0x000079af9089eb2c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x000079af9089eb2c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #6 0x000079af9089eb2c pthread_kill ./nptl/pthread_kill.c:89:10
 #7 0x000079af9084527e raise ./signal/../sysdeps/posix/raise.c:27:6
 #8 0x000079af908288ff abort ./stdlib/abort.c:81:7
 #9 0x000079af9082881b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x000079af9083b517 (/lib/x86_64-linux-gnu/libc.so.6+0x3b517)
#11 0x000079af87a96956 llvm::InsertElementInst::InsertElementInst(llvm::Value*, llvm::Value*, llvm::Value*, llvm::Twine const&, llvm::InsertPosition) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMCore.so.21.0git+0x296956)
#12 0x000079af88e650ca llvm::IRBuilderBase::CreateInsertElement(llvm::Value*, llvm::Value*, llvm::Value*, llvm::Twine const&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMVectorize.so.21.0git+0x2650ca)
#13 0x000079af88e70fcd (anonymous namespace)::VectorCombine::scalarizeBinopOrCmp(llvm::Instruction&) VectorCombine.cpp:0:0
#14 0x000079af88e80c5e (anonymous namespace)::VectorCombine::run()::'lambda'(llvm::Instruction&)::operator()(llvm::Instruction&) const VectorCombine.cpp:0:0
#15 0x000079af88e82daf llvm::VectorCombinePass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMVectorize.so.21.0git+0x282daf)
#16 0x000079af8ace7785 llvm::detail::PassModel<llvm::Function, llvm::VectorCombinePass, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMPasses.so.21.0git+0xe7785)
#17 0x000079af87b2b124 llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMCore.so.21.0git+0x32b124)
#18 0x000079af8fad9835 llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMX86CodeGen.so.21.0git+0xd9835)
#19 0x000079af87b29a00 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMCore.so.21.0git+0x329a00)
#20 0x000079af8fada1f5 llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMX86CodeGen.so.21.0git+0xda1f5)
#21 0x000079af87b29ff5 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMCore.so.21.0git+0x329ff5)
#22 0x000079af910f6329 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/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMOptDriver.so.21.0git+0x2c329)
#23 0x000079af91101346 optMain (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMOptDriver.so.21.0git+0x37346)
#24 0x000079af9082a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#25 0x000079af9082a28b call_init ./csu/../csu/libc-start.c:128:20
#26 0x000079af9082a28b __libc_start_main ./csu/../csu/libc-start.c:347:5
#27 0x0000640738e74095 _start (bin/opt+0x1095)
Aborted (core dumped)
```

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


More information about the llvm-commits mailing list