diff --git a/loopy/check.py b/loopy/check.py index 3db049616b5e261ae769e1e344ab7389c365e91f..83f529206c6d1d4cb058673162c2285a5ad1356a 100644 --- a/loopy/check.py +++ b/loopy/check.py @@ -279,7 +279,8 @@ class _AccessCheckMapper(WalkMapper): if not isinstance(subscript, tuple): subscript = (subscript,) - from loopy.symbolic import get_dependencies, get_access_range + from loopy.symbolic import (get_dependencies, get_access_range, + UnableToDetermineAccessRange) available_vars = set(self.domain.get_var_dict()) shape_deps = set() @@ -300,11 +301,8 @@ class _AccessCheckMapper(WalkMapper): try: access_range = get_access_range(self.domain, subscript, self.kernel.assumptions) - except isl.Error: - # Likely: index was non-linear, nothing we can do. - return - except TypeError: - # Likely: index was non-linear, nothing we can do. + except UnableToDetermineAccessRange: + # Likely: index was non-affine, nothing we can do. return shape_domain = isl.BasicSet.universe(access_range.get_space()) diff --git a/loopy/symbolic.py b/loopy/symbolic.py index 272a7f45bec8a134d072e9ab4f358bb36196a2df..aa9a08844ea1bfda77ec128828880c2b07680697 100644 --- a/loopy/symbolic.py +++ b/loopy/symbolic.py @@ -1537,6 +1537,10 @@ class PrimeAdder(IdentityMapper): # {{{ get access range +class UnableToDetermineAccessRange(Exception): + pass + + def get_access_range(domain, subscript, assumptions): domain, assumptions = isl.align_two(domain, assumptions) @@ -1558,8 +1562,17 @@ def get_access_range(domain, subscript, assumptions): access_map = access_map.insert_dims(dim_type.set, dn, dims) for idim in range(dims): - idx_aff = aff_from_expr(access_map.get_space(), - subscript[idim]) + sub_idim = subscript[idim] + with isl.SuppressedWarnings(domain.get_ctx()): + try: + idx_aff = aff_from_expr(access_map.get_space(), sub_idim) + except TypeError as e: + raise UnableToDetermineAccessRange( + "%s: %s" % (type(e).__name__, str(e))) + except isl.Error as e: + raise UnableToDetermineAccessRange( + "%s: %s" % (type(e).__name__, str(e))) + idx_aff = idx_aff.set_coefficient_val( dim_type.in_, dn+idim, -1) @@ -1604,7 +1617,12 @@ class BatchedAccessRangeMapper(WalkMapper): self.bad_subscripts[arg_name].append(expr) return - access_range = get_access_range(domain, subscript, self.kernel.assumptions) + try: + access_range = get_access_range( + domain, subscript, self.kernel.assumptions) + except UnableToDetermineAccessRange: + self.bad_subscripts[arg_name].append(expr) + return if self.access_ranges[arg_name] is None: self.access_ranges[arg_name] = access_range @@ -1652,7 +1670,7 @@ class AccessRangeMapper(object): # }}} -# {{{ do_access_ranges_overlap +# {{{ do_access_ranges_overlap_conservative def _get_access_range_conservative(kernel, insn_id, access_dir, var_name): insn = kernel.id_to_insn[insn_id]