[PATCH] D68593: [NewPM] Add an SROA pass after loop unroll

Guozhi Wei via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 7 14:14:15 PDT 2019


Carrot created this revision.
Carrot added a reviewer: chandlerc.
Herald added subscribers: llvm-commits, dexonsmith, steven_wu, hiraditya, mehdi_amini.
Herald added a project: LLVM.

In tensorflow library we found llvm generates redundant memory accesses to local array. It can also be demonstrated by following test case

#include <memory.h>

constexpr int size=4;

void f(int *a,int * b) {

  float tmp[size];
  for(int i =0;i<size;i++) {
      tmp[i] = a[i];
  }
  memcpy(b,tmp,size*sizeof(int));
  return;

}

LLVM generates:

  movups  (%rdi), %xmm0
  cvtdq2ps        %xmm0, %xmm0
  movaps  %xmm0, -24(%rsp)             // *
  movaps  -24(%rsp), %xmm0             // *
  movups  %xmm0, (%rsi)
  retq

The reason is SROA can't handle memory accesses with variant offset inside a loop, after the loop is fully unrolled, all memory accesses to the array are with fixed offset, so now they can be processed by SROA. But there is no more SROA passes after loop unroll. This patch add an SROA pass after loop unroll to handle this pattern.


Repository:
  rL LLVM

https://reviews.llvm.org/D68593

Files:
  lib/Passes/PassBuilder.cpp
  test/Other/new-pm-defaults.ll
  test/Other/new-pm-thinlto-defaults.ll


Index: test/Other/new-pm-thinlto-defaults.ll
===================================================================
--- test/Other/new-pm-thinlto-defaults.ll
+++ test/Other/new-pm-thinlto-defaults.ll
@@ -156,6 +156,7 @@
 ; CHECK-O-NEXT: Running pass: LoopDeletionPass
 ; CHECK-O-NEXT: Running pass: LoopFullUnrollPass
 ; CHECK-O-NEXT: Finished Loop pass manager run.
+; CHECK-O-NEXT: Running pass: SROA on foo
 ; CHECK-Os-NEXT: Running pass: MergedLoadStoreMotionPass
 ; CHECK-Os-NEXT: Running pass: GVN
 ; CHECK-Os-NEXT: Running analysis: MemoryDependenceAnalysis
Index: test/Other/new-pm-defaults.ll
===================================================================
--- test/Other/new-pm-defaults.ll
+++ test/Other/new-pm-defaults.ll
@@ -179,6 +179,7 @@
 ; CHECK-O-NEXT: Running pass: LoopFullUnrollPass
 ; CHECK-EP-LOOP-END-NEXT: Running pass: NoOpLoopPass
 ; CHECK-O-NEXT: Finished Loop pass manager run.
+; CHECK-O-NEXT: Running pass: SROA on foo
 ; CHECK-Os-NEXT: Running pass: MergedLoadStoreMotionPass
 ; CHECK-Os-NEXT: Running pass: GVN
 ; CHECK-Os-NEXT: Running analysis: MemoryDependenceAnalysis
Index: lib/Passes/PassBuilder.cpp
===================================================================
--- lib/Passes/PassBuilder.cpp
+++ lib/Passes/PassBuilder.cpp
@@ -489,6 +489,9 @@
   FPM.addPass(createFunctionToLoopPassAdaptor(
       std::move(LPM2), /*UseMemorySSA=*/false, DebugLogging));
 
+  // Delete small array after loop unroll.
+  FPM.addPass(SROA());
+
   // Eliminate redundancies.
   if (Level != O1) {
     // These passes add substantial compile time so skip them at O1.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D68593.223644.patch
Type: text/x-patch
Size: 1596 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191007/8d4cf324/attachment.bin>


More information about the llvm-commits mailing list