[polly] r251948 - Remove read-only statements from the SCoP

Johannes Doerfert via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 3 08:54:49 PST 2015


Author: jdoerfert
Date: Tue Nov  3 10:54:49 2015
New Revision: 251948

URL: http://llvm.org/viewvc/llvm-project?rev=251948&view=rev
Log:
Remove read-only statements from the SCoP

  We do not need to model read-only statements in the SCoP as they will
  not cause any side effects that are visible to the outside anyway.
  Removing them should safe us time and might even simplify the ASTs we
  generate.

Differential Revision: http://reviews.llvm.org/D14272

Added:
    polly/trunk/test/ScopInfo/invariant-loads-leave-read-only-statements.ll
    polly/trunk/test/ScopInfo/read-only-statements.ll
Modified:
    polly/trunk/lib/Analysis/ScopInfo.cpp
    polly/trunk/test/DependenceInfo/different_schedule_dimensions.ll
    polly/trunk/test/ScopInfo/variant_base_pointer.ll

Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=251948&r1=251947&r2=251948&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Tue Nov  3 10:54:49 2015
@@ -2518,10 +2518,27 @@ void Scop::simplifySCoP(bool RemoveIgnor
                          ? Stmt.getRegion()->getNode()
                          : getRegion().getBBNode(Stmt.getBasicBlock());
 
-    if (StmtIt->isEmpty() ||
-        isl_set_is_empty(DomainMap[getRegionNodeBasicBlock(RN)]) ||
-        (RemoveIgnoredStmts && isIgnored(RN))) {
+    bool RemoveStmt = StmtIt->isEmpty();
+    if (!RemoveStmt)
+      RemoveStmt = isl_set_is_empty(DomainMap[getRegionNodeBasicBlock(RN)]);
+    if (!RemoveStmt)
+      RemoveStmt = (RemoveIgnoredStmts && isIgnored(RN));
 
+    // Remove read only statements only after invariant loop hoisting.
+    if (!RemoveStmt && !RemoveIgnoredStmts) {
+      bool OnlyRead = true;
+      for (MemoryAccess *MA : Stmt) {
+        if (MA->isRead())
+          continue;
+
+        OnlyRead = false;
+        break;
+      }
+
+      RemoveStmt = OnlyRead;
+    }
+
+    if (RemoveStmt) {
       // Remove the statement because it is unnecessary.
       if (Stmt.isRegionStmt())
         for (BasicBlock *BB : Stmt.getRegion()->blocks())

Modified: polly/trunk/test/DependenceInfo/different_schedule_dimensions.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/DependenceInfo/different_schedule_dimensions.ll?rev=251948&r1=251947&r2=251948&view=diff
==============================================================================
--- polly/trunk/test/DependenceInfo/different_schedule_dimensions.ll (original)
+++ polly/trunk/test/DependenceInfo/different_schedule_dimensions.ll Tue Nov  3 10:54:49 2015
@@ -4,9 +4,9 @@
 ; CHECK: RAW dependences:
 ; CHECK:   { Stmt_bb9[0] -> Stmt_bb10[0] }
 ; CHECK: WAR dependences:
-; CHECK:   { Stmt_bb3[0] -> Stmt_bb10[0] }
-; CHECK: WAW dependences:
 ; CHECK:   {  }
+; CHECK: WAW dependences:
+; CHECK:   { Stmt_bb3[0] -> Stmt_bb10[0] }
 ; CHECK: Reduction dependences:
 ; CHECK:   {  }
 
@@ -25,6 +25,7 @@ bb3:
   %tmp5 = getelementptr inbounds [1024 x double], [1024 x double]* %arg1, i64 0, i64 0
   %tmp6 = load double, double* %tmp5, align 8
   %tmp7 = fadd double undef, %tmp6
+  store double %tmp7, double* %tmp5, align 8
   br i1 false, label %bb8, label %bb9
 
 bb8:                                              ; preds = %bb3

Added: polly/trunk/test/ScopInfo/invariant-loads-leave-read-only-statements.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/invariant-loads-leave-read-only-statements.ll?rev=251948&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/invariant-loads-leave-read-only-statements.ll (added)
+++ polly/trunk/test/ScopInfo/invariant-loads-leave-read-only-statements.ll Tue Nov  3 10:54:49 2015
@@ -0,0 +1,129 @@
+; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-codegen -analyze < %s
+;
+;
+; CHECK:         Statements {
+; CHECK-NEXT:      Stmt_top_split
+; CHECK-NEXT:            Domain :=
+; CHECK-NEXT:                [p_0, p_1, p_2] -> { Stmt_top_split[] };
+; CHECK-NEXT:            Schedule :=
+; CHECK-NEXT:                [p_0, p_1, p_2] -> { Stmt_top_split[] -> [0, 0, 0, 0] };
+; CHECK-NEXT:            MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT:                [p_0, p_1, p_2] -> { Stmt_top_split[] -> MemRef_25[] };
+; CHECK-NEXT:            MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT:                [p_0, p_1, p_2] -> { Stmt_top_split[] -> MemRef_26[] };
+; CHECK-NEXT:      Stmt_L_4
+; CHECK-NEXT:            Domain :=
+; CHECK-NEXT:                [p_0, p_1, p_2] -> { Stmt_L_4[i0, i1, i2] : i0 >= 0 and i0 <= -1 + p_0 and i1 >= 0 and i1 <= -1 + p_0 and i2 >= 0 and i2 <= -1 + p_0 };
+; CHECK-NEXT:            Schedule :=
+; CHECK-NEXT:                [p_0, p_1, p_2] -> { Stmt_L_4[i0, i1, i2] -> [1, i0, i1, i2] };
+; CHECK-NEXT:            ReadAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT:                [p_0, p_1, p_2] -> { Stmt_L_4[i0, i1, i2] -> MemRef_25[] };
+; CHECK-NEXT:            ReadAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT:                [p_0, p_1, p_2] -> { Stmt_L_4[i0, i1, i2] -> MemRef_19[i1, i0] };
+; CHECK-NEXT:            ReadAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT:                [p_0, p_1, p_2] -> { Stmt_L_4[i0, i1, i2] -> MemRef_5[i2, i0] };
+; CHECK-NEXT:            ReadAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT:                [p_0, p_1, p_2] -> { Stmt_L_4[i0, i1, i2] -> MemRef_12[i2, i1] };
+; CHECK-NEXT:            MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT:                [p_0, p_1, p_2] -> { Stmt_L_4[i0, i1, i2] -> MemRef_19[i1, i0] };
+; CHECK-NEXT:    }
+;
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+%jl_value_t = type { %jl_value_t* }
+
+define %jl_value_t* @julia_gemm_22583(%jl_value_t*, %jl_value_t**, i32) {
+top:
+  br label %top.split
+
+top.split:                                        ; preds = %top
+  %3 = load %jl_value_t*, %jl_value_t** %1, align 8
+  %4 = bitcast %jl_value_t* %3 to double**
+  %5 = load double*, double** %4, align 8
+  %6 = getelementptr inbounds %jl_value_t, %jl_value_t* %3, i64 3, i32 0
+  %7 = bitcast %jl_value_t** %6 to i64*
+  %8 = load i64, i64* %7, align 8
+  %9 = getelementptr %jl_value_t*, %jl_value_t** %1, i64 1
+  %10 = load %jl_value_t*, %jl_value_t** %9, align 8
+  %11 = bitcast %jl_value_t* %10 to double**
+  %12 = load double*, double** %11, align 8
+  %13 = getelementptr inbounds %jl_value_t, %jl_value_t* %10, i64 3, i32 0
+  %14 = bitcast %jl_value_t** %13 to i64*
+  %15 = load i64, i64* %14, align 8
+  %16 = getelementptr %jl_value_t*, %jl_value_t** %1, i64 2
+  %17 = load %jl_value_t*, %jl_value_t** %16, align 8
+  %18 = bitcast %jl_value_t* %17 to double**
+  %19 = load double*, double** %18, align 8
+  %20 = getelementptr inbounds %jl_value_t, %jl_value_t* %17, i64 3, i32 0
+  %21 = bitcast %jl_value_t** %20 to i64*
+  %22 = load i64, i64* %21, align 8
+  %23 = icmp sgt i64 %8, 0
+  %24 = select i1 %23, i64 %8, i64 0
+  %25 = add i64 %24, 1
+  %26 = icmp eq i64 %24, 0
+  br i1 %26, label %L.11, label %L.preheader
+
+L.preheader:                                      ; preds = %top.split
+  br label %L
+
+L:                                                ; preds = %L.preheader, %L.9
+  %"#s5.0" = phi i64 [ %27, %L.9 ], [ 1, %L.preheader ]
+  %27 = add i64 %"#s5.0", 1
+  br i1 %26, label %L.9, label %L.2.preheader
+
+L.2.preheader:                                    ; preds = %L
+  br label %L.2
+
+L.2:                                              ; preds = %L.2.preheader, %L.7
+  %"#s4.0" = phi i64 [ %28, %L.7 ], [ 1, %L.2.preheader ]
+  %28 = add i64 %"#s4.0", 1
+  br i1 %26, label %L.7, label %L.4.preheader
+
+L.4.preheader:                                    ; preds = %L.2
+  br label %L.4
+
+L.4:                                              ; preds = %L.4.preheader, %L.4
+  %"#s3.0" = phi i64 [ %29, %L.4 ], [ 1, %L.4.preheader ]
+  %29 = add i64 %"#s3.0", 1
+  %30 = add i64 %"#s5.0", -1
+  %31 = add i64 %"#s4.0", -1
+  %32 = mul i64 %31, %22
+  %33 = add i64 %32, %30
+  %34 = getelementptr double, double* %19, i64 %33
+  %35 = load double, double* %34, align 8
+  %36 = add i64 %"#s3.0", -1
+  %37 = mul i64 %36, %8
+  %38 = add i64 %37, %30
+  %39 = getelementptr double, double* %5, i64 %38
+  %40 = load double, double* %39, align 8
+  %41 = mul i64 %36, %15
+  %42 = add i64 %41, %31
+  %43 = getelementptr double, double* %12, i64 %42
+  %44 = load double, double* %43, align 8
+  %45 = fmul double %40, %44
+  %46 = fadd double %35, %45
+  store double %46, double* %34, align 8
+  %47 = icmp eq i64 %29, %25
+  br i1 %47, label %L.7.loopexit, label %L.4
+
+L.7.loopexit:                                     ; preds = %L.4
+  br label %L.7
+
+L.7:                                              ; preds = %L.7.loopexit, %L.2
+  %48 = icmp eq i64 %28, %25
+  br i1 %48, label %L.9.loopexit, label %L.2
+
+L.9.loopexit:                                     ; preds = %L.7
+  br label %L.9
+
+L.9:                                              ; preds = %L.9.loopexit, %L
+  %49 = icmp eq i64 %27, %25
+  br i1 %49, label %L.11.loopexit, label %L
+
+L.11.loopexit:                                    ; preds = %L.9
+  br label %L.11
+
+L.11:                                             ; preds = %L.11.loopexit, %top.split
+  ret %jl_value_t* inttoptr (i64 140220477440016 to %jl_value_t*)
+}

Added: polly/trunk/test/ScopInfo/read-only-statements.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/read-only-statements.ll?rev=251948&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/read-only-statements.ll (added)
+++ polly/trunk/test/ScopInfo/read-only-statements.ll Tue Nov  3 10:54:49 2015
@@ -0,0 +1,76 @@
+; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
+;
+; Check we remove read only statements.
+;
+; CHECK:         Statements {
+; CHECK-NEXT:      Stmt_for_body_2
+; CHECK-NEXT:            Domain :=
+; CHECK-NEXT:                { Stmt_for_body_2[i0] : i0 <= 99 and i0 >= 0 };
+; CHECK-NEXT:            Schedule :=
+; CHECK-NEXT:                { Stmt_for_body_2[i0] -> [i0] };
+; CHECK-NEXT:            ReadAccess := [Reduction Type: +] [Scalar: 0]
+; CHECK-NEXT:                { Stmt_for_body_2[i0] -> MemRef_A[i0] };
+; CHECK-NEXT:            MustWriteAccess :=  [Reduction Type: +] [Scalar: 0]
+; CHECK-NEXT:                { Stmt_for_body_2[i0] -> MemRef_A[i0] };
+; CHECK-NEXT:    }
+;
+;    int g(int);
+;    void f(int *A) {
+;      for (int i = 0; i < 100; i++) {
+;        (A[i]);
+;        /* Split BB */
+;        (A[i]);
+;        /* Split BB */
+;        A[i] += 1;
+;        /* Split BB */
+;        (A[i]);
+;        /* Split BB */
+;        (A[i]);
+;      }
+;    }
+;
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+define void @f(i32* %A) {
+entry:
+  br label %for.cond
+
+for.cond:                                         ; preds = %for.inc, %entry
+  %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
+  %exitcond = icmp ne i64 %indvars.iv, 100
+  br i1 %exitcond, label %for.body, label %for.end
+
+for.body:                                         ; preds = %for.cond
+  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
+  %tmp = load i32, i32* %arrayidx, align 4
+  br label %for.body.1
+
+for.body.1:
+  %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
+  %tmp1 = load i32, i32* %arrayidx2, align 4
+  br label %for.body.2
+
+for.body.2:
+  %arrayidx5 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
+  %tmp2 = load i32, i32* %arrayidx5, align 4
+  %add = add nsw i32 %tmp2, 1
+  store i32 %add, i32* %arrayidx5, align 4
+  br label %for.body.3
+
+for.body.3:
+  %arrayidx7 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
+  %tmp3 = load i32, i32* %arrayidx7, align 4
+  br label %for.body.4
+
+for.body.4:
+  %arrayidx10 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
+  %tmp4 = load i32, i32* %arrayidx10, align 4
+  br label %for.inc
+
+for.inc:                                          ; preds = %for.body
+  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+  br label %for.cond
+
+for.end:                                          ; preds = %for.cond
+  ret void
+}

Modified: polly/trunk/test/ScopInfo/variant_base_pointer.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/variant_base_pointer.ll?rev=251948&r1=251947&r2=251948&view=diff
==============================================================================
--- polly/trunk/test/ScopInfo/variant_base_pointer.ll (original)
+++ polly/trunk/test/ScopInfo/variant_base_pointer.ll Tue Nov  3 10:54:49 2015
@@ -16,6 +16,7 @@ if.end:
   %tmp = load i16*, i16** %call, align 8
   %arrayidx = getelementptr inbounds i16, i16* %tmp, i64 0
   %tmp1 = load i16, i16* %arrayidx, align 2
+  store i16 3, i16 *%arrayidx, align 2
   br i1 false, label %if.then.2, label %if.end.3
 
 if.then.2:                                        ; preds = %if.end




More information about the llvm-commits mailing list