1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
| ; RUN: opt %loadPolly -analyze -polly-scops < %s | FileCheck %s --check-prefix=SCOP
; RUN: opt %loadPolly -S -polly-codegen-ppcg < %s | FileCheck %s
; Check that we do not create a kernel if there is an
; unknown function call in a candidate kernel.
; Check that we model the kernel as a scop.
; SCOP: Function: f
; SCOP-NEXT: Region: %entry.split---%for.end13
; If a kernel were generated, then this code would have been part of the kernel
; and not the `.ll` file that is generated.
; CHECK: %conv = fpext float %0 to double
; CHECK-NEXT: %1 = tail call double @extern.fn(double %conv)
; CHECK-NEXT: %conv6 = fptrunc double %1 to float
; REQUIRES: pollyacc
; static const int N = 1000;
; void f(float A[N][N], int n, float B[N][N]) {
; for(int i = 0; i < n; i++) {
; for(int j = 0; j < n; j++) {
; B[i][j] = extern_fn(A[i][j], 3);
; }
;
; }
; }
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.11.0"
define void @f([1000 x float]* %A, i32 %n, [1000 x float]* %B) {
entry:
br label %entry.split
entry.split: ; preds = %entry
%cmp3 = icmp sgt i32 %n, 0
br i1 %cmp3, label %for.cond1.preheader.lr.ph, label %for.end13
for.cond1.preheader.lr.ph: ; preds = %entry.split
br label %for.cond1.preheader
for.cond1.preheader: ; preds = %for.cond1.preheader.lr.ph, %for.inc11
%indvars.iv5 = phi i64 [ 0, %for.cond1.preheader.lr.ph ], [ %indvars.iv.next6, %for.inc11 ]
%cmp21 = icmp sgt i32 %n, 0
br i1 %cmp21, label %for.body3.lr.ph, label %for.inc11
for.body3.lr.ph: ; preds = %for.cond1.preheader
br label %for.body3
for.body3: ; preds = %for.body3.lr.ph, %for.body3
%indvars.iv = phi i64 [ 0, %for.body3.lr.ph ], [ %indvars.iv.next, %for.body3 ]
%arrayidx5 = getelementptr inbounds [1000 x float], [1000 x float]* %A, i64 %indvars.iv5, i64 %indvars.iv
%0 = load float, float* %arrayidx5, align 4
%conv = fpext float %0 to double
%1 = tail call double @extern.fn(double %conv)
%conv6 = fptrunc double %1 to float
%arrayidx10 = getelementptr inbounds [1000 x float], [1000 x float]* %B, i64 %indvars.iv5, i64 %indvars.iv
store float %conv6, float* %arrayidx10, align 4
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
%wide.trip.count = zext i32 %n to i64
%exitcond = icmp ne i64 %indvars.iv.next, %wide.trip.count
br i1 %exitcond, label %for.body3, label %for.cond1.for.inc11_crit_edge
for.cond1.for.inc11_crit_edge: ; preds = %for.body3
br label %for.inc11
for.inc11: ; preds = %for.cond1.for.inc11_crit_edge, %for.cond1.preheader
%indvars.iv.next6 = add nuw nsw i64 %indvars.iv5, 1
%wide.trip.count7 = zext i32 %n to i64
%exitcond8 = icmp ne i64 %indvars.iv.next6, %wide.trip.count7
br i1 %exitcond8, label %for.cond1.preheader, label %for.cond.for.end13_crit_edge
for.cond.for.end13_crit_edge: ; preds = %for.inc11
br label %for.end13
for.end13: ; preds = %for.cond.for.end13_crit_edge, %entry.split
ret void
}
declare double @extern.fn(double) #0
attributes #0 = { readnone }
|