@@ -124,12 +124,10 @@ function tfunc(::Val{Core.Intrinsics.neg_float}, @nospecialize(a::Union{Const, I
124124 for (i, v) in zip (rowvals (a. row), nonzeros (a. row))
125125 arow[i] = - v
126126 end
127- eps = copy (a. eps)
128127 else
129128 arow = _zero_row ()
130- eps = BitSet ()
131129 end
132- return Incidence (builtin_math_tfunc (Core. Intrinsics. neg_float, isa (a, Incidence) ? a. typ : a), arow, eps )
130+ return Incidence (builtin_math_tfunc (Core. Intrinsics. neg_float, isa (a, Incidence) ? a. typ : a), arow)
133131end
134132
135133get_eps (inc:: Incidence ) = inc. eps
@@ -220,6 +218,38 @@ function tfunc(::Val{Core.Intrinsics.div_float}, @nospecialize(a::Union{Const, T
220218 return Incidence (builtin_math_tfunc (Core. Intrinsics. div_float, isa (a, Incidence) ? a. typ : a, widenconst (b. typ)), rrow)
221219end
222220
221+ function tfunc (:: Val{Core.Intrinsics.or_int} , @nospecialize (a:: Union{Const, Type, Incidence} ), @nospecialize (b:: Union{Const, Type, Incidence} ))
222+ if isa (a, Const) && isa (b, Const)
223+ return builtin_math_tfunc (Core. Intrinsics. or_int, a, b)
224+ end
225+ if ! isa (a, Incidence) && ! isa (b, Incidence)
226+ return builtin_math_tfunc (Core. Intrinsics. or_int, a, b)
227+ end
228+ rrow = _zero_row ()
229+ arow = isa (a, Incidence) ? a. row : _ZERO_ROW
230+ brow = isa (b, Incidence) ? b. row : _ZERO_ROW
231+ for i in Iterators. flatten ((rowvals (arow), rowvals (brow)))
232+ rrow[i] = nonlinear
233+ end
234+ return Incidence (builtin_math_tfunc (Core. Intrinsics. or_int, widenconst (a), widenconst (b)), rrow)
235+ end
236+
237+ function tfunc (:: Val{Core.Intrinsics.and_int} , @nospecialize (a:: Union{Const, Type, Incidence} ), @nospecialize (b:: Union{Const, Type, Incidence} ))
238+ if isa (a, Const) && isa (b, Const)
239+ return builtin_math_tfunc (Core. Intrinsics. and_int, a, b)
240+ end
241+ if ! isa (a, Incidence) && ! isa (b, Incidence)
242+ return builtin_math_tfunc (Core. Intrinsics. and_int, a, b)
243+ end
244+ rrow = _zero_row ()
245+ arow = isa (a, Incidence) ? a. row : _ZERO_ROW
246+ brow = isa (b, Incidence) ? b. row : _ZERO_ROW
247+ for i in Iterators. flatten ((rowvals (arow), rowvals (brow)))
248+ rrow[i] = nonlinear
249+ end
250+ return Incidence (builtin_math_tfunc (Core. Intrinsics. and_int, widenconst (a), widenconst (b)), rrow)
251+ end
252+
223253function builtin_math_tfunc (@nospecialize (f), @nospecialize (a), @nospecialize (b), @nospecialize (c))
224254 if isa (a, Const) && isa (b, Const) && isa (c, Const)
225255 return Const (f (a. val:: Float64 , b. val:: Float64 , c. val:: Float64 ))
@@ -277,7 +307,14 @@ is_any_incidence(@nospecialize args...) = any(@nospecialize(x)->isa(x, Incidence
277307 (f == Core. Intrinsics. mul_float || f == Core. Intrinsics. div_float) ||
278308 f == Core. Intrinsics. copysign_float
279309 return tfunc (Val (f), a, b)
280- elseif f == Core. Intrinsics. lt_float
310+ elseif f == Core. Intrinsics. or_int
311+ return tfunc (Val (f), a, b)
312+ elseif f == Core. Intrinsics. and_int
313+ return tfunc (Val (f), a, b)
314+ elseif f == Core. Intrinsics. fptosi || f == Core. Intrinsics. sitofp
315+ # We keep the linearity structure here and absorb the rounding error into be base Int64
316+ return Incidence (Compiler. conversion_tfunc (Compiler. typeinf_lattice (interp), widenconst (a), widenconst (b)), b. row)
317+ elseif f == Core. Intrinsics. lt_float || f == Core. Intrinsics. eq_float || f == Core. Intrinsics. slt_int
281318 r = Compiler. tmerge (Compiler. typeinf_lattice (interp), argtypes[1 ], argtypes[2 ])
282319 @assert isa (r, Incidence)
283320 return Incidence (Bool, r. row)
0 commit comments