[PATCH] D139721: [RISCV][VP] Support vp.reduce.mul by ExpandVectorPredication

Yingchi Long via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 13 10:48:59 PST 2022


inclyc added a comment.

In D139721#3992238 <https://reviews.llvm.org/D139721#3992238>, @craig.topper wrote:

> Does this work for scalable vectors?

I'm afraid not.... expand vp pass seems not able to expand reduction (causes an assertion failure).

IR:

  declare i8 @llvm.vp.reduce.mul.nxv2i8(i8, <vscale x 2 x i8>, <vscale x 2 x i1>, i32)
  
  define signext i8 @vpreduce_mul_nxv2i8(i8 signext %s, <vscale x 2 x i8> %v, <vscale x 2 x i1> %m, i32 zeroext %evl) {
    %r = call i8 @llvm.vp.reduce.mul.nxv2i8(i8 %s, <vscale x 2 x i8> %v, <vscale x 2 x i1> %m, i32 %evl)
    ret i8 %r
  }

After expand vp:

  define signext i8 @vpreduce_mul_nxv2i8(i8 signext %s, <vscale x 2 x i8> %v, <vscale x 2 x i1> %m, i32 zeroext %evl) {
    %1 = call <vscale x 2 x i1> @llvm.get.active.lane.mask.nxv2i1.i32(i32 0, i32 %evl)
    %2 = and <vscale x 2 x i1> %1, %m
    %vscale = call i32 @llvm.vscale.i32()
    %scalable_size = mul nuw i32 %vscale, 2
    %3 = select <vscale x 2 x i1> %2, <vscale x 2 x i8> %v, <vscale x 2 x i8> shufflevector (<vscale x 2 x i8> insertelement (<vscale x 2 x i8> poison, i8 1, i32 0), <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer)
    %4 = call i8 @llvm.vector.reduce.mul.nxv2i8(<vscale x 2 x i8> %3)
    %5 = mul i8 %4, %s
    ret i8 %5
  }

Other targets may not able to handle this as well. https://godbolt.org/z/qevxT5r8Y

Perhaps some of our next patches should be to improve the related passes (like `Expand reduction intrinsics`)?

Stack dump:

  llc: <llvm-project>/llvm/include/llvm/Support/Casting.h:578: decltype(auto) llvm::cast(From *) [To = llvm::FixedVectorType, From = llvm::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: build/bin/llc -mtriple=riscv32 local/buddy/reduce/mul/scale.ll
  1.      Running pass 'Function Pass Manager' on module 'local/buddy/reduce/mul/scale.ll'.
  2.      Running pass 'Expand reduction intrinsics' on function '@vpreduce_mul_nxv2i8'
   #0 0x00007f5ebd0c31da llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) <llvm-project>/llvm/lib/Support/Unix/Signals.inc:567:11
   #1 0x00007f5ebd0c338b PrintStackTraceSignalHandler(void*) <llvm-project>/llvm/lib/Support/Unix/Signals.inc:641:1
   #2 0x00007f5ebd0c1a16 llvm::sys::RunSignalHandlers() <llvm-project>/llvm/lib/Support/Signals.cpp:104:5
   #3 0x00007f5ebd0c3a75 SignalHandler(int) <llvm-project>/llvm/lib/Support/Unix/Signals.inc:412:1
   #4 0x00007f5ebc7c2950 (/usr/lib64/libc.so.6+0x37950)
   #5 0x00007f5ebc80e42c (/usr/lib64/libc.so.6+0x8342c)
   #6 0x00007f5ebc7c28b2 raise (/usr/lib64/libc.so.6+0x378b2)
   #7 0x00007f5ebc7ad471 abort (/usr/lib64/libc.so.6+0x22471)
   #8 0x00007f5ebc7ad395 (/usr/lib64/libc.so.6+0x22395)
   #9 0x00007f5ebc7bbb92 (/usr/lib64/libc.so.6+0x30b92)
  #10 0x00007f5ec07c8c88 decltype(auto) llvm::cast<llvm::FixedVectorType, llvm::Type>(llvm::Type*) <llvm-project>/llvm/include/llvm/Support/Casting.h:579:10
  #11 0x00007f5ec080c6d6 (anonymous namespace)::expandReductions(llvm::Function&, llvm::TargetTransformInfo const*) <llvm-project>/llvm/lib/CodeGen/ExpandReductions.cpp:147:15
  #12 0x00007f5ec080c976 (anonymous namespace)::ExpandReductions::runOnFunction(llvm::Function&) <llvm-project>/llvm/lib/CodeGen/ExpandReductions.cpp:183:5
  #13 0x00007f5ebdcb9643 llvm::FPPassManager::runOnFunction(llvm::Function&) <llvm-project>/llvm/lib/IR/LegacyPassManager.cpp:1430:23
  #14 0x00007f5ebdcbe462 llvm::FPPassManager::runOnModule(llvm::Module&) <llvm-project>/llvm/lib/IR/LegacyPassManager.cpp:1476:16
  #15 0x00007f5ebdcb9f19 (anonymous namespace)::MPPassManager::runOnModule(llvm::Module&) <llvm-project>/llvm/lib/IR/LegacyPassManager.cpp:1545:23
  #16 0x00007f5ebdcb9a8a llvm::legacy::PassManagerImpl::run(llvm::Module&) <llvm-project>/llvm/lib/IR/LegacyPassManager.cpp:535:16
  #17 0x00007f5ebdcbe741 llvm::legacy::PassManager::run(llvm::Module&) <llvm-project>/llvm/lib/IR/LegacyPassManager.cpp:1672:3
  #18 0x000055f10326689a compileModule(char**, llvm::LLVMContext&) <llvm-project>/llvm/tools/llc/llc.cpp:737:41
  #19 0x000055f103264ca2 main <llvm-project>/llvm/tools/llc/llc.cpp:418:13
  #20 0x00007f5ebc7ae34a (/usr/lib64/libc.so.6+0x2334a)
  #21 0x00007f5ebc7ae3fc __libc_start_main (/usr/lib64/libc.so.6+0x233fc)
  #22 0x000055f1032644b1 _start (build/bin/llc+0x284b1)
  zsh: IOT instruction (core dumped)  build/bin/llc -mtriple=riscv32 local/buddy/reduce/mul/scale.ll


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D139721/new/

https://reviews.llvm.org/D139721



More information about the llvm-commits mailing list