From 2f8732e7c6e2dd87b759923320e90508c88f3f10 Mon Sep 17 00:00:00 2001 From: Tobias Grosser Date: Sun, 16 Nov 2014 20:33:58 +0000 Subject: [PATCH] Independent blocks: SE->forget() scalars translated to arrays 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 | 1 + polly/test/Isl/CodeGen/two-scops-in-row.ll | 41 ++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 polly/test/Isl/CodeGen/two-scops-in-row.ll diff --git a/polly/lib/Transform/IndependentBlocks.cpp b/polly/lib/Transform/IndependentBlocks.cpp index 1894f45..8514143 100644 --- a/polly/lib/Transform/IndependentBlocks.cpp +++ b/polly/lib/Transform/IndependentBlocks.cpp @@ -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 index 0000000..043fe5a --- /dev/null +++ b/polly/test/Isl/CodeGen/two-scops-in-row.ll @@ -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 +} -- 2.7.4