[PATCH] D63692: [LSR] Improved code generation for Zero Compare loops

ChenZheng via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 25 19:50:48 PDT 2019


shchenz requested changes to this revision.
shchenz added a comment.
This revision now requires changes to proceed.

This patch causes a lot of cases fail except platform X86 and ARM.

And there is a compiling time crash:

  : 'RUN: at line 6';   /home/czhengsz/llvm_new/llvm-project/llvm/build/bin/llc -switch-peel-threshold=101 < /home/czhengsz/llvm_new/llvm-project/llvm/test/CodeGen/SystemZ/loop-03.ll -mtriple=s390x-linux-gnu -mcpu=z13 | /home/czhengsz/llvm_new/llvm-project/llvm/build/bin/FileCheck /home/czhengsz/llvm_new/llvm-project/llvm/test/CodeGen/SystemZ/loop-03.ll
  --
  Exit Code: 2
  
  Command Output (stderr):
  --
  llc: /home/czhengsz/llvm_new/llvm-project/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:3350: void {anonymous}::LSRInstance::InsertSupplementalFormula(const llvm::SCEV*, {anonymous}::LSRUse&, size_t): Assertion `Inserted && "Supplemental formula already exists!"' failed.
  Stack dump:
  0.      Program arguments: /home/czhengsz/llvm_new/llvm-project/llvm/build/bin/llc -switch-peel-threshold=101 -mtriple=s390x-linux-gnu -mcpu=z13 
  1.      Running pass 'Function Pass Manager' on module '<stdin>'.
  2.      Running pass 'Loop Pass Manager' on function '@fun0'
  3.      Running pass 'Loop Strength Reduction' on basic block '%23'
   #0 0x00000000127b8768 llvm::sys::PrintStackTrace(llvm::raw_ostream&) (/home/czhengsz/llvm_new/llvm-project/llvm/build/bin/llc+0x127b8768)
   #1 0x00000000127b8890 PrintStackTraceSignalHandler(void*) (/home/czhengsz/llvm_new/llvm-project/llvm/build/bin/llc+0x127b8890)
   #2 0x00000000127b6324 llvm::sys::RunSignalHandlers() (/home/czhengsz/llvm_new/llvm-project/llvm/build/bin/llc+0x127b6324)
   #3 0x00000000127b6504 SignalHandler(int) (/home/czhengsz/llvm_new/llvm-project/llvm/build/bin/llc+0x127b6504)
   #4 0x00003fffb6470478 (linux-vdso64.so.1+0x478)
   #5 0x00003fffb5d0e100 raise (/opt/at12.0/lib64/power8/libc.so.6+0x4e100)
   #6 0x00003fffb5ce4598 abort (/opt/at12.0/lib64/power8/libc.so.6+0x24598)
   #7 0x00003fffb5cfb624 (/opt/at12.0/lib64/power8/libc.so.6+0x3b624)
   #8 0x00003fffb5cfb6c4 __assert_fail (/opt/at12.0/lib64/power8/libc.so.6+0x3b6c4)
   #9 0x000000001220151c (anonymous namespace)::LSRInstance::InsertSupplementalFormula(llvm::SCEV const*, (anonymous namespace)::LSRUse&, unsigned long) (/home/czhengsz/llvm_new/llvm-project/llvm/build/bin/llc+0x1220151c)
  #10 0x0000000012209050 (anonymous namespace)::LSRInstance::CollectFixupsAndInitialFormulae() (/home/czhengsz/llvm_new/llvm-project/llvm/build/bin/llc+0x12209050)
  #11 0x0000000012212908 ReduceLoopStrength(llvm::Loop*, llvm::IVUsers&, llvm::ScalarEvolution&, llvm::DominatorTree&, llvm::LoopInfo&, llvm::TargetTransformInfo const&) (/home/czhengsz/llvm_new/llvm-project/llvm/build/bin/llc+0x12212908)
  #12 0x00000000117e5938 llvm::LPPassManager::runOnFunction(llvm::Function&) (/home/czhengsz/llvm_new/llvm-project/llvm/build/bin/llc+0x117e5938)
  #13 0x00000000120240b0 llvm::FPPassManager::runOnFunction(llvm::Function&) (/home/czhengsz/llvm_new/llvm-project/llvm/build/bin/llc+0x120240b0)
  #14 0x00000000120242f8 llvm::FPPassManager::runOnModule(llvm::Module&) (/home/czhengsz/llvm_new/llvm-project/llvm/build/bin/llc+0x120242f8)
  #15 0x00000000120230e0 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/home/czhengsz/llvm_new/llvm-project/llvm/build/bin/llc+0x120230e0)
  #16 0x000000001202350c llvm::legacy::PassManager::run(llvm::Module&) (/home/czhengsz/llvm_new/llvm-project/llvm/build/bin/llc+0x1202350c)
  #17 0x00000000103b585c compileModule(char**, llvm::LLVMContext&) (/home/czhengsz/llvm_new/llvm-project/llvm/build/bin/llc+0x103b585c)
  #18 0x0000000010318678 main (/home/czhengsz/llvm_new/llvm-project/llvm/build/bin/llc+0x10318678)
  #19 0x00003fffb5ce4bf8 (/opt/at12.0/lib64/power8/libc.so.6+0x24bf8)
  #20 0x00003fffb5ce4e04 __libc_start_main (/opt/at12.0/lib64/power8/libc.so.6+0x24e04)
  FileCheck error: '-' is empty.
  FileCheck command line:  /home/czhengsz/llvm_new/llvm-project/llvm/build/bin/FileCheck /home/czhengsz/llvm_new/llvm-project/llvm/test/CodeGen/SystemZ/loop-03.ll

I think these failures should be fixed firstly.

One opinion about this patch's example, seems you found the improvement for X86, because `incl` loop(negative loop count) on X86 can use the instruction `movl`+ `leal`, but `decl` loop(positive loop count) uses `addl` + `pushl` + `popl` + `subl`.

As I know, PowerPC has hardware loop, it needs the loop count must be a positive value. This patch changes all loop to a `incl` loop with negative loop count which is surely a deg for PowerPC. So maybe you need to treat this improvement for specific platform by using some target hook function?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D63692





More information about the llvm-commits mailing list