Skip to content

Commit

Permalink
more compact detection of pure builtins
Browse files Browse the repository at this point in the history
  • Loading branch information
JeffBezanson committed Apr 2, 2014
1 parent 4d88d8e commit 2cb2c4a
Showing 1 changed file with 20 additions and 25 deletions.
45 changes: 20 additions & 25 deletions base/inference.jl
Expand Up @@ -1842,28 +1842,23 @@ function without_linenums(a::Array{Any,1})
l
end

_pure_builtins = {getfield, tuple, tupleref, tuplelen, fieldtype, apply_type,
Intrinsics.checked_usub,Intrinsics.cglobal,Intrinsics.checked_fptosi,
Intrinsics.lefsi64,Intrinsics.checked_umul,Intrinsics.fpext,Intrinsics.sext_int,
Intrinsics.ltuif64,Intrinsics.sub_float,Intrinsics.checked_ssub,Intrinsics.sub_int,
Intrinsics.abs_float,Intrinsics.ctpop_int,Intrinsics.div_float,Intrinsics.nan_dom_err,
Intrinsics.mul_int,Intrinsics.fptosi,Intrinsics.uitofp,Intrinsics.neg_float,
Intrinsics.eq_float,Intrinsics.ult_int,Intrinsics.srem_int,
Intrinsics.ltsif64,Intrinsics.eq_int,Intrinsics.leuif64,
Intrinsics.copysign_float,Intrinsics.fpislt,Intrinsics.add_float,Intrinsics.ltfui64,
Intrinsics.fpsiround,Intrinsics.checked_uadd,Intrinsics.add_int,Intrinsics.fptoui,
Intrinsics.slt_int,Intrinsics.urem_int,Intrinsics.select_value,Intrinsics.lt_float,
Intrinsics.box,Intrinsics.sdiv_int,Intrinsics.flipsign_int,Intrinsics.or_int,
Intrinsics.unbox,Intrinsics.ctlz_int,Intrinsics.checked_fptoui,
Intrinsics.and_int,Intrinsics.le_float,Intrinsics.sle_int,Intrinsics.checked_smul,
Intrinsics.ltfsi64,Intrinsics.bswap_int,Intrinsics.cttz_int,Intrinsics.lefui64,
Intrinsics.sitofp,Intrinsics.checked_sadd,Intrinsics.udiv_int,Intrinsics.lshr_int,
Intrinsics.trunc_int,Intrinsics.eqfsi64,Intrinsics.mul_float,Intrinsics.shl_int,
Intrinsics.neg_int,Intrinsics.zext_int,Intrinsics.ule_int,Intrinsics.smod_int,
Intrinsics.lesif64,Intrinsics.eqfui64,Intrinsics.ashr_int,Intrinsics.xor_int,
Intrinsics.ne_int,Intrinsics.fpuiround,Intrinsics.fptrunc,Intrinsics.ne_float,
Intrinsics.fpiseq,Intrinsics.not_int,Intrinsics.rem_float
} #all Intrinsic functions except pointerref,pointerset,ccall,jl_alloca,pointertoref
const _pure_builtins = {getfield, tuple, tupleref, tuplelen, fieldtype, apply_type}

function is_pure_builtin(f)
if contains_is(_pure_builtins, f)
return true
end
if isa(f,IntrinsicFunction)
if !(f === Intrinsics.pointerref ||
f === Intrinsics.pointerset ||
f === Intrinsics.ccall ||
f === Intrinsics.jl_alloca ||
f === Intrinsics.pointertoref)
return true
end
end
return false
end

# detect some important side-effect-free calls
function effect_free(e::ANY, sv, any_expr::Bool)
Expand All @@ -1878,7 +1873,7 @@ function effect_free(e::ANY, sv, any_expr::Bool)
end
ea = e.args
if e.head === :call || e.head === :call1
if is_known_call(e, _pure_builtins, sv)
if is_known_call_p(e, is_pure_builtin, sv)
if !any_expr && is_known_call(e, getfield, sv)
for a in ea
if isa(a,Symbol)
Expand Down Expand Up @@ -2509,12 +2504,12 @@ function is_known_call(e::Expr, func, sv)
return !is(f,false) && is(_ieval(f), func)
end

function is_known_call(e::Expr, fs::Array, sv)
function is_known_call_p(e::Expr, pred::Function, sv)
if !(is(e.head,:call) || is(e.head,:call1))
return false
end
f = isconstantfunc(e.args[1], sv)
return !is(f,false) && contains_is(fs, _ieval(f))
return !is(f,false) && pred(_ieval(f))
end

function is_var_assigned(ast, v)
Expand Down

0 comments on commit 2cb2c4a

Please sign in to comment.