diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index aa48093..bfa5894 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -498,7 +498,7 @@
 		auto typeId = baseObject.definition.word(1);
 
 		if (baseObject.kind == Object::Kind::Value)
-			res += As<Int4>((*routine->lvalues[id])[0]);
+			res += As<Int4>(routine->getValue(id)[0]);
 
 		for (auto i = 0u; i < numIndexes; i++)
 		{
@@ -525,7 +525,7 @@
 				if (obj.kind == Object::Kind::Constant)
 					res += Int4(stride * GetConstantInt(indexIds[i]));
 				else
-					res += Int4(stride) * As<Int4>((*(routine->lvalues)[indexIds[i]])[0]);
+					res += Int4(stride) * As<Int4>(routine->getValue(indexIds[i])[0]);
 				break;
 			}
 
@@ -685,12 +685,12 @@
 					UNIMPLEMENTED("Descriptor-backed load not yet implemented");
 				}
 
-				SpirvRoutine::Value& ptrBase = *(routine->lvalues)[pointer.pointerBase];
-				auto & dst = *(routine->lvalues)[insn.word(2)];
+				SpirvRoutine::Value& ptrBase = routine->getValue(pointer.pointerBase);
+				auto & dst = routine->getValue(insn.word(2));
 
 				if (pointer.kind == Object::Kind::Value)
 				{
-					auto offsets = As<Int4>(*(routine->lvalues)[insn.word(3)]);
+					auto offsets = As<Int4>(routine->getValue(insn.word(3)));
 					for (auto i = 0u; i < object.sizeInComponents; i++)
 					{
 						// i wish i had a Float,Float,Float,Float constructor here..
@@ -732,7 +732,7 @@
 					UNIMPLEMENTED("Descriptor-backed OpAccessChain not yet implemented");
 				}
 
-				auto & dst = *(routine->lvalues)[insn.word(2)];
+				auto & dst = routine->getValue(insn.word(2));
 				dst[0] = As<Float4>(WalkAccessChain(insn.word(3), insn.wordCount() - 4, insn.wordPointer(4), routine));
 				break;
 			}
@@ -754,12 +754,12 @@
 					UNIMPLEMENTED("Descriptor-backed store not yet implemented");
 				}
 
-				SpirvRoutine::Value& ptrBase = *(routine->lvalues)[pointer.pointerBase];
-				auto & src = *(routine->lvalues)[insn.word(2)];
+				SpirvRoutine::Value& ptrBase = routine->getValue(pointer.pointerBase);
+				auto & src = routine->getValue(insn.word(2));;
 
 				if (pointer.kind == Object::Kind::Value)
 				{
-					auto offsets = As<Int4>(*(routine->lvalues)[insn.word(1)]);
+					auto offsets = As<Int4>(routine->getValue(insn.word(1)));
 					for (auto i = 0u; i < object.sizeInComponents; i++)
 					{
 						// Scattered store
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp
index 86dfaed..b2a3b3a 100644
--- a/src/Pipeline/SpirvShader.hpp
+++ b/src/Pipeline/SpirvShader.hpp
@@ -42,6 +42,13 @@
 		{
 			lvalues.emplace(id, std::unique_ptr<Value>(new Value(size)));
 		}
+
+		Value& getValue(uint32_t id)
+		{
+			auto it = lvalues.find(id);
+			assert(it != lvalues.end());
+			return *it->second;
+		}
 	};
 
 	class SpirvShader
diff --git a/src/Pipeline/VertexProgram.cpp b/src/Pipeline/VertexProgram.cpp
index b8ccf34..54cd408 100644
--- a/src/Pipeline/VertexProgram.cpp
+++ b/src/Pipeline/VertexProgram.cpp
@@ -37,7 +37,7 @@
 		{
 			// TODO: we could do better here; we know InstanceIndex is uniform across all lanes
 			assert(it->second.SizeInComponents == 1);
-			(*routine.lvalues[it->second.Id])[it->second.FirstComponent] =
+			routine.getValue(it->second.Id)[it->second.FirstComponent] =
 					As<Float4>(Int4((*Pointer<Int>(data + OFFSET(DrawData, instanceID)))));
 		}
 	}
@@ -56,7 +56,7 @@
 		if (it != spirvShader->inputBuiltins.end())
 		{
 			assert(it->second.SizeInComponents == 1);
-			(*routine.lvalues[it->second.Id])[it->second.FirstComponent] =
+			routine.getValue(it->second.Id)[it->second.FirstComponent] =
 					As<Float4>(Int4(index) + Int4(0, 1, 2, 3));
 		}
 
diff --git a/src/Pipeline/VertexRoutine.cpp b/src/Pipeline/VertexRoutine.cpp
index 5b476f7..82d38d5 100644
--- a/src/Pipeline/VertexRoutine.cpp
+++ b/src/Pipeline/VertexRoutine.cpp
@@ -107,7 +107,7 @@
 		auto it = spirvShader->outputBuiltins.find(spv::BuiltInPosition);
 		assert(it != spirvShader->outputBuiltins.end());
 		assert(it->second.SizeInComponents == 4);
-		auto &pos = (*routine.lvalues[it->second.Id]);
+		auto &pos = routine.getValue(it->second.Id);
 		auto posX = pos[it->second.FirstComponent];
 		auto posY = pos[it->second.FirstComponent + 1];
 		auto posZ = pos[it->second.FirstComponent + 2];
@@ -640,7 +640,7 @@
 		auto it = spirvShader->outputBuiltins.find(spv::BuiltInPosition);
 		assert(it != spirvShader->outputBuiltins.end());
 		assert(it->second.SizeInComponents == 4);
-		auto &pos = (*routine.lvalues[it->second.Id]);
+		auto &pos = routine.getValue(it->second.Id);
 		auto posX = pos[it->second.FirstComponent];
 		auto posY = pos[it->second.FirstComponent + 1];
 		auto posZ = pos[it->second.FirstComponent + 2];
