Skip to content

Commit 88454ee

Browse files
committed
Expand intrinsic coverage
1 parent 72d92fb commit 88454ee

File tree

6 files changed

+78
-12
lines changed

6 files changed

+78
-12
lines changed

src/analysis/ipoincidence.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,11 @@ function process_template!(𝕃, coeffs, eq_mapping, applied_scopes, argtypes, t
100100
if isa(arg, PartialStruct)
101101
fields = arg.fields
102102
else
103-
fields = Any[getfield_tfunc(𝕃, arg, Const(i)) for i = 1:length(template.fields)]
103+
fields = Any[Compiler.getfield_tfunc(𝕃, arg, Const(i)) for i = 1:length(template.fields)]
104104
end
105105
process_template!(𝕃, coeffs, eq_mapping, applied_scopes, fields, template.fields)
106106
else
107-
@show (arg, template)
107+
@show (arg, template, template_argtypes)
108108
error()
109109
end
110110
end

src/analysis/lattice.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ function Incidence(T::PartialStruct)
188188
end
189189

190190
Base.:(==)(a::Incidence, b::Incidence) = a.typ === b.typ &&
191-
a.row.nzind == b.row.nzind && a.row.nzval == b.row.nzval && a.eps == b.eps
191+
a.row.nzind == b.row.nzind && a.row.nzval == b.row.nzval
192192
Base.:(+)(a::Incidence, b::Incidence) = tfunc(Val{Core.Intrinsics.add_float}(), a, b)
193193
Base.:(+)(a::Const, b::Incidence) = tfunc(Val{Core.Intrinsics.add_float}(), a, b)
194194
Base.:(+)(a::Incidence, b::Const) = tfunc(Val{Core.Intrinsics.add_float}(), a, b)
@@ -210,8 +210,8 @@ function epsnum(a::Incidence)
210210
return only(a.eps)
211211
end
212212

213-
Base.copy(inc::Incidence) = Incidence(inc.typ, copy(inc.row), copy(inc.eps))
214-
Base.isempty(inc::Incidence) = iszero(inc.row) && isempty(inc.eps) # slightly weaker than iszero as that also requires it to be Const(0.0)
213+
Base.copy(inc::Incidence) = Incidence(inc.typ, copy(inc.row))
214+
Base.isempty(inc::Incidence) = iszero(inc.row) # slightly weaker than iszero as that also requires it to be Const(0.0)
215215

216216
#################################### Eq ########################################
217217
struct Eq

src/analysis/refiner.jl

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
133131
end
134132

135133
get_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)
221219
end
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+
223253
function 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)

src/analysis/structural.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,8 @@ function _structural_analysis!(ci::CodeInstance, world::UInt)
298298
return result
299299
end
300300

301-
argtypes = Compiler.collect_argtypes(refiner, stmt.args, Compiler.StatementState(nothing, false), irsv)[2:end]
302-
mapping = CalleeMapping(Compiler.optimizer_lattice(refiner), argtypes, result)
301+
callee_argtypes = Compiler.collect_argtypes(refiner, stmt.args, Compiler.StatementState(nothing, false), irsv)[2:end]
302+
mapping = CalleeMapping(Compiler.optimizer_lattice(refiner), callee_argtypes, result)
303303
inst[:info] = MappingInfo(info, result, mapping)
304304
end
305305

src/transform/tearing/schedule.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,8 @@ function schedule_nonlinear!(compact, param_vars, var_eq_matching, ir, val::Unio
170170
f = f.val
171171
@assert f in (Core.Intrinsics.sub_float, Core.Intrinsics.add_float,
172172
Core.Intrinsics.mul_float, Core.Intrinsics.copysign_float,
173-
Core.ifelse)
173+
Core.ifelse, Core.Intrinsics.or_int, Core.Intrinsics.and_int)
174+
# TODO: or_int is linear in Bool
174175
call_is_linear = f in (Core.Intrinsics.sub_float, Core.Intrinsics.add_float)
175176
end
176177

test/regression.jl

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ using OrdinaryDiffEq
1010
const cf = Base.copysign_float
1111
const ief = Core.ifelse
1212
const -= Core.Intrinsics.sub_float
13+
const oif = Core.Intrinsics.or_int
1314

1415
function tfb1()
1516
x = continuous()
@@ -21,4 +22,31 @@ end
2122
sol = solve(DAECProblem(tfb1, (1,) .=> 1.), IDA())
2223
@test all(map((x,y)->isapprox(x[], y, atol=1e-2), sol.u[:, 1], exp.(sol.t)))
2324

25+
function tfb1_ipo()
26+
x = continuous()
27+
always!(ddt(x) - (x < 43200.)*x)
28+
end
29+
30+
sol = solve(DAECProblem(tfb1_ipo, (1,) .=> 1.), IDA())
31+
@test all(map((x,y)->isapprox(x[], y, atol=1e-2), sol.u[:, 1], exp.(sol.t)))
32+
33+
function tfb2()
34+
x = continuous()
35+
36+
fx = Float64(-100)
37+
b = oif(fx < x,
38+
((fx == x) & oif((fx == Float64(typemax(Int64))), (-100 < unsafe_trunc(Int64,fx)) )))
39+
40+
always!(ddt(x) - b*x)
41+
end
42+
sol = solve(DAECProblem(tfb2, (1,) .=> 1.), IDA())
43+
@test all(map((x,y)->isapprox(x[], y, atol=1e-2), sol.u[:, 1], exp.(sol.t)))
44+
45+
function tfb2_ipo()
46+
x = continuous()
47+
always!(ddt(x) - (-100 < x)*x)
48+
end
49+
sol = solve(DAECProblem(tfb2_ipo, (1,) .=> 1.), IDA())
50+
@test all(map((x,y)->isapprox(x[], y, atol=1e-2), sol.u[:, 1], exp.(sol.t)))
51+
2452
end

0 commit comments

Comments
 (0)