From c92c8f06ec0dcee0bf6cc035bcd3eba34d15cb44 Mon Sep 17 00:00:00 2001 From: Tobias Grosser Date: Mon, 11 Feb 2013 17:52:36 +0000 Subject: [PATCH] [isl-codegen]: Fix off by one in getNumberOfIterations We need to remove one dimension. Any is correct as long as it exists. We have choosen for whatever reason the dimension #dims - 2. This is incorrect if there is just one dimension. For CLooG this case did never happen. For isl however, the case can happen and causes undefined behavior including crashes. We choose now always the last dimension #dims - 1. We could have choosen dimension '0' but the last dimension is what we remove conceptionally in the algorithm, so it seems better to actually program it that way. While at it remove another piece of undefined behavior. llvm-svn: 174894 --- polly/include/polly/CodeGen/CodeGeneration.h | 6 +++-- .../Isl/CodeGen/20130211-getNumberOfIterations.ll | 29 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 polly/test/Isl/CodeGen/20130211-getNumberOfIterations.ll diff --git a/polly/include/polly/CodeGen/CodeGeneration.h b/polly/include/polly/CodeGen/CodeGeneration.h index 8dcc3af..55543d6 100644 --- a/polly/include/polly/CodeGen/CodeGeneration.h +++ b/polly/include/polly/CodeGen/CodeGeneration.h @@ -34,13 +34,15 @@ namespace polly { // and output dimension not related. // [i0, i1, i2, i3] -> [i0, i1, i2, o0] isl_space *Space = isl_set_get_space(Domain); - Space = isl_space_drop_outputs(Space, Dim - 2, 1); + Space = isl_space_drop_outputs(Space, Dim - 1, 1); Space = isl_space_map_from_set(Space); isl_map *Identity = isl_map_identity(Space); Identity = isl_map_add_dims(Identity, isl_dim_in, 1); Identity = isl_map_add_dims(Identity, isl_dim_out, 1); - isl_map *Map = isl_map_from_domain_and_range(isl_set_copy(Domain), Domain); + isl_map *Map = isl_map_from_domain_and_range(isl_set_copy(Domain), + isl_set_copy(Domain)); + isl_set_free(Domain); Map = isl_map_intersect(Map, Identity); isl_map *LexMax = isl_map_lexmax(isl_map_copy(Map)); diff --git a/polly/test/Isl/CodeGen/20130211-getNumberOfIterations.ll b/polly/test/Isl/CodeGen/20130211-getNumberOfIterations.ll new file mode 100644 index 0000000..ce2a984 --- /dev/null +++ b/polly/test/Isl/CodeGen/20130211-getNumberOfIterations.ll @@ -0,0 +1,29 @@ +; RUN: opt %loadPolly -polly-codegen-isl -polly-vectorizer=polly < %s +; RUN: opt %loadPolly -polly-codegen-isl -polly-vectorizer=bb < %s + +; This test case checks that the polly vectorizer does not crash when +; calculating the number of iterations. +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-S128" +target triple = "x86_64-unknown-linux-gnu" + +@b = external global [2048 x i64], align 16 + +define void @foo(i64 %n) { +entry: + br label %for.cond + +for.cond: ; preds = %for.body, %entry + %indvar = phi i64 [ 0, %entry ], [ %inc, %for.body ] + %cmp = icmp slt i64 %indvar, %n + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %arrayidx = getelementptr inbounds [2048 x i64]* @b, i64 0, i64 %indvar + store i64 1, i64* %arrayidx + %inc = add nsw i64 %indvar, 1 + br label %for.cond + +for.end: ; preds = %for.cond + ret void +} + -- 2.7.4