From b41344a88f29a59574cd0efc4d424918b496be9f Mon Sep 17 00:00:00 2001 From: Johannes Doerfert Date: Fri, 1 Aug 2014 08:20:26 +0000 Subject: [PATCH] [Fix] Annotate the IslAst with broken reductions (Missing files) + test cases of r214489. llvm-svn: 214491 --- .../reduction_clauses_multidimensional_access.ll | 68 ++++++++++++++++++++++ .../Ast/reduction_clauses_onedimensional_access.ll | 50 ++++++++++++++++ .../Ast/reduction_different_reduction_clauses.ll | 55 +++++++++++++++++ 3 files changed, 173 insertions(+) create mode 100644 polly/test/Isl/Ast/reduction_clauses_multidimensional_access.ll create mode 100644 polly/test/Isl/Ast/reduction_clauses_onedimensional_access.ll create mode 100644 polly/test/Isl/Ast/reduction_different_reduction_clauses.ll diff --git a/polly/test/Isl/Ast/reduction_clauses_multidimensional_access.ll b/polly/test/Isl/Ast/reduction_clauses_multidimensional_access.ll new file mode 100644 index 0000000..dba85cd --- /dev/null +++ b/polly/test/Isl/Ast/reduction_clauses_multidimensional_access.ll @@ -0,0 +1,68 @@ +; RUN: opt %loadPolly -polly-delinearize -polly-ast -polly-ast-detect-parallel -analyze < %s | FileCheck %s +; +; CHECK: #pragma omp parallel for reduction (^ : sum) +; void f(int N, int M, int P, int sum[P][M]) { +; for (int i = 0; i < N; i++) +; for (int j = 0; j < P; j++) +; CHECK: #pragma simd +; for (int k = 0; k < M; k++) +; sum[j][k] ^= j; +; } +; +target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64" + +define void @f(i32 %N, i32 %M, i32 %P, i32* %sum) { +entry: + br label %for.cond + +for.cond: ; preds = %for.inc11, %entry + %i.0 = phi i32 [ 0, %entry ], [ %inc12, %for.inc11 ] + %cmp = icmp slt i32 %i.0, %N + br i1 %cmp, label %for.body, label %for.end13 + +for.body: ; preds = %for.cond + br label %for.cond1 + +for.cond1: ; preds = %for.inc8, %for.body + %j.0 = phi i32 [ 0, %for.body ], [ %inc9, %for.inc8 ] + %cmp2 = icmp slt i32 %j.0, %P + br i1 %cmp2, label %for.body3, label %for.end10 + +for.body3: ; preds = %for.cond1 + br label %for.cond4 + +for.cond4: ; preds = %for.inc, %for.body3 + %k.0 = phi i32 [ 0, %for.body3 ], [ %inc, %for.inc ] + %cmp5 = icmp slt i32 %k.0, %M + br i1 %cmp5, label %for.body6, label %for.end + +for.body6: ; preds = %for.cond4 + %tmp = mul nsw i32 %j.0, %M + %arrayidx.sum = add i32 %tmp, %k.0 + %arrayidx7 = getelementptr inbounds i32* %sum, i32 %arrayidx.sum + %tmp1 = load i32* %arrayidx7, align 4 + %xor = xor i32 %tmp1, %j.0 + store i32 %xor, i32* %arrayidx7, align 4 + br label %for.inc + +for.inc: ; preds = %for.body6 + %inc = add nsw i32 %k.0, 1 + br label %for.cond4 + +for.end: ; preds = %for.cond4 + br label %for.inc8 + +for.inc8: ; preds = %for.end + %inc9 = add nsw i32 %j.0, 1 + br label %for.cond1 + +for.end10: ; preds = %for.cond1 + br label %for.inc11 + +for.inc11: ; preds = %for.end10 + %inc12 = add nsw i32 %i.0, 1 + br label %for.cond + +for.end13: ; preds = %for.cond + ret void +} diff --git a/polly/test/Isl/Ast/reduction_clauses_onedimensional_access.ll b/polly/test/Isl/Ast/reduction_clauses_onedimensional_access.ll new file mode 100644 index 0000000..1e0f654 --- /dev/null +++ b/polly/test/Isl/Ast/reduction_clauses_onedimensional_access.ll @@ -0,0 +1,50 @@ +; RUN: opt %loadPolly -polly-ast -polly-ast-detect-parallel -analyze < %s | FileCheck %s +; +; CHECK: #pragma omp parallel for reduction (^ : sum) +; void f(int N, int M, int *sum) { +; for (int i = 0; i < N; i++) +; CHECK: #pragma simd +; for (int j = 0; j < M; j++) +; sum[j] ^= j; +; } +; +target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64" + +define void @f(i32 %N, i32 %M, i32* %sum) { +entry: + br label %for.cond + +for.cond: ; preds = %for.inc4, %entry + %i.0 = phi i32 [ 0, %entry ], [ %inc5, %for.inc4 ] + %cmp = icmp slt i32 %i.0, %N + br i1 %cmp, label %for.body, label %for.end6 + +for.body: ; preds = %for.cond + br label %for.cond1 + +for.cond1: ; preds = %for.inc, %for.body + %j.0 = phi i32 [ 0, %for.body ], [ %inc, %for.inc ] + %cmp2 = icmp slt i32 %j.0, %M + br i1 %cmp2, label %for.body3, label %for.end + +for.body3: ; preds = %for.cond1 + %arrayidx = getelementptr inbounds i32* %sum, i32 %j.0 + %tmp = load i32* %arrayidx, align 4 + %xor = xor i32 %tmp, %j.0 + store i32 %xor, i32* %arrayidx, align 4 + br label %for.inc + +for.inc: ; preds = %for.body3 + %inc = add nsw i32 %j.0, 1 + br label %for.cond1 + +for.end: ; preds = %for.cond1 + br label %for.inc4 + +for.inc4: ; preds = %for.end + %inc5 = add nsw i32 %i.0, 1 + br label %for.cond + +for.end6: ; preds = %for.cond + ret void +} diff --git a/polly/test/Isl/Ast/reduction_different_reduction_clauses.ll b/polly/test/Isl/Ast/reduction_different_reduction_clauses.ll new file mode 100644 index 0000000..b2272d3 --- /dev/null +++ b/polly/test/Isl/Ast/reduction_different_reduction_clauses.ll @@ -0,0 +1,55 @@ +; RUN: opt %loadPolly -basicaa -polly-ast -polly-ast-detect-parallel -analyze < %s | FileCheck %s +; +; CHECK: #pragma simd reduction (+ : sum{{[1,2]}}, sum{{[1,2]}}) reduction (* : prod) reduction (| : or) reduction (& : and) +; CHECK: #pragma omp parallel for reduction (+ : sum{{[1,2]}}, sum{{[1,2]}}) reduction (* : prod) reduction (| : or) reduction (& : and) +; CHECK: for (int c1 = 0; c1 < N; c1 += 1) +; CHECK: Stmt_for_body(c1); +; +; void f(int N, int *restrict sum1, int *restrict sum2, int *restrict prod, +; int *restrict and, int *restrict or ) { +; for (int i = 0; i < N; i++) { +; *sum1 += i; +; *sum2 += i + 1; +; *prod *= i; +; *and &= i; +; * or |= i; +; } +; } +; +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +define void @f(i32 %N, i32* noalias %sum1, i32* noalias %sum2, i32* noalias %prod, i32* noalias %and, i32* noalias %or) { +entry: + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ] + %cmp = icmp slt i32 %i.0, %N + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %tmp = load i32* %sum1, align 4 + %add = add nsw i32 %tmp, %i.0 + store i32 %add, i32* %sum1, align 4 + %add1 = add nsw i32 %i.0, 1 + %tmp1 = load i32* %sum2, align 4 + %add2 = add nsw i32 %tmp1, %add1 + store i32 %add2, i32* %sum2, align 4 + %tmp2 = load i32* %prod, align 4 + %mul = mul nsw i32 %tmp2, %i.0 + store i32 %mul, i32* %prod, align 4 + %tmp3 = load i32* %and, align 4 + %and3 = and i32 %tmp3, %i.0 + store i32 %and3, i32* %and, align 4 + %tmp4 = load i32* %or, align 4 + %or4 = or i32 %tmp4, %i.0 + store i32 %or4, i32* %or, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %inc = add nsw i32 %i.0, 1 + br label %for.cond + +for.end: ; preds = %for.cond + ret void +} -- 2.7.4