diff --git a/loopy/symbolic.py b/loopy/symbolic.py
index 543c2743bb98b09b706c2fdbf9188ed0a85d97f2..6e661f422951b12ecf2340e4b60563063f4b3514 100644
--- a/loopy/symbolic.py
+++ b/loopy/symbolic.py
@@ -63,6 +63,8 @@ from islpy import dim_type
 import re
 import numpy as np
 
+from loopy.diagnostic import LoopyError
+
 
 # {{{ mappers with support for loopy-specific primitives
 
@@ -1284,7 +1286,20 @@ def aff_from_expr(space, expr, vars_to_zero=frozenset()):
 
 
 def pwaff_from_expr(space, expr, vars_to_zero=frozenset()):
-    return PwAffEvaluationMapper(space, vars_to_zero)(expr)
+    eval_mapper = PwAffEvaluationMapper(space, vars_to_zero)
+
+    from pymbolic.mapper.evaluator import UnknownVariableError
+    try:
+        return eval_mapper(expr)
+    except UnknownVariableError as e:
+        raise LoopyError("unable to build (piecewise) affine expression "
+                "in terms of variables '%s' "
+                "for expression '%s' "
+                "because '%s: %s'"
+                % (
+                    ", ".join(space.get_var_dict()),
+                    expr,
+                    type(e).__name__, e))
 
 # }}}
 
diff --git a/loopy/transform/array_buffer_map.py b/loopy/transform/array_buffer_map.py
index 618e36f20da8b3f9089ecf5ce88d6b3177528570..cdd45a0696a24208e33ae7d0a9b03ff0e584d1b2 100644
--- a/loopy/transform/array_buffer_map.py
+++ b/loopy/transform/array_buffer_map.py
@@ -1,5 +1,4 @@
 from __future__ import division, absolute_import
-from six.moves import range, zip
 
 __copyright__ = "Copyright (C) 2012-2015 Andreas Kloeckner"
 
@@ -23,6 +22,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 """
 
+from six.moves import range, zip
+
 import islpy as isl
 from islpy import dim_type
 from loopy.symbolic import (get_dependencies, SubstitutionMapper)
@@ -92,9 +93,9 @@ def build_per_access_storage_to_domain_map(storage_axis_exprs, domain,
     from loopy.symbolic import aff_from_expr
 
     for saxis, sa_expr in zip(storage_axis_names, storage_axis_exprs):
-        cns = isl.Constraint.equality_from_aff(
-                aff_from_expr(set_space,
-                    var(saxis+"'") - prime_sweep_inames(sa_expr)))
+        cns_expr = var(saxis+"'") - prime_sweep_inames(sa_expr)
+        cns_aff = aff_from_expr(set_space, cns_expr)
+        cns = isl.Constraint.equality_from_aff(cns_aff)
 
         cns_map = isl.BasicMap.from_constraint(cns)
         if stor2sweep is None:
@@ -352,13 +353,11 @@ class ArrayToBufferMap(object):
                 self.stor2sweep,
                 except_inames=frozenset(self.primed_sweep_inames)).domain()
 
-        arg_inames = (
-                set(global_s2s_par_dom.get_var_names(dim_type.param))
-                & self.kernel.all_inames())
+        arg_inames = set(global_s2s_par_dom.get_var_names(dim_type.param))
 
         for arg in storage_axis_exprs:
             arg_inames.update(get_dependencies(arg))
-        arg_inames = frozenset(arg_inames)
+        arg_inames = frozenset(arg_inames & self.kernel.all_inames())
 
         from loopy.kernel import CannotBranchDomainTree
         try:
diff --git a/test/test_apps.py b/test/test_apps.py
index c4844d3a3c5d88e0c4eeccf0d67e9b4284fd744f..9e7c2ee5c2cca8f1b3b702833addc9d538793da8 100644
--- a/test/test_apps.py
+++ b/test/test_apps.py
@@ -43,6 +43,8 @@ else:
 from pyopencl.tools import pytest_generate_tests_for_pyopencl \
         as pytest_generate_tests
 
+from loopy.diagnostic import LoopyError
+
 __all__ = [
         "pytest_generate_tests",
         "cl"  # 'cl.create_some_context'
@@ -663,6 +665,26 @@ def test_domain_tree_nesting():
         assert depth(i) < 2
 
 
+def test_prefetch_through_indirect_access():
+    knl = lp.make_kernel("{[i, j, k]: 0 <= i,k < 10 and 0<=j<2}",
+        """
+        for i, j, k
+            a[map1[indirect[i], j], k] = 2
+        end
+        """,
+        [
+            lp.GlobalArg("a", strides=(2, 1), dtype=int),
+            lp.GlobalArg("map1", shape=(10, 10), dtype=int),
+            ...
+            ],
+        target=lp.CTarget())
+
+    knl = lp.prioritize_loops(knl, "i,j,k")
+
+    with pytest.raises(LoopyError):
+        knl = lp.add_prefetch(knl, "map1[:, j]")
+
+
 if __name__ == "__main__":
     if len(sys.argv) > 1:
         exec(sys.argv[1])