[polly] r308826 - [ForwardOpTree] Support hoisted invariant loads.

Michael Kruse via llvm-commits llvm-commits at lists.llvm.org
Sat Jul 22 07:30:02 PDT 2017


Author: meinersbur
Date: Sat Jul 22 07:30:02 2017
New Revision: 308826

URL: http://llvm.org/viewvc/llvm-project?rev=308826&view=rev
Log:
[ForwardOpTree] Support hoisted invariant loads.

Hoisted loads can be trivially supported because there are no
MemoryAccess to be modified, the loaded value is just available
at code generation.

Added:
    polly/trunk/test/ForwardOpTree/forward_hoisted.ll
Modified:
    polly/trunk/lib/Transform/ForwardOpTree.cpp

Modified: polly/trunk/lib/Transform/ForwardOpTree.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Transform/ForwardOpTree.cpp?rev=308826&r1=308825&r2=308826&view=diff
==============================================================================
--- polly/trunk/lib/Transform/ForwardOpTree.cpp (original)
+++ polly/trunk/lib/Transform/ForwardOpTree.cpp Sat Jul 22 07:30:02 2017
@@ -120,6 +120,7 @@ private:
     switch (VUse.getKind()) {
     case VirtualUse::Constant:
     case VirtualUse::Block:
+    case VirtualUse::Hoisted:
       // These can be used anywhere without special considerations.
       if (DoIt)
         return FD_DidForward;
@@ -130,11 +131,6 @@ private:
       DEBUG(dbgs() << "    Cannot forward synthesizable: " << *UseVal << "\n");
       return FD_CannotForward;
 
-    case VirtualUse::Hoisted:
-      // Not supported yet.
-      DEBUG(dbgs() << "    Cannot forward hoisted load: " << *UseVal << "\n");
-      return FD_CannotForward;
-
     case VirtualUse::ReadOnly:
       // Not supported yet.
       DEBUG(dbgs() << "    Cannot forward read-only val: " << *UseVal << "\n");

Added: polly/trunk/test/ForwardOpTree/forward_hoisted.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ForwardOpTree/forward_hoisted.ll?rev=308826&view=auto
==============================================================================
--- polly/trunk/test/ForwardOpTree/forward_hoisted.ll (added)
+++ polly/trunk/test/ForwardOpTree/forward_hoisted.ll Sat Jul 22 07:30:02 2017
@@ -0,0 +1,64 @@
+; RUN: opt %loadPolly -polly-invariant-load-hoisting=true -polly-optree -analyze < %s | FileCheck %s -match-full-lines
+;
+; Move %val to %bodyB, so %bodyA can be removed (by -polly-simplify)
+;
+; for (int j = 0; j < n; j += 1) {
+; bodyA:
+;   double val = B[0] + 21.0;
+;
+; bodyB:
+;   A[0] = val;
+; }
+;
+define void @func(i32 %n, double* noalias nonnull %A, double* noalias nonnull %B) {
+entry:
+  br label %for
+
+for:
+  %j = phi i32 [0, %entry], [%j.inc, %inc]
+  %j.cmp = icmp slt i32 %j, %n
+  br i1 %j.cmp, label %bodyA, label %exit
+
+    bodyA:
+      %val1 = load double, double* %B
+      %val2 = fadd double %val1, 21.0
+      br label %bodyB
+
+    bodyB:
+      store double %val2, double* %A
+      br label %inc
+
+inc:
+  %j.inc = add nuw nsw i32 %j, 1
+  br label %for
+
+exit:
+  br label %return
+
+return:
+  ret void
+}
+
+
+; CHECK: Statistics {
+; CHECK:     Instructions copied: 1
+; CHECK:     Operand trees forwarded: 1
+; CHECK:     Statements with forwarded operand trees: 1
+; CHECK: }
+
+; CHECK:      After statements {
+; CHECK-NEXT:     Stmt_bodyA
+; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT:                 [n] -> { Stmt_bodyA[i0] -> MemRef_val2[] };
+; CHECK-NEXT:             Instructions {
+; CHECK-NEXT:                   %val1 = load double, double* %B
+; CHECK-NEXT:                   %val2 = fadd double %val1, 2.100000e+01
+; CHECK-NEXT:                 }
+; CHECK-NEXT:     Stmt_bodyB
+; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT:                 [n] -> { Stmt_bodyB[i0] -> MemRef_A[0] };
+; CHECK-NEXT:             Instructions {
+; CHECK-NEXT:                   %val2 = fadd double %val1, 2.100000e+01
+; CHECK-NEXT:                   store double %val2, double* %A
+; CHECK-NEXT:                 }
+; CHECK-NEXT: }




More information about the llvm-commits mailing list