From 826b2af11237190bee053e3862ad2f1ef3c2136a Mon Sep 17 00:00:00 2001 From: Tobias Grosser Date: Thu, 21 Mar 2013 16:14:50 +0000 Subject: [PATCH] Remove last uses of canoncial induction variable when scev code generating We now detect scops without a canonical induction variable and can generate a polyhedral representation for them. There was no modification necessary to code generate these scops. llvm-svn: 177643 --- polly/lib/Analysis/ScopDetection.cpp | 13 ++++--- polly/lib/Analysis/ScopInfo.cpp | 4 +- polly/test/ScopDetect/base_pointer_in_scop.ll | 1 + .../test/ScopDetect/invalidate_scalar_evolution.ll | 45 ++++++++++++++++++++++ polly/test/ScopDetect/simple_loop.ll | 1 + .../ScopDetect/simple_loop_non_single_entry.ll | 2 + .../test/ScopDetect/simple_loop_non_single_exit.ll | 2 + .../ScopDetect/simple_loop_non_single_exit_2.ll | 2 + polly/test/ScopDetect/simple_loop_two_phi_nodes.ll | 2 + polly/test/ScopDetect/simple_loop_with_param_2.ll | 1 + .../covariance/covariance_without_param.ll | 4 +- .../linear-algebra/solvers/lu/lu_with_param.ll | 4 +- 12 files changed, 68 insertions(+), 13 deletions(-) create mode 100644 polly/test/ScopDetect/invalidate_scalar_evolution.ll diff --git a/polly/lib/Analysis/ScopDetection.cpp b/polly/lib/Analysis/ScopDetection.cpp index a35f03c..e5704c6 100644 --- a/polly/lib/Analysis/ScopDetection.cpp +++ b/polly/lib/Analysis/ScopDetection.cpp @@ -392,11 +392,14 @@ bool ScopDetection::isValidBasicBlock(BasicBlock &BB, } bool ScopDetection::isValidLoop(Loop *L, DetectionContext &Context) const { - PHINode *IndVar = L->getCanonicalInductionVariable(); - // No canonical induction variable. - if (!IndVar) - INVALID(IndVar, "No canonical IV at loop header: " - << L->getHeader()->getName()); + if (!SCEVCodegen) { + // If code generation is not in scev based mode, we need to ensure that + // each loop has a canonical induction variable. + PHINode *IndVar = L->getCanonicalInductionVariable(); + if (!IndVar) + INVALID(IndVar, + "No canonical IV at loop header: " << L->getHeader()->getName()); + } // Is the loop count affine? const SCEV *LoopCount = SE->getBackedgeTakenCount(L); diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index e51c18b..0d8cda6 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -592,8 +592,8 @@ ScopStmt::ScopStmt(Scop &parent, TempScop &tempScop, const Region &CurRegion, // Setup the induction variables. for (unsigned i = 0, e = Nest.size(); i < e; ++i) { PHINode *PN = Nest[i]->getCanonicalInductionVariable(); - assert(PN && "Non canonical IV in Scop!"); - IVS[i] = PN; + if (PN) + IVS[i] = PN; NestLoops[i] = Nest[i]; } diff --git a/polly/test/ScopDetect/base_pointer_in_scop.ll b/polly/test/ScopDetect/base_pointer_in_scop.ll index 9628559..5faebdd 100644 --- a/polly/test/ScopDetect/base_pointer_in_scop.ll +++ b/polly/test/ScopDetect/base_pointer_in_scop.ll @@ -1,4 +1,5 @@ ; RUN: opt %loadPolly -polly-detect -analyze < %s | FileCheck %s +; RUN: opt %loadPolly -polly-detect -polly-codegen-scev -analyze < %s | FileCheck %s ; void f(long **A_ptr, long N) { ; long i; diff --git a/polly/test/ScopDetect/invalidate_scalar_evolution.ll b/polly/test/ScopDetect/invalidate_scalar_evolution.ll new file mode 100644 index 0000000..4e3ebcd --- /dev/null +++ b/polly/test/ScopDetect/invalidate_scalar_evolution.ll @@ -0,0 +1,45 @@ +; RUN: opt %loadPolly -polly-detect -analyze < %s | FileCheck %s +; RUN: opt %loadPolly -polly-detect -analyze -polly-codegen-scev < %s | FileCheck %s -check-prefix=CHECK-SCEV + +; void f(long A[], long N) { +; long i; +; for (i = 0; i < N; ++i) +; A[i] = i; +; } + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" +target triple = "x86_64-unknown-linux-gnu" + +define void @f(i64* %A, i64 %N, i64 %p) nounwind { +entry: + fence seq_cst + br label %pre + +pre: + %p_tmp = srem i64 %p, 5 + br i1 true, label %for.i, label %then + +for.i: + %indvar = phi i64 [ 0, %pre ], [ %indvar.next, %for.i ] + %indvar.p1 = phi i64 [ 0, %pre ], [ %indvar.p1.next, %for.i ] + %indvar.p2 = phi i64 [ 0, %pre ], [ %indvar.p2.next, %for.i ] + %sum = add i64 %indvar, %indvar.p1 + %sum2 = sub i64 %sum, %indvar.p2 + %scevgep = getelementptr i64* %A, i64 %indvar + store i64 %indvar, i64* %scevgep + %indvar.next = add nsw i64 %indvar, 1 + %indvar.p1.next = add nsw i64 %indvar.p1, %p_tmp + %indvar.p2.next = add nsw i64 %indvar.p2, %p_tmp + %exitcond = icmp eq i64 %sum2, %N + br i1 %exitcond, label %then, label %for.i + +then: + br label %return + +return: + fence seq_cst + ret void +} + +; CHECK-NOT: Valid Region for Scop +; CHECK-SCEV: Valid Region for Scop: for.i => then diff --git a/polly/test/ScopDetect/simple_loop.ll b/polly/test/ScopDetect/simple_loop.ll index bcb096d..7485b5f 100644 --- a/polly/test/ScopDetect/simple_loop.ll +++ b/polly/test/ScopDetect/simple_loop.ll @@ -1,4 +1,5 @@ ; RUN: opt %loadPolly -polly-detect -analyze < %s | FileCheck %s +; RUN: opt %loadPolly -polly-detect -polly-codegen-scev -analyze < %s | FileCheck %s ; void f(long A[], long N) { ; long i; diff --git a/polly/test/ScopDetect/simple_loop_non_single_entry.ll b/polly/test/ScopDetect/simple_loop_non_single_entry.ll index a5c0d28..fa3acaa 100644 --- a/polly/test/ScopDetect/simple_loop_non_single_entry.ll +++ b/polly/test/ScopDetect/simple_loop_non_single_entry.ll @@ -1,5 +1,7 @@ ; RUN: opt %loadPolly -polly-detect -analyze < %s | FileCheck %s ; RUN: opt %loadPolly -polly-region-simplify -polly-detect -analyze < %s | FileCheck %s -check-prefix=CHECK-SIMPLIFY +; RUN: opt %loadPolly -polly-detect -polly-codegen-scev -analyze < %s | FileCheck %s +; RUN: opt %loadPolly -polly-region-simplify -polly-detect -polly-codegen-scev -analyze < %s | FileCheck %s -check-prefix=CHECK-SIMPLIFY ; void f(long A[], long N) { ; long i; diff --git a/polly/test/ScopDetect/simple_loop_non_single_exit.ll b/polly/test/ScopDetect/simple_loop_non_single_exit.ll index 1a1129b..7138fdd 100644 --- a/polly/test/ScopDetect/simple_loop_non_single_exit.ll +++ b/polly/test/ScopDetect/simple_loop_non_single_exit.ll @@ -1,5 +1,7 @@ ; RUN: opt %loadPolly -polly-detect -analyze < %s | FileCheck %s ; RUN: opt %loadPolly -polly-region-simplify -polly-detect -analyze < %s | FileCheck %s -check-prefix=CHECK-SIMPLIFY +; RUN: opt %loadPolly -polly-detect -polly-codegen-scev -analyze < %s | FileCheck %s +; RUN: opt %loadPolly -polly-region-simplify -polly-detect -polly-codegen-scev -analyze < %s | FileCheck %s -check-prefix=CHECK-SIMPLIFY ; void f(long A[], long N) { ; long i; diff --git a/polly/test/ScopDetect/simple_loop_non_single_exit_2.ll b/polly/test/ScopDetect/simple_loop_non_single_exit_2.ll index ea2ba12..d88d9eb 100644 --- a/polly/test/ScopDetect/simple_loop_non_single_exit_2.ll +++ b/polly/test/ScopDetect/simple_loop_non_single_exit_2.ll @@ -1,5 +1,7 @@ ; RUN: opt %loadPolly -polly-detect -analyze < %s | FileCheck %s ; RUN: opt %loadPolly -polly-region-simplify -polly-detect -analyze < %s | FileCheck %s -check-prefix=CHECK-SIMPLIFY +; RUN: opt %loadPolly -polly-detect -polly-codegen-scev -analyze < %s | FileCheck %s +; RUN: opt %loadPolly -polly-region-simplify -polly-detect -polly-codegen-scev -analyze < %s | FileCheck %s -check-prefix=CHECK-SIMPLIFY ; void f(long A[], long N) { ; long i; diff --git a/polly/test/ScopDetect/simple_loop_two_phi_nodes.ll b/polly/test/ScopDetect/simple_loop_two_phi_nodes.ll index fbffcd7..e7396b2 100644 --- a/polly/test/ScopDetect/simple_loop_two_phi_nodes.ll +++ b/polly/test/ScopDetect/simple_loop_two_phi_nodes.ll @@ -1,4 +1,5 @@ ; RUN: opt %loadPolly -polly-detect -analyze < %s | FileCheck %s +; RUN: opt %loadPolly -polly-detect -polly-codegen-scev -analyze < %s | FileCheck %s -check-prefix=CHECK-SCEV ; void f(long A[], long N) { ; long i; @@ -32,3 +33,4 @@ return: } ; CHECK-NOT: Valid Region for Scop +; CHECK-SCEV: Valid Region for Scop: for.i => return diff --git a/polly/test/ScopDetect/simple_loop_with_param_2.ll b/polly/test/ScopDetect/simple_loop_with_param_2.ll index fa85556..5c2890d 100644 --- a/polly/test/ScopDetect/simple_loop_with_param_2.ll +++ b/polly/test/ScopDetect/simple_loop_with_param_2.ll @@ -1,4 +1,5 @@ ; RUN: opt %loadPolly -basicaa -polly-detect -analyze < %s | FileCheck %s +; RUN: opt %loadPolly -basicaa -polly-detect -polly-codegen-scev -analyze < %s | FileCheck %s ; void f(long A[], int N, int *init_ptr) { ; long i, j; diff --git a/polly/test/polybench/datamining/covariance/covariance_without_param.ll b/polly/test/polybench/datamining/covariance/covariance_without_param.ll index d387552..4eb60ca 100644 --- a/polly/test/polybench/datamining/covariance/covariance_without_param.ll +++ b/polly/test/polybench/datamining/covariance/covariance_without_param.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadPolly %defaultOpts -polly-detect -polly-ast -analyze %s | FileCheck %s -; region-simplify make polly fail to detect the canonical induction variable. -; XFAIL:* +; RUN: opt %loadPolly %defaultOpts -polly-detect -polly-ast -polly-codegen-scev -analyze %s | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-unknown-linux-gnu" diff --git a/polly/test/polybench/linear-algebra/solvers/lu/lu_with_param.ll b/polly/test/polybench/linear-algebra/solvers/lu/lu_with_param.ll index 81c9ee9..7034d27 100644 --- a/polly/test/polybench/linear-algebra/solvers/lu/lu_with_param.ll +++ b/polly/test/polybench/linear-algebra/solvers/lu/lu_with_param.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadPolly %defaultOpts -polly-detect -analyze %s | FileCheck %s -; region-simplify make polly fail to detect the canonical induction variable. -; XFAIL:* +; RUN: opt %loadPolly %defaultOpts -polly-detect -polly-codegen-scev -analyze %s | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-unknown-linux-gnu" -- 2.7.4