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]