Skip to content
This repository was archived by the owner on Apr 23, 2020. It is now read-only.

Commit d603bbb

Browse files
committed
[JSONImport] Check, if the size of an imported array is positive
git-svn-id: https://llvm.org/svn/llvm-project/polly/trunk@306479 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 225018f commit d603bbb

4 files changed

+214
-1
lines changed

lib/Exchange/JSONExporter.cpp

+9-1
Original file line numberDiff line numberDiff line change
@@ -701,8 +701,16 @@ bool JSONImporter::importArrays(Scop &S, Json::Value &JScop) {
701701
return false;
702702
}
703703
std::vector<unsigned> DimSizes;
704-
for (unsigned i = 0; i < Arrays[ArrayIdx]["sizes"].size(); i++)
704+
for (unsigned i = 0; i < Arrays[ArrayIdx]["sizes"].size(); i++) {
705+
auto Size = std::stoi(Arrays[ArrayIdx]["sizes"][i].asCString());
706+
707+
// Check if the size if positive.
708+
if (Size <= 0) {
709+
errs() << "The size at index " << i << " is =< 0.\n";
710+
return false;
711+
}
705712
DimSizes.push_back(std::stoi(Arrays[ArrayIdx]["sizes"][i].asCString()));
713+
}
706714
S.createScopArrayInfo(ElementType, Arrays[ArrayIdx]["name"].asCString(),
707715
DimSizes);
708716
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
; RUN: opt %loadPolly -polly-scops -analyze -polly-import-jscop-dir=%S -polly-import-jscop -polly-import-jscop-postfix=transformed < %s 2>&1 | FileCheck %s
2+
;
3+
; #define Ni 1056
4+
; #define Nj 1056
5+
; #define Nk 1024
6+
;
7+
; void ImportArray_Negative_size(double beta, double A[Ni][Nk], double B[Ni][Nj]) {
8+
; int i,j,k;
9+
;
10+
; for (i = 0; i < Ni; i++) {
11+
; for (j = 0; j < Nj; j++) {
12+
; for (k = 0; k < Nk; ++k) {
13+
; B[i][j] = beta * A[i][k];
14+
; }
15+
; }
16+
; }
17+
; }
18+
;
19+
; Verify if the JSONImporter checks if the size of the new array is positive.
20+
; CHECK: The size at index 0 is =< 0.
21+
;
22+
; ModuleID = 'ImportArrays-Negative-size.ll'
23+
;
24+
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
25+
26+
; Function Attrs: nounwind uwtable
27+
define void @ImportArrays_Negative_Size(double %beta, [1024 x double]* nocapture readonly %A, [1056 x double]* nocapture %B) local_unnamed_addr {
28+
entry:
29+
br label %for.cond1.preheader
30+
31+
for.cond1.preheader: ; preds = %for.inc16, %entry
32+
%indvars.iv35 = phi i64 [ 0, %entry ], [ %indvars.iv.next36, %for.inc16 ]
33+
br label %for.cond4.preheader
34+
35+
for.cond4.preheader: ; preds = %for.inc13, %for.cond1.preheader
36+
%indvars.iv32 = phi i64 [ 0, %for.cond1.preheader ], [ %indvars.iv.next33, %for.inc13 ]
37+
%arrayidx12 = getelementptr inbounds [1056 x double], [1056 x double]* %B, i64 %indvars.iv35, i64 %indvars.iv32
38+
br label %for.body6
39+
40+
for.body6: ; preds = %for.body6, %for.cond4.preheader
41+
%indvars.iv = phi i64 [ 0, %for.cond4.preheader ], [ %indvars.iv.next.3, %for.body6 ]
42+
%arrayidx8 = getelementptr inbounds [1024 x double], [1024 x double]* %A, i64 %indvars.iv35, i64 %indvars.iv
43+
%0 = load double, double* %arrayidx8, align 8
44+
%mul = fmul double %0, %beta
45+
store double %mul, double* %arrayidx12, align 8
46+
%indvars.iv.next = or i64 %indvars.iv, 1
47+
%arrayidx8.1 = getelementptr inbounds [1024 x double], [1024 x double]* %A, i64 %indvars.iv35, i64 %indvars.iv.next
48+
%1 = load double, double* %arrayidx8.1, align 8
49+
%mul.1 = fmul double %1, %beta
50+
store double %mul.1, double* %arrayidx12, align 8
51+
%indvars.iv.next.1 = or i64 %indvars.iv, 2
52+
%arrayidx8.2 = getelementptr inbounds [1024 x double], [1024 x double]* %A, i64 %indvars.iv35, i64 %indvars.iv.next.1
53+
%2 = load double, double* %arrayidx8.2, align 8
54+
%mul.2 = fmul double %2, %beta
55+
store double %mul.2, double* %arrayidx12, align 8
56+
%indvars.iv.next.2 = or i64 %indvars.iv, 3
57+
%arrayidx8.3 = getelementptr inbounds [1024 x double], [1024 x double]* %A, i64 %indvars.iv35, i64 %indvars.iv.next.2
58+
%3 = load double, double* %arrayidx8.3, align 8
59+
%mul.3 = fmul double %3, %beta
60+
store double %mul.3, double* %arrayidx12, align 8
61+
%indvars.iv.next.3 = add nsw i64 %indvars.iv, 4
62+
%exitcond.3 = icmp eq i64 %indvars.iv.next.3, 1024
63+
br i1 %exitcond.3, label %for.inc13, label %for.body6
64+
65+
for.inc13: ; preds = %for.body6
66+
%indvars.iv.next33 = add nuw nsw i64 %indvars.iv32, 1
67+
%exitcond34 = icmp eq i64 %indvars.iv.next33, 1056
68+
br i1 %exitcond34, label %for.inc16, label %for.cond4.preheader
69+
70+
for.inc16: ; preds = %for.inc13
71+
%indvars.iv.next36 = add nuw nsw i64 %indvars.iv35, 1
72+
%exitcond37 = icmp eq i64 %indvars.iv.next36, 1056
73+
br i1 %exitcond37, label %for.end18, label %for.cond1.preheader
74+
75+
for.end18: ; preds = %for.inc16
76+
ret void
77+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
{
2+
"arrays" : [
3+
{
4+
"name" : "MemRef_A",
5+
"sizes" : [ "*", "1024" ],
6+
"type" : "double"
7+
},
8+
{
9+
"name" : "MemRef_B",
10+
"sizes" : [ "*", "1056" ],
11+
"type" : "double"
12+
}
13+
],
14+
"context" : "{ : }",
15+
"name" : "%for.cond1.preheader---%for.end18",
16+
"statements" : [
17+
{
18+
"accesses" : [
19+
{
20+
"kind" : "read",
21+
"relation" : "{ Stmt_for_body6[i0, i1, i2] -> MemRef_A[i0, 4i2] }"
22+
},
23+
{
24+
"kind" : "read",
25+
"relation" : "{ Stmt_for_body6[i0, i1, i2] -> MemRef_beta[] }"
26+
},
27+
{
28+
"kind" : "write",
29+
"relation" : "{ Stmt_for_body6[i0, i1, i2] -> MemRef_B[i0, i1] }"
30+
},
31+
{
32+
"kind" : "read",
33+
"relation" : "{ Stmt_for_body6[i0, i1, i2] -> MemRef_A[i0, 1 + 4i2] }"
34+
},
35+
{
36+
"kind" : "write",
37+
"relation" : "{ Stmt_for_body6[i0, i1, i2] -> MemRef_B[i0, i1] }"
38+
},
39+
{
40+
"kind" : "read",
41+
"relation" : "{ Stmt_for_body6[i0, i1, i2] -> MemRef_A[i0, 2 + 4i2] }"
42+
},
43+
{
44+
"kind" : "write",
45+
"relation" : "{ Stmt_for_body6[i0, i1, i2] -> MemRef_B[i0, i1] }"
46+
},
47+
{
48+
"kind" : "read",
49+
"relation" : "{ Stmt_for_body6[i0, i1, i2] -> MemRef_A[i0, 3 + 4i2] }"
50+
},
51+
{
52+
"kind" : "write",
53+
"relation" : "{ Stmt_for_body6[i0, i1, i2] -> MemRef_B[i0, i1] }"
54+
}
55+
],
56+
"domain" : "{ Stmt_for_body6[i0, i1, i2] : 0 <= i0 <= 1055 and 0 <= i1 <= 1055 and 0 <= i2 <= 255 }",
57+
"name" : "Stmt_for_body6",
58+
"schedule" : "{ Stmt_for_body6[i0, i1, i2] -> [i0, i1, i2] }"
59+
}
60+
]
61+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
{
2+
"arrays" : [
3+
{
4+
"name" : "MemRef_A",
5+
"sizes" : [ "*", "1024" ],
6+
"type" : "double"
7+
},
8+
{
9+
"name" : "MemRef_B",
10+
"sizes" : [ "*", "1056" ],
11+
"type" : "double"
12+
},
13+
{
14+
"name" : "D",
15+
"sizes" : [ "-270336" ],
16+
"type" : "double",
17+
"allocation" : "heap"
18+
}
19+
],
20+
"context" : "{ : }",
21+
"name" : "%for.cond1.preheader---%for.end18",
22+
"statements" : [
23+
{
24+
"accesses" : [
25+
{
26+
"kind" : "read",
27+
"relation" : "{ Stmt_for_body6[i0, i1, i2] -> MemRef_A[i0, 4i2] }"
28+
},
29+
{
30+
"kind" : "read",
31+
"relation" : "{ Stmt_for_body6[i0, i1, i2] -> MemRef_beta[] }"
32+
},
33+
{
34+
"kind" : "write",
35+
"relation" : "{ Stmt_for_body6[i0, i1, i2] -> MemRef_B[i0, i1] }"
36+
},
37+
{
38+
"kind" : "read",
39+
"relation" : "{ Stmt_for_body6[i0, i1, i2] -> MemRef_A[i0, 1 + 4i2] }"
40+
},
41+
{
42+
"kind" : "write",
43+
"relation" : "{ Stmt_for_body6[i0, i1, i2] -> MemRef_B[i0, i1] }"
44+
},
45+
{
46+
"kind" : "read",
47+
"relation" : "{ Stmt_for_body6[i0, i1, i2] -> MemRef_A[i0, 2 + 4i2] }"
48+
},
49+
{
50+
"kind" : "write",
51+
"relation" : "{ Stmt_for_body6[i0, i1, i2] -> MemRef_B[i0, i1] }"
52+
},
53+
{
54+
"kind" : "read",
55+
"relation" : "{ Stmt_for_body6[i0, i1, i2] -> MemRef_A[i0, 3 + 4i2] }"
56+
},
57+
{
58+
"kind" : "write",
59+
"relation" : "{ Stmt_for_body6[i0, i1, i2] -> MemRef_B[i0, i1] }"
60+
}
61+
],
62+
"domain" : "{ Stmt2[i0, i1, i2] : 0 <= i0 <= 1055 and 0 <= i1 <= 1055 and 0 <= i2 <= 255 }",
63+
"name" : "Stmt2",
64+
"schedule" : "{ Stmt2[i0, i1, i2] -> [i0, i1, i2] }"
65+
}
66+
]
67+
}

0 commit comments

Comments
 (0)