Independent blocks: SE->forget() scalars translated to arrays
authorTobias Grosser <tobias@grosser.es>
Sun, 16 Nov 2014 20:33:58 +0000 (20:33 +0000)
committerTobias Grosser <tobias@grosser.es>
Sun, 16 Nov 2014 20:33:58 +0000 (20:33 +0000)
This prevents SCEVs to reference values not valid any more and as a consequence
solves a bug where such values reintroduced during ast generation caused the
independent blocks pass to fail validation.

http://llvm.org/PR21204

llvm-svn: 222103

polly/lib/Transform/IndependentBlocks.cpp
polly/test/Isl/CodeGen/two-scops-in-row.ll [new file with mode: 0644]

index 1894f45..8514143 100644 (file)
@@ -425,6 +425,7 @@ bool IndependentBlocks::translateScalarToArray(Instruction *Inst,
     U->replaceUsesOfWith(Inst, L);
   }
 
+  SE->forgetValue(Inst);
   return true;
 }
 
diff --git a/polly/test/Isl/CodeGen/two-scops-in-row.ll b/polly/test/Isl/CodeGen/two-scops-in-row.ll
new file mode 100644 (file)
index 0000000..043fe5a
--- /dev/null
@@ -0,0 +1,41 @@
+; RUN: opt %loadPolly -polly-ast -analyze -polly-codegen-scev -polly-ignore-aliasing < %s | FileCheck %s 
+; RUN: opt %loadPolly -polly-codegen-isl -polly-codegen-scev -polly-ignore-aliasing < %s
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+; CHECK: if (1)
+; CHECK:     {
+; CHECK:       for (int c1 = 0; c1 <= -Scalar0.val.loadoutside + 99; c1 += 1)
+; CHECK:         Stmt_for_1(c1);
+; CHECK:       if (Scalar0.val.loadoutside >= 100)
+; CHECK:         Stmt_for_1(0);
+; CHECK:     }
+
+; CHECK: if (1)
+; CHECK:     Stmt_for_0(0);
+
+
+define void @foo(i32* %A) {
+entry:
+  %Scalar0 = alloca i32
+  br label %for.0
+
+for.0:
+  %Scalar0.val = load i32* %Scalar0
+  br i1 false, label %for.0, label %for.1.preheader
+
+for.1.preheader:
+  fence seq_cst
+  br label %for.1
+
+for.1:
+  %indvar.1 = phi i32 [ %Scalar0.val, %for.1.preheader ], [ %indvar.1.next, %for.1]
+  %arrayidx.1 = getelementptr inbounds i32* %A, i32 %indvar.1
+  store i32 1, i32* %arrayidx.1
+  %indvar.1.next = add nsw i32 %indvar.1, 1
+  %cmp.1 = icmp slt i32 %indvar.1.next, 100
+  br i1 %cmp.1, label %for.1, label %end
+
+end:
+  ret void
+}