[polly] r284023 - [ScopInfo/CodeGen] ExitPHI reads are implicit.

Michael Kruse via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 12 09:31:10 PDT 2016


Author: meinersbur
Date: Wed Oct 12 11:31:09 2016
New Revision: 284023

URL: http://llvm.org/viewvc/llvm-project?rev=284023&view=rev
Log:
[ScopInfo/CodeGen] ExitPHI reads are implicit.

Under some conditions MK_Value read accessed where converted to MK_ExitPHI read
accessed. This is unexpected because MK_ExitPHI read accesses are implicit after
the scop execution. This behaviour was introduced in r265261, which fixed a
failed assertion/crash in CodeGen.

Instead, we fix this failure in CodeGen itself. createExitPHINodeMerges(),
despite its name, also handles accesses of kind MK_Value, only to skip them
because they access values that are usually not PHI nodes in the SCoP region's
exit block. Except in the situation observed in r265261.

Do not convert value accessed to ExitPHI accesses and do not handle
value accesses like ExitPHI accessed in CodeGen anymore.

Added:
    polly/trunk/test/ScopInfo/exit-phi-2.ll
Modified:
    polly/trunk/lib/Analysis/ScopBuilder.cpp
    polly/trunk/lib/CodeGen/BlockGenerators.cpp
    polly/trunk/test/ScopInfo/exit-phi-1.ll

Modified: polly/trunk/lib/Analysis/ScopBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopBuilder.cpp?rev=284023&r1=284022&r2=284023&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopBuilder.cpp (original)
+++ polly/trunk/lib/Analysis/ScopBuilder.cpp Wed Oct 12 11:31:09 2016
@@ -590,13 +590,9 @@ void ScopBuilder::ensureValueRead(Value
   if (UserStmt->lookupValueReadOf(V))
     return;
 
-  // For exit PHIs use the MK_ExitPHI MemoryKind not MK_Value.
-  ScopArrayInfo::MemoryKind Kind = ScopArrayInfo::MK_Value;
-  if (!ValueStmt && isa<PHINode>(V))
-    Kind = ScopArrayInfo::MK_ExitPHI;
-
   addMemoryAccess(UserBB, nullptr, MemoryAccess::READ, V, V->getType(), true, V,
-                  ArrayRef<const SCEV *>(), ArrayRef<const SCEV *>(), Kind);
+                  ArrayRef<const SCEV *>(), ArrayRef<const SCEV *>(),
+                  ScopArrayInfo::MK_Value);
   if (ValueInst)
     ensureValueWrite(ValueInst);
 }

Modified: polly/trunk/lib/CodeGen/BlockGenerators.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/BlockGenerators.cpp?rev=284023&r1=284022&r2=284023&view=diff
==============================================================================
--- polly/trunk/lib/CodeGen/BlockGenerators.cpp (original)
+++ polly/trunk/lib/CodeGen/BlockGenerators.cpp Wed Oct 12 11:31:09 2016
@@ -670,7 +670,7 @@ void BlockGenerator::createExitPHINodeMe
     // the original PHI's value or the reloaded incoming values from the
     // generated code. An llvm::Value is merged between the original code's
     // value or the generated one.
-    if (!SAI->isValueKind() && !SAI->isExitPHIKind())
+    if (!SAI->isExitPHIKind())
       continue;
 
     PHINode *PHI = dyn_cast<PHINode>(Val);

Modified: polly/trunk/test/ScopInfo/exit-phi-1.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/exit-phi-1.ll?rev=284023&r1=284022&r2=284023&view=diff
==============================================================================
--- polly/trunk/test/ScopInfo/exit-phi-1.ll (original)
+++ polly/trunk/test/ScopInfo/exit-phi-1.ll Wed Oct 12 11:31:09 2016
@@ -1,15 +1,31 @@
 ; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
-; RUN: opt %loadPolly -polly-codegen -disable-output < %s
+; RUN: opt %loadPolly -polly-codegen -S < %s | FileCheck %s --check-prefix=CODEGEN
 ;
