|
129 | 129 | # build something that works for us here and worry about it later.
|
130 | 130 | nonzerosmap(a::CLILVector) = NonZeros(a)
|
131 | 131 |
|
132 |
| -findfirstequal(vpivot, ivars) = findfirst(isequal(vpivot), ivars) |
133 |
| -function findfirstequal(vpivot::Int64, ivars::Vector{Int64}) |
134 |
| - GC.@preserve ivars begin |
135 |
| - ret = Base.llvmcall((""" |
136 |
| - declare i8 @llvm.cttz.i8(i8, i1); |
137 |
| - define i64 @entry(i64 %0, i64 %1, i64 %2) #0 { |
138 |
| - top: |
139 |
| - %ivars = inttoptr i64 %1 to i64* |
140 |
| - %btmp = insertelement <8 x i64> undef, i64 %0, i64 0 |
141 |
| - %var = shufflevector <8 x i64> %btmp, <8 x i64> undef, <8 x i32> zeroinitializer |
142 |
| - %lenm7 = add nsw i64 %2, -7 |
143 |
| - %dosimditer = icmp ugt i64 %2, 7 |
144 |
| - br i1 %dosimditer, label %L9.lr.ph, label %L32 |
145 |
| -
|
146 |
| - L9.lr.ph: |
147 |
| - %len8 = and i64 %2, 9223372036854775800 |
148 |
| - br label %L9 |
149 |
| -
|
150 |
| - L9: |
151 |
| - %i = phi i64 [ 0, %L9.lr.ph ], [ %vinc, %L30 ] |
152 |
| - %ivarsi = getelementptr inbounds i64, i64* %ivars, i64 %i |
153 |
| - %vpvi = bitcast i64* %ivarsi to <8 x i64>* |
154 |
| - %v = load <8 x i64>, <8 x i64>* %vpvi, align 8 |
155 |
| - %m = icmp eq <8 x i64> %v, %var |
156 |
| - %mu = bitcast <8 x i1> %m to i8 |
157 |
| - %matchnotfound = icmp eq i8 %mu, 0 |
158 |
| - br i1 %matchnotfound, label %L30, label %L17 |
159 |
| -
|
160 |
| - L17: |
161 |
| - %tz8 = call i8 @llvm.cttz.i8(i8 %mu, i1 true) |
162 |
| - %tz64 = zext i8 %tz8 to i64 |
163 |
| - %vis = add nuw i64 %i, %tz64 |
164 |
| - br label %common.ret |
165 |
| -
|
166 |
| - common.ret: |
167 |
| - %retval = phi i64 [ %vis, %L17 ], [ -1, %L32 ], [ %si, %L51 ], [ -1, %L67 ] |
168 |
| - ret i64 %retval |
169 |
| -
|
170 |
| - L30: |
171 |
| - %vinc = add nuw nsw i64 %i, 8 |
172 |
| - %continue = icmp slt i64 %vinc, %lenm7 |
173 |
| - br i1 %continue, label %L9, label %L32 |
174 |
| -
|
175 |
| - L32: |
176 |
| - %cumi = phi i64 [ 0, %top ], [ %len8, %L30 ] |
177 |
| - %done = icmp eq i64 %cumi, %2 |
178 |
| - br i1 %done, label %common.ret, label %L51 |
179 |
| -
|
180 |
| - L51: |
181 |
| - %si = phi i64 [ %inc, %L67 ], [ %cumi, %L32 ] |
182 |
| - %spi = getelementptr inbounds i64, i64* %ivars, i64 %si |
183 |
| - %svi = load i64, i64* %spi, align 8 |
184 |
| - %match = icmp eq i64 %svi, %0 |
185 |
| - br i1 %match, label %common.ret, label %L67 |
186 |
| -
|
187 |
| - L67: |
188 |
| - %inc = add i64 %si, 1 |
189 |
| - %dobreak = icmp eq i64 %inc, %2 |
190 |
| - br i1 %dobreak, label %common.ret, label %L51 |
191 |
| -
|
192 |
| - } |
193 |
| - attributes #0 = { alwaysinline } |
194 |
| - """, "entry"), Int64, Tuple{Int64, Ptr{Int64}, Int64}, vpivot, pointer(ivars), |
195 |
| - length(ivars)) |
196 |
| - end |
197 |
| - ret < 0 ? nothing : ret + 1 |
198 |
| -end |
| 132 | +using FindFirstFunctions: findfirstequal |
199 | 133 |
|
200 | 134 | function bareiss_update_virtual_colswap_mtk!(zero!, M::SparseMatrixCLIL, k, swapto, pivot,
|
201 | 135 | last_pivot; pivot_equal_optimization = true)
|
|
0 commit comments