diff --git a/loopy/check.py b/loopy/check.py index 266aa72013a2cfbd0e50f880924f1d0bdcb15bc6..3401f7b8d86eb8e89d0bdb0629b5e85d57fff771 100644 --- a/loopy/check.py +++ b/loopy/check.py @@ -450,11 +450,27 @@ def check_implemented_domains(kernel, implemented_domains, code=None): from islpy import align_two + last_idomains = None + last_insn_inames = None + for insn_id, idomains in six.iteritems(implemented_domains): insn = kernel.id_to_insn[insn_id] assert idomains + insn_inames = kernel.insn_inames(insn) + + # {{{ if we've checked the same thing before, no need to check it again + + if last_idomains is not None and last_insn_inames is not None: + if idomains == last_idomains and insn_inames == last_insn_inames: + continue + + last_idomains = idomains + last_insn_inames = insn_inames + + # }}} + insn_impl_domain = idomains[0] for idomain in idomains[1:]: insn_impl_domain = insn_impl_domain | idomain @@ -463,13 +479,12 @@ def check_implemented_domains(kernel, implemented_domains, code=None): assumption_non_param, insn_impl_domain) insn_impl_domain = ( (insn_impl_domain & assumptions) - .project_out_except(kernel.insn_inames(insn), [dim_type.set])) + .project_out_except(insn_inames, [dim_type.set])) - insn_inames = kernel.insn_inames(insn) insn_domain = kernel.get_inames_domain(insn_inames) assumptions, insn_domain = align_two(assumption_non_param, insn_domain) desired_domain = ((insn_domain & assumptions) - .project_out_except(kernel.insn_inames(insn), [dim_type.set])) + .project_out_except(insn_inames, [dim_type.set])) insn_impl_domain, desired_domain = align_two( insn_impl_domain, desired_domain)