matvecmul.ll
9.15 KB
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
; RUN: opt < %s -passes='print<loop-cache-cost>' -disable-output 2>&1 | FileCheck %s
target datalayout = "e-m:e-i64:64-n32:64"
target triple = "powerpc64le-unknown-linux-gnu"
; void matvecmul(const double *__restrict y, const double * __restrict x, const double * __restrict b,
; const int * __restrict nb, const int * __restrict nx, const int * __restrict ny, const int * __restrict nz) {
;
; for (int k=1;k<nz,++k)
; for (int j=1;j<ny,++j)
; for (int i=1;i<nx,++i)
; for (int l=1;l<nb,++l)
; for (int m=1;m<nb,++m)
; y[k+1][j][i][l] = y[k+1][j][i][l] + b[k][j][i][m][l]*x[k][j][i][m]
; }
; CHECK-DAG: Loop 'k_loop' has cost = 30000000000
; CHECK-DAG: Loop 'j_loop' has cost = 30000000000
; CHECK-DAG: Loop 'i_loop' has cost = 30000000000
; CHECK-DAG: Loop 'm_loop' has cost = 10700000000
; CHECK-DAG: Loop 'l_loop' has cost = 1300000000
%_elem_type_of_double = type <{ double }>
; Function Attrs: norecurse nounwind
define void @mat_vec_mpy([0 x %_elem_type_of_double]* noalias %y, [0 x %_elem_type_of_double]* noalias readonly %x,
[0 x %_elem_type_of_double]* noalias readonly %b, i32* noalias readonly %nb, i32* noalias readonly %nx,
i32* noalias readonly %ny, i32* noalias readonly %nz) {
mat_times_vec_entry:
%_ind_val = load i32, i32* %nb, align 4
%_conv = sext i32 %_ind_val to i64
%_grt_tmp.i = icmp sgt i64 %_conv, 0
%a_b.i = select i1 %_grt_tmp.i, i64 %_conv, i64 0
%_ind_val1 = load i32, i32* %nx, align 4
%_conv2 = sext i32 %_ind_val1 to i64
%_grt_tmp.i266 = icmp sgt i64 %_conv2, 0
%a_b.i267 = select i1 %_grt_tmp.i266, i64 %_conv2, i64 0
%_ind_val3 = load i32, i32* %ny, align 4
%_conv4 = sext i32 %_ind_val3 to i64
%_grt_tmp.i264 = icmp sgt i64 %_conv4, 0
%a_b.i265 = select i1 %_grt_tmp.i264, i64 %_conv4, i64 0
%_ind_val5 = load i32, i32* %nz, align 4
%_mult_tmp = shl nsw i64 %a_b.i, 3
%_mult_tmp7 = mul i64 %_mult_tmp, %a_b.i267
%_mult_tmp8 = mul i64 %_mult_tmp7, %a_b.i265
%_sub_tmp = sub nuw nsw i64 -8, %_mult_tmp
%_sub_tmp21 = sub i64 %_sub_tmp, %_mult_tmp7
%_sub_tmp23 = sub i64 %_sub_tmp21, %_mult_tmp8
%_mult_tmp73 = mul i64 %_mult_tmp, %a_b.i
%_mult_tmp74 = mul i64 %_mult_tmp73, %a_b.i267
%_mult_tmp75 = mul i64 %_mult_tmp74, %a_b.i265
%_sub_tmp93 = sub i64 %_sub_tmp, %_mult_tmp73
%_sub_tmp95 = sub i64 %_sub_tmp93, %_mult_tmp74
%_sub_tmp97 = sub i64 %_sub_tmp95, %_mult_tmp75
%_grt_tmp853288 = icmp slt i32 %_ind_val5, 1
br i1 %_grt_tmp853288, label %_return_bb, label %k_loop.lr.ph
k_loop.lr.ph: ; preds = %mat_times_vec_entry
%_grt_tmp851279 = icmp slt i32 %_ind_val3, 1
%_grt_tmp847270 = icmp slt i32 %_ind_val, 1
%_aa_conv = bitcast [0 x %_elem_type_of_double]* %y to i8*
%_adda_ = getelementptr inbounds i8, i8* %_aa_conv, i64 %_sub_tmp23
%_aa_conv434 = bitcast [0 x %_elem_type_of_double]* %x to i8*
%_adda_435 = getelementptr inbounds i8, i8* %_aa_conv434, i64 %_sub_tmp23
%_aa_conv785 = bitcast [0 x %_elem_type_of_double]* %b to i8*
%_adda_786 = getelementptr inbounds i8, i8* %_aa_conv785, i64 %_sub_tmp97
br i1 %_grt_tmp851279, label %k_loop.us.preheader, label %k_loop.lr.ph.split
k_loop.us.preheader: ; preds = %k_loop.lr.ph
br label %_return_bb.loopexit
k_loop.lr.ph.split: ; preds = %k_loop.lr.ph
%_grt_tmp849273 = icmp slt i32 %_ind_val1, 1
br i1 %_grt_tmp849273, label %k_loop.us291.preheader, label %k_loop.lr.ph.split.split
k_loop.us291.preheader: ; preds = %k_loop.lr.ph.split
br label %_return_bb.loopexit300
k_loop.lr.ph.split.split: ; preds = %k_loop.lr.ph.split
br i1 %_grt_tmp847270, label %k_loop.us294.preheader, label %k_loop.preheader
k_loop.preheader: ; preds = %k_loop.lr.ph.split.split
%0 = add i32 %_ind_val, 1
%1 = add i32 %_ind_val1, 1
%2 = add i32 %_ind_val3, 1
%3 = add i32 %_ind_val5, 1
br label %k_loop
k_loop.us294.preheader: ; preds = %k_loop.lr.ph.split.split
br label %_return_bb.loopexit301
k_loop: ; preds = %k_loop._label_18_crit_edge.split.split.split, %k_loop.preheader
%indvars.iv316 = phi i64 [ 1, %k_loop.preheader ], [ %indvars.iv.next317, %k_loop._label_18_crit_edge.split.split.split ]
%indvars.iv.next317 = add nuw nsw i64 %indvars.iv316, 1
%_ix_x_len = mul i64 %_mult_tmp8, %indvars.iv.next317
%_ix_x_len410 = mul i64 %_mult_tmp75, %indvars.iv316
%_ix_x_len822 = mul i64 %_mult_tmp8, %indvars.iv316
br label %j_loop
j_loop: ; preds = %j_loop._label_15_crit_edge.split.split, %k_loop
%indvars.iv312 = phi i64 [ %indvars.iv.next313, %j_loop._label_15_crit_edge.split.split ], [ 1, %k_loop ]
%_ix_x_len371 = mul i64 %_mult_tmp7, %indvars.iv312
%_ix_x_len415 = mul i64 %_mult_tmp74, %indvars.iv312
br label %i_loop
i_loop: ; preds = %i_loop._label_12_crit_edge.split, %j_loop
%indvars.iv307 = phi i64 [ %indvars.iv.next308, %i_loop._label_12_crit_edge.split ], [ 1, %j_loop ]
%_ix_x_len375 = mul i64 %_mult_tmp, %indvars.iv307
%_ix_x_len420 = mul i64 %_mult_tmp73, %indvars.iv307
br label %l_loop
l_loop: ; preds = %l_loop._label_9_crit_edge, %i_loop
%indvars.iv303 = phi i64 [ %indvars.iv.next304, %l_loop._label_9_crit_edge ], [ 1, %i_loop ]
%_ix_x_len378 = shl nuw nsw i64 %indvars.iv303, 3
br label %m_loop
m_loop: ; preds = %m_loop, %l_loop
%indvars.iv = phi i64 [ %indvars.iv.next, %m_loop ], [ 1, %l_loop ]
%_ix_x_len424 = mul i64 %_mult_tmp, %indvars.iv
%_ix_x_len454 = shl nuw nsw i64 %indvars.iv, 3
%_ixa_gep = getelementptr inbounds i8, i8* %_adda_, i64 %_ix_x_len
%_ixa_gep791 = getelementptr inbounds i8, i8* %_adda_786, i64 %_ix_x_len410
%_ixa_gep823 = getelementptr inbounds i8, i8* %_adda_435, i64 %_ix_x_len822
%_ixa_gep372 = getelementptr inbounds i8, i8* %_ixa_gep, i64 %_ix_x_len371
%_ixa_gep376 = getelementptr inbounds i8, i8* %_ixa_gep372, i64 %_ix_x_len375
%_ixa_gep796 = getelementptr inbounds i8, i8* %_ixa_gep791, i64 %_ix_x_len415
%_ixa_gep828 = getelementptr inbounds i8, i8* %_ixa_gep823, i64 %_ix_x_len371
%_ixa_gep379 = getelementptr inbounds i8, i8* %_ixa_gep376, i64 %_ix_x_len378
%_ixa_gep801 = getelementptr inbounds i8, i8* %_ixa_gep796, i64 %_ix_x_len420
%_ixa_gep833 = getelementptr inbounds i8, i8* %_ixa_gep828, i64 %_ix_x_len375
%_ixa_gep806 = getelementptr inbounds i8, i8* %_ixa_gep801, i64 %_ix_x_len378
%_ixa_gep810 = getelementptr inbounds i8, i8* %_ixa_gep806, i64 %_ix_x_len424
%_gepp = bitcast i8* %_ixa_gep379 to double*
%_gepp813 = bitcast i8* %_ixa_gep810 to double*
%_ind_val814 = load double, double* %_gepp813, align 8
%_ixa_gep837 = getelementptr inbounds i8, i8* %_ixa_gep833, i64 %_ix_x_len454
%_gepp840 = bitcast i8* %_ixa_gep837 to double*
%_ind_val841 = load double, double* %_gepp840, align 8
%_mult_tmp842 = fmul double %_ind_val814, %_ind_val841
store double %_mult_tmp842, double* %_gepp, align 8
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
%wide.trip.count = zext i32 %0 to i64
%wide.trip.count305 = zext i32 %0 to i64
%wide.trip.count309 = zext i32 %1 to i64
%wide.trip.count314 = zext i32 %2 to i64
%wide.trip.count319 = zext i32 %3 to i64
%exitcond = icmp ne i64 %indvars.iv.next, %wide.trip.count
br i1 %exitcond, label %m_loop, label %l_loop._label_9_crit_edge
l_loop._label_9_crit_edge: ; preds = %m_loop
%indvars.iv.next304 = add nuw nsw i64 %indvars.iv303, 1
%exitcond306 = icmp ne i64 %indvars.iv.next304, %wide.trip.count305
br i1 %exitcond306, label %l_loop, label %i_loop._label_12_crit_edge.split
i_loop._label_12_crit_edge.split: ; preds = %l_loop._label_9_crit_edge
%indvars.iv.next308 = add nuw nsw i64 %indvars.iv307, 1
%exitcond310 = icmp ne i64 %indvars.iv.next308, %wide.trip.count309
br i1 %exitcond310, label %i_loop, label %j_loop._label_15_crit_edge.split.split
j_loop._label_15_crit_edge.split.split: ; preds = %i_loop._label_12_crit_edge.split
%indvars.iv.next313 = add nuw nsw i64 %indvars.iv312, 1
%exitcond315 = icmp ne i64 %indvars.iv.next313, %wide.trip.count314
br i1 %exitcond315, label %j_loop, label %k_loop._label_18_crit_edge.split.split.split
k_loop._label_18_crit_edge.split.split.split: ; preds = %j_loop._label_15_crit_edge.split.split
%exitcond320 = icmp ne i64 %indvars.iv.next317, %wide.trip.count319
br i1 %exitcond320, label %k_loop, label %_return_bb.loopexit302
_return_bb.loopexit: ; preds = %k_loop.us.preheader
br label %_return_bb
_return_bb.loopexit300: ; preds = %k_loop.us291.preheader
br label %_return_bb
_return_bb.loopexit301: ; preds = %k_loop.us294.preheader
br label %_return_bb
_return_bb.loopexit302: ; preds = %k_loop._label_18_crit_edge.split.split.split
br label %_return_bb
_return_bb: ; preds = %_return_bb.loopexit302, %_return_bb.loopexit301, %_return_bb.loopexit300, %_return_bb.loopexit, %mat_times_vec_entry
ret void
}