-; Verify we only create one SAI object for up.3.ph as it is outside the SCoP.
+; Check for correct code generation of exit PHIs, even if the same PHI value
+; is used again inside the the SCoP.
+; Note that if.else113 is removed from the SCoP because it is never executed.
 ;
 ; CHECK: Region: %for.body
 ;
 ; CHECK:         Arrays {
 ; CHECK-NEXT:        double MemRef_up_3_ph; // Element size 8
 ; CHECK-NEXT:        i32* MemRef_A[*]; // Element size 8
+; CHECK-NEXT:        double MemRef_up_3_ph; // Element size 8
 ; CHECK-NEXT:    }
 ;
+; CODEGEN:      polly.merge_new_and_old:
+; CODEGEN-NEXT:   %up.3.ph.ph.merge = phi double [ %up.3.ph.ph.final_reload, %polly.exiting ], [ undef, %for.cond.outer304.region_exiting ]
+;
+; CODEGEN:      for.cond.outer304:
+; CODEGEN-NEXT:   %indvar = phi i64 [ %indvar.next, %polly.merge_new_and_old ], [ 0, %entry ]
+; CODEGEN-NEXT:   %up.3.ph = phi double [ 0.000000e+00, %entry ], [ %up.3.ph.ph.merge, %polly.merge_new_and_old ]
+;
+; CODEGEN:      polly.stmt.if.then111:
+; CODEGEN-NEXT:   store double undef, double* %up.3.ph.s2a
+;
+; CODEGEN:      polly.exiting:
+; CODEGEN-NEXT:   %up.3.ph.ph.final_reload = load double, double* %up.3.ph.s2a
+;
 ; ModuleID = 'bugpoint-reduced-simplified.bc'
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 

Added: polly/trunk/test/ScopInfo/exit-phi-2.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/exit-phi-2.ll?rev=284023&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/exit-phi-2.ll (added)
+++ polly/trunk/test/ScopInfo/exit-phi-2.ll Wed Oct 12 11:31:09 2016
@@ -0,0 +1,42 @@
+; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
+;
+; Check that there is no MK_ExitPHI READ access.
+;
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+define void @local_book_besterror() {
+entry:
+  %0 = load i64, i64* undef, align 8
+  %conv = trunc i64 %0 to i32
+  br label %for.body64
+
+for.body64:
+  %bestf.011 = phi float [ 0.000000e+00, %entry ], [ %this.0.bestf.0, %if.end92 ]
+  br label %for.body74
+
+for.body74:
+  br i1 false, label %for.body74, label %for.cond71.for.end85_crit_edge
+
+for.cond71.for.end85_crit_edge:
+  %cmp88 = fcmp olt float undef, %bestf.011
+  %this.0.bestf.0 = select i1 undef, float undef, float %bestf.011
+  br label %if.end92
+
+if.end92:
+  br i1 undef, label %for.body64, label %for.cond60.if.end96.loopexit_crit_edge
+
+for.cond60.if.end96.loopexit_crit_edge:           ; preds = %if.end92
+  ret void
+}
+
+; CHECK:      Statements {
+; CHECK-NEXT:     Stmt_for_cond71_for_end85_crit_edge
+; CHECK-NEXT:         Domain :=
+; CHECK-NEXT:             { Stmt_for_cond71_for_end85_crit_edge[] };
+; CHECK-NEXT:         Schedule :=
+; CHECK-NEXT:             { Stmt_for_cond71_for_end85_crit_edge[] -> [] };
+; CHECK-NEXT:         ReadAccess :=    [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT:             { Stmt_for_cond71_for_end85_crit_edge[] -> MemRef_bestf_011[] };
+; CHECK-NEXT:         MustWriteAccess :=    [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT:             { Stmt_for_cond71_for_end85_crit_edge[] -> MemRef_this_0_bestf_0[] };
+; CHECK-NEXT: }




More information about the llvm-commits mailing list