[FIX] Do not create two SAI objects for exit PHIs
authorJohannes Doerfert <doerfert@cs.uni-saarland.de>
Sun, 3 Apr 2016 11:16:00 +0000 (11:16 +0000)
committerJohannes Doerfert <doerfert@cs.uni-saarland.de>
Sun, 3 Apr 2016 11:16:00 +0000 (11:16 +0000)
  If an exit PHI is written and also read in the SCoP we should not create two
  SAI objects but only one. As the read is only modeled to ensure OpenMP code
  generation knows about it we can simply use the EXIT_PHI MemoryKind for both
  accesses.

llvm-svn: 265261

polly/lib/Analysis/ScopInfo.cpp
polly/test/ScopInfo/exit-phi-1.ll [new file with mode: 0644]

index f3271c2..7edc149 100644 (file)
@@ -4334,9 +4334,13 @@ void ScopInfo::ensureValueRead(Value *V, BasicBlock *UserBB) {
   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 *>(),
-                  ScopArrayInfo::MK_Value);
+                  ArrayRef<const SCEV *>(), ArrayRef<const SCEV *>(), Kind);
   if (ValueInst)
     ensureValueWrite(ValueInst);
 }
diff --git a/polly/test/ScopInfo/exit-phi-1.ll b/polly/test/ScopInfo/exit-phi-1.ll
new file mode 100644 (file)
index 0000000..27a8334
--- /dev/null
@@ -0,0 +1,39 @@
+; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-codegen -disable-output < %s
+;
+; Verify we only create one SAI object for up.3.ph as it is outside the SCoP.
+;
+; CHECK: Region: %for.body
+;
+; CHECK:         Arrays {
+; CHECK-NEXT:        i32* MemRef_A[*]; // Element size 8
+; CHECK-NEXT:        double MemRef_up_3_ph; // Element size 8
+; CHECK-NEXT:    }
+;
+; ModuleID = 'bugpoint-reduced-simplified.bc'
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+; Function Attrs: uwtable
+define void @_ZN6soplex14SPxAggregateSM9eliminateERKNS_7SVectorEd(i32** nocapture readonly %A) {
+entry:
+  br label %for.cond.outer304
+
+for.cond.outer304:                                ; preds = %if.else113, %if.then111, %entry
+  %up.3.ph = phi double [ 0.000000e+00, %entry ], [ undef, %if.else113 ], [ undef, %if.then111 ]
+  br i1 undef, label %for.body, label %for.end
+
+for.body:                                         ; preds = %for.cond.outer304
+  %0 = load i32*, i32** %A, align 8
+  %add = fadd double %up.3.ph, undef
+  %val.i.i.i235 = getelementptr inbounds i32, i32* %0, i64 0
+  br i1 false, label %if.else113, label %if.then111
+
+if.then111:                                       ; preds = %for.body
+  br label %for.cond.outer304
+
+if.else113:                                       ; preds = %for.body
+  br label %for.cond.outer304
+
+for.end:                                          ; preds = %for.cond.outer304
+  ret void
+}