diff --git a/patches/loopy/0001-Allow-using-globalargs-as-base-storage.patch b/patches/loopy/0001-Allow-using-globalargs-as-base-storage.patch
new file mode 100644
index 0000000000000000000000000000000000000000..f4556ca85790a44598be640883eac8524eccc7b8
--- /dev/null
+++ b/patches/loopy/0001-Allow-using-globalargs-as-base-storage.patch
@@ -0,0 +1,63 @@
+From b15ad57a11b774bde714f058c85248990c461048 Mon Sep 17 00:00:00 2001
+From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
+Date: Tue, 23 May 2017 12:55:25 +0200
+Subject: [PATCH] Allow using globalargs as base storage
+
+---
+ loopy/preprocess.py        |  2 +-
+ loopy/target/c/__init__.py | 23 ++++++++++++-----------
+ 2 files changed, 13 insertions(+), 12 deletions(-)
+
+diff --git a/loopy/preprocess.py b/loopy/preprocess.py
+index 17226b6..65a9df1 100644
+--- a/loopy/preprocess.py
++++ b/loopy/preprocess.py
+@@ -165,7 +165,7 @@ def find_temporary_scope(kernel):
+     for temp_var in six.itervalues(kernel.temporary_variables):
+         if temp_var.base_storage is not None:
+             # no nesting allowed
+-            if temp_var.base_storage in kernel_var_names:
++            if temp_var.base_storage in kernel.temporary_variables:
+                 raise LoopyError("base_storage for temporary '%s' is '%s', "
+                         "which is an existing variable name"
+                         % (temp_var.name, temp_var.base_storage))
+diff --git a/loopy/target/c/__init__.py b/loopy/target/c/__init__.py
+index e4835a3..7c6a617 100644
+--- a/loopy/target/c/__init__.py
++++ b/loopy/target/c/__init__.py
+@@ -439,20 +439,21 @@ class CASTBuilder(ASTBuilderBase):
+                 assert tv.initializer is None
+ 
+                 offset = 0
+-                base_storage_sizes.setdefault(tv.base_storage, []).append(
+-                        tv.nbytes)
+-                base_storage_to_scope.setdefault(tv.base_storage, []).append(
+-                        tv.scope)
++                if not tv.base_storage in kernel.arguments:
++                    base_storage_sizes.setdefault(tv.base_storage, []).append(
++                            tv.nbytes)
++                    base_storage_to_scope.setdefault(tv.base_storage, []).append(
++                            tv.scope)
+ 
+-                align_size = tv.dtype.itemsize
++                    align_size = tv.dtype.itemsize
+ 
+-                from loopy.kernel.array import VectorArrayDimTag
+-                for dim_tag, axis_len in zip(tv.dim_tags, tv.shape):
+-                    if isinstance(dim_tag, VectorArrayDimTag):
+-                        align_size *= axis_len
++                    from loopy.kernel.array import VectorArrayDimTag
++                    for dim_tag, axis_len in zip(tv.dim_tags, tv.shape):
++                        if isinstance(dim_tag, VectorArrayDimTag):
++                            align_size *= axis_len
+ 
+-                base_storage_to_align_bytes.setdefault(tv.base_storage, []).append(
+-                        align_size)
++                    base_storage_to_align_bytes.setdefault(tv.base_storage, []).append(
++                            align_size)
+ 
+                 for idi in decl_info:
+                     cast_decl = POD(self, idi.dtype, "")
+-- 
+2.1.4
+