diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp
index 34f9b03..4aaaa61 100644
--- a/src/Pipeline/SpirvShader.hpp
+++ b/src/Pipeline/SpirvShader.hpp
@@ -92,13 +92,13 @@
 		UInt
 	};
 
-	void move(uint32_t i, RValue<SIMD::Float> &&scalar) { emplace(i, scalar.value, TypeHint::Float); }
-	void move(uint32_t i, RValue<SIMD::Int> &&scalar) { emplace(i, scalar.value, TypeHint::Int); }
-	void move(uint32_t i, RValue<SIMD::UInt> &&scalar) { emplace(i, scalar.value, TypeHint::UInt); }
+	void move(uint32_t i, RValue<SIMD::Float> &&scalar) { emplace(i, scalar.value(), TypeHint::Float); }
+	void move(uint32_t i, RValue<SIMD::Int> &&scalar) { emplace(i, scalar.value(), TypeHint::Int); }
+	void move(uint32_t i, RValue<SIMD::UInt> &&scalar) { emplace(i, scalar.value(), TypeHint::UInt); }
 
-	void move(uint32_t i, const RValue<SIMD::Float> &scalar) { emplace(i, scalar.value, TypeHint::Float); }
-	void move(uint32_t i, const RValue<SIMD::Int> &scalar) { emplace(i, scalar.value, TypeHint::Int); }
-	void move(uint32_t i, const RValue<SIMD::UInt> &scalar) { emplace(i, scalar.value, TypeHint::UInt); }
+	void move(uint32_t i, const RValue<SIMD::Float> &scalar) { emplace(i, scalar.value(), TypeHint::Float); }
+	void move(uint32_t i, const RValue<SIMD::Int> &scalar) { emplace(i, scalar.value(), TypeHint::Int); }
+	void move(uint32_t i, const RValue<SIMD::UInt> &scalar) { emplace(i, scalar.value(), TypeHint::UInt); }
 
 	// Value retrieval functions.
 	RValue<SIMD::Float> Float(uint32_t i) const
@@ -912,8 +912,8 @@
 		          spv::ExecutionModel executionModel)
 		    : routine(routine)
 		    , function(function)
-		    , activeLaneMaskValue(activeLaneMask.value)
-		    , storesAndAtomicsMaskValue(storesAndAtomicsMask.value)
+		    , activeLaneMaskValue(activeLaneMask.value())
+		    , storesAndAtomicsMaskValue(storesAndAtomicsMask.value())
 		    , descriptorSets(descriptorSets)
 		    , robustBufferAccess(robustBufferAccess)
 		    , executionModel(executionModel)
diff --git a/src/Pipeline/SpirvShaderControlFlow.cpp b/src/Pipeline/SpirvShaderControlFlow.cpp
index 16f329c..a0ee8b2 100644
--- a/src/Pipeline/SpirvShaderControlFlow.cpp
+++ b/src/Pipeline/SpirvShaderControlFlow.cpp
@@ -481,7 +481,7 @@
 	// Loop body now done.
 	// If any lanes are still active, jump back to the loop header,
 	// otherwise jump to the merge block.
-	Nucleus::createCondBr(AnyTrue(loopActiveLaneMask).value, headerBasicBlock, mergeBasicBlock);
+	Nucleus::createCondBr(AnyTrue(loopActiveLaneMask).value(), headerBasicBlock, mergeBasicBlock);
 
 	// Continue emitting from the merge block.
 	Nucleus::setInsertBlock(mergeBasicBlock);
@@ -728,7 +728,7 @@
 
 void SpirvShader::SetActiveLaneMask(RValue<SIMD::Int> mask, EmitState *state) const
 {
-	state->activeLaneMaskValue = mask.value;
+	state->activeLaneMaskValue = mask.value();
 	dbgUpdateActiveLaneMask(mask, state);
 }
 
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp
index d254aea..9e5ad40 100644
--- a/src/Reactor/LLVMReactor.cpp
+++ b/src/Reactor/LLVMReactor.cpp
@@ -921,7 +921,7 @@
 
 RValue<Float4> operator%(RValue<Float4> lhs, RValue<Float4> rhs)
 {
-	return RValue<Float4>(Nucleus::createFRem(lhs.value, rhs.value));
+	return RValue<Float4>(Nucleus::createFRem(lhs.value(), rhs.value()));
 }
 
 Value *Nucleus::createShl(Value *lhs, Value *rhs)
@@ -1231,22 +1231,22 @@
 
 RValue<Float4> Gather(RValue<Pointer<Float>> base, RValue<Int4> offsets, RValue<Int4> mask, unsigned int alignment, bool zeroMaskedLanes /* = false */)
 {
-	return As<Float4>(V(createGather(V(base.value), T(Float::type()), V(offsets.value), V(mask.value), alignment, zeroMaskedLanes)));
+	return As<Float4>(V(createGather(V(base.value()), T(Float::type()), V(offsets.value()), V(mask.value()), alignment, zeroMaskedLanes)));
 }
 
 RValue<Int4> Gather(RValue<Pointer<Int>> base, RValue<Int4> offsets, RValue<Int4> mask, unsigned int alignment, bool zeroMaskedLanes /* = false */)
 {
-	return As<Int4>(V(createGather(V(base.value), T(Float::type()), V(offsets.value), V(mask.value), alignment, zeroMaskedLanes)));
+	return As<Int4>(V(createGather(V(base.value()), T(Float::type()), V(offsets.value()), V(mask.value()), alignment, zeroMaskedLanes)));
 }
 
 void Scatter(RValue<Pointer<Float>> base, RValue<Float4> val, RValue<Int4> offsets, RValue<Int4> mask, unsigned int alignment)
 {
-	return createScatter(V(base.value), V(val.value), V(offsets.value), V(mask.value), alignment);
+	return createScatter(V(base.value()), V(val.value()), V(offsets.value()), V(mask.value()), alignment);
 }
 
 void Scatter(RValue<Pointer<Int>> base, RValue<Int4> val, RValue<Int4> offsets, RValue<Int4> mask, unsigned int alignment)
 {
-	return createScatter(V(base.value), V(val.value), V(offsets.value), V(mask.value), alignment);
+	return createScatter(V(base.value()), V(val.value()), V(offsets.value()), V(mask.value()), alignment);
 }
 
 void Nucleus::createFence(std::memory_order memoryOrder)
@@ -1832,7 +1832,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::paddusb(x, y);
 #else
-	return As<Byte8>(V(lowerPUADDSAT(V(x.value), V(y.value))));
+	return As<Byte8>(V(lowerPUADDSAT(V(x.value()), V(y.value()))));
 #endif
 }
 
@@ -1842,7 +1842,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::psubusb(x, y);
 #else
-	return As<Byte8>(V(lowerPUSUBSAT(V(x.value), V(y.value))));
+	return As<Byte8>(V(lowerPUSUBSAT(V(x.value()), V(y.value()))));
 #endif
 }
 
@@ -1852,7 +1852,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::pmovmskb(x);
 #else
-	return As<Int>(V(lowerSignMask(V(x.value), T(Int::type()))));
+	return As<Int>(V(lowerSignMask(V(x.value()), T(Int::type()))));
 #endif
 }
 
@@ -1861,7 +1861,7 @@
 //#if defined(__i386__) || defined(__x86_64__)
 //		return x86::pcmpgtb(x, y);   // FIXME: Signedness
 //#else
-//		return As<Byte8>(V(lowerPCMP(llvm::ICmpInst::ICMP_SGT, V(x.value), V(y.value), T(Byte8::type()))));
+//		return As<Byte8>(V(lowerPCMP(llvm::ICmpInst::ICMP_SGT, V(x.value()), V(y.value()), T(Byte8::type()))));
 //#endif
 //	}
 
@@ -1871,7 +1871,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::pcmpeqb(x, y);
 #else
-	return As<Byte8>(V(lowerPCMP(llvm::ICmpInst::ICMP_EQ, V(x.value), V(y.value), T(Byte8::type()))));
+	return As<Byte8>(V(lowerPCMP(llvm::ICmpInst::ICMP_EQ, V(x.value()), V(y.value()), T(Byte8::type()))));
 #endif
 }
 
@@ -1886,7 +1886,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::paddsb(x, y);
 #else
-	return As<SByte8>(V(lowerPSADDSAT(V(x.value), V(y.value))));
+	return As<SByte8>(V(lowerPSADDSAT(V(x.value()), V(y.value()))));
 #endif
 }
 
@@ -1896,7 +1896,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::psubsb(x, y);
 #else
-	return As<SByte8>(V(lowerPSSUBSAT(V(x.value), V(y.value))));
+	return As<SByte8>(V(lowerPSSUBSAT(V(x.value()), V(y.value()))));
 #endif
 }
 
@@ -1906,7 +1906,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::pmovmskb(As<Byte8>(x));
 #else
-	return As<Int>(V(lowerSignMask(V(x.value), T(Int::type()))));
+	return As<Int>(V(lowerSignMask(V(x.value()), T(Int::type()))));
 #endif
 }
 
@@ -1916,7 +1916,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::pcmpgtb(x, y);
 #else
-	return As<Byte8>(V(lowerPCMP(llvm::ICmpInst::ICMP_SGT, V(x.value), V(y.value), T(Byte8::type()))));
+	return As<Byte8>(V(lowerPCMP(llvm::ICmpInst::ICMP_SGT, V(x.value()), V(y.value()), T(Byte8::type()))));
 #endif
 }
 
@@ -1926,7 +1926,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::pcmpeqb(As<Byte8>(x), As<Byte8>(y));
 #else
-	return As<Byte8>(V(lowerPCMP(llvm::ICmpInst::ICMP_EQ, V(x.value), V(y.value), T(Byte8::type()))));
+	return As<Byte8>(V(lowerPCMP(llvm::ICmpInst::ICMP_EQ, V(x.value()), V(y.value()), T(Byte8::type()))));
 #endif
 }
 
@@ -1959,10 +1959,10 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	int select[8] = { 0, 2, 4, 6, 0, 2, 4, 6 };
-	Value *short8 = Nucleus::createBitCast(cast.value, Short8::type());
+	Value *short8 = Nucleus::createBitCast(cast.value(), Short8::type());
 
 	Value *packed = Nucleus::createShuffleVector(short8, short8, select);
-	Value *short4 = As<Short4>(Int2(As<Int4>(packed))).value;
+	Value *short4 = As<Short4>(Int2(As<Int4>(packed))).value();
 
 	storeValue(short4);
 }
@@ -1982,18 +1982,18 @@
 	v4i32 = As<Int4>(V(lowerPack(V(v), V(v), true)));
 #endif
 
-	storeValue(As<Short4>(Int2(v4i32)).value);
+	storeValue(As<Short4>(Int2(v4i32)).value());
 }
 
 RValue<Short4> operator<<(RValue<Short4> lhs, unsigned char rhs)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 #if defined(__i386__) || defined(__x86_64__)
-	//	return RValue<Short4>(Nucleus::createShl(lhs.value, rhs.value));
+	//	return RValue<Short4>(Nucleus::createShl(lhs.value(), rhs.value()));
 
 	return x86::psllw(lhs, rhs);
 #else
-	return As<Short4>(V(lowerVectorShl(V(lhs.value), rhs)));
+	return As<Short4>(V(lowerVectorShl(V(lhs.value()), rhs)));
 #endif
 }
 
@@ -2003,7 +2003,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::psraw(lhs, rhs);
 #else
-	return As<Short4>(V(lowerVectorAShr(V(lhs.value), rhs)));
+	return As<Short4>(V(lowerVectorAShr(V(lhs.value()), rhs)));
 #endif
 }
 
@@ -2013,7 +2013,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::pmaxsw(x, y);
 #else
-	return RValue<Short4>(V(lowerPMINMAX(V(x.value), V(y.value), llvm::ICmpInst::ICMP_SGT)));
+	return RValue<Short4>(V(lowerPMINMAX(V(x.value()), V(y.value()), llvm::ICmpInst::ICMP_SGT)));
 #endif
 }
 
@@ -2023,7 +2023,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::pminsw(x, y);
 #else
-	return RValue<Short4>(V(lowerPMINMAX(V(x.value), V(y.value), llvm::ICmpInst::ICMP_SLT)));
+	return RValue<Short4>(V(lowerPMINMAX(V(x.value()), V(y.value()), llvm::ICmpInst::ICMP_SLT)));
 #endif
 }
 
@@ -2033,7 +2033,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::paddsw(x, y);
 #else
-	return As<Short4>(V(lowerPSADDSAT(V(x.value), V(y.value))));
+	return As<Short4>(V(lowerPSADDSAT(V(x.value()), V(y.value()))));
 #endif
 }
 
@@ -2043,7 +2043,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::psubsw(x, y);
 #else
-	return As<Short4>(V(lowerPSSUBSAT(V(x.value), V(y.value))));
+	return As<Short4>(V(lowerPSSUBSAT(V(x.value()), V(y.value()))));
 #endif
 }
 
@@ -2053,7 +2053,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::pmulhw(x, y);
 #else
-	return As<Short4>(V(lowerMulHigh(V(x.value), V(y.value), true)));
+	return As<Short4>(V(lowerMulHigh(V(x.value()), V(y.value()), true)));
 #endif
 }
 
@@ -2063,7 +2063,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::pmaddwd(x, y);
 #else
-	return As<Int2>(V(lowerMulAdd(V(x.value), V(y.value))));
+	return As<Int2>(V(lowerMulAdd(V(x.value()), V(y.value()))));
 #endif
 }
 
@@ -2073,7 +2073,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	auto result = x86::packsswb(x, y);
 #else
-	auto result = V(lowerPack(V(x.value), V(y.value), true));
+	auto result = V(lowerPack(V(x.value()), V(y.value()), true));
 #endif
 	return As<SByte8>(Swizzle(As<Int4>(result), 0x0202));
 }
@@ -2084,7 +2084,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	auto result = x86::packuswb(x, y);
 #else
-	auto result = V(lowerPack(V(x.value), V(y.value), false));
+	auto result = V(lowerPack(V(x.value()), V(y.value()), false));
 #endif
 	return As<Byte8>(Swizzle(As<Int4>(result), 0x0202));
 }
@@ -2095,7 +2095,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::pcmpgtw(x, y);
 #else
-	return As<Short4>(V(lowerPCMP(llvm::ICmpInst::ICMP_SGT, V(x.value), V(y.value), T(Short4::type()))));
+	return As<Short4>(V(lowerPCMP(llvm::ICmpInst::ICMP_SGT, V(x.value()), V(y.value()), T(Short4::type()))));
 #endif
 }
 
@@ -2105,7 +2105,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::pcmpeqw(x, y);
 #else
-	return As<Short4>(V(lowerPCMP(llvm::ICmpInst::ICMP_EQ, V(x.value), V(y.value), T(Short4::type()))));
+	return As<Short4>(V(lowerPCMP(llvm::ICmpInst::ICMP_EQ, V(x.value()), V(y.value()), T(Short4::type()))));
 #endif
 }
 
@@ -2141,11 +2141,11 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 #if defined(__i386__) || defined(__x86_64__)
-	//	return RValue<Short4>(Nucleus::createShl(lhs.value, rhs.value));
+	//	return RValue<Short4>(Nucleus::createShl(lhs.value(), rhs.value()));
 
 	return As<UShort4>(x86::psllw(As<Short4>(lhs), rhs));
 #else
-	return As<UShort4>(V(lowerVectorShl(V(lhs.value), rhs)));
+	return As<UShort4>(V(lowerVectorShl(V(lhs.value()), rhs)));
 #endif
 }
 
@@ -2153,11 +2153,11 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 #if defined(__i386__) || defined(__x86_64__)
-	//	return RValue<Short4>(Nucleus::createLShr(lhs.value, rhs.value));
+	//	return RValue<Short4>(Nucleus::createLShr(lhs.value(), rhs.value()));
 
 	return x86::psrlw(lhs, rhs);
 #else
-	return As<UShort4>(V(lowerVectorLShr(V(lhs.value), rhs)));
+	return As<UShort4>(V(lowerVectorLShr(V(lhs.value()), rhs)));
 #endif
 }
 
@@ -2179,7 +2179,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::paddusw(x, y);
 #else
-	return As<UShort4>(V(lowerPUADDSAT(V(x.value), V(y.value))));
+	return As<UShort4>(V(lowerPUADDSAT(V(x.value()), V(y.value()))));
 #endif
 }
 
@@ -2189,7 +2189,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::psubusw(x, y);
 #else
-	return As<UShort4>(V(lowerPUSUBSAT(V(x.value), V(y.value))));
+	return As<UShort4>(V(lowerPUSUBSAT(V(x.value()), V(y.value()))));
 #endif
 }
 
@@ -2199,7 +2199,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::pmulhuw(x, y);
 #else
-	return As<UShort4>(V(lowerMulHigh(V(x.value), V(y.value), false)));
+	return As<UShort4>(V(lowerMulHigh(V(x.value()), V(y.value()), false)));
 #endif
 }
 
@@ -2209,7 +2209,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::pavgw(x, y);
 #else
-	return As<UShort4>(V(lowerPAVG(V(x.value), V(y.value))));
+	return As<UShort4>(V(lowerPAVG(V(x.value()), V(y.value()))));
 #endif
 }
 
@@ -2224,7 +2224,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::psllw(lhs, rhs);
 #else
-	return As<Short8>(V(lowerVectorShl(V(lhs.value), rhs)));
+	return As<Short8>(V(lowerVectorShl(V(lhs.value()), rhs)));
 #endif
 }
 
@@ -2234,7 +2234,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::psraw(lhs, rhs);
 #else
-	return As<Short8>(V(lowerVectorAShr(V(lhs.value), rhs)));
+	return As<Short8>(V(lowerVectorAShr(V(lhs.value()), rhs)));
 #endif
 }
 
@@ -2244,7 +2244,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::pmaddwd(x, y);
 #else
-	return As<Int4>(V(lowerMulAdd(V(x.value), V(y.value))));
+	return As<Int4>(V(lowerMulAdd(V(x.value()), V(y.value()))));
 #endif
 }
 
@@ -2254,7 +2254,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::pmulhw(x, y);
 #else
-	return As<Short8>(V(lowerMulHigh(V(x.value), V(y.value), true)));
+	return As<Short8>(V(lowerMulHigh(V(x.value()), V(y.value()), true)));
 #endif
 }
 
@@ -2269,7 +2269,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return As<UShort8>(x86::psllw(As<Short8>(lhs), rhs));
 #else
-	return As<UShort8>(V(lowerVectorShl(V(lhs.value), rhs)));
+	return As<UShort8>(V(lowerVectorShl(V(lhs.value()), rhs)));
 #endif
 }
 
@@ -2279,7 +2279,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::psrlw(lhs, rhs);  // FIXME: Fallback required
 #else
-	return As<UShort8>(V(lowerVectorLShr(V(lhs.value), rhs)));
+	return As<UShort8>(V(lowerVectorLShr(V(lhs.value()), rhs)));
 #endif
 }
 
@@ -2289,7 +2289,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::pmulhuw(x, y);
 #else
-	return As<UShort8>(V(lowerMulHigh(V(x.value), V(y.value), false)));
+	return As<UShort8>(V(lowerMulHigh(V(x.value()), V(y.value()), false)));
 #endif
 }
 
@@ -2303,7 +2303,7 @@
 	RR_DEBUG_INFO_UPDATE_LOC();
 	RValue<Int> res = val;
 
-	Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantInt(1));
+	Value *inc = Nucleus::createAdd(res.value(), Nucleus::createConstantInt(1));
 	val.storeValue(inc);
 
 	return res;
@@ -2323,7 +2323,7 @@
 	RR_DEBUG_INFO_UPDATE_LOC();
 	RValue<Int> res = val;
 
-	Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantInt(1));
+	Value *inc = Nucleus::createSub(res.value(), Nucleus::createConstantInt(1));
 	val.storeValue(inc);
 
 	return res;
@@ -2344,7 +2344,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::cvtss2si(cast);
 #else
-	return RValue<Int>(V(lowerRoundInt(V(cast.value), T(Int::type()))));
+	return RValue<Int>(V(lowerRoundInt(V(cast.value()), T(Int::type()))));
 #endif
 }
 
@@ -2361,7 +2361,7 @@
 UInt::UInt(RValue<Float> cast)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	Value *integer = Nucleus::createFPToUI(cast.value, UInt::type());
+	Value *integer = Nucleus::createFPToUI(cast.value(), UInt::type());
 	storeValue(integer);
 }
 
@@ -2370,7 +2370,7 @@
 	RR_DEBUG_INFO_UPDATE_LOC();
 	RValue<UInt> res = val;
 
-	Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantInt(1));
+	Value *inc = Nucleus::createAdd(res.value(), Nucleus::createConstantInt(1));
 	val.storeValue(inc);
 
 	return res;
@@ -2390,7 +2390,7 @@
 	RR_DEBUG_INFO_UPDATE_LOC();
 	RValue<UInt> res = val;
 
-	Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantInt(1));
+	Value *inc = Nucleus::createSub(res.value(), Nucleus::createConstantInt(1));
 	val.storeValue(inc);
 
 	return res;
@@ -2421,7 +2421,7 @@
 
 //	Int2::Int2(RValue<Int> cast)
 //	{
-//		Value *extend = Nucleus::createZExt(cast.value, Long::type());
+//		Value *extend = Nucleus::createZExt(cast.value(), Long::type());
 //		Value *vector = Nucleus::createBitCast(extend, Int2::type());
 //
 //		int shuffle[2] = {0, 0};
@@ -2434,11 +2434,11 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 #if defined(__i386__) || defined(__x86_64__)
-	//	return RValue<Int2>(Nucleus::createShl(lhs.value, rhs.value));
+	//	return RValue<Int2>(Nucleus::createShl(lhs.value(), rhs.value()));
 
 	return x86::pslld(lhs, rhs);
 #else
-	return As<Int2>(V(lowerVectorShl(V(lhs.value), rhs)));
+	return As<Int2>(V(lowerVectorShl(V(lhs.value()), rhs)));
 #endif
 }
 
@@ -2446,11 +2446,11 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 #if defined(__i386__) || defined(__x86_64__)
-	//	return RValue<Int2>(Nucleus::createAShr(lhs.value, rhs.value));
+	//	return RValue<Int2>(Nucleus::createAShr(lhs.value(), rhs.value()));
 
 	return x86::psrad(lhs, rhs);
 #else
-	return As<Int2>(V(lowerVectorAShr(V(lhs.value), rhs)));
+	return As<Int2>(V(lowerVectorAShr(V(lhs.value()), rhs)));
 #endif
 }
 
@@ -2463,11 +2463,11 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 #if defined(__i386__) || defined(__x86_64__)
-	//	return RValue<UInt2>(Nucleus::createShl(lhs.value, rhs.value));
+	//	return RValue<UInt2>(Nucleus::createShl(lhs.value(), rhs.value()));
 
 	return As<UInt2>(x86::pslld(As<Int2>(lhs), rhs));
 #else
-	return As<UInt2>(V(lowerVectorShl(V(lhs.value), rhs)));
+	return As<UInt2>(V(lowerVectorShl(V(lhs.value()), rhs)));
 #endif
 }
 
@@ -2475,11 +2475,11 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 #if defined(__i386__) || defined(__x86_64__)
-	//	return RValue<UInt2>(Nucleus::createLShr(lhs.value, rhs.value));
+	//	return RValue<UInt2>(Nucleus::createLShr(lhs.value(), rhs.value()));
 
 	return x86::psrld(lhs, rhs);
 #else
-	return As<UInt2>(V(lowerVectorLShr(V(lhs.value), rhs)));
+	return As<UInt2>(V(lowerVectorLShr(V(lhs.value()), rhs)));
 #endif
 }
 
@@ -2501,7 +2501,7 @@
 #endif
 	{
 		int swizzle[16] = { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 };
-		Value *a = Nucleus::createBitCast(cast.value, Byte16::type());
+		Value *a = Nucleus::createBitCast(cast.value(), Byte16::type());
 		Value *b = Nucleus::createShuffleVector(a, Nucleus::createNullValue(Byte16::type()), swizzle);
 
 		int swizzle2[8] = { 0, 8, 1, 9, 2, 10, 3, 11 };
@@ -2525,7 +2525,7 @@
 #endif
 	{
 		int swizzle[16] = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };
-		Value *a = Nucleus::createBitCast(cast.value, Byte16::type());
+		Value *a = Nucleus::createBitCast(cast.value(), Byte16::type());
 		Value *b = Nucleus::createShuffleVector(a, a, swizzle);
 
 		int swizzle2[8] = { 0, 0, 1, 1, 2, 2, 3, 3 };
@@ -2549,7 +2549,7 @@
 #endif
 	{
 		int swizzle[8] = { 0, 0, 1, 1, 2, 2, 3, 3 };
-		Value *c = Nucleus::createShuffleVector(cast.value, cast.value, swizzle);
+		Value *c = Nucleus::createShuffleVector(cast.value(), cast.value(), swizzle);
 		*this = As<Int4>(c) >> 16;
 	}
 }
@@ -2567,7 +2567,7 @@
 #endif
 	{
 		int swizzle[8] = { 0, 8, 1, 9, 2, 10, 3, 11 };
-		Value *c = Nucleus::createShuffleVector(cast.value, Short8(0, 0, 0, 0, 0, 0, 0, 0).loadValue(), swizzle);
+		Value *c = Nucleus::createShuffleVector(cast.value(), Short8(0, 0, 0, 0, 0, 0, 0, 0).loadValue(), swizzle);
 		*this = As<Int4>(c);
 	}
 }
@@ -2577,7 +2577,7 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	Value *vector = loadValue();
-	Value *insert = Nucleus::createInsertElement(vector, rhs.value, 0);
+	Value *insert = Nucleus::createInsertElement(vector, rhs.value(), 0);
 
 	int swizzle[4] = { 0, 0, 0, 0 };
 	Value *replicate = Nucleus::createShuffleVector(insert, insert, swizzle);
@@ -2591,7 +2591,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::pslld(lhs, rhs);
 #else
-	return As<Int4>(V(lowerVectorShl(V(lhs.value), rhs)));
+	return As<Int4>(V(lowerVectorShl(V(lhs.value()), rhs)));
 #endif
 }
 
@@ -2601,44 +2601,44 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::psrad(lhs, rhs);
 #else
-	return As<Int4>(V(lowerVectorAShr(V(lhs.value), rhs)));
+	return As<Int4>(V(lowerVectorAShr(V(lhs.value()), rhs)));
 #endif
 }
 
 RValue<Int4> CmpEQ(RValue<Int4> x, RValue<Int4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpEQ(x.value, y.value), Int4::type()));
+	return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpEQ(x.value(), y.value()), Int4::type()));
 }
 
 RValue<Int4> CmpLT(RValue<Int4> x, RValue<Int4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSLT(x.value, y.value), Int4::type()));
+	return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSLT(x.value(), y.value()), Int4::type()));
 }
 
 RValue<Int4> CmpLE(RValue<Int4> x, RValue<Int4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSLE(x.value, y.value), Int4::type()));
+	return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSLE(x.value(), y.value()), Int4::type()));
 }
 
 RValue<Int4> CmpNEQ(RValue<Int4> x, RValue<Int4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpNE(x.value, y.value), Int4::type()));
+	return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpNE(x.value(), y.value()), Int4::type()));
 }
 
 RValue<Int4> CmpNLT(RValue<Int4> x, RValue<Int4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSGE(x.value, y.value), Int4::type()));
+	return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSGE(x.value(), y.value()), Int4::type()));
 }
 
 RValue<Int4> CmpNLE(RValue<Int4> x, RValue<Int4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSGT(x.value, y.value), Int4::type()));
+	return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSGT(x.value(), y.value()), Int4::type()));
 }
 
 RValue<Int4> Max(RValue<Int4> x, RValue<Int4> y)
@@ -2679,7 +2679,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::cvtps2dq(cast);
 #else
-	return As<Int4>(V(lowerRoundInt(V(cast.value), T(Int4::type()))));
+	return As<Int4>(V(lowerRoundInt(V(cast.value()), T(Int4::type()))));
 #endif
 }
 
@@ -2687,14 +2687,14 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	// TODO: For x86, build an intrinsics version of this which uses shuffles + pmuludq.
-	return As<Int4>(V(lowerMulHigh(V(x.value), V(y.value), true)));
+	return As<Int4>(V(lowerMulHigh(V(x.value()), V(y.value()), true)));
 }
 
 RValue<UInt4> MulHigh(RValue<UInt4> x, RValue<UInt4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	// TODO: For x86, build an intrinsics version of this which uses shuffles + pmuludq.
-	return As<UInt4>(V(lowerMulHigh(V(x.value), V(y.value), false)));
+	return As<UInt4>(V(lowerMulHigh(V(x.value()), V(y.value()), false)));
 }
 
 RValue<Short8> PackSigned(RValue<Int4> x, RValue<Int4> y)
@@ -2703,7 +2703,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::packssdw(x, y);
 #else
-	return As<Short8>(V(lowerPack(V(x.value), V(y.value), true)));
+	return As<Short8>(V(lowerPack(V(x.value()), V(y.value()), true)));
 #endif
 }
 
@@ -2713,7 +2713,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::packusdw(x, y);
 #else
-	return As<UShort8>(V(lowerPack(V(x.value), V(y.value), false)));
+	return As<UShort8>(V(lowerPack(V(x.value()), V(y.value()), false)));
 #endif
 }
 
@@ -2723,7 +2723,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::movmskps(As<Float4>(x));
 #else
-	return As<Int>(V(lowerSignMask(V(x.value), T(Int::type()))));
+	return As<Int>(V(lowerSignMask(V(x.value()), T(Int::type()))));
 #endif
 }
 
@@ -2736,7 +2736,7 @@
     : XYZW(this)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	Value *xyzw = Nucleus::createFPToUI(cast.value, UInt4::type());
+	Value *xyzw = Nucleus::createFPToUI(cast.value(), UInt4::type());
 	storeValue(xyzw);
 }
 
@@ -2745,7 +2745,7 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	Value *vector = loadValue();
-	Value *insert = Nucleus::createInsertElement(vector, rhs.value, 0);
+	Value *insert = Nucleus::createInsertElement(vector, rhs.value(), 0);
 
 	int swizzle[4] = { 0, 0, 0, 0 };
 	Value *replicate = Nucleus::createShuffleVector(insert, insert, swizzle);
@@ -2759,7 +2759,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return As<UInt4>(x86::pslld(As<Int4>(lhs), rhs));
 #else
-	return As<UInt4>(V(lowerVectorShl(V(lhs.value), rhs)));
+	return As<UInt4>(V(lowerVectorShl(V(lhs.value()), rhs)));
 #endif
 }
 
@@ -2769,44 +2769,44 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::psrld(lhs, rhs);
 #else
-	return As<UInt4>(V(lowerVectorLShr(V(lhs.value), rhs)));
+	return As<UInt4>(V(lowerVectorLShr(V(lhs.value()), rhs)));
 #endif
 }
 
 RValue<UInt4> CmpEQ(RValue<UInt4> x, RValue<UInt4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpEQ(x.value, y.value), Int4::type()));
+	return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpEQ(x.value(), y.value()), Int4::type()));
 }
 
 RValue<UInt4> CmpLT(RValue<UInt4> x, RValue<UInt4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpULT(x.value, y.value), Int4::type()));
+	return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpULT(x.value(), y.value()), Int4::type()));
 }
 
 RValue<UInt4> CmpLE(RValue<UInt4> x, RValue<UInt4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpULE(x.value, y.value), Int4::type()));
+	return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpULE(x.value(), y.value()), Int4::type()));
 }
 
 RValue<UInt4> CmpNEQ(RValue<UInt4> x, RValue<UInt4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpNE(x.value, y.value), Int4::type()));
+	return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpNE(x.value(), y.value()), Int4::type()));
 }
 
 RValue<UInt4> CmpNLT(RValue<UInt4> x, RValue<UInt4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpUGE(x.value, y.value), Int4::type()));
+	return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpUGE(x.value(), y.value()), Int4::type()));
 }
 
 RValue<UInt4> CmpNLE(RValue<UInt4> x, RValue<UInt4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpUGT(x.value, y.value), Int4::type()));
+	return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpUGT(x.value(), y.value()), Int4::type()));
 }
 
 RValue<UInt4> Max(RValue<UInt4> x, RValue<UInt4> y)
@@ -2863,7 +2863,7 @@
 	}
 	return x86::rcpss(x);
 #else
-	return As<Float>(V(lowerRCP(V(x.value))));
+	return As<Float>(V(lowerRCP(V(x.value()))));
 #endif
 }
 
@@ -2873,7 +2873,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::rsqrtss(x);
 #else
-	return As<Float>(V(lowerRSQRT(V(x.value))));
+	return As<Float>(V(lowerRSQRT(V(x.value()))));
 #endif
 }
 
@@ -2883,7 +2883,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::sqrtss(x);
 #else
-	return As<Float>(V(lowerSQRT(V(x.value))));
+	return As<Float>(V(lowerSQRT(V(x.value()))));
 #endif
 }
 
@@ -2900,7 +2900,7 @@
 		return Float4(Round(Float4(x))).x;
 	}
 #else
-	return RValue<Float>(V(lowerRound(V(x.value))));
+	return RValue<Float>(V(lowerRound(V(x.value()))));
 #endif
 }
 
@@ -2917,7 +2917,7 @@
 		return Float(Int(x));  // Rounded toward zero
 	}
 #else
-	return RValue<Float>(V(lowerTrunc(V(x.value))));
+	return RValue<Float>(V(lowerTrunc(V(x.value()))));
 #endif
 }
 
@@ -2953,7 +2953,7 @@
 		return Float4(Floor(Float4(x))).x;
 	}
 #else
-	return RValue<Float>(V(lowerFloor(V(x.value))));
+	return RValue<Float>(V(lowerFloor(V(x.value()))));
 #endif
 }
 
@@ -2985,13 +2985,13 @@
 RValue<Float> Exp2(RValue<Float> v)
 {
 	auto func = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::exp2, { T(Float::type()) });
-	return RValue<Float>(V(jit->builder->CreateCall(func, V(v.value))));
+	return RValue<Float>(V(jit->builder->CreateCall(func, V(v.value()))));
 }
 
 RValue<Float> Log2(RValue<Float> v)
 {
 	auto func = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::log2, { T(Float::type()) });
-	return RValue<Float>(V(jit->builder->CreateCall(func, V(v.value))));
+	return RValue<Float>(V(jit->builder->CreateCall(func, V(v.value()))));
 }
 
 Float4::Float4(RValue<Float> rhs)
@@ -2999,7 +2999,7 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	Value *vector = loadValue();
-	Value *insert = Nucleus::createInsertElement(vector, rhs.value, 0);
+	Value *insert = Nucleus::createInsertElement(vector, rhs.value(), 0);
 
 	int swizzle[4] = { 0, 0, 0, 0 };
 	Value *replicate = Nucleus::createShuffleVector(insert, insert, swizzle);
@@ -3013,7 +3013,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::maxps(x, y);
 #else
-	return As<Float4>(V(lowerPFMINMAX(V(x.value), V(y.value), llvm::FCmpInst::FCMP_OGT)));
+	return As<Float4>(V(lowerPFMINMAX(V(x.value()), V(y.value()), llvm::FCmpInst::FCMP_OGT)));
 #endif
 }
 
@@ -3023,7 +3023,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::minps(x, y);
 #else
-	return As<Float4>(V(lowerPFMINMAX(V(x.value), V(y.value), llvm::FCmpInst::FCMP_OLT)));
+	return As<Float4>(V(lowerPFMINMAX(V(x.value()), V(y.value()), llvm::FCmpInst::FCMP_OLT)));
 #endif
 }
 
@@ -3039,7 +3039,7 @@
 	}
 	return x86::rcpps(x);
 #else
-	return As<Float4>(V(lowerRCP(V(x.value))));
+	return As<Float4>(V(lowerRCP(V(x.value()))));
 #endif
 }
 
@@ -3049,7 +3049,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::rsqrtps(x);
 #else
-	return As<Float4>(V(lowerRSQRT(V(x.value))));
+	return As<Float4>(V(lowerRSQRT(V(x.value()))));
 #endif
 }
 
@@ -3059,7 +3059,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::sqrtps(x);
 #else
-	return As<Float4>(V(lowerSQRT(V(x.value))));
+	return As<Float4>(V(lowerSQRT(V(x.value()))));
 #endif
 }
 
@@ -3069,7 +3069,7 @@
 #if defined(__i386__) || defined(__x86_64__)
 	return x86::movmskps(x);
 #else
-	return As<Int>(V(lowerFPSignMask(V(x.value), T(Int::type()))));
+	return As<Int>(V(lowerFPSignMask(V(x.value()), T(Int::type()))));
 #endif
 }
 
@@ -3077,78 +3077,78 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	//	return As<Int4>(x86::cmpeqps(x, y));
-	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOEQ(x.value, y.value), Int4::type()));
+	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOEQ(x.value(), y.value()), Int4::type()));
 }
 
 RValue<Int4> CmpLT(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	//	return As<Int4>(x86::cmpltps(x, y));
-	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOLT(x.value, y.value), Int4::type()));
+	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOLT(x.value(), y.value()), Int4::type()));
 }
 
 RValue<Int4> CmpLE(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	//	return As<Int4>(x86::cmpleps(x, y));
-	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOLE(x.value, y.value), Int4::type()));
+	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOLE(x.value(), y.value()), Int4::type()));
 }
 
 RValue<Int4> CmpNEQ(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	//	return As<Int4>(x86::cmpneqps(x, y));
-	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpONE(x.value, y.value), Int4::type()));
+	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpONE(x.value(), y.value()), Int4::type()));
 }
 
 RValue<Int4> CmpNLT(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	//	return As<Int4>(x86::cmpnltps(x, y));
-	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOGE(x.value, y.value), Int4::type()));
+	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOGE(x.value(), y.value()), Int4::type()));
 }
 
 RValue<Int4> CmpNLE(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	//	return As<Int4>(x86::cmpnleps(x, y));
-	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOGT(x.value, y.value), Int4::type()));
+	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOGT(x.value(), y.value()), Int4::type()));
 }
 
 RValue<Int4> CmpUEQ(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpUEQ(x.value, y.value), Int4::type()));
+	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpUEQ(x.value(), y.value()), Int4::type()));
 }
 
 RValue<Int4> CmpULT(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpULT(x.value, y.value), Int4::type()));
+	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpULT(x.value(), y.value()), Int4::type()));
 }
 
 RValue<Int4> CmpULE(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpULE(x.value, y.value), Int4::type()));
+	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpULE(x.value(), y.value()), Int4::type()));
 }
 
 RValue<Int4> CmpUNEQ(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpUNE(x.value, y.value), Int4::type()));
+	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpUNE(x.value(), y.value()), Int4::type()));
 }
 
 RValue<Int4> CmpUNLT(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpUGE(x.value, y.value), Int4::type()));
+	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpUGE(x.value(), y.value()), Int4::type()));
 }
 
 RValue<Int4> CmpUNLE(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpUGT(x.value, y.value), Int4::type()));
+	return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpUGT(x.value(), y.value()), Int4::type()));
 }
 
 RValue<Float4> Round(RValue<Float4> x)
@@ -3164,7 +3164,7 @@
 		return Float4(RoundInt(x));
 	}
 #else
-	return RValue<Float4>(V(lowerRound(V(x.value))));
+	return RValue<Float4>(V(lowerRound(V(x.value()))));
 #endif
 }
 
@@ -3181,7 +3181,7 @@
 		return Float4(Int4(x));
 	}
 #else
-	return RValue<Float4>(V(lowerTrunc(V(x.value))));
+	return RValue<Float4>(V(lowerTrunc(V(x.value()))));
 #endif
 }
 
@@ -3223,7 +3223,7 @@
 		return x - Frac(x);
 	}
 #else
-	return RValue<Float4>(V(lowerFloor(V(x.value))));
+	return RValue<Float4>(V(lowerFloor(V(x.value()))));
 #endif
 }
 
@@ -3245,15 +3245,15 @@
 RValue<Float4> Sin(RValue<Float4> v)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	auto func = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::sin, { V(v.value)->getType() });
-	return RValue<Float4>(V(jit->builder->CreateCall(func, V(v.value))));
+	auto func = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::sin, { V(v.value())->getType() });
+	return RValue<Float4>(V(jit->builder->CreateCall(func, V(v.value()))));
 }
 
 RValue<Float4> Cos(RValue<Float4> v)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	auto func = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::cos, { V(v.value)->getType() });
-	return RValue<Float4>(V(jit->builder->CreateCall(func, V(v.value))));
+	auto func = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::cos, { V(v.value())->getType() });
+	return RValue<Float4>(V(jit->builder->CreateCall(func, V(v.value()))));
 }
 
 RValue<Float4> Tan(RValue<Float4> v)
@@ -3269,7 +3269,7 @@
 	llvm::Value *out = ::llvm::UndefValue::get(T(Float4::type()));
 	for(uint64_t i = 0; i < 4; i++)
 	{
-		auto el = jit->builder->CreateCall(func, V(Nucleus::createExtractElement(v.value, Float::type(), i)));
+		auto el = jit->builder->CreateCall(func, V(Nucleus::createExtractElement(v.value(), Float::type(), i)));
 		out = V(Nucleus::createInsertElement(V(out), V(el), i));
 	}
 	return RValue<Float4>(V(out));
@@ -3341,8 +3341,8 @@
 	for(uint64_t i = 0; i < 4; i++)
 	{
 		auto el = jit->builder->CreateCall2(func, ARGS(
-		                                              V(Nucleus::createExtractElement(x.value, Float::type(), i)),
-		                                              V(Nucleus::createExtractElement(y.value, Float::type(), i))));
+		                                              V(Nucleus::createExtractElement(x.value(), Float::type(), i)),
+		                                              V(Nucleus::createExtractElement(y.value(), Float::type(), i))));
 		out = V(Nucleus::createInsertElement(V(out), V(el), i));
 	}
 	return RValue<Float4>(V(out));
@@ -3352,35 +3352,35 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	auto func = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::pow, { T(Float4::type()) });
-	return RValue<Float4>(V(jit->builder->CreateCall2(func, ARGS(V(x.value), V(y.value)))));
+	return RValue<Float4>(V(jit->builder->CreateCall2(func, ARGS(V(x.value()), V(y.value())))));
 }
 
 RValue<Float4> Exp(RValue<Float4> v)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	auto func = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::exp, { T(Float4::type()) });
-	return RValue<Float4>(V(jit->builder->CreateCall(func, V(v.value))));
+	return RValue<Float4>(V(jit->builder->CreateCall(func, V(v.value()))));
 }
 
 RValue<Float4> Log(RValue<Float4> v)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	auto func = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::log, { T(Float4::type()) });
-	return RValue<Float4>(V(jit->builder->CreateCall(func, V(v.value))));
+	return RValue<Float4>(V(jit->builder->CreateCall(func, V(v.value()))));
 }
 
 RValue<Float4> Exp2(RValue<Float4> v)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	auto func = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::exp2, { T(Float4::type()) });
-	return RValue<Float4>(V(jit->builder->CreateCall(func, V(v.value))));
+	return RValue<Float4>(V(jit->builder->CreateCall(func, V(v.value()))));
 }
 
 RValue<Float4> Log2(RValue<Float4> v)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	auto func = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::log2, { T(Float4::type()) });
-	return RValue<Float4>(V(jit->builder->CreateCall(func, V(v.value))));
+	return RValue<Float4>(V(jit->builder->CreateCall(func, V(v.value()))));
 }
 
 RValue<UInt> Ctlz(RValue<UInt> v, bool isZeroUndef)
@@ -3388,7 +3388,7 @@
 	RR_DEBUG_INFO_UPDATE_LOC();
 	auto func = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::ctlz, { T(UInt::type()) });
 	return RValue<UInt>(V(jit->builder->CreateCall2(func, ARGS(
-	                                                          V(v.value),
+	                                                          V(v.value()),
 	                                                          isZeroUndef ? ::llvm::ConstantInt::getTrue(jit->context) : ::llvm::ConstantInt::getFalse(jit->context)))));
 }
 
@@ -3397,7 +3397,7 @@
 	RR_DEBUG_INFO_UPDATE_LOC();
 	auto func = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::ctlz, { T(UInt4::type()) });
 	return RValue<UInt4>(V(jit->builder->CreateCall2(func, ARGS(
-	                                                           V(v.value),
+	                                                           V(v.value()),
 	                                                           isZeroUndef ? ::llvm::ConstantInt::getTrue(jit->context) : ::llvm::ConstantInt::getFalse(jit->context)))));
 }
 
@@ -3406,7 +3406,7 @@
 	RR_DEBUG_INFO_UPDATE_LOC();
 	auto func = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::cttz, { T(UInt::type()) });
 	return RValue<UInt>(V(jit->builder->CreateCall2(func, ARGS(
-	                                                          V(v.value),
+	                                                          V(v.value()),
 	                                                          isZeroUndef ? ::llvm::ConstantInt::getTrue(jit->context) : ::llvm::ConstantInt::getFalse(jit->context)))));
 }
 
@@ -3415,28 +3415,28 @@
 	RR_DEBUG_INFO_UPDATE_LOC();
 	auto func = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::cttz, { T(UInt4::type()) });
 	return RValue<UInt4>(V(jit->builder->CreateCall2(func, ARGS(
-	                                                           V(v.value),
+	                                                           V(v.value()),
 	                                                           isZeroUndef ? ::llvm::ConstantInt::getTrue(jit->context) : ::llvm::ConstantInt::getFalse(jit->context)))));
 }
 
 RValue<Int> MinAtomic(RValue<Pointer<Int>> x, RValue<Int> y, std::memory_order memoryOrder)
 {
-	return RValue<Int>(Nucleus::createAtomicMin(x.value, y.value, memoryOrder));
+	return RValue<Int>(Nucleus::createAtomicMin(x.value(), y.value(), memoryOrder));
 }
 
 RValue<UInt> MinAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
 {
-	return RValue<UInt>(Nucleus::createAtomicUMin(x.value, y.value, memoryOrder));
+	return RValue<UInt>(Nucleus::createAtomicUMin(x.value(), y.value(), memoryOrder));
 }
 
 RValue<Int> MaxAtomic(RValue<Pointer<Int>> x, RValue<Int> y, std::memory_order memoryOrder)
 {
-	return RValue<Int>(Nucleus::createAtomicMax(x.value, y.value, memoryOrder));
+	return RValue<Int>(Nucleus::createAtomicMax(x.value(), y.value(), memoryOrder));
 }
 
 RValue<UInt> MaxAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
 {
-	return RValue<UInt>(Nucleus::createAtomicUMax(x.value, y.value, memoryOrder));
+	return RValue<UInt>(Nucleus::createAtomicUMax(x.value(), y.value(), memoryOrder));
 }
 
 Type *Float4::type()
@@ -3477,7 +3477,7 @@
 	auto funcTy = ::llvm::FunctionType::get(T(retTy), paramTys, false);
 
 	auto funcPtrTy = funcTy->getPointerTo();
-	auto funcPtr = jit->builder->CreatePointerCast(V(fptr.value), funcPtrTy);
+	auto funcPtr = jit->builder->CreatePointerCast(V(fptr.value()), funcPtrTy);
 
 	::llvm::SmallVector<::llvm::Value *, 8> arguments;
 	for(auto arg : args) { arguments.push_back(V(arg)); }
@@ -3506,36 +3506,36 @@
 	Float4 vector;
 	vector.x = val;
 
-	return RValue<Int>(V(jit->builder->CreateCall(cvtss2si, ARGS(V(RValue<Float4>(vector).value)))));
+	return RValue<Int>(V(jit->builder->CreateCall(cvtss2si, ARGS(V(RValue<Float4>(vector).value())))));
 }
 
 RValue<Int4> cvtps2dq(RValue<Float4> val)
 {
 	llvm::Function *cvtps2dq = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_cvtps2dq);
 
-	return RValue<Int4>(V(jit->builder->CreateCall(cvtps2dq, ARGS(V(val.value)))));
+	return RValue<Int4>(V(jit->builder->CreateCall(cvtps2dq, ARGS(V(val.value())))));
 }
 
 RValue<Float> rcpss(RValue<Float> val)
 {
 	llvm::Function *rcpss = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse_rcp_ss);
 
-	Value *vector = Nucleus::createInsertElement(V(llvm::UndefValue::get(T(Float4::type()))), val.value, 0);
+	Value *vector = Nucleus::createInsertElement(V(llvm::UndefValue::get(T(Float4::type()))), val.value(), 0);
 
 	return RValue<Float>(Nucleus::createExtractElement(V(jit->builder->CreateCall(rcpss, ARGS(V(vector)))), Float::type(), 0));
 }
 
 RValue<Float> sqrtss(RValue<Float> val)
 {
-	llvm::Function *sqrt = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::sqrt, { V(val.value)->getType() });
-	return RValue<Float>(V(jit->builder->CreateCall(sqrt, ARGS(V(val.value)))));
+	llvm::Function *sqrt = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::sqrt, { V(val.value())->getType() });
+	return RValue<Float>(V(jit->builder->CreateCall(sqrt, ARGS(V(val.value())))));
 }
 
 RValue<Float> rsqrtss(RValue<Float> val)
 {
 	llvm::Function *rsqrtss = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse_rsqrt_ss);
 
-	Value *vector = Nucleus::createInsertElement(V(llvm::UndefValue::get(T(Float4::type()))), val.value, 0);
+	Value *vector = Nucleus::createInsertElement(V(llvm::UndefValue::get(T(Float4::type()))), val.value(), 0);
 
 	return RValue<Float>(Nucleus::createExtractElement(V(jit->builder->CreateCall(rsqrtss, ARGS(V(vector)))), Float::type(), 0));
 }
@@ -3544,35 +3544,35 @@
 {
 	llvm::Function *rcpps = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse_rcp_ps);
 
-	return RValue<Float4>(V(jit->builder->CreateCall(rcpps, ARGS(V(val.value)))));
+	return RValue<Float4>(V(jit->builder->CreateCall(rcpps, ARGS(V(val.value())))));
 }
 
 RValue<Float4> sqrtps(RValue<Float4> val)
 {
-	llvm::Function *sqrtps = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::sqrt, { V(val.value)->getType() });
+	llvm::Function *sqrtps = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::sqrt, { V(val.value())->getType() });
 
-	return RValue<Float4>(V(jit->builder->CreateCall(sqrtps, ARGS(V(val.value)))));
+	return RValue<Float4>(V(jit->builder->CreateCall(sqrtps, ARGS(V(val.value())))));
 }
 
 RValue<Float4> rsqrtps(RValue<Float4> val)
 {
 	llvm::Function *rsqrtps = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse_rsqrt_ps);
 
-	return RValue<Float4>(V(jit->builder->CreateCall(rsqrtps, ARGS(V(val.value)))));
+	return RValue<Float4>(V(jit->builder->CreateCall(rsqrtps, ARGS(V(val.value())))));
 }
 
 RValue<Float4> maxps(RValue<Float4> x, RValue<Float4> y)
 {
 	llvm::Function *maxps = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse_max_ps);
 
-	return RValue<Float4>(V(jit->builder->CreateCall2(maxps, ARGS(V(x.value), V(y.value)))));
+	return RValue<Float4>(V(jit->builder->CreateCall2(maxps, ARGS(V(x.value()), V(y.value())))));
 }
 
 RValue<Float4> minps(RValue<Float4> x, RValue<Float4> y)
 {
 	llvm::Function *minps = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse_min_ps);
 
-	return RValue<Float4>(V(jit->builder->CreateCall2(minps, ARGS(V(x.value), V(y.value)))));
+	return RValue<Float4>(V(jit->builder->CreateCall2(minps, ARGS(V(x.value()), V(y.value())))));
 }
 
 RValue<Float> roundss(RValue<Float> val, unsigned char imm)
@@ -3580,7 +3580,7 @@
 	llvm::Function *roundss = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse41_round_ss);
 
 	Value *undef = V(llvm::UndefValue::get(T(Float4::type())));
-	Value *vector = Nucleus::createInsertElement(undef, val.value, 0);
+	Value *vector = Nucleus::createInsertElement(undef, val.value(), 0);
 
 	return RValue<Float>(Nucleus::createExtractElement(V(jit->builder->CreateCall3(roundss, ARGS(V(undef), V(vector), V(Nucleus::createConstantInt(imm))))), Float::type(), 0));
 }
@@ -3599,7 +3599,7 @@
 {
 	llvm::Function *roundps = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse41_round_ps);
 
-	return RValue<Float4>(V(jit->builder->CreateCall2(roundps, ARGS(V(val.value), V(Nucleus::createConstantInt(imm))))));
+	return RValue<Float4>(V(jit->builder->CreateCall2(roundps, ARGS(V(val.value()), V(Nucleus::createConstantInt(imm))))));
 }
 
 RValue<Float4> floorps(RValue<Float4> val)
@@ -3614,158 +3614,158 @@
 
 RValue<Int4> pabsd(RValue<Int4> x)
 {
-	return RValue<Int4>(V(lowerPABS(V(x.value))));
+	return RValue<Int4>(V(lowerPABS(V(x.value()))));
 }
 
 RValue<Short4> paddsw(RValue<Short4> x, RValue<Short4> y)
 {
 #	if LLVM_VERSION_MAJOR >= 8
-	return As<Short4>(V(lowerPSADDSAT(V(x.value), V(y.value))));
+	return As<Short4>(V(lowerPSADDSAT(V(x.value()), V(y.value()))));
 #	else
 	llvm::Function *paddsw = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_padds_w);
 
-	return As<Short4>(V(jit->builder->CreateCall2(paddsw, ARGS(V(x.value), V(y.value)))));
+	return As<Short4>(V(jit->builder->CreateCall2(paddsw, ARGS(V(x.value()), V(y.value())))));
 #	endif
 }
 
 RValue<Short4> psubsw(RValue<Short4> x, RValue<Short4> y)
 {
 #	if LLVM_VERSION_MAJOR >= 8
-	return As<Short4>(V(lowerPSSUBSAT(V(x.value), V(y.value))));
+	return As<Short4>(V(lowerPSSUBSAT(V(x.value()), V(y.value()))));
 #	else
 	llvm::Function *psubsw = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_psubs_w);
 
-	return As<Short4>(V(jit->builder->CreateCall2(psubsw, ARGS(V(x.value), V(y.value)))));
+	return As<Short4>(V(jit->builder->CreateCall2(psubsw, ARGS(V(x.value()), V(y.value())))));
 #	endif
 }
 
 RValue<UShort4> paddusw(RValue<UShort4> x, RValue<UShort4> y)
 {
 #	if LLVM_VERSION_MAJOR >= 8
-	return As<UShort4>(V(lowerPUADDSAT(V(x.value), V(y.value))));
+	return As<UShort4>(V(lowerPUADDSAT(V(x.value()), V(y.value()))));
 #	else
 	llvm::Function *paddusw = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_paddus_w);
 
-	return As<UShort4>(V(jit->builder->CreateCall2(paddusw, ARGS(V(x.value), V(y.value)))));
+	return As<UShort4>(V(jit->builder->CreateCall2(paddusw, ARGS(V(x.value()), V(y.value())))));
 #	endif
 }
 
 RValue<UShort4> psubusw(RValue<UShort4> x, RValue<UShort4> y)
 {
 #	if LLVM_VERSION_MAJOR >= 8
-	return As<UShort4>(V(lowerPUSUBSAT(V(x.value), V(y.value))));
+	return As<UShort4>(V(lowerPUSUBSAT(V(x.value()), V(y.value()))));
 #	else
 	llvm::Function *psubusw = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_psubus_w);
 
-	return As<UShort4>(V(jit->builder->CreateCall2(psubusw, ARGS(V(x.value), V(y.value)))));
+	return As<UShort4>(V(jit->builder->CreateCall2(psubusw, ARGS(V(x.value()), V(y.value())))));
 #	endif
 }
 
 RValue<SByte8> paddsb(RValue<SByte8> x, RValue<SByte8> y)
 {
 #	if LLVM_VERSION_MAJOR >= 8
-	return As<SByte8>(V(lowerPSADDSAT(V(x.value), V(y.value))));
+	return As<SByte8>(V(lowerPSADDSAT(V(x.value()), V(y.value()))));
 #	else
 	llvm::Function *paddsb = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_padds_b);
 
-	return As<SByte8>(V(jit->builder->CreateCall2(paddsb, ARGS(V(x.value), V(y.value)))));
+	return As<SByte8>(V(jit->builder->CreateCall2(paddsb, ARGS(V(x.value()), V(y.value())))));
 #	endif
 }
 
 RValue<SByte8> psubsb(RValue<SByte8> x, RValue<SByte8> y)
 {
 #	if LLVM_VERSION_MAJOR >= 8
-	return As<SByte8>(V(lowerPSSUBSAT(V(x.value), V(y.value))));
+	return As<SByte8>(V(lowerPSSUBSAT(V(x.value()), V(y.value()))));
 #	else
 	llvm::Function *psubsb = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_psubs_b);
 
-	return As<SByte8>(V(jit->builder->CreateCall2(psubsb, ARGS(V(x.value), V(y.value)))));
+	return As<SByte8>(V(jit->builder->CreateCall2(psubsb, ARGS(V(x.value()), V(y.value())))));
 #	endif
 }
 
 RValue<Byte8> paddusb(RValue<Byte8> x, RValue<Byte8> y)
 {
 #	if LLVM_VERSION_MAJOR >= 8
-	return As<Byte8>(V(lowerPUADDSAT(V(x.value), V(y.value))));
+	return As<Byte8>(V(lowerPUADDSAT(V(x.value()), V(y.value()))));
 #	else
 	llvm::Function *paddusb = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_paddus_b);
 
-	return As<Byte8>(V(jit->builder->CreateCall2(paddusb, ARGS(V(x.value), V(y.value)))));
+	return As<Byte8>(V(jit->builder->CreateCall2(paddusb, ARGS(V(x.value()), V(y.value())))));
 #	endif
 }
 
 RValue<Byte8> psubusb(RValue<Byte8> x, RValue<Byte8> y)
 {
 #	if LLVM_VERSION_MAJOR >= 8
-	return As<Byte8>(V(lowerPUSUBSAT(V(x.value), V(y.value))));
+	return As<Byte8>(V(lowerPUSUBSAT(V(x.value()), V(y.value()))));
 #	else
 	llvm::Function *psubusb = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_psubus_b);
 
-	return As<Byte8>(V(jit->builder->CreateCall2(psubusb, ARGS(V(x.value), V(y.value)))));
+	return As<Byte8>(V(jit->builder->CreateCall2(psubusb, ARGS(V(x.value()), V(y.value())))));
 #	endif
 }
 
 RValue<UShort4> pavgw(RValue<UShort4> x, RValue<UShort4> y)
 {
-	return As<UShort4>(V(lowerPAVG(V(x.value), V(y.value))));
+	return As<UShort4>(V(lowerPAVG(V(x.value()), V(y.value()))));
 }
 
 RValue<Short4> pmaxsw(RValue<Short4> x, RValue<Short4> y)
 {
-	return As<Short4>(V(lowerPMINMAX(V(x.value), V(y.value), llvm::ICmpInst::ICMP_SGT)));
+	return As<Short4>(V(lowerPMINMAX(V(x.value()), V(y.value()), llvm::ICmpInst::ICMP_SGT)));
 }
 
 RValue<Short4> pminsw(RValue<Short4> x, RValue<Short4> y)
 {
-	return As<Short4>(V(lowerPMINMAX(V(x.value), V(y.value), llvm::ICmpInst::ICMP_SLT)));
+	return As<Short4>(V(lowerPMINMAX(V(x.value()), V(y.value()), llvm::ICmpInst::ICMP_SLT)));
 }
 
 RValue<Short4> pcmpgtw(RValue<Short4> x, RValue<Short4> y)
 {
-	return As<Short4>(V(lowerPCMP(llvm::ICmpInst::ICMP_SGT, V(x.value), V(y.value), T(Short4::type()))));
+	return As<Short4>(V(lowerPCMP(llvm::ICmpInst::ICMP_SGT, V(x.value()), V(y.value()), T(Short4::type()))));
 }
 
 RValue<Short4> pcmpeqw(RValue<Short4> x, RValue<Short4> y)
 {
-	return As<Short4>(V(lowerPCMP(llvm::ICmpInst::ICMP_EQ, V(x.value), V(y.value), T(Short4::type()))));
+	return As<Short4>(V(lowerPCMP(llvm::ICmpInst::ICMP_EQ, V(x.value()), V(y.value()), T(Short4::type()))));
 }
 
 RValue<Byte8> pcmpgtb(RValue<SByte8> x, RValue<SByte8> y)
 {
-	return As<Byte8>(V(lowerPCMP(llvm::ICmpInst::ICMP_SGT, V(x.value), V(y.value), T(Byte8::type()))));
+	return As<Byte8>(V(lowerPCMP(llvm::ICmpInst::ICMP_SGT, V(x.value()), V(y.value()), T(Byte8::type()))));
 }
 
 RValue<Byte8> pcmpeqb(RValue<Byte8> x, RValue<Byte8> y)
 {
-	return As<Byte8>(V(lowerPCMP(llvm::ICmpInst::ICMP_EQ, V(x.value), V(y.value), T(Byte8::type()))));
+	return As<Byte8>(V(lowerPCMP(llvm::ICmpInst::ICMP_EQ, V(x.value()), V(y.value()), T(Byte8::type()))));
 }
 
 RValue<Short4> packssdw(RValue<Int2> x, RValue<Int2> y)
 {
 	llvm::Function *packssdw = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_packssdw_128);
 
-	return As<Short4>(V(jit->builder->CreateCall2(packssdw, ARGS(V(x.value), V(y.value)))));
+	return As<Short4>(V(jit->builder->CreateCall2(packssdw, ARGS(V(x.value()), V(y.value())))));
 }
 
 RValue<Short8> packssdw(RValue<Int4> x, RValue<Int4> y)
 {
 	llvm::Function *packssdw = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_packssdw_128);
 
-	return RValue<Short8>(V(jit->builder->CreateCall2(packssdw, ARGS(V(x.value), V(y.value)))));
+	return RValue<Short8>(V(jit->builder->CreateCall2(packssdw, ARGS(V(x.value()), V(y.value())))));
 }
 
 RValue<SByte8> packsswb(RValue<Short4> x, RValue<Short4> y)
 {
 	llvm::Function *packsswb = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_packsswb_128);
 
-	return As<SByte8>(V(jit->builder->CreateCall2(packsswb, ARGS(V(x.value), V(y.value)))));
+	return As<SByte8>(V(jit->builder->CreateCall2(packsswb, ARGS(V(x.value()), V(y.value())))));
 }
 
 RValue<Byte8> packuswb(RValue<Short4> x, RValue<Short4> y)
 {
 	llvm::Function *packuswb = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_packuswb_128);
 
-	return As<Byte8>(V(jit->builder->CreateCall2(packuswb, ARGS(V(x.value), V(y.value)))));
+	return As<Byte8>(V(jit->builder->CreateCall2(packuswb, ARGS(V(x.value()), V(y.value())))));
 }
 
 RValue<UShort8> packusdw(RValue<Int4> x, RValue<Int4> y)
@@ -3774,7 +3774,7 @@
 	{
 		llvm::Function *packusdw = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse41_packusdw);
 
-		return RValue<UShort8>(V(jit->builder->CreateCall2(packusdw, ARGS(V(x.value), V(y.value)))));
+		return RValue<UShort8>(V(jit->builder->CreateCall2(packusdw, ARGS(V(x.value()), V(y.value())))));
 	}
 	else
 	{
@@ -3789,180 +3789,180 @@
 {
 	llvm::Function *psrlw = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_psrli_w);
 
-	return As<UShort4>(V(jit->builder->CreateCall2(psrlw, ARGS(V(x.value), V(Nucleus::createConstantInt(y))))));
+	return As<UShort4>(V(jit->builder->CreateCall2(psrlw, ARGS(V(x.value()), V(Nucleus::createConstantInt(y))))));
 }
 
 RValue<UShort8> psrlw(RValue<UShort8> x, unsigned char y)
 {
 	llvm::Function *psrlw = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_psrli_w);
 
-	return RValue<UShort8>(V(jit->builder->CreateCall2(psrlw, ARGS(V(x.value), V(Nucleus::createConstantInt(y))))));
+	return RValue<UShort8>(V(jit->builder->CreateCall2(psrlw, ARGS(V(x.value()), V(Nucleus::createConstantInt(y))))));
 }
 
 RValue<Short4> psraw(RValue<Short4> x, unsigned char y)
 {
 	llvm::Function *psraw = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_psrai_w);
 
-	return As<Short4>(V(jit->builder->CreateCall2(psraw, ARGS(V(x.value), V(Nucleus::createConstantInt(y))))));
+	return As<Short4>(V(jit->builder->CreateCall2(psraw, ARGS(V(x.value()), V(Nucleus::createConstantInt(y))))));
 }
 
 RValue<Short8> psraw(RValue<Short8> x, unsigned char y)
 {
 	llvm::Function *psraw = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_psrai_w);
 
-	return RValue<Short8>(V(jit->builder->CreateCall2(psraw, ARGS(V(x.value), V(Nucleus::createConstantInt(y))))));
+	return RValue<Short8>(V(jit->builder->CreateCall2(psraw, ARGS(V(x.value()), V(Nucleus::createConstantInt(y))))));
 }
 
 RValue<Short4> psllw(RValue<Short4> x, unsigned char y)
 {
 	llvm::Function *psllw = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_pslli_w);
 
-	return As<Short4>(V(jit->builder->CreateCall2(psllw, ARGS(V(x.value), V(Nucleus::createConstantInt(y))))));
+	return As<Short4>(V(jit->builder->CreateCall2(psllw, ARGS(V(x.value()), V(Nucleus::createConstantInt(y))))));
 }
 
 RValue<Short8> psllw(RValue<Short8> x, unsigned char y)
 {
 	llvm::Function *psllw = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_pslli_w);
 
-	return RValue<Short8>(V(jit->builder->CreateCall2(psllw, ARGS(V(x.value), V(Nucleus::createConstantInt(y))))));
+	return RValue<Short8>(V(jit->builder->CreateCall2(psllw, ARGS(V(x.value()), V(Nucleus::createConstantInt(y))))));
 }
 
 RValue<Int2> pslld(RValue<Int2> x, unsigned char y)
 {
 	llvm::Function *pslld = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_pslli_d);
 
-	return As<Int2>(V(jit->builder->CreateCall2(pslld, ARGS(V(x.value), V(Nucleus::createConstantInt(y))))));
+	return As<Int2>(V(jit->builder->CreateCall2(pslld, ARGS(V(x.value()), V(Nucleus::createConstantInt(y))))));
 }
 
 RValue<Int4> pslld(RValue<Int4> x, unsigned char y)
 {
 	llvm::Function *pslld = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_pslli_d);
 
-	return RValue<Int4>(V(jit->builder->CreateCall2(pslld, ARGS(V(x.value), V(Nucleus::createConstantInt(y))))));
+	return RValue<Int4>(V(jit->builder->CreateCall2(pslld, ARGS(V(x.value()), V(Nucleus::createConstantInt(y))))));
 }
 
 RValue<Int2> psrad(RValue<Int2> x, unsigned char y)
 {
 	llvm::Function *psrad = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_psrai_d);
 
-	return As<Int2>(V(jit->builder->CreateCall2(psrad, ARGS(V(x.value), V(Nucleus::createConstantInt(y))))));
+	return As<Int2>(V(jit->builder->CreateCall2(psrad, ARGS(V(x.value()), V(Nucleus::createConstantInt(y))))));
 }
 
 RValue<Int4> psrad(RValue<Int4> x, unsigned char y)
 {
 	llvm::Function *psrad = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_psrai_d);
 
-	return RValue<Int4>(V(jit->builder->CreateCall2(psrad, ARGS(V(x.value), V(Nucleus::createConstantInt(y))))));
+	return RValue<Int4>(V(jit->builder->CreateCall2(psrad, ARGS(V(x.value()), V(Nucleus::createConstantInt(y))))));
 }
 
 RValue<UInt2> psrld(RValue<UInt2> x, unsigned char y)
 {
 	llvm::Function *psrld = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_psrli_d);
 
-	return As<UInt2>(V(jit->builder->CreateCall2(psrld, ARGS(V(x.value), V(Nucleus::createConstantInt(y))))));
+	return As<UInt2>(V(jit->builder->CreateCall2(psrld, ARGS(V(x.value()), V(Nucleus::createConstantInt(y))))));
 }
 
 RValue<UInt4> psrld(RValue<UInt4> x, unsigned char y)
 {
 	llvm::Function *psrld = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_psrli_d);
 
-	return RValue<UInt4>(V(jit->builder->CreateCall2(psrld, ARGS(V(x.value), V(Nucleus::createConstantInt(y))))));
+	return RValue<UInt4>(V(jit->builder->CreateCall2(psrld, ARGS(V(x.value()), V(Nucleus::createConstantInt(y))))));
 }
 
 RValue<Int4> pmaxsd(RValue<Int4> x, RValue<Int4> y)
 {
-	return RValue<Int4>(V(lowerPMINMAX(V(x.value), V(y.value), llvm::ICmpInst::ICMP_SGT)));
+	return RValue<Int4>(V(lowerPMINMAX(V(x.value()), V(y.value()), llvm::ICmpInst::ICMP_SGT)));
 }
 
 RValue<Int4> pminsd(RValue<Int4> x, RValue<Int4> y)
 {
-	return RValue<Int4>(V(lowerPMINMAX(V(x.value), V(y.value), llvm::ICmpInst::ICMP_SLT)));
+	return RValue<Int4>(V(lowerPMINMAX(V(x.value()), V(y.value()), llvm::ICmpInst::ICMP_SLT)));
 }
 
 RValue<UInt4> pmaxud(RValue<UInt4> x, RValue<UInt4> y)
 {
-	return RValue<UInt4>(V(lowerPMINMAX(V(x.value), V(y.value), llvm::ICmpInst::ICMP_UGT)));
+	return RValue<UInt4>(V(lowerPMINMAX(V(x.value()), V(y.value()), llvm::ICmpInst::ICMP_UGT)));
 }
 
 RValue<UInt4> pminud(RValue<UInt4> x, RValue<UInt4> y)
 {
-	return RValue<UInt4>(V(lowerPMINMAX(V(x.value), V(y.value), llvm::ICmpInst::ICMP_ULT)));
+	return RValue<UInt4>(V(lowerPMINMAX(V(x.value()), V(y.value()), llvm::ICmpInst::ICMP_ULT)));
 }
 
 RValue<Short4> pmulhw(RValue<Short4> x, RValue<Short4> y)
 {
 	llvm::Function *pmulhw = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_pmulh_w);
 
-	return As<Short4>(V(jit->builder->CreateCall2(pmulhw, ARGS(V(x.value), V(y.value)))));
+	return As<Short4>(V(jit->builder->CreateCall2(pmulhw, ARGS(V(x.value()), V(y.value())))));
 }
 
 RValue<UShort4> pmulhuw(RValue<UShort4> x, RValue<UShort4> y)
 {
 	llvm::Function *pmulhuw = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_pmulhu_w);
 
-	return As<UShort4>(V(jit->builder->CreateCall2(pmulhuw, ARGS(V(x.value), V(y.value)))));
+	return As<UShort4>(V(jit->builder->CreateCall2(pmulhuw, ARGS(V(x.value()), V(y.value())))));
 }
 
 RValue<Int2> pmaddwd(RValue<Short4> x, RValue<Short4> y)
 {
 	llvm::Function *pmaddwd = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_pmadd_wd);
 
-	return As<Int2>(V(jit->builder->CreateCall2(pmaddwd, ARGS(V(x.value), V(y.value)))));
+	return As<Int2>(V(jit->builder->CreateCall2(pmaddwd, ARGS(V(x.value()), V(y.value())))));
 }
 
 RValue<Short8> pmulhw(RValue<Short8> x, RValue<Short8> y)
 {
 	llvm::Function *pmulhw = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_pmulh_w);
 
-	return RValue<Short8>(V(jit->builder->CreateCall2(pmulhw, ARGS(V(x.value), V(y.value)))));
+	return RValue<Short8>(V(jit->builder->CreateCall2(pmulhw, ARGS(V(x.value()), V(y.value())))));
 }
 
 RValue<UShort8> pmulhuw(RValue<UShort8> x, RValue<UShort8> y)
 {
 	llvm::Function *pmulhuw = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_pmulhu_w);
 
-	return RValue<UShort8>(V(jit->builder->CreateCall2(pmulhuw, ARGS(V(x.value), V(y.value)))));
+	return RValue<UShort8>(V(jit->builder->CreateCall2(pmulhuw, ARGS(V(x.value()), V(y.value())))));
 }
 
 RValue<Int4> pmaddwd(RValue<Short8> x, RValue<Short8> y)
 {
 	llvm::Function *pmaddwd = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_pmadd_wd);
 
-	return RValue<Int4>(V(jit->builder->CreateCall2(pmaddwd, ARGS(V(x.value), V(y.value)))));
+	return RValue<Int4>(V(jit->builder->CreateCall2(pmaddwd, ARGS(V(x.value()), V(y.value())))));
 }
 
 RValue<Int> movmskps(RValue<Float4> x)
 {
 	llvm::Function *movmskps = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse_movmsk_ps);
 
-	return RValue<Int>(V(jit->builder->CreateCall(movmskps, ARGS(V(x.value)))));
+	return RValue<Int>(V(jit->builder->CreateCall(movmskps, ARGS(V(x.value())))));
 }
 
 RValue<Int> pmovmskb(RValue<Byte8> x)
 {
 	llvm::Function *pmovmskb = llvm::Intrinsic::getDeclaration(jit->module.get(), llvm::Intrinsic::x86_sse2_pmovmskb_128);
 
-	return RValue<Int>(V(jit->builder->CreateCall(pmovmskb, ARGS(V(x.value))))) & 0xFF;
+	return RValue<Int>(V(jit->builder->CreateCall(pmovmskb, ARGS(V(x.value()))))) & 0xFF;
 }
 
 RValue<Int4> pmovzxbd(RValue<Byte16> x)
 {
-	return RValue<Int4>(V(lowerPMOV(V(x.value), T(Int4::type()), false)));
+	return RValue<Int4>(V(lowerPMOV(V(x.value()), T(Int4::type()), false)));
 }
 
 RValue<Int4> pmovsxbd(RValue<SByte16> x)
 {
-	return RValue<Int4>(V(lowerPMOV(V(x.value), T(Int4::type()), true)));
+	return RValue<Int4>(V(lowerPMOV(V(x.value()), T(Int4::type()), true)));
 }
 
 RValue<Int4> pmovzxwd(RValue<UShort8> x)
 {
-	return RValue<Int4>(V(lowerPMOV(V(x.value), T(Int4::type()), false)));
+	return RValue<Int4>(V(lowerPMOV(V(x.value()), T(Int4::type()), false)));
 }
 
 RValue<Int4> pmovsxwd(RValue<Short8> x)
 {
-	return RValue<Int4>(V(lowerPMOV(V(x.value), T(Int4::type()), true)));
+	return RValue<Int4>(V(lowerPMOV(V(x.value()), T(Int4::type()), true)));
 }
 
 }  // namespace x86
diff --git a/src/Reactor/Print.hpp b/src/Reactor/Print.hpp
index 163af82..6267533 100644
--- a/src/Reactor/Print.hpp
+++ b/src/Reactor/Print.hpp
@@ -316,13 +316,13 @@
 struct PrintValue::Ty<Long>
 {
 	static std::string fmt(const RValue<Long> &v) { return "%lld"; }
-	static std::vector<Value *> val(const RValue<Long> &v) { return { v.value }; }
+	static std::vector<Value *> val(const RValue<Long> &v) { return { v.value() }; }
 };
 template<typename T>
 struct PrintValue::Ty<Pointer<T>>
 {
 	static std::string fmt(const RValue<Pointer<T>> &v) { return "%p"; }
-	static std::vector<Value *> val(const RValue<Pointer<T>> &v) { return { v.value }; }
+	static std::vector<Value *> val(const RValue<Pointer<T>> &v) { return { v.value() }; }
 };
 template<typename T>
 struct PrintValue::Ty<Reference<T>>
diff --git a/src/Reactor/Reactor.cpp b/src/Reactor/Reactor.cpp
index aa21a01..2ddeaa3 100644
--- a/src/Reactor/Reactor.cpp
+++ b/src/Reactor/Reactor.cpp
@@ -170,7 +170,7 @@
 
 Bool::Bool(Argument<Bool> argument)
 {
-	storeValue(argument.value);
+	store(argument.rvalue());
 }
 
 Bool::Bool(bool x)
@@ -210,51 +210,51 @@
 
 RValue<Bool> operator!(RValue<Bool> val)
 {
-	return RValue<Bool>(Nucleus::createNot(val.value));
+	return RValue<Bool>(Nucleus::createNot(val.value()));
 }
 
 RValue<Bool> operator&&(RValue<Bool> lhs, RValue<Bool> rhs)
 {
-	return RValue<Bool>(Nucleus::createAnd(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createAnd(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator||(RValue<Bool> lhs, RValue<Bool> rhs)
 {
-	return RValue<Bool>(Nucleus::createOr(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createOr(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator!=(RValue<Bool> lhs, RValue<Bool> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator==(RValue<Bool> lhs, RValue<Bool> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
 }
 
 Byte::Byte(Argument<Byte> argument)
 {
-	storeValue(argument.value);
+	store(argument.rvalue());
 }
 
 Byte::Byte(RValue<Int> cast)
 {
-	Value *integer = Nucleus::createTrunc(cast.value, Byte::type());
+	Value *integer = Nucleus::createTrunc(cast.value(), Byte::type());
 
 	storeValue(integer);
 }
 
 Byte::Byte(RValue<UInt> cast)
 {
-	Value *integer = Nucleus::createTrunc(cast.value, Byte::type());
+	Value *integer = Nucleus::createTrunc(cast.value(), Byte::type());
 
 	storeValue(integer);
 }
 
 Byte::Byte(RValue<UShort> cast)
 {
-	Value *integer = Nucleus::createTrunc(cast.value, Byte::type());
+	Value *integer = Nucleus::createTrunc(cast.value(), Byte::type());
 
 	storeValue(integer);
 }
@@ -301,52 +301,52 @@
 
 RValue<Byte> operator+(RValue<Byte> lhs, RValue<Byte> rhs)
 {
-	return RValue<Byte>(Nucleus::createAdd(lhs.value, rhs.value));
+	return RValue<Byte>(Nucleus::createAdd(lhs.value(), rhs.value()));
 }
 
 RValue<Byte> operator-(RValue<Byte> lhs, RValue<Byte> rhs)
 {
-	return RValue<Byte>(Nucleus::createSub(lhs.value, rhs.value));
+	return RValue<Byte>(Nucleus::createSub(lhs.value(), rhs.value()));
 }
 
 RValue<Byte> operator*(RValue<Byte> lhs, RValue<Byte> rhs)
 {
-	return RValue<Byte>(Nucleus::createMul(lhs.value, rhs.value));
+	return RValue<Byte>(Nucleus::createMul(lhs.value(), rhs.value()));
 }
 
 RValue<Byte> operator/(RValue<Byte> lhs, RValue<Byte> rhs)
 {
-	return RValue<Byte>(Nucleus::createUDiv(lhs.value, rhs.value));
+	return RValue<Byte>(Nucleus::createUDiv(lhs.value(), rhs.value()));
 }
 
 RValue<Byte> operator%(RValue<Byte> lhs, RValue<Byte> rhs)
 {
-	return RValue<Byte>(Nucleus::createURem(lhs.value, rhs.value));
+	return RValue<Byte>(Nucleus::createURem(lhs.value(), rhs.value()));
 }
 
 RValue<Byte> operator&(RValue<Byte> lhs, RValue<Byte> rhs)
 {
-	return RValue<Byte>(Nucleus::createAnd(lhs.value, rhs.value));
+	return RValue<Byte>(Nucleus::createAnd(lhs.value(), rhs.value()));
 }
 
 RValue<Byte> operator|(RValue<Byte> lhs, RValue<Byte> rhs)
 {
-	return RValue<Byte>(Nucleus::createOr(lhs.value, rhs.value));
+	return RValue<Byte>(Nucleus::createOr(lhs.value(), rhs.value()));
 }
 
 RValue<Byte> operator^(RValue<Byte> lhs, RValue<Byte> rhs)
 {
-	return RValue<Byte>(Nucleus::createXor(lhs.value, rhs.value));
+	return RValue<Byte>(Nucleus::createXor(lhs.value(), rhs.value()));
 }
 
 RValue<Byte> operator<<(RValue<Byte> lhs, RValue<Byte> rhs)
 {
-	return RValue<Byte>(Nucleus::createShl(lhs.value, rhs.value));
+	return RValue<Byte>(Nucleus::createShl(lhs.value(), rhs.value()));
 }
 
 RValue<Byte> operator>>(RValue<Byte> lhs, RValue<Byte> rhs)
 {
-	return RValue<Byte>(Nucleus::createLShr(lhs.value, rhs.value));
+	return RValue<Byte>(Nucleus::createLShr(lhs.value(), rhs.value()));
 }
 
 RValue<Byte> operator+=(Byte &lhs, RValue<Byte> rhs)
@@ -406,19 +406,19 @@
 
 RValue<Byte> operator-(RValue<Byte> val)
 {
-	return RValue<Byte>(Nucleus::createNeg(val.value));
+	return RValue<Byte>(Nucleus::createNeg(val.value()));
 }
 
 RValue<Byte> operator~(RValue<Byte> val)
 {
-	return RValue<Byte>(Nucleus::createNot(val.value));
+	return RValue<Byte>(Nucleus::createNot(val.value()));
 }
 
 RValue<Byte> operator++(Byte &val, int)  // Post-increment
 {
 	RValue<Byte> res = val;
 
-	Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantByte((unsigned char)1));
+	Value *inc = Nucleus::createAdd(res.value(), Nucleus::createConstantByte((unsigned char)1));
 	val.storeValue(inc);
 
 	return res;
@@ -436,7 +436,7 @@
 {
 	RValue<Byte> res = val;
 
-	Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantByte((unsigned char)1));
+	Value *inc = Nucleus::createSub(res.value(), Nucleus::createConstantByte((unsigned char)1));
 	val.storeValue(inc);
 
 	return res;
@@ -452,49 +452,49 @@
 
 RValue<Bool> operator<(RValue<Byte> lhs, RValue<Byte> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpULT(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator<=(RValue<Byte> lhs, RValue<Byte> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpULE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator>(RValue<Byte> lhs, RValue<Byte> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpUGT(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator>=(RValue<Byte> lhs, RValue<Byte> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpUGE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator!=(RValue<Byte> lhs, RValue<Byte> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator==(RValue<Byte> lhs, RValue<Byte> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
 }
 
 SByte::SByte(Argument<SByte> argument)
 {
-	storeValue(argument.value);
+	store(argument.rvalue());
 }
 
 SByte::SByte(RValue<Int> cast)
 {
-	Value *integer = Nucleus::createTrunc(cast.value, SByte::type());
+	Value *integer = Nucleus::createTrunc(cast.value(), SByte::type());
 
 	storeValue(integer);
 }
 
 SByte::SByte(RValue<Short> cast)
 {
-	Value *integer = Nucleus::createTrunc(cast.value, SByte::type());
+	Value *integer = Nucleus::createTrunc(cast.value(), SByte::type());
 
 	storeValue(integer);
 }
@@ -536,52 +536,52 @@
 
 RValue<SByte> operator+(RValue<SByte> lhs, RValue<SByte> rhs)
 {
-	return RValue<SByte>(Nucleus::createAdd(lhs.value, rhs.value));
+	return RValue<SByte>(Nucleus::createAdd(lhs.value(), rhs.value()));
 }
 
 RValue<SByte> operator-(RValue<SByte> lhs, RValue<SByte> rhs)
 {
-	return RValue<SByte>(Nucleus::createSub(lhs.value, rhs.value));
+	return RValue<SByte>(Nucleus::createSub(lhs.value(), rhs.value()));
 }
 
 RValue<SByte> operator*(RValue<SByte> lhs, RValue<SByte> rhs)
 {
-	return RValue<SByte>(Nucleus::createMul(lhs.value, rhs.value));
+	return RValue<SByte>(Nucleus::createMul(lhs.value(), rhs.value()));
 }
 
 RValue<SByte> operator/(RValue<SByte> lhs, RValue<SByte> rhs)
 {
-	return RValue<SByte>(Nucleus::createSDiv(lhs.value, rhs.value));
+	return RValue<SByte>(Nucleus::createSDiv(lhs.value(), rhs.value()));
 }
 
 RValue<SByte> operator%(RValue<SByte> lhs, RValue<SByte> rhs)
 {
-	return RValue<SByte>(Nucleus::createSRem(lhs.value, rhs.value));
+	return RValue<SByte>(Nucleus::createSRem(lhs.value(), rhs.value()));
 }
 
 RValue<SByte> operator&(RValue<SByte> lhs, RValue<SByte> rhs)
 {
-	return RValue<SByte>(Nucleus::createAnd(lhs.value, rhs.value));
+	return RValue<SByte>(Nucleus::createAnd(lhs.value(), rhs.value()));
 }
 
 RValue<SByte> operator|(RValue<SByte> lhs, RValue<SByte> rhs)
 {
-	return RValue<SByte>(Nucleus::createOr(lhs.value, rhs.value));
+	return RValue<SByte>(Nucleus::createOr(lhs.value(), rhs.value()));
 }
 
 RValue<SByte> operator^(RValue<SByte> lhs, RValue<SByte> rhs)
 {
-	return RValue<SByte>(Nucleus::createXor(lhs.value, rhs.value));
+	return RValue<SByte>(Nucleus::createXor(lhs.value(), rhs.value()));
 }
 
 RValue<SByte> operator<<(RValue<SByte> lhs, RValue<SByte> rhs)
 {
-	return RValue<SByte>(Nucleus::createShl(lhs.value, rhs.value));
+	return RValue<SByte>(Nucleus::createShl(lhs.value(), rhs.value()));
 }
 
 RValue<SByte> operator>>(RValue<SByte> lhs, RValue<SByte> rhs)
 {
-	return RValue<SByte>(Nucleus::createAShr(lhs.value, rhs.value));
+	return RValue<SByte>(Nucleus::createAShr(lhs.value(), rhs.value()));
 }
 
 RValue<SByte> operator+=(SByte &lhs, RValue<SByte> rhs)
@@ -641,19 +641,19 @@
 
 RValue<SByte> operator-(RValue<SByte> val)
 {
-	return RValue<SByte>(Nucleus::createNeg(val.value));
+	return RValue<SByte>(Nucleus::createNeg(val.value()));
 }
 
 RValue<SByte> operator~(RValue<SByte> val)
 {
-	return RValue<SByte>(Nucleus::createNot(val.value));
+	return RValue<SByte>(Nucleus::createNot(val.value()));
 }
 
 RValue<SByte> operator++(SByte &val, int)  // Post-increment
 {
 	RValue<SByte> res = val;
 
-	Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantByte((signed char)1));
+	Value *inc = Nucleus::createAdd(res.value(), Nucleus::createConstantByte((signed char)1));
 	val.storeValue(inc);
 
 	return res;
@@ -671,7 +671,7 @@
 {
 	RValue<SByte> res = val;
 
-	Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantByte((signed char)1));
+	Value *inc = Nucleus::createSub(res.value(), Nucleus::createConstantByte((signed char)1));
 	val.storeValue(inc);
 
 	return res;
@@ -687,42 +687,42 @@
 
 RValue<Bool> operator<(RValue<SByte> lhs, RValue<SByte> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpSLT(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator<=(RValue<SByte> lhs, RValue<SByte> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpSLE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator>(RValue<SByte> lhs, RValue<SByte> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpSGT(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator>=(RValue<SByte> lhs, RValue<SByte> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpSGE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator!=(RValue<SByte> lhs, RValue<SByte> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator==(RValue<SByte> lhs, RValue<SByte> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
 }
 
 Short::Short(Argument<Short> argument)
 {
-	storeValue(argument.value);
+	store(argument.rvalue());
 }
 
 Short::Short(RValue<Int> cast)
 {
-	Value *integer = Nucleus::createTrunc(cast.value, Short::type());
+	Value *integer = Nucleus::createTrunc(cast.value(), Short::type());
 
 	storeValue(integer);
 }
@@ -764,52 +764,52 @@
 
 RValue<Short> operator+(RValue<Short> lhs, RValue<Short> rhs)
 {
-	return RValue<Short>(Nucleus::createAdd(lhs.value, rhs.value));
+	return RValue<Short>(Nucleus::createAdd(lhs.value(), rhs.value()));
 }
 
 RValue<Short> operator-(RValue<Short> lhs, RValue<Short> rhs)
 {
-	return RValue<Short>(Nucleus::createSub(lhs.value, rhs.value));
+	return RValue<Short>(Nucleus::createSub(lhs.value(), rhs.value()));
 }
 
 RValue<Short> operator*(RValue<Short> lhs, RValue<Short> rhs)
 {
-	return RValue<Short>(Nucleus::createMul(lhs.value, rhs.value));
+	return RValue<Short>(Nucleus::createMul(lhs.value(), rhs.value()));
 }
 
 RValue<Short> operator/(RValue<Short> lhs, RValue<Short> rhs)
 {
-	return RValue<Short>(Nucleus::createSDiv(lhs.value, rhs.value));
+	return RValue<Short>(Nucleus::createSDiv(lhs.value(), rhs.value()));
 }
 
 RValue<Short> operator%(RValue<Short> lhs, RValue<Short> rhs)
 {
-	return RValue<Short>(Nucleus::createSRem(lhs.value, rhs.value));
+	return RValue<Short>(Nucleus::createSRem(lhs.value(), rhs.value()));
 }
 
 RValue<Short> operator&(RValue<Short> lhs, RValue<Short> rhs)
 {
-	return RValue<Short>(Nucleus::createAnd(lhs.value, rhs.value));
+	return RValue<Short>(Nucleus::createAnd(lhs.value(), rhs.value()));
 }
 
 RValue<Short> operator|(RValue<Short> lhs, RValue<Short> rhs)
 {
-	return RValue<Short>(Nucleus::createOr(lhs.value, rhs.value));
+	return RValue<Short>(Nucleus::createOr(lhs.value(), rhs.value()));
 }
 
 RValue<Short> operator^(RValue<Short> lhs, RValue<Short> rhs)
 {
-	return RValue<Short>(Nucleus::createXor(lhs.value, rhs.value));
+	return RValue<Short>(Nucleus::createXor(lhs.value(), rhs.value()));
 }
 
 RValue<Short> operator<<(RValue<Short> lhs, RValue<Short> rhs)
 {
-	return RValue<Short>(Nucleus::createShl(lhs.value, rhs.value));
+	return RValue<Short>(Nucleus::createShl(lhs.value(), rhs.value()));
 }
 
 RValue<Short> operator>>(RValue<Short> lhs, RValue<Short> rhs)
 {
-	return RValue<Short>(Nucleus::createAShr(lhs.value, rhs.value));
+	return RValue<Short>(Nucleus::createAShr(lhs.value(), rhs.value()));
 }
 
 RValue<Short> operator+=(Short &lhs, RValue<Short> rhs)
@@ -869,19 +869,19 @@
 
 RValue<Short> operator-(RValue<Short> val)
 {
-	return RValue<Short>(Nucleus::createNeg(val.value));
+	return RValue<Short>(Nucleus::createNeg(val.value()));
 }
 
 RValue<Short> operator~(RValue<Short> val)
 {
-	return RValue<Short>(Nucleus::createNot(val.value));
+	return RValue<Short>(Nucleus::createNot(val.value()));
 }
 
 RValue<Short> operator++(Short &val, int)  // Post-increment
 {
 	RValue<Short> res = val;
 
-	Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantShort((short)1));
+	Value *inc = Nucleus::createAdd(res.value(), Nucleus::createConstantShort((short)1));
 	val.storeValue(inc);
 
 	return res;
@@ -899,7 +899,7 @@
 {
 	RValue<Short> res = val;
 
-	Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantShort((short)1));
+	Value *inc = Nucleus::createSub(res.value(), Nucleus::createConstantShort((short)1));
 	val.storeValue(inc);
 
 	return res;
@@ -915,49 +915,49 @@
 
 RValue<Bool> operator<(RValue<Short> lhs, RValue<Short> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpSLT(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator<=(RValue<Short> lhs, RValue<Short> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpSLE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator>(RValue<Short> lhs, RValue<Short> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpSGT(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator>=(RValue<Short> lhs, RValue<Short> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpSGE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator!=(RValue<Short> lhs, RValue<Short> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator==(RValue<Short> lhs, RValue<Short> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
 }
 
 UShort::UShort(Argument<UShort> argument)
 {
-	storeValue(argument.value);
+	store(argument.rvalue());
 }
 
 UShort::UShort(RValue<UInt> cast)
 {
-	Value *integer = Nucleus::createTrunc(cast.value, UShort::type());
+	Value *integer = Nucleus::createTrunc(cast.value(), UShort::type());
 
 	storeValue(integer);
 }
 
 UShort::UShort(RValue<Int> cast)
 {
-	Value *integer = Nucleus::createTrunc(cast.value, UShort::type());
+	Value *integer = Nucleus::createTrunc(cast.value(), UShort::type());
 
 	storeValue(integer);
 }
@@ -999,52 +999,52 @@
 
 RValue<UShort> operator+(RValue<UShort> lhs, RValue<UShort> rhs)
 {
-	return RValue<UShort>(Nucleus::createAdd(lhs.value, rhs.value));
+	return RValue<UShort>(Nucleus::createAdd(lhs.value(), rhs.value()));
 }
 
 RValue<UShort> operator-(RValue<UShort> lhs, RValue<UShort> rhs)
 {
-	return RValue<UShort>(Nucleus::createSub(lhs.value, rhs.value));
+	return RValue<UShort>(Nucleus::createSub(lhs.value(), rhs.value()));
 }
 
 RValue<UShort> operator*(RValue<UShort> lhs, RValue<UShort> rhs)
 {
-	return RValue<UShort>(Nucleus::createMul(lhs.value, rhs.value));
+	return RValue<UShort>(Nucleus::createMul(lhs.value(), rhs.value()));
 }
 
 RValue<UShort> operator/(RValue<UShort> lhs, RValue<UShort> rhs)
 {
-	return RValue<UShort>(Nucleus::createUDiv(lhs.value, rhs.value));
+	return RValue<UShort>(Nucleus::createUDiv(lhs.value(), rhs.value()));
 }
 
 RValue<UShort> operator%(RValue<UShort> lhs, RValue<UShort> rhs)
 {
-	return RValue<UShort>(Nucleus::createURem(lhs.value, rhs.value));
+	return RValue<UShort>(Nucleus::createURem(lhs.value(), rhs.value()));
 }
 
 RValue<UShort> operator&(RValue<UShort> lhs, RValue<UShort> rhs)
 {
-	return RValue<UShort>(Nucleus::createAnd(lhs.value, rhs.value));
+	return RValue<UShort>(Nucleus::createAnd(lhs.value(), rhs.value()));
 }
 
 RValue<UShort> operator|(RValue<UShort> lhs, RValue<UShort> rhs)
 {
-	return RValue<UShort>(Nucleus::createOr(lhs.value, rhs.value));
+	return RValue<UShort>(Nucleus::createOr(lhs.value(), rhs.value()));
 }
 
 RValue<UShort> operator^(RValue<UShort> lhs, RValue<UShort> rhs)
 {
-	return RValue<UShort>(Nucleus::createXor(lhs.value, rhs.value));
+	return RValue<UShort>(Nucleus::createXor(lhs.value(), rhs.value()));
 }
 
 RValue<UShort> operator<<(RValue<UShort> lhs, RValue<UShort> rhs)
 {
-	return RValue<UShort>(Nucleus::createShl(lhs.value, rhs.value));
+	return RValue<UShort>(Nucleus::createShl(lhs.value(), rhs.value()));
 }
 
 RValue<UShort> operator>>(RValue<UShort> lhs, RValue<UShort> rhs)
 {
-	return RValue<UShort>(Nucleus::createLShr(lhs.value, rhs.value));
+	return RValue<UShort>(Nucleus::createLShr(lhs.value(), rhs.value()));
 }
 
 RValue<UShort> operator+=(UShort &lhs, RValue<UShort> rhs)
@@ -1104,19 +1104,19 @@
 
 RValue<UShort> operator-(RValue<UShort> val)
 {
-	return RValue<UShort>(Nucleus::createNeg(val.value));
+	return RValue<UShort>(Nucleus::createNeg(val.value()));
 }
 
 RValue<UShort> operator~(RValue<UShort> val)
 {
-	return RValue<UShort>(Nucleus::createNot(val.value));
+	return RValue<UShort>(Nucleus::createNot(val.value()));
 }
 
 RValue<UShort> operator++(UShort &val, int)  // Post-increment
 {
 	RValue<UShort> res = val;
 
-	Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantShort((unsigned short)1));
+	Value *inc = Nucleus::createAdd(res.value(), Nucleus::createConstantShort((unsigned short)1));
 	val.storeValue(inc);
 
 	return res;
@@ -1134,7 +1134,7 @@
 {
 	RValue<UShort> res = val;
 
-	Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantShort((unsigned short)1));
+	Value *inc = Nucleus::createSub(res.value(), Nucleus::createConstantShort((unsigned short)1));
 	val.storeValue(inc);
 
 	return res;
@@ -1150,37 +1150,37 @@
 
 RValue<Bool> operator<(RValue<UShort> lhs, RValue<UShort> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpULT(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator<=(RValue<UShort> lhs, RValue<UShort> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpULE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator>(RValue<UShort> lhs, RValue<UShort> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpUGT(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator>=(RValue<UShort> lhs, RValue<UShort> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpUGE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator!=(RValue<UShort> lhs, RValue<UShort> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator==(RValue<UShort> lhs, RValue<UShort> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
 }
 
 Byte4::Byte4(RValue<Byte8> cast)
 {
-	storeValue(Nucleus::createBitCast(cast.value, type()));
+	storeValue(Nucleus::createBitCast(cast.value(), type()));
 }
 
 Byte4::Byte4(RValue<UShort4> cast)
@@ -1270,52 +1270,52 @@
 
 RValue<Byte8> operator+(RValue<Byte8> lhs, RValue<Byte8> rhs)
 {
-	return RValue<Byte8>(Nucleus::createAdd(lhs.value, rhs.value));
+	return RValue<Byte8>(Nucleus::createAdd(lhs.value(), rhs.value()));
 }
 
 RValue<Byte8> operator-(RValue<Byte8> lhs, RValue<Byte8> rhs)
 {
-	return RValue<Byte8>(Nucleus::createSub(lhs.value, rhs.value));
+	return RValue<Byte8>(Nucleus::createSub(lhs.value(), rhs.value()));
 }
 
 //	RValue<Byte8> operator*(RValue<Byte8> lhs, RValue<Byte8> rhs)
 //	{
-//		return RValue<Byte8>(Nucleus::createMul(lhs.value, rhs.value));
+//		return RValue<Byte8>(Nucleus::createMul(lhs.value(), rhs.value()));
 //	}
 
 //	RValue<Byte8> operator/(RValue<Byte8> lhs, RValue<Byte8> rhs)
 //	{
-//		return RValue<Byte8>(Nucleus::createUDiv(lhs.value, rhs.value));
+//		return RValue<Byte8>(Nucleus::createUDiv(lhs.value(), rhs.value()));
 //	}
 
 //	RValue<Byte8> operator%(RValue<Byte8> lhs, RValue<Byte8> rhs)
 //	{
-//		return RValue<Byte8>(Nucleus::createURem(lhs.value, rhs.value));
+//		return RValue<Byte8>(Nucleus::createURem(lhs.value(), rhs.value()));
 //	}
 
 RValue<Byte8> operator&(RValue<Byte8> lhs, RValue<Byte8> rhs)
 {
-	return RValue<Byte8>(Nucleus::createAnd(lhs.value, rhs.value));
+	return RValue<Byte8>(Nucleus::createAnd(lhs.value(), rhs.value()));
 }
 
 RValue<Byte8> operator|(RValue<Byte8> lhs, RValue<Byte8> rhs)
 {
-	return RValue<Byte8>(Nucleus::createOr(lhs.value, rhs.value));
+	return RValue<Byte8>(Nucleus::createOr(lhs.value(), rhs.value()));
 }
 
 RValue<Byte8> operator^(RValue<Byte8> lhs, RValue<Byte8> rhs)
 {
-	return RValue<Byte8>(Nucleus::createXor(lhs.value, rhs.value));
+	return RValue<Byte8>(Nucleus::createXor(lhs.value(), rhs.value()));
 }
 
 //	RValue<Byte8> operator<<(RValue<Byte8> lhs, unsigned char rhs)
 //	{
-//		return RValue<Byte8>(Nucleus::createShl(lhs.value, rhs.value));
+//		return RValue<Byte8>(Nucleus::createShl(lhs.value(), rhs.value()));
 //	}
 
 //	RValue<Byte8> operator>>(RValue<Byte8> lhs, unsigned char rhs)
 //	{
-//		return RValue<Byte8>(Nucleus::createLShr(lhs.value, rhs.value));
+//		return RValue<Byte8>(Nucleus::createLShr(lhs.value(), rhs.value()));
 //	}
 
 RValue<Byte8> operator+=(Byte8 &lhs, RValue<Byte8> rhs)
@@ -1375,12 +1375,12 @@
 
 //	RValue<Byte8> operator-(RValue<Byte8> val)
 //	{
-//		return RValue<Byte8>(Nucleus::createNeg(val.value));
+//		return RValue<Byte8>(Nucleus::createNeg(val.value()));
 //	}
 
 RValue<Byte8> operator~(RValue<Byte8> val)
 {
-	return RValue<Byte8>(Nucleus::createNot(val.value));
+	return RValue<Byte8>(Nucleus::createNot(val.value()));
 }
 
 RValue<Byte8> Swizzle(RValue<Byte8> x, uint32_t select)
@@ -1406,14 +1406,14 @@
 		static_cast<int>((select >> 0) & 0x07),
 	};
 
-	return As<Byte8>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
+	return As<Byte8>(Nucleus::createShuffleVector(x.value(), x.value(), shuffle));
 }
 
 RValue<Short4> Unpack(RValue<Byte4> x)
 {
 	// TODO(b/148379603): Optimize narrowing swizzle.
 	int shuffle[16] = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };  // Real type is v16i8
-	return As<Short4>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
+	return As<Short4>(Nucleus::createShuffleVector(x.value(), x.value(), shuffle));
 }
 
 RValue<Short4> Unpack(RValue<Byte4> x, RValue<Byte4> y)
@@ -1425,14 +1425,14 @@
 {
 	// TODO(b/148379603): Optimize narrowing swizzle.
 	int shuffle[16] = { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 };  // Real type is v16i8
-	return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
+	return As<Short4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
 }
 
 RValue<Short4> UnpackHigh(RValue<Byte8> x, RValue<Byte8> y)
 {
 	// TODO(b/148379603): Optimize narrowing swizzle.
 	int shuffle[16] = { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 };  // Real type is v16i8
-	auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
+	auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
 	return As<Short4>(Swizzle(As<Int4>(lowHigh), 0x2323));
 }
 
@@ -1476,52 +1476,52 @@
 
 RValue<SByte8> operator+(RValue<SByte8> lhs, RValue<SByte8> rhs)
 {
-	return RValue<SByte8>(Nucleus::createAdd(lhs.value, rhs.value));
+	return RValue<SByte8>(Nucleus::createAdd(lhs.value(), rhs.value()));
 }
 
 RValue<SByte8> operator-(RValue<SByte8> lhs, RValue<SByte8> rhs)
 {
-	return RValue<SByte8>(Nucleus::createSub(lhs.value, rhs.value));
+	return RValue<SByte8>(Nucleus::createSub(lhs.value(), rhs.value()));
 }
 
 //	RValue<SByte8> operator*(RValue<SByte8> lhs, RValue<SByte8> rhs)
 //	{
-//		return RValue<SByte8>(Nucleus::createMul(lhs.value, rhs.value));
+//		return RValue<SByte8>(Nucleus::createMul(lhs.value(), rhs.value()));
 //	}
 
 //	RValue<SByte8> operator/(RValue<SByte8> lhs, RValue<SByte8> rhs)
 //	{
-//		return RValue<SByte8>(Nucleus::createSDiv(lhs.value, rhs.value));
+//		return RValue<SByte8>(Nucleus::createSDiv(lhs.value(), rhs.value()));
 //	}
 
 //	RValue<SByte8> operator%(RValue<SByte8> lhs, RValue<SByte8> rhs)
 //	{
-//		return RValue<SByte8>(Nucleus::createSRem(lhs.value, rhs.value));
+//		return RValue<SByte8>(Nucleus::createSRem(lhs.value(), rhs.value()));
 //	}
 
 RValue<SByte8> operator&(RValue<SByte8> lhs, RValue<SByte8> rhs)
 {
-	return RValue<SByte8>(Nucleus::createAnd(lhs.value, rhs.value));
+	return RValue<SByte8>(Nucleus::createAnd(lhs.value(), rhs.value()));
 }
 
 RValue<SByte8> operator|(RValue<SByte8> lhs, RValue<SByte8> rhs)
 {
-	return RValue<SByte8>(Nucleus::createOr(lhs.value, rhs.value));
+	return RValue<SByte8>(Nucleus::createOr(lhs.value(), rhs.value()));
 }
 
 RValue<SByte8> operator^(RValue<SByte8> lhs, RValue<SByte8> rhs)
 {
-	return RValue<SByte8>(Nucleus::createXor(lhs.value, rhs.value));
+	return RValue<SByte8>(Nucleus::createXor(lhs.value(), rhs.value()));
 }
 
 //	RValue<SByte8> operator<<(RValue<SByte8> lhs, unsigned char rhs)
 //	{
-//		return RValue<SByte8>(Nucleus::createShl(lhs.value, rhs.value));
+//		return RValue<SByte8>(Nucleus::createShl(lhs.value(), rhs.value()));
 //	}
 
 //	RValue<SByte8> operator>>(RValue<SByte8> lhs, unsigned char rhs)
 //	{
-//		return RValue<SByte8>(Nucleus::createAShr(lhs.value, rhs.value));
+//		return RValue<SByte8>(Nucleus::createAShr(lhs.value(), rhs.value()));
 //	}
 
 RValue<SByte8> operator+=(SByte8 &lhs, RValue<SByte8> rhs)
@@ -1581,26 +1581,26 @@
 
 //	RValue<SByte8> operator-(RValue<SByte8> val)
 //	{
-//		return RValue<SByte8>(Nucleus::createNeg(val.value));
+//		return RValue<SByte8>(Nucleus::createNeg(val.value()));
 //	}
 
 RValue<SByte8> operator~(RValue<SByte8> val)
 {
-	return RValue<SByte8>(Nucleus::createNot(val.value));
+	return RValue<SByte8>(Nucleus::createNot(val.value()));
 }
 
 RValue<Short4> UnpackLow(RValue<SByte8> x, RValue<SByte8> y)
 {
 	// TODO(b/148379603): Optimize narrowing swizzle.
 	int shuffle[16] = { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 };  // Real type is v16i8
-	return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
+	return As<Short4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
 }
 
 RValue<Short4> UnpackHigh(RValue<SByte8> x, RValue<SByte8> y)
 {
 	// TODO(b/148379603): Optimize narrowing swizzle.
 	int shuffle[16] = { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 };  // Real type is v16i8
-	auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
+	auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
 	return As<Short4>(Swizzle(As<Int4>(lowHigh), 0x2323));
 }
 
@@ -1655,25 +1655,25 @@
 		static_cast<int>((select >> 0) & 0x0F),
 	};
 
-	return As<Byte16>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
+	return As<Byte16>(Nucleus::createShuffleVector(x.value(), x.value(), shuffle));
 }
 
 Short2::Short2(RValue<Short4> cast)
 {
-	storeValue(Nucleus::createBitCast(cast.value, type()));
+	storeValue(Nucleus::createBitCast(cast.value(), type()));
 }
 
 UShort2::UShort2(RValue<UShort4> cast)
 {
-	storeValue(Nucleus::createBitCast(cast.value, type()));
+	storeValue(Nucleus::createBitCast(cast.value(), type()));
 }
 
 Short4::Short4(RValue<Int> cast)
 {
 	Value *vector = loadValue();
-	Value *element = Nucleus::createTrunc(cast.value, Short::type());
+	Value *element = Nucleus::createTrunc(cast.value(), Short::type());
 	Value *insert = Nucleus::createInsertElement(vector, element, 0);
-	Value *swizzle = Swizzle(RValue<Short4>(insert), 0x0000).value;
+	Value *swizzle = Swizzle(RValue<Short4>(insert), 0x0000).value();
 
 	storeValue(swizzle);
 }
@@ -1711,7 +1711,7 @@
 
 Short4::Short4(RValue<UShort4> rhs)
 {
-	storeValue(rhs.value);
+	storeValue(rhs.value());
 }
 
 Short4::Short4(const UShort4 &rhs)
@@ -1741,7 +1741,7 @@
 
 RValue<Short4> Short4::operator=(RValue<UShort4> rhs)
 {
-	return RValue<Short4>(storeValue(rhs.value));
+	return RValue<Short4>(storeValue(rhs.value()));
 }
 
 RValue<Short4> Short4::operator=(const UShort4 &rhs)
@@ -1756,42 +1756,42 @@
 
 RValue<Short4> operator+(RValue<Short4> lhs, RValue<Short4> rhs)
 {
-	return RValue<Short4>(Nucleus::createAdd(lhs.value, rhs.value));
+	return RValue<Short4>(Nucleus::createAdd(lhs.value(), rhs.value()));
 }
 
 RValue<Short4> operator-(RValue<Short4> lhs, RValue<Short4> rhs)
 {
-	return RValue<Short4>(Nucleus::createSub(lhs.value, rhs.value));
+	return RValue<Short4>(Nucleus::createSub(lhs.value(), rhs.value()));
 }
 
 RValue<Short4> operator*(RValue<Short4> lhs, RValue<Short4> rhs)
 {
-	return RValue<Short4>(Nucleus::createMul(lhs.value, rhs.value));
+	return RValue<Short4>(Nucleus::createMul(lhs.value(), rhs.value()));
 }
 
 //	RValue<Short4> operator/(RValue<Short4> lhs, RValue<Short4> rhs)
 //	{
-//		return RValue<Short4>(Nucleus::createSDiv(lhs.value, rhs.value));
+//		return RValue<Short4>(Nucleus::createSDiv(lhs.value(), rhs.value()));
 //	}
 
 //	RValue<Short4> operator%(RValue<Short4> lhs, RValue<Short4> rhs)
 //	{
-//		return RValue<Short4>(Nucleus::createSRem(lhs.value, rhs.value));
+//		return RValue<Short4>(Nucleus::createSRem(lhs.value(), rhs.value()));
 //	}
 
 RValue<Short4> operator&(RValue<Short4> lhs, RValue<Short4> rhs)
 {
-	return RValue<Short4>(Nucleus::createAnd(lhs.value, rhs.value));
+	return RValue<Short4>(Nucleus::createAnd(lhs.value(), rhs.value()));
 }
 
 RValue<Short4> operator|(RValue<Short4> lhs, RValue<Short4> rhs)
 {
-	return RValue<Short4>(Nucleus::createOr(lhs.value, rhs.value));
+	return RValue<Short4>(Nucleus::createOr(lhs.value(), rhs.value()));
 }
 
 RValue<Short4> operator^(RValue<Short4> lhs, RValue<Short4> rhs)
 {
-	return RValue<Short4>(Nucleus::createXor(lhs.value, rhs.value));
+	return RValue<Short4>(Nucleus::createXor(lhs.value(), rhs.value()));
 }
 
 RValue<Short4> operator+=(Short4 &lhs, RValue<Short4> rhs)
@@ -1851,12 +1851,12 @@
 
 RValue<Short4> operator-(RValue<Short4> val)
 {
-	return RValue<Short4>(Nucleus::createNeg(val.value));
+	return RValue<Short4>(Nucleus::createNeg(val.value()));
 }
 
 RValue<Short4> operator~(RValue<Short4> val)
 {
-	return RValue<Short4>(Nucleus::createNot(val.value));
+	return RValue<Short4>(Nucleus::createNot(val.value()));
 }
 
 RValue<Short4> RoundShort4(RValue<Float4> cast)
@@ -1868,14 +1868,14 @@
 RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y)
 {
 	int shuffle[8] = { 0, 8, 1, 9, 2, 10, 3, 11 };  // Real type is v8i16
-	return As<Int2>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
+	return As<Int2>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
 }
 
 RValue<Int2> UnpackHigh(RValue<Short4> x, RValue<Short4> y)
 {
 	// TODO(b/148379603): Optimize narrowing swizzle.
 	int shuffle[8] = { 0, 8, 1, 9, 2, 10, 3, 11 };  // Real type is v8i16
-	auto lowHigh = RValue<Short8>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
+	auto lowHigh = RValue<Short8>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
 	return As<Int2>(Swizzle(As<Int4>(lowHigh), 0x2323));
 }
 
@@ -1894,17 +1894,17 @@
 		(select >> 0) & 0x03,
 	};
 
-	return As<Short4>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
+	return As<Short4>(Nucleus::createShuffleVector(x.value(), x.value(), shuffle));
 }
 
 RValue<Short4> Insert(RValue<Short4> val, RValue<Short> element, int i)
 {
-	return RValue<Short4>(Nucleus::createInsertElement(val.value, element.value, i));
+	return RValue<Short4>(Nucleus::createInsertElement(val.value(), element.value(), i));
 }
 
 RValue<Short> Extract(RValue<Short4> val, int i)
 {
-	return RValue<Short>(Nucleus::createExtractElement(val.value, Short::type(), i));
+	return RValue<Short>(Nucleus::createExtractElement(val.value(), Short::type(), i));
 }
 
 UShort4::UShort4(RValue<Int4> cast)
@@ -1941,7 +1941,7 @@
 
 UShort4::UShort4(RValue<Short4> rhs)
 {
-	storeValue(rhs.value);
+	storeValue(rhs.value());
 }
 
 UShort4::UShort4(const Short4 &rhs)
@@ -1971,7 +1971,7 @@
 
 RValue<UShort4> UShort4::operator=(RValue<Short4> rhs)
 {
-	return RValue<UShort4>(storeValue(rhs.value));
+	return RValue<UShort4>(storeValue(rhs.value()));
 }
 
 RValue<UShort4> UShort4::operator=(const Short4 &rhs)
@@ -1986,32 +1986,32 @@
 
 RValue<UShort4> operator+(RValue<UShort4> lhs, RValue<UShort4> rhs)
 {
-	return RValue<UShort4>(Nucleus::createAdd(lhs.value, rhs.value));
+	return RValue<UShort4>(Nucleus::createAdd(lhs.value(), rhs.value()));
 }
 
 RValue<UShort4> operator-(RValue<UShort4> lhs, RValue<UShort4> rhs)
 {
-	return RValue<UShort4>(Nucleus::createSub(lhs.value, rhs.value));
+	return RValue<UShort4>(Nucleus::createSub(lhs.value(), rhs.value()));
 }
 
 RValue<UShort4> operator*(RValue<UShort4> lhs, RValue<UShort4> rhs)
 {
-	return RValue<UShort4>(Nucleus::createMul(lhs.value, rhs.value));
+	return RValue<UShort4>(Nucleus::createMul(lhs.value(), rhs.value()));
 }
 
 RValue<UShort4> operator&(RValue<UShort4> lhs, RValue<UShort4> rhs)
 {
-	return RValue<UShort4>(Nucleus::createAnd(lhs.value, rhs.value));
+	return RValue<UShort4>(Nucleus::createAnd(lhs.value(), rhs.value()));
 }
 
 RValue<UShort4> operator|(RValue<UShort4> lhs, RValue<UShort4> rhs)
 {
-	return RValue<UShort4>(Nucleus::createOr(lhs.value, rhs.value));
+	return RValue<UShort4>(Nucleus::createOr(lhs.value(), rhs.value()));
 }
 
 RValue<UShort4> operator^(RValue<UShort4> lhs, RValue<UShort4> rhs)
 {
-	return RValue<UShort4>(Nucleus::createXor(lhs.value, rhs.value));
+	return RValue<UShort4>(Nucleus::createXor(lhs.value(), rhs.value()));
 }
 
 RValue<UShort4> operator<<=(UShort4 &lhs, unsigned char rhs)
@@ -2026,7 +2026,7 @@
 
 RValue<UShort4> operator~(RValue<UShort4> val)
 {
-	return RValue<UShort4>(Nucleus::createNot(val.value));
+	return RValue<UShort4>(Nucleus::createNot(val.value()));
 }
 
 Short8::Short8(short c)
@@ -2054,7 +2054,7 @@
 Short8::Short8(RValue<Short4> lo, RValue<Short4> hi)
 {
 	int shuffle[8] = { 0, 1, 2, 3, 8, 9, 10, 11 };  // Real type is v8i16
-	Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
+	Value *packed = Nucleus::createShuffleVector(lo.value(), hi.value(), shuffle);
 
 	storeValue(packed);
 }
@@ -2076,12 +2076,12 @@
 
 RValue<Short8> operator+(RValue<Short8> lhs, RValue<Short8> rhs)
 {
-	return RValue<Short8>(Nucleus::createAdd(lhs.value, rhs.value));
+	return RValue<Short8>(Nucleus::createAdd(lhs.value(), rhs.value()));
 }
 
 RValue<Short8> operator&(RValue<Short8> lhs, RValue<Short8> rhs)
 {
-	return RValue<Short8>(Nucleus::createAnd(lhs.value, rhs.value));
+	return RValue<Short8>(Nucleus::createAnd(lhs.value(), rhs.value()));
 }
 
 RValue<Int4> Abs(RValue<Int4> x)
@@ -2116,7 +2116,7 @@
 UShort8::UShort8(RValue<UShort4> lo, RValue<UShort4> hi)
 {
 	int shuffle[8] = { 0, 1, 2, 3, 8, 9, 10, 11 };  // Real type is v8i16
-	Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
+	Value *packed = Nucleus::createShuffleVector(lo.value(), hi.value(), shuffle);
 
 	storeValue(packed);
 }
@@ -2138,17 +2138,17 @@
 
 RValue<UShort8> operator&(RValue<UShort8> lhs, RValue<UShort8> rhs)
 {
-	return RValue<UShort8>(Nucleus::createAnd(lhs.value, rhs.value));
+	return RValue<UShort8>(Nucleus::createAnd(lhs.value(), rhs.value()));
 }
 
 RValue<UShort8> operator+(RValue<UShort8> lhs, RValue<UShort8> rhs)
 {
-	return RValue<UShort8>(Nucleus::createAdd(lhs.value, rhs.value));
+	return RValue<UShort8>(Nucleus::createAdd(lhs.value(), rhs.value()));
 }
 
 RValue<UShort8> operator*(RValue<UShort8> lhs, RValue<UShort8> rhs)
 {
-	return RValue<UShort8>(Nucleus::createMul(lhs.value, rhs.value));
+	return RValue<UShort8>(Nucleus::createMul(lhs.value(), rhs.value()));
 }
 
 RValue<UShort8> operator+=(UShort8 &lhs, RValue<UShort8> rhs)
@@ -2158,7 +2158,7 @@
 
 RValue<UShort8> operator~(RValue<UShort8> val)
 {
-	return RValue<UShort8>(Nucleus::createNot(val.value));
+	return RValue<UShort8>(Nucleus::createNot(val.value()));
 }
 
 RValue<UShort8> Swizzle(RValue<UShort8> x, uint32_t select)
@@ -2174,38 +2174,38 @@
 		static_cast<int>((select >> 0) & 0x07),
 	};
 
-	return RValue<UShort8>(Nucleus::createShuffleVector(x.value, x.value, swizzle));
+	return RValue<UShort8>(Nucleus::createShuffleVector(x.value(), x.value(), swizzle));
 }
 
 Int::Int(Argument<Int> argument)
 {
-	storeValue(argument.value);
+	store(argument.rvalue());
 }
 
 Int::Int(RValue<Byte> cast)
 {
-	Value *integer = Nucleus::createZExt(cast.value, Int::type());
+	Value *integer = Nucleus::createZExt(cast.value(), Int::type());
 
 	storeValue(integer);
 }
 
 Int::Int(RValue<SByte> cast)
 {
-	Value *integer = Nucleus::createSExt(cast.value, Int::type());
+	Value *integer = Nucleus::createSExt(cast.value(), Int::type());
 
 	storeValue(integer);
 }
 
 Int::Int(RValue<Short> cast)
 {
-	Value *integer = Nucleus::createSExt(cast.value, Int::type());
+	Value *integer = Nucleus::createSExt(cast.value(), Int::type());
 
 	storeValue(integer);
 }
 
 Int::Int(RValue<UShort> cast)
 {
-	Value *integer = Nucleus::createZExt(cast.value, Int::type());
+	Value *integer = Nucleus::createZExt(cast.value(), Int::type());
 
 	storeValue(integer);
 }
@@ -2217,14 +2217,14 @@
 
 Int::Int(RValue<Long> cast)
 {
-	Value *integer = Nucleus::createTrunc(cast.value, Int::type());
+	Value *integer = Nucleus::createTrunc(cast.value(), Int::type());
 
 	storeValue(integer);
 }
 
 Int::Int(RValue<Float> cast)
 {
-	Value *integer = Nucleus::createFPToSI(cast.value, Int::type());
+	Value *integer = Nucleus::createFPToSI(cast.value(), Int::type());
 
 	storeValue(integer);
 }
@@ -2241,7 +2241,7 @@
 
 Int::Int(RValue<UInt> rhs)
 {
-	storeValue(rhs.value);
+	storeValue(rhs.value());
 }
 
 Int::Int(const Int &rhs)
@@ -2276,7 +2276,7 @@
 
 RValue<Int> Int::operator=(RValue<UInt> rhs)
 {
-	storeValue(rhs.value);
+	storeValue(rhs.value());
 
 	return RValue<Int>(rhs);
 }
@@ -2303,52 +2303,52 @@
 
 RValue<Int> operator+(RValue<Int> lhs, RValue<Int> rhs)
 {
-	return RValue<Int>(Nucleus::createAdd(lhs.value, rhs.value));
+	return RValue<Int>(Nucleus::createAdd(lhs.value(), rhs.value()));
 }
 
 RValue<Int> operator-(RValue<Int> lhs, RValue<Int> rhs)
 {
-	return RValue<Int>(Nucleus::createSub(lhs.value, rhs.value));
+	return RValue<Int>(Nucleus::createSub(lhs.value(), rhs.value()));
 }
 
 RValue<Int> operator*(RValue<Int> lhs, RValue<Int> rhs)
 {
-	return RValue<Int>(Nucleus::createMul(lhs.value, rhs.value));
+	return RValue<Int>(Nucleus::createMul(lhs.value(), rhs.value()));
 }
 
 RValue<Int> operator/(RValue<Int> lhs, RValue<Int> rhs)
 {
-	return RValue<Int>(Nucleus::createSDiv(lhs.value, rhs.value));
+	return RValue<Int>(Nucleus::createSDiv(lhs.value(), rhs.value()));
 }
 
 RValue<Int> operator%(RValue<Int> lhs, RValue<Int> rhs)
 {
-	return RValue<Int>(Nucleus::createSRem(lhs.value, rhs.value));
+	return RValue<Int>(Nucleus::createSRem(lhs.value(), rhs.value()));
 }
 
 RValue<Int> operator&(RValue<Int> lhs, RValue<Int> rhs)
 {
-	return RValue<Int>(Nucleus::createAnd(lhs.value, rhs.value));
+	return RValue<Int>(Nucleus::createAnd(lhs.value(), rhs.value()));
 }
 
 RValue<Int> operator|(RValue<Int> lhs, RValue<Int> rhs)
 {
-	return RValue<Int>(Nucleus::createOr(lhs.value, rhs.value));
+	return RValue<Int>(Nucleus::createOr(lhs.value(), rhs.value()));
 }
 
 RValue<Int> operator^(RValue<Int> lhs, RValue<Int> rhs)
 {
-	return RValue<Int>(Nucleus::createXor(lhs.value, rhs.value));
+	return RValue<Int>(Nucleus::createXor(lhs.value(), rhs.value()));
 }
 
 RValue<Int> operator<<(RValue<Int> lhs, RValue<Int> rhs)
 {
-	return RValue<Int>(Nucleus::createShl(lhs.value, rhs.value));
+	return RValue<Int>(Nucleus::createShl(lhs.value(), rhs.value()));
 }
 
 RValue<Int> operator>>(RValue<Int> lhs, RValue<Int> rhs)
 {
-	return RValue<Int>(Nucleus::createAShr(lhs.value, rhs.value));
+	return RValue<Int>(Nucleus::createAShr(lhs.value(), rhs.value()));
 }
 
 RValue<Int> operator+=(Int &lhs, RValue<Int> rhs)
@@ -2408,42 +2408,42 @@
 
 RValue<Int> operator-(RValue<Int> val)
 {
-	return RValue<Int>(Nucleus::createNeg(val.value));
+	return RValue<Int>(Nucleus::createNeg(val.value()));
 }
 
 RValue<Int> operator~(RValue<Int> val)
 {
-	return RValue<Int>(Nucleus::createNot(val.value));
+	return RValue<Int>(Nucleus::createNot(val.value()));
 }
 
 RValue<Bool> operator<(RValue<Int> lhs, RValue<Int> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpSLT(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator<=(RValue<Int> lhs, RValue<Int> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpSLE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator>(RValue<Int> lhs, RValue<Int> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpSGT(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator>=(RValue<Int> lhs, RValue<Int> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpSGE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator!=(RValue<Int> lhs, RValue<Int> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator==(RValue<Int> lhs, RValue<Int> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
 }
 
 RValue<Int> Max(RValue<Int> x, RValue<Int> y)
@@ -2463,14 +2463,14 @@
 
 Long::Long(RValue<Int> cast)
 {
-	Value *integer = Nucleus::createSExt(cast.value, Long::type());
+	Value *integer = Nucleus::createSExt(cast.value(), Long::type());
 
 	storeValue(integer);
 }
 
 Long::Long(RValue<UInt> cast)
 {
-	Value *integer = Nucleus::createZExt(cast.value, Long::type());
+	Value *integer = Nucleus::createZExt(cast.value(), Long::type());
 
 	storeValue(integer);
 }
@@ -2502,22 +2502,22 @@
 
 RValue<Long> operator+(RValue<Long> lhs, RValue<Long> rhs)
 {
-	return RValue<Long>(Nucleus::createAdd(lhs.value, rhs.value));
+	return RValue<Long>(Nucleus::createAdd(lhs.value(), rhs.value()));
 }
 
 RValue<Long> operator-(RValue<Long> lhs, RValue<Long> rhs)
 {
-	return RValue<Long>(Nucleus::createSub(lhs.value, rhs.value));
+	return RValue<Long>(Nucleus::createSub(lhs.value(), rhs.value()));
 }
 
 RValue<Long> operator*(RValue<Long> lhs, RValue<Long> rhs)
 {
-	return RValue<Long>(Nucleus::createMul(lhs.value, rhs.value));
+	return RValue<Long>(Nucleus::createMul(lhs.value(), rhs.value()));
 }
 
 RValue<Long> operator>>(RValue<Long> lhs, RValue<Long> rhs)
 {
-	return RValue<Long>(Nucleus::createAShr(lhs.value, rhs.value));
+	return RValue<Long>(Nucleus::createAShr(lhs.value(), rhs.value()));
 }
 
 RValue<Long> operator+=(Long &lhs, RValue<Long> rhs)
@@ -2532,59 +2532,59 @@
 
 RValue<Long> AddAtomic(RValue<Pointer<Long>> x, RValue<Long> y)
 {
-	return RValue<Long>(Nucleus::createAtomicAdd(x.value, y.value));
+	return RValue<Long>(Nucleus::createAtomicAdd(x.value(), y.value()));
 }
 
 RValue<UInt> AddAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
 {
-	return RValue<UInt>(Nucleus::createAtomicAdd(x.value, y.value, memoryOrder));
+	return RValue<UInt>(Nucleus::createAtomicAdd(x.value(), y.value(), memoryOrder));
 }
 
 RValue<UInt> SubAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
 {
-	return RValue<UInt>(Nucleus::createAtomicSub(x.value, y.value, memoryOrder));
+	return RValue<UInt>(Nucleus::createAtomicSub(x.value(), y.value(), memoryOrder));
 }
 
 RValue<UInt> AndAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
 {
-	return RValue<UInt>(Nucleus::createAtomicAnd(x.value, y.value, memoryOrder));
+	return RValue<UInt>(Nucleus::createAtomicAnd(x.value(), y.value(), memoryOrder));
 }
 
 RValue<UInt> OrAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
 {
-	return RValue<UInt>(Nucleus::createAtomicOr(x.value, y.value, memoryOrder));
+	return RValue<UInt>(Nucleus::createAtomicOr(x.value(), y.value(), memoryOrder));
 }
 
 RValue<UInt> XorAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
 {
-	return RValue<UInt>(Nucleus::createAtomicXor(x.value, y.value, memoryOrder));
+	return RValue<UInt>(Nucleus::createAtomicXor(x.value(), y.value(), memoryOrder));
 }
 
 RValue<UInt> ExchangeAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
 {
-	return RValue<UInt>(Nucleus::createAtomicExchange(x.value, y.value, memoryOrder));
+	return RValue<UInt>(Nucleus::createAtomicExchange(x.value(), y.value(), memoryOrder));
 }
 
 RValue<UInt> CompareExchangeAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, RValue<UInt> compare, std::memory_order memoryOrderEqual, std::memory_order memoryOrderUnequal)
 {
-	return RValue<UInt>(Nucleus::createAtomicCompareExchange(x.value, y.value, compare.value, memoryOrderEqual, memoryOrderUnequal));
+	return RValue<UInt>(Nucleus::createAtomicCompareExchange(x.value(), y.value(), compare.value(), memoryOrderEqual, memoryOrderUnequal));
 }
 
 UInt::UInt(Argument<UInt> argument)
 {
-	storeValue(argument.value);
+	store(argument.rvalue());
 }
 
 UInt::UInt(RValue<UShort> cast)
 {
-	Value *integer = Nucleus::createZExt(cast.value, UInt::type());
+	Value *integer = Nucleus::createZExt(cast.value(), UInt::type());
 
 	storeValue(integer);
 }
 
 UInt::UInt(RValue<Long> cast)
 {
-	Value *integer = Nucleus::createTrunc(cast.value, UInt::type());
+	Value *integer = Nucleus::createTrunc(cast.value(), UInt::type());
 
 	storeValue(integer);
 }
@@ -2606,7 +2606,7 @@
 
 UInt::UInt(RValue<Int> rhs)
 {
-	storeValue(rhs.value);
+	storeValue(rhs.value());
 }
 
 UInt::UInt(const UInt &rhs)
@@ -2641,7 +2641,7 @@
 
 RValue<UInt> UInt::operator=(RValue<Int> rhs)
 {
-	storeValue(rhs.value);
+	storeValue(rhs.value());
 
 	return RValue<UInt>(rhs);
 }
@@ -2668,52 +2668,52 @@
 
 RValue<UInt> operator+(RValue<UInt> lhs, RValue<UInt> rhs)
 {
-	return RValue<UInt>(Nucleus::createAdd(lhs.value, rhs.value));
+	return RValue<UInt>(Nucleus::createAdd(lhs.value(), rhs.value()));
 }
 
 RValue<UInt> operator-(RValue<UInt> lhs, RValue<UInt> rhs)
 {
-	return RValue<UInt>(Nucleus::createSub(lhs.value, rhs.value));
+	return RValue<UInt>(Nucleus::createSub(lhs.value(), rhs.value()));
 }
 
 RValue<UInt> operator*(RValue<UInt> lhs, RValue<UInt> rhs)
 {
-	return RValue<UInt>(Nucleus::createMul(lhs.value, rhs.value));
+	return RValue<UInt>(Nucleus::createMul(lhs.value(), rhs.value()));
 }
 
 RValue<UInt> operator/(RValue<UInt> lhs, RValue<UInt> rhs)
 {
-	return RValue<UInt>(Nucleus::createUDiv(lhs.value, rhs.value));
+	return RValue<UInt>(Nucleus::createUDiv(lhs.value(), rhs.value()));
 }
 
 RValue<UInt> operator%(RValue<UInt> lhs, RValue<UInt> rhs)
 {
-	return RValue<UInt>(Nucleus::createURem(lhs.value, rhs.value));
+	return RValue<UInt>(Nucleus::createURem(lhs.value(), rhs.value()));
 }
 
 RValue<UInt> operator&(RValue<UInt> lhs, RValue<UInt> rhs)
 {
-	return RValue<UInt>(Nucleus::createAnd(lhs.value, rhs.value));
+	return RValue<UInt>(Nucleus::createAnd(lhs.value(), rhs.value()));
 }
 
 RValue<UInt> operator|(RValue<UInt> lhs, RValue<UInt> rhs)
 {
-	return RValue<UInt>(Nucleus::createOr(lhs.value, rhs.value));
+	return RValue<UInt>(Nucleus::createOr(lhs.value(), rhs.value()));
 }
 
 RValue<UInt> operator^(RValue<UInt> lhs, RValue<UInt> rhs)
 {
-	return RValue<UInt>(Nucleus::createXor(lhs.value, rhs.value));
+	return RValue<UInt>(Nucleus::createXor(lhs.value(), rhs.value()));
 }
 
 RValue<UInt> operator<<(RValue<UInt> lhs, RValue<UInt> rhs)
 {
-	return RValue<UInt>(Nucleus::createShl(lhs.value, rhs.value));
+	return RValue<UInt>(Nucleus::createShl(lhs.value(), rhs.value()));
 }
 
 RValue<UInt> operator>>(RValue<UInt> lhs, RValue<UInt> rhs)
 {
-	return RValue<UInt>(Nucleus::createLShr(lhs.value, rhs.value));
+	return RValue<UInt>(Nucleus::createLShr(lhs.value(), rhs.value()));
 }
 
 RValue<UInt> operator+=(UInt &lhs, RValue<UInt> rhs)
@@ -2773,12 +2773,12 @@
 
 RValue<UInt> operator-(RValue<UInt> val)
 {
-	return RValue<UInt>(Nucleus::createNeg(val.value));
+	return RValue<UInt>(Nucleus::createNeg(val.value()));
 }
 
 RValue<UInt> operator~(RValue<UInt> val)
 {
-	return RValue<UInt>(Nucleus::createNot(val.value));
+	return RValue<UInt>(Nucleus::createNot(val.value()));
 }
 
 RValue<UInt> Max(RValue<UInt> x, RValue<UInt> y)
@@ -2798,37 +2798,37 @@
 
 RValue<Bool> operator<(RValue<UInt> lhs, RValue<UInt> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpULT(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator<=(RValue<UInt> lhs, RValue<UInt> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpULE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator>(RValue<UInt> lhs, RValue<UInt> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpUGT(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator>=(RValue<UInt> lhs, RValue<UInt> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpUGE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator!=(RValue<UInt> lhs, RValue<UInt> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator==(RValue<UInt> lhs, RValue<UInt> rhs)
 {
-	return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
 }
 
 Int2::Int2(RValue<Int4> cast)
 {
-	storeValue(Nucleus::createBitCast(cast.value, type()));
+	storeValue(Nucleus::createBitCast(cast.value(), type()));
 }
 
 Int2::Int2(int x, int y)
@@ -2877,42 +2877,42 @@
 
 RValue<Int2> operator+(RValue<Int2> lhs, RValue<Int2> rhs)
 {
-	return RValue<Int2>(Nucleus::createAdd(lhs.value, rhs.value));
+	return RValue<Int2>(Nucleus::createAdd(lhs.value(), rhs.value()));
 }
 
 RValue<Int2> operator-(RValue<Int2> lhs, RValue<Int2> rhs)
 {
-	return RValue<Int2>(Nucleus::createSub(lhs.value, rhs.value));
+	return RValue<Int2>(Nucleus::createSub(lhs.value(), rhs.value()));
 }
 
 //	RValue<Int2> operator*(RValue<Int2> lhs, RValue<Int2> rhs)
 //	{
-//		return RValue<Int2>(Nucleus::createMul(lhs.value, rhs.value));
+//		return RValue<Int2>(Nucleus::createMul(lhs.value(), rhs.value()));
 //	}
 
 //	RValue<Int2> operator/(RValue<Int2> lhs, RValue<Int2> rhs)
 //	{
-//		return RValue<Int2>(Nucleus::createSDiv(lhs.value, rhs.value));
+//		return RValue<Int2>(Nucleus::createSDiv(lhs.value(), rhs.value()));
 //	}
 
 //	RValue<Int2> operator%(RValue<Int2> lhs, RValue<Int2> rhs)
 //	{
-//		return RValue<Int2>(Nucleus::createSRem(lhs.value, rhs.value));
+//		return RValue<Int2>(Nucleus::createSRem(lhs.value(), rhs.value()));
 //	}
 
 RValue<Int2> operator&(RValue<Int2> lhs, RValue<Int2> rhs)
 {
-	return RValue<Int2>(Nucleus::createAnd(lhs.value, rhs.value));
+	return RValue<Int2>(Nucleus::createAnd(lhs.value(), rhs.value()));
 }
 
 RValue<Int2> operator|(RValue<Int2> lhs, RValue<Int2> rhs)
 {
-	return RValue<Int2>(Nucleus::createOr(lhs.value, rhs.value));
+	return RValue<Int2>(Nucleus::createOr(lhs.value(), rhs.value()));
 }
 
 RValue<Int2> operator^(RValue<Int2> lhs, RValue<Int2> rhs)
 {
-	return RValue<Int2>(Nucleus::createXor(lhs.value, rhs.value));
+	return RValue<Int2>(Nucleus::createXor(lhs.value(), rhs.value()));
 }
 
 RValue<Int2> operator+=(Int2 &lhs, RValue<Int2> rhs)
@@ -2972,37 +2972,37 @@
 
 //	RValue<Int2> operator-(RValue<Int2> val)
 //	{
-//		return RValue<Int2>(Nucleus::createNeg(val.value));
+//		return RValue<Int2>(Nucleus::createNeg(val.value()));
 //	}
 
 RValue<Int2> operator~(RValue<Int2> val)
 {
-	return RValue<Int2>(Nucleus::createNot(val.value));
+	return RValue<Int2>(Nucleus::createNot(val.value()));
 }
 
 RValue<Short4> UnpackLow(RValue<Int2> x, RValue<Int2> y)
 {
 	// TODO(b/148379603): Optimize narrowing swizzle.
 	int shuffle[4] = { 0, 4, 1, 5 };  // Real type is v4i32
-	return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
+	return As<Short4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
 }
 
 RValue<Short4> UnpackHigh(RValue<Int2> x, RValue<Int2> y)
 {
 	// TODO(b/148379603): Optimize narrowing swizzle.
 	int shuffle[4] = { 0, 4, 1, 5 };  // Real type is v4i32
-	auto lowHigh = RValue<Int4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
+	auto lowHigh = RValue<Int4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
 	return As<Short4>(Swizzle(lowHigh, 0x2323));
 }
 
 RValue<Int> Extract(RValue<Int2> val, int i)
 {
-	return RValue<Int>(Nucleus::createExtractElement(val.value, Int::type(), i));
+	return RValue<Int>(Nucleus::createExtractElement(val.value(), Int::type(), i));
 }
 
 RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i)
 {
-	return RValue<Int2>(Nucleus::createInsertElement(val.value, element.value, i));
+	return RValue<Int2>(Nucleus::createInsertElement(val.value(), element.value(), i));
 }
 
 UInt2::UInt2(unsigned int x, unsigned int y)
@@ -3043,42 +3043,42 @@
 
 RValue<UInt2> operator+(RValue<UInt2> lhs, RValue<UInt2> rhs)
 {
-	return RValue<UInt2>(Nucleus::createAdd(lhs.value, rhs.value));
+	return RValue<UInt2>(Nucleus::createAdd(lhs.value(), rhs.value()));
 }
 
 RValue<UInt2> operator-(RValue<UInt2> lhs, RValue<UInt2> rhs)
 {
-	return RValue<UInt2>(Nucleus::createSub(lhs.value, rhs.value));
+	return RValue<UInt2>(Nucleus::createSub(lhs.value(), rhs.value()));
 }
 
 //	RValue<UInt2> operator*(RValue<UInt2> lhs, RValue<UInt2> rhs)
 //	{
-//		return RValue<UInt2>(Nucleus::createMul(lhs.value, rhs.value));
+//		return RValue<UInt2>(Nucleus::createMul(lhs.value(), rhs.value()));
 //	}
 
 //	RValue<UInt2> operator/(RValue<UInt2> lhs, RValue<UInt2> rhs)
 //	{
-//		return RValue<UInt2>(Nucleus::createUDiv(lhs.value, rhs.value));
+//		return RValue<UInt2>(Nucleus::createUDiv(lhs.value(), rhs.value()));
 //	}
 
 //	RValue<UInt2> operator%(RValue<UInt2> lhs, RValue<UInt2> rhs)
 //	{
-//		return RValue<UInt2>(Nucleus::createURem(lhs.value, rhs.value));
+//		return RValue<UInt2>(Nucleus::createURem(lhs.value(), rhs.value()));
 //	}
 
 RValue<UInt2> operator&(RValue<UInt2> lhs, RValue<UInt2> rhs)
 {
-	return RValue<UInt2>(Nucleus::createAnd(lhs.value, rhs.value));
+	return RValue<UInt2>(Nucleus::createAnd(lhs.value(), rhs.value()));
 }
 
 RValue<UInt2> operator|(RValue<UInt2> lhs, RValue<UInt2> rhs)
 {
-	return RValue<UInt2>(Nucleus::createOr(lhs.value, rhs.value));
+	return RValue<UInt2>(Nucleus::createOr(lhs.value(), rhs.value()));
 }
 
 RValue<UInt2> operator^(RValue<UInt2> lhs, RValue<UInt2> rhs)
 {
-	return RValue<UInt2>(Nucleus::createXor(lhs.value, rhs.value));
+	return RValue<UInt2>(Nucleus::createXor(lhs.value(), rhs.value()));
 }
 
 RValue<UInt2> operator+=(UInt2 &lhs, RValue<UInt2> rhs)
@@ -3138,22 +3138,22 @@
 
 //	RValue<UInt2> operator-(RValue<UInt2> val)
 //	{
-//		return RValue<UInt2>(Nucleus::createNeg(val.value));
+//		return RValue<UInt2>(Nucleus::createNeg(val.value()));
 //	}
 
 RValue<UInt2> operator~(RValue<UInt2> val)
 {
-	return RValue<UInt2>(Nucleus::createNot(val.value));
+	return RValue<UInt2>(Nucleus::createNot(val.value()));
 }
 
 RValue<UInt> Extract(RValue<UInt2> val, int i)
 {
-	return RValue<UInt>(Nucleus::createExtractElement(val.value, UInt::type(), i));
+	return RValue<UInt>(Nucleus::createExtractElement(val.value(), UInt::type(), i));
 }
 
 RValue<UInt2> Insert(RValue<UInt2> val, RValue<UInt> element, int i)
 {
-	return RValue<UInt2>(Nucleus::createInsertElement(val.value, element.value, i));
+	return RValue<UInt2>(Nucleus::createInsertElement(val.value(), element.value(), i));
 }
 
 Int4::Int4()
@@ -3164,7 +3164,7 @@
 Int4::Int4(RValue<Float4> cast)
     : XYZW(this)
 {
-	Value *xyzw = Nucleus::createFPToSI(cast.value, Int4::type());
+	Value *xyzw = Nucleus::createFPToSI(cast.value(), Int4::type());
 
 	storeValue(xyzw);
 }
@@ -3220,7 +3220,7 @@
 Int4::Int4(RValue<UInt4> rhs)
     : XYZW(this)
 {
-	storeValue(rhs.value);
+	storeValue(rhs.value());
 }
 
 Int4::Int4(const UInt4 &rhs)
@@ -3239,7 +3239,7 @@
     : XYZW(this)
 {
 	int shuffle[4] = { 0, 1, 4, 5 };  // Real type is v4i32
-	Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
+	Value *packed = Nucleus::createShuffleVector(lo.value(), hi.value(), shuffle);
 
 	storeValue(packed);
 }
@@ -3273,52 +3273,52 @@
 
 RValue<Int4> operator+(RValue<Int4> lhs, RValue<Int4> rhs)
 {
-	return RValue<Int4>(Nucleus::createAdd(lhs.value, rhs.value));
+	return RValue<Int4>(Nucleus::createAdd(lhs.value(), rhs.value()));
 }
 
 RValue<Int4> operator-(RValue<Int4> lhs, RValue<Int4> rhs)
 {
-	return RValue<Int4>(Nucleus::createSub(lhs.value, rhs.value));
+	return RValue<Int4>(Nucleus::createSub(lhs.value(), rhs.value()));
 }
 
 RValue<Int4> operator*(RValue<Int4> lhs, RValue<Int4> rhs)
 {
-	return RValue<Int4>(Nucleus::createMul(lhs.value, rhs.value));
+	return RValue<Int4>(Nucleus::createMul(lhs.value(), rhs.value()));
 }
 
 RValue<Int4> operator/(RValue<Int4> lhs, RValue<Int4> rhs)
 {
-	return RValue<Int4>(Nucleus::createSDiv(lhs.value, rhs.value));
+	return RValue<Int4>(Nucleus::createSDiv(lhs.value(), rhs.value()));
 }
 
 RValue<Int4> operator%(RValue<Int4> lhs, RValue<Int4> rhs)
 {
-	return RValue<Int4>(Nucleus::createSRem(lhs.value, rhs.value));
+	return RValue<Int4>(Nucleus::createSRem(lhs.value(), rhs.value()));
 }
 
 RValue<Int4> operator&(RValue<Int4> lhs, RValue<Int4> rhs)
 {
-	return RValue<Int4>(Nucleus::createAnd(lhs.value, rhs.value));
+	return RValue<Int4>(Nucleus::createAnd(lhs.value(), rhs.value()));
 }
 
 RValue<Int4> operator|(RValue<Int4> lhs, RValue<Int4> rhs)
 {
-	return RValue<Int4>(Nucleus::createOr(lhs.value, rhs.value));
+	return RValue<Int4>(Nucleus::createOr(lhs.value(), rhs.value()));
 }
 
 RValue<Int4> operator^(RValue<Int4> lhs, RValue<Int4> rhs)
 {
-	return RValue<Int4>(Nucleus::createXor(lhs.value, rhs.value));
+	return RValue<Int4>(Nucleus::createXor(lhs.value(), rhs.value()));
 }
 
 RValue<Int4> operator<<(RValue<Int4> lhs, RValue<Int4> rhs)
 {
-	return RValue<Int4>(Nucleus::createShl(lhs.value, rhs.value));
+	return RValue<Int4>(Nucleus::createShl(lhs.value(), rhs.value()));
 }
 
 RValue<Int4> operator>>(RValue<Int4> lhs, RValue<Int4> rhs)
 {
-	return RValue<Int4>(Nucleus::createAShr(lhs.value, rhs.value));
+	return RValue<Int4>(Nucleus::createAShr(lhs.value(), rhs.value()));
 }
 
 RValue<Int4> operator+=(Int4 &lhs, RValue<Int4> rhs)
@@ -3378,32 +3378,32 @@
 
 RValue<Int4> operator-(RValue<Int4> val)
 {
-	return RValue<Int4>(Nucleus::createNeg(val.value));
+	return RValue<Int4>(Nucleus::createNeg(val.value()));
 }
 
 RValue<Int4> operator~(RValue<Int4> val)
 {
-	return RValue<Int4>(Nucleus::createNot(val.value));
+	return RValue<Int4>(Nucleus::createNot(val.value()));
 }
 
 RValue<Int> Extract(RValue<Int4> x, int i)
 {
-	return RValue<Int>(Nucleus::createExtractElement(x.value, Int::type(), i));
+	return RValue<Int>(Nucleus::createExtractElement(x.value(), Int::type(), i));
 }
 
 RValue<Int4> Insert(RValue<Int4> x, RValue<Int> element, int i)
 {
-	return RValue<Int4>(Nucleus::createInsertElement(x.value, element.value, i));
+	return RValue<Int4>(Nucleus::createInsertElement(x.value(), element.value(), i));
 }
 
 RValue<Int4> Swizzle(RValue<Int4> x, uint16_t select)
 {
-	return RValue<Int4>(createSwizzle4(x.value, select));
+	return RValue<Int4>(createSwizzle4(x.value(), select));
 }
 
 RValue<Int4> Shuffle(RValue<Int4> x, RValue<Int4> y, unsigned short select)
 {
-	return RValue<Int4>(createShuffle4(x.value, y.value, select));
+	return RValue<Int4>(createShuffle4(x.value(), y.value(), select));
 }
 
 UInt4::UInt4()
@@ -3462,7 +3462,7 @@
 UInt4::UInt4(RValue<Int4> rhs)
     : XYZW(this)
 {
-	storeValue(rhs.value);
+	storeValue(rhs.value());
 }
 
 UInt4::UInt4(const Int4 &rhs)
@@ -3481,7 +3481,7 @@
     : XYZW(this)
 {
 	int shuffle[4] = { 0, 1, 4, 5 };  // Real type is v4i32
-	Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
+	Value *packed = Nucleus::createShuffleVector(lo.value(), hi.value(), shuffle);
 
 	storeValue(packed);
 }
@@ -3515,52 +3515,52 @@
 
 RValue<UInt4> operator+(RValue<UInt4> lhs, RValue<UInt4> rhs)
 {
-	return RValue<UInt4>(Nucleus::createAdd(lhs.value, rhs.value));
+	return RValue<UInt4>(Nucleus::createAdd(lhs.value(), rhs.value()));
 }
 
 RValue<UInt4> operator-(RValue<UInt4> lhs, RValue<UInt4> rhs)
 {
-	return RValue<UInt4>(Nucleus::createSub(lhs.value, rhs.value));
+	return RValue<UInt4>(Nucleus::createSub(lhs.value(), rhs.value()));
 }
 
 RValue<UInt4> operator*(RValue<UInt4> lhs, RValue<UInt4> rhs)
 {
-	return RValue<UInt4>(Nucleus::createMul(lhs.value, rhs.value));
+	return RValue<UInt4>(Nucleus::createMul(lhs.value(), rhs.value()));
 }
 
 RValue<UInt4> operator/(RValue<UInt4> lhs, RValue<UInt4> rhs)
 {
-	return RValue<UInt4>(Nucleus::createUDiv(lhs.value, rhs.value));
+	return RValue<UInt4>(Nucleus::createUDiv(lhs.value(), rhs.value()));
 }
 
 RValue<UInt4> operator%(RValue<UInt4> lhs, RValue<UInt4> rhs)
 {
-	return RValue<UInt4>(Nucleus::createURem(lhs.value, rhs.value));
+	return RValue<UInt4>(Nucleus::createURem(lhs.value(), rhs.value()));
 }
 
 RValue<UInt4> operator&(RValue<UInt4> lhs, RValue<UInt4> rhs)
 {
-	return RValue<UInt4>(Nucleus::createAnd(lhs.value, rhs.value));
+	return RValue<UInt4>(Nucleus::createAnd(lhs.value(), rhs.value()));
 }
 
 RValue<UInt4> operator|(RValue<UInt4> lhs, RValue<UInt4> rhs)
 {
-	return RValue<UInt4>(Nucleus::createOr(lhs.value, rhs.value));
+	return RValue<UInt4>(Nucleus::createOr(lhs.value(), rhs.value()));
 }
 
 RValue<UInt4> operator^(RValue<UInt4> lhs, RValue<UInt4> rhs)
 {
-	return RValue<UInt4>(Nucleus::createXor(lhs.value, rhs.value));
+	return RValue<UInt4>(Nucleus::createXor(lhs.value(), rhs.value()));
 }
 
 RValue<UInt4> operator<<(RValue<UInt4> lhs, RValue<UInt4> rhs)
 {
-	return RValue<UInt4>(Nucleus::createShl(lhs.value, rhs.value));
+	return RValue<UInt4>(Nucleus::createShl(lhs.value(), rhs.value()));
 }
 
 RValue<UInt4> operator>>(RValue<UInt4> lhs, RValue<UInt4> rhs)
 {
-	return RValue<UInt4>(Nucleus::createLShr(lhs.value, rhs.value));
+	return RValue<UInt4>(Nucleus::createLShr(lhs.value(), rhs.value()));
 }
 
 RValue<UInt4> operator+=(UInt4 &lhs, RValue<UInt4> rhs)
@@ -3620,32 +3620,32 @@
 
 RValue<UInt4> operator-(RValue<UInt4> val)
 {
-	return RValue<UInt4>(Nucleus::createNeg(val.value));
+	return RValue<UInt4>(Nucleus::createNeg(val.value()));
 }
 
 RValue<UInt4> operator~(RValue<UInt4> val)
 {
-	return RValue<UInt4>(Nucleus::createNot(val.value));
+	return RValue<UInt4>(Nucleus::createNot(val.value()));
 }
 
 RValue<UInt> Extract(RValue<UInt4> x, int i)
 {
-	return RValue<UInt>(Nucleus::createExtractElement(x.value, Int::type(), i));
+	return RValue<UInt>(Nucleus::createExtractElement(x.value(), Int::type(), i));
 }
 
 RValue<UInt4> Insert(RValue<UInt4> x, RValue<UInt> element, int i)
 {
-	return RValue<UInt4>(Nucleus::createInsertElement(x.value, element.value, i));
+	return RValue<UInt4>(Nucleus::createInsertElement(x.value(), element.value(), i));
 }
 
 RValue<UInt4> Swizzle(RValue<UInt4> x, uint16_t select)
 {
-	return RValue<UInt4>(createSwizzle4(x.value, select));
+	return RValue<UInt4>(createSwizzle4(x.value(), select));
 }
 
 RValue<UInt4> Shuffle(RValue<UInt4> x, RValue<UInt4> y, unsigned short select)
 {
-	return RValue<UInt4>(createShuffle4(x.value, y.value, select));
+	return RValue<UInt4>(createShuffle4(x.value(), y.value(), select));
 }
 
 Half::Half(RValue<Float> cast)
@@ -3678,7 +3678,7 @@
 
 Float::Float(RValue<Int> cast)
 {
-	Value *integer = Nucleus::createSIToFP(cast.value, Float::type());
+	Value *integer = Nucleus::createSIToFP(cast.value(), Float::type());
 
 	storeValue(integer);
 }
@@ -3688,7 +3688,7 @@
 	RValue<Float> result = Float(Int(cast & UInt(0x7FFFFFFF))) +
 	                       As<Float>((As<Int>(cast) >> 31) & As<Int>(Float(0x80000000u)));
 
-	storeValue(result.value);
+	storeValue(result.value());
 }
 
 Float::Float(RValue<Half> cast)
@@ -3718,7 +3718,7 @@
 		fp32i |= As<UInt>(((e + (127 - 15)) << 23) | (m << 13));
 	}
 
-	storeValue(As<Float>(fp32i).value);
+	storeValue(As<Float>(fp32i).value());
 }
 
 Float::Float(float x)
@@ -3776,7 +3776,7 @@
 
 Float::Float(Argument<Float> argument)
 {
-	storeValue(argument.value);
+	store(argument.rvalue());
 }
 
 RValue<Float> Float::operator=(RValue<Float> rhs)
@@ -3796,22 +3796,22 @@
 
 RValue<Float> operator+(RValue<Float> lhs, RValue<Float> rhs)
 {
-	return RValue<Float>(Nucleus::createFAdd(lhs.value, rhs.value));
+	return RValue<Float>(Nucleus::createFAdd(lhs.value(), rhs.value()));
 }
 
 RValue<Float> operator-(RValue<Float> lhs, RValue<Float> rhs)
 {
-	return RValue<Float>(Nucleus::createFSub(lhs.value, rhs.value));
+	return RValue<Float>(Nucleus::createFSub(lhs.value(), rhs.value()));
 }
 
 RValue<Float> operator*(RValue<Float> lhs, RValue<Float> rhs)
 {
-	return RValue<Float>(Nucleus::createFMul(lhs.value, rhs.value));
+	return RValue<Float>(Nucleus::createFMul(lhs.value(), rhs.value()));
 }
 
 RValue<Float> operator/(RValue<Float> lhs, RValue<Float> rhs)
 {
-	return RValue<Float>(Nucleus::createFDiv(lhs.value, rhs.value));
+	return RValue<Float>(Nucleus::createFDiv(lhs.value(), rhs.value()));
 }
 
 RValue<Float> operator+=(Float &lhs, RValue<Float> rhs)
@@ -3841,37 +3841,37 @@
 
 RValue<Float> operator-(RValue<Float> val)
 {
-	return RValue<Float>(Nucleus::createFNeg(val.value));
+	return RValue<Float>(Nucleus::createFNeg(val.value()));
 }
 
 RValue<Bool> operator<(RValue<Float> lhs, RValue<Float> rhs)
 {
-	return RValue<Bool>(Nucleus::createFCmpOLT(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createFCmpOLT(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator<=(RValue<Float> lhs, RValue<Float> rhs)
 {
-	return RValue<Bool>(Nucleus::createFCmpOLE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createFCmpOLE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator>(RValue<Float> lhs, RValue<Float> rhs)
 {
-	return RValue<Bool>(Nucleus::createFCmpOGT(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createFCmpOGT(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator>=(RValue<Float> lhs, RValue<Float> rhs)
 {
-	return RValue<Bool>(Nucleus::createFCmpOGE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createFCmpOGE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator!=(RValue<Float> lhs, RValue<Float> rhs)
 {
-	return RValue<Bool>(Nucleus::createFCmpONE(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createFCmpONE(lhs.value(), rhs.value()));
 }
 
 RValue<Bool> operator==(RValue<Float> lhs, RValue<Float> rhs)
 {
-	return RValue<Bool>(Nucleus::createFCmpOEQ(lhs.value, rhs.value));
+	return RValue<Bool>(Nucleus::createFCmpOEQ(lhs.value(), rhs.value()));
 }
 
 RValue<Float> Abs(RValue<Float> x)
@@ -3891,7 +3891,7 @@
 
 Float2::Float2(RValue<Float4> cast)
 {
-	storeValue(Nucleus::createBitCast(cast.value, type()));
+	storeValue(Nucleus::createBitCast(cast.value(), type()));
 }
 
 Float4::Float4(RValue<Byte4> cast)
@@ -3916,20 +3916,20 @@
     : XYZW(this)
 {
 	Int4 c(cast);
-	storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::type()));
+	storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value(), Float4::type()));
 }
 
 Float4::Float4(RValue<UShort4> cast)
     : XYZW(this)
 {
 	Int4 c(cast);
-	storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::type()));
+	storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value(), Float4::type()));
 }
 
 Float4::Float4(RValue<Int4> cast)
     : XYZW(this)
 {
-	Value *xyzw = Nucleus::createSIToFP(cast.value, Float4::type());
+	Value *xyzw = Nucleus::createSIToFP(cast.value(), Float4::type());
 
 	storeValue(xyzw);
 }
@@ -3940,7 +3940,7 @@
 	RValue<Float4> result = Float4(Int4(cast & UInt4(0x7FFFFFFF))) +
 	                        As<Float4>((As<Int4>(cast) >> 31) & As<Int4>(Float4(0x80000000u)));
 
-	storeValue(result.value);
+	storeValue(result.value());
 }
 
 Float4::Float4()
@@ -4059,22 +4059,22 @@
 
 RValue<Float4> operator+(RValue<Float4> lhs, RValue<Float4> rhs)
 {
-	return RValue<Float4>(Nucleus::createFAdd(lhs.value, rhs.value));
+	return RValue<Float4>(Nucleus::createFAdd(lhs.value(), rhs.value()));
 }
 
 RValue<Float4> operator-(RValue<Float4> lhs, RValue<Float4> rhs)
 {
-	return RValue<Float4>(Nucleus::createFSub(lhs.value, rhs.value));
+	return RValue<Float4>(Nucleus::createFSub(lhs.value(), rhs.value()));
 }
 
 RValue<Float4> operator*(RValue<Float4> lhs, RValue<Float4> rhs)
 {
-	return RValue<Float4>(Nucleus::createFMul(lhs.value, rhs.value));
+	return RValue<Float4>(Nucleus::createFMul(lhs.value(), rhs.value()));
 }
 
 RValue<Float4> operator/(RValue<Float4> lhs, RValue<Float4> rhs)
 {
-	return RValue<Float4>(Nucleus::createFDiv(lhs.value, rhs.value));
+	return RValue<Float4>(Nucleus::createFDiv(lhs.value(), rhs.value()));
 }
 
 RValue<Float4> operator+=(Float4 &lhs, RValue<Float4> rhs)
@@ -4109,13 +4109,13 @@
 
 RValue<Float4> operator-(RValue<Float4> val)
 {
-	return RValue<Float4>(Nucleus::createFNeg(val.value));
+	return RValue<Float4>(Nucleus::createFNeg(val.value()));
 }
 
 RValue<Float4> Abs(RValue<Float4> x)
 {
 	// TODO: Optimize.
-	Value *vector = Nucleus::createBitCast(x.value, Int4::type());
+	Value *vector = Nucleus::createBitCast(x.value(), Int4::type());
 	int64_t constantVector[4] = { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF };
 	Value *result = Nucleus::createAnd(vector, Nucleus::createConstantVector(constantVector, Int4::type()));
 
@@ -4124,22 +4124,22 @@
 
 RValue<Float4> Insert(RValue<Float4> x, RValue<Float> element, int i)
 {
-	return RValue<Float4>(Nucleus::createInsertElement(x.value, element.value, i));
+	return RValue<Float4>(Nucleus::createInsertElement(x.value(), element.value(), i));
 }
 
 RValue<Float> Extract(RValue<Float4> x, int i)
 {
-	return RValue<Float>(Nucleus::createExtractElement(x.value, Float::type(), i));
+	return RValue<Float>(Nucleus::createExtractElement(x.value(), Float::type(), i));
 }
 
 RValue<Float4> Swizzle(RValue<Float4> x, uint16_t select)
 {
-	return RValue<Float4>(createSwizzle4(x.value, select));
+	return RValue<Float4>(createSwizzle4(x.value(), select));
 }
 
 RValue<Float4> Shuffle(RValue<Float4> x, RValue<Float4> y, uint16_t select)
 {
-	return RValue<Float4>(createShuffle4(x.value, y.value, select));
+	return RValue<Float4>(createShuffle4(x.value(), y.value(), select));
 }
 
 RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, uint16_t imm)
@@ -4151,25 +4151,25 @@
 		((imm >> 0) & 0x03) + 4,
 	};
 
-	return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
+	return RValue<Float4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
 }
 
 RValue<Float4> UnpackLow(RValue<Float4> x, RValue<Float4> y)
 {
 	int shuffle[4] = { 0, 4, 1, 5 };
-	return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
+	return RValue<Float4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
 }
 
 RValue<Float4> UnpackHigh(RValue<Float4> x, RValue<Float4> y)
 {
 	int shuffle[4] = { 2, 6, 3, 7 };
-	return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
+	return RValue<Float4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
 }
 
 RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, uint16_t select)
 {
 	Value *vector = lhs.loadValue();
-	Value *result = createMask4(vector, rhs.value, select);
+	Value *result = createMask4(vector, rhs.value(), select);
 	lhs.storeValue(result);
 
 	return RValue<Float4>(result);
@@ -4192,12 +4192,12 @@
 
 RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
 {
-	return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::type(), offset.value, false));
+	return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value(), Byte::type(), offset.value(), false));
 }
 
 RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
 {
-	return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::type(), offset.value, true));
+	return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value(), Byte::type(), offset.value(), true));
 }
 
 RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, int offset)
@@ -4254,28 +4254,28 @@
 
 void branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB)
 {
-	Nucleus::createCondBr(cmp.value, bodyBB, endBB);
+	Nucleus::createCondBr(cmp.value(), bodyBB, endBB);
 	Nucleus::setInsertBlock(bodyBB);
 }
 
 RValue<Float4> MaskedLoad(RValue<Pointer<Float4>> base, RValue<Int4> mask, unsigned int alignment, bool zeroMaskedLanes /* = false */)
 {
-	return RValue<Float4>(Nucleus::createMaskedLoad(base.value, Float::type(), mask.value, alignment, zeroMaskedLanes));
+	return RValue<Float4>(Nucleus::createMaskedLoad(base.value(), Float::type(), mask.value(), alignment, zeroMaskedLanes));
 }
 
 RValue<Int4> MaskedLoad(RValue<Pointer<Int4>> base, RValue<Int4> mask, unsigned int alignment, bool zeroMaskedLanes /* = false */)
 {
-	return RValue<Int4>(Nucleus::createMaskedLoad(base.value, Int::type(), mask.value, alignment, zeroMaskedLanes));
+	return RValue<Int4>(Nucleus::createMaskedLoad(base.value(), Int::type(), mask.value(), alignment, zeroMaskedLanes));
 }
 
 void MaskedStore(RValue<Pointer<Float4>> base, RValue<Float4> val, RValue<Int4> mask, unsigned int alignment)
 {
-	Nucleus::createMaskedStore(base.value, val.value, mask.value, alignment);
+	Nucleus::createMaskedStore(base.value(), val.value(), mask.value(), alignment);
 }
 
 void MaskedStore(RValue<Pointer<Int4>> base, RValue<Int4> val, RValue<Int4> mask, unsigned int alignment)
 {
-	Nucleus::createMaskedStore(base.value, val.value, mask.value, alignment);
+	Nucleus::createMaskedStore(base.value(), val.value(), mask.value(), alignment);
 }
 
 void Fence(std::memory_order memoryOrder)
@@ -4393,77 +4393,77 @@
 {
 	auto t = Nucleus::createConstantString("true");
 	auto f = Nucleus::createConstantString("false");
-	return { Nucleus::createSelect(v.value, t, f) };
+	return { Nucleus::createSelect(v.value(), t, f) };
 }
 
 std::vector<Value *> PrintValue::Ty<Byte>::val(const RValue<Byte> &v)
 {
-	return toInt({ v.value }, false);
+	return toInt({ v.value() }, false);
 }
 
 std::vector<Value *> PrintValue::Ty<Byte4>::val(const RValue<Byte4> &v)
 {
-	return toInt(extractAll(v.value, 4), false);
+	return toInt(extractAll(v.value(), 4), false);
 }
 
 std::vector<Value *> PrintValue::Ty<Int>::val(const RValue<Int> &v)
 {
-	return toInt({ v.value }, true);
+	return toInt({ v.value() }, true);
 }
 
 std::vector<Value *> PrintValue::Ty<Int2>::val(const RValue<Int2> &v)
 {
-	return toInt(extractAll(v.value, 2), true);
+	return toInt(extractAll(v.value(), 2), true);
 }
 
 std::vector<Value *> PrintValue::Ty<Int4>::val(const RValue<Int4> &v)
 {
-	return toInt(extractAll(v.value, 4), true);
+	return toInt(extractAll(v.value(), 4), true);
 }
 
 std::vector<Value *> PrintValue::Ty<UInt>::val(const RValue<UInt> &v)
 {
-	return toInt({ v.value }, false);
+	return toInt({ v.value() }, false);
 }
 
 std::vector<Value *> PrintValue::Ty<UInt2>::val(const RValue<UInt2> &v)
 {
-	return toInt(extractAll(v.value, 2), false);
+	return toInt(extractAll(v.value(), 2), false);
 }
 
 std::vector<Value *> PrintValue::Ty<UInt4>::val(const RValue<UInt4> &v)
 {
-	return toInt(extractAll(v.value, 4), false);
+	return toInt(extractAll(v.value(), 4), false);
 }
 
 std::vector<Value *> PrintValue::Ty<Short>::val(const RValue<Short> &v)
 {
-	return toInt({ v.value }, true);
+	return toInt({ v.value() }, true);
 }
 
 std::vector<Value *> PrintValue::Ty<Short4>::val(const RValue<Short4> &v)
 {
-	return toInt(extractAll(v.value, 4), true);
+	return toInt(extractAll(v.value(), 4), true);
 }
 
 std::vector<Value *> PrintValue::Ty<UShort>::val(const RValue<UShort> &v)
 {
-	return toInt({ v.value }, false);
+	return toInt({ v.value() }, false);
 }
 
 std::vector<Value *> PrintValue::Ty<UShort4>::val(const RValue<UShort4> &v)
 {
-	return toInt(extractAll(v.value, 4), false);
+	return toInt(extractAll(v.value(), 4), false);
 }
 
 std::vector<Value *> PrintValue::Ty<Float>::val(const RValue<Float> &v)
 {
-	return toFloat({ v.value });
+	return toFloat({ v.value() });
 }
 
 std::vector<Value *> PrintValue::Ty<Float4>::val(const RValue<Float4> &v)
 {
-	return toFloat(extractAll(v.value, 4));
+	return toFloat(extractAll(v.value(), 4));
 }
 
 std::vector<Value *> PrintValue::Ty<const char *>::val(const char *v)
diff --git a/src/Reactor/Reactor.hpp b/src/Reactor/Reactor.hpp
index b063663..92cfdf0 100644
--- a/src/Reactor/Reactor.hpp
+++ b/src/Reactor/Reactor.hpp
@@ -152,7 +152,7 @@
 
 	RValue<T> store(RValue<T> rvalue) const
 	{
-		Variable::storeValue(rvalue.value);
+		Variable::storeValue(rvalue.value());
 
 		return rvalue;
 	}
@@ -261,17 +261,24 @@
 	// Rvalues cannot be assigned to: "(a + b) = c;"
 	RValue<T> &operator=(const RValue<T> &) = delete;
 
-	Value *value;  // FIXME: Make private
+	Value *value() const { return val; }
+
+private:
+	Value *const val;
 };
 
 template<typename T>
-struct Argument
+class Argument
 {
-	explicit Argument(Value *value)
-	    : value(value)
+public:
+	explicit Argument(Value *val)
+	    : val(val)
 	{}
 
-	Value *value;
+	RValue<T> rvalue() const { return RValue<T>(val); }
+
+private:
+	Value *const val;
 };
 
 class Bool : public LValue<Bool>
@@ -2385,7 +2392,7 @@
 	Pointer(RValue<Pointer<S>> pointerS, int alignment = 1)
 	    : alignment(alignment)
 	{
-		Value *pointerT = Nucleus::createBitCast(pointerS.value, Nucleus::getPointerType(T::type()));
+		Value *pointerT = Nucleus::createBitCast(pointerS.value(), Nucleus::getPointerType(T::type()));
 		LValue<Pointer<T>>::storeValue(pointerT);
 	}
 
@@ -2446,7 +2453,7 @@
 template<typename T>
 RValue<T> Load(RValue<Pointer<T>> pointer, unsigned int alignment, bool atomic, std::memory_order memoryOrder)
 {
-	return RValue<T>(Nucleus::createLoad(pointer.value, T::type(), false, alignment, atomic, memoryOrder));
+	return RValue<T>(Nucleus::createLoad(pointer.value(), T::type(), false, alignment, atomic, memoryOrder));
 }
 
 template<typename T>
@@ -2469,7 +2476,7 @@
 template<typename T>
 void Store(RValue<T> value, RValue<Pointer<T>> pointer, unsigned int alignment, bool atomic, std::memory_order memoryOrder)
 {
-	Nucleus::createStore(value.value, pointer.value, T::type(), false, alignment, atomic, memoryOrder);
+	Nucleus::createStore(value.value(), pointer.value(), T::type(), false, alignment, atomic, memoryOrder);
 }
 
 template<typename T>
@@ -2689,7 +2696,7 @@
 template<class T>
 RValue<T> Reference<T>::operator=(RValue<T> rhs) const
 {
-	Nucleus::createStore(rhs.value, address, T::type(), false, alignment);
+	Nucleus::createStore(rhs.value(), address, T::type(), false, alignment);
 
 	return rhs;
 }
@@ -2730,54 +2737,53 @@
 #ifdef ENABLE_RR_DEBUG_INFO
 template<class T>
 RValue<T>::RValue(const RValue<T> &rvalue)
-    : value(rvalue.value)
+    : val(rvalue.val)
 {
-	RR_DEBUG_INFO_EMIT_VAR(value);
+	RR_DEBUG_INFO_EMIT_VAR(val);
 }
 #endif  // ENABLE_RR_DEBUG_INFO
 
 template<class T>
-RValue<T>::RValue(Value *rvalue)
+RValue<T>::RValue(Value *value)
+    : val(value)
 {
-	assert(Nucleus::createBitCast(rvalue, T::type()) == rvalue);  // Run-time type should match T, so bitcast is no-op.
-
-	value = rvalue;
-	RR_DEBUG_INFO_EMIT_VAR(value);
+	assert(Nucleus::createBitCast(value, T::type()) == value);  // Run-time type should match T, so bitcast is no-op.
+	RR_DEBUG_INFO_EMIT_VAR(val);
 }
 
 template<class T>
 RValue<T>::RValue(const T &lvalue)
+    : val(lvalue.loadValue())
 {
-	value = lvalue.loadValue();
-	RR_DEBUG_INFO_EMIT_VAR(value);
+	RR_DEBUG_INFO_EMIT_VAR(val);
 }
 
 template<class T>
 RValue<T>::RValue(typename BoolLiteral<T>::type i)
+    : val(Nucleus::createConstantBool(i))
 {
-	value = Nucleus::createConstantBool(i);
-	RR_DEBUG_INFO_EMIT_VAR(value);
+	RR_DEBUG_INFO_EMIT_VAR(val);
 }
 
 template<class T>
 RValue<T>::RValue(typename IntLiteral<T>::type i)
+    : val(Nucleus::createConstantInt(i))
 {
-	value = Nucleus::createConstantInt(i);
-	RR_DEBUG_INFO_EMIT_VAR(value);
+	RR_DEBUG_INFO_EMIT_VAR(val);
 }
 
 template<class T>
 RValue<T>::RValue(typename FloatLiteral<T>::type f)
+    : val(Nucleus::createConstantFloat(f))
 {
-	value = Nucleus::createConstantFloat(f);
-	RR_DEBUG_INFO_EMIT_VAR(value);
+	RR_DEBUG_INFO_EMIT_VAR(val);
 }
 
 template<class T>
 RValue<T>::RValue(const Reference<T> &ref)
+    : val(ref.loadValue())
 {
-	value = ref.loadValue();
-	RR_DEBUG_INFO_EMIT_VAR(value);
+	RR_DEBUG_INFO_EMIT_VAR(val);
 }
 
 template<class Vector4, int T>
@@ -2954,7 +2960,7 @@
 Pointer<T>::Pointer(Argument<Pointer<T>> argument)
     : alignment(1)
 {
-	LValue<Pointer<T>>::storeValue(argument.value);
+	LValue<Pointer<T>>::store(argument.rvalue());
 }
 
 template<class T>
@@ -2966,7 +2972,7 @@
 Pointer<T>::Pointer(RValue<Pointer<T>> rhs)
     : alignment(1)
 {
-	LValue<Pointer<T>>::storeValue(rhs.value);
+	LValue<Pointer<T>>::storeValue(rhs.value());
 }
 
 template<class T>
@@ -2996,7 +3002,7 @@
 template<class T>
 RValue<Pointer<T>> Pointer<T>::operator=(RValue<Pointer<T>> rhs)
 {
-	LValue<Pointer<T>>::storeValue(rhs.value);
+	LValue<Pointer<T>>::storeValue(rhs.value());
 
 	return rhs;
 }
@@ -3056,7 +3062,7 @@
 Reference<T> Pointer<T>::operator[](RValue<Int> index)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	Value *element = Nucleus::createGEP(LValue<Pointer<T>>::loadValue(), T::type(), index.value, false);
+	Value *element = Nucleus::createGEP(LValue<Pointer<T>>::loadValue(), T::type(), index.value(), false);
 
 	return Reference<T>(element, alignment);
 }
@@ -3065,7 +3071,7 @@
 Reference<T> Pointer<T>::operator[](RValue<UInt> index)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	Value *element = Nucleus::createGEP(LValue<Pointer<T>>::loadValue(), T::type(), index.value, true);
+	Value *element = Nucleus::createGEP(LValue<Pointer<T>>::loadValue(), T::type(), index.value(), true);
 
 	return Reference<T>(element, alignment);
 }
@@ -3103,7 +3109,7 @@
 template<class T, int S>
 Reference<T> Array<T, S>::operator[](RValue<Int> index)
 {
-	Value *element = LValue<T>::getElementPointer(index.value, false);
+	Value *element = LValue<T>::getElementPointer(index.value(), false);
 
 	return Reference<T>(element);
 }
@@ -3111,7 +3117,7 @@
 template<class T, int S>
 Reference<T> Array<T, S>::operator[](RValue<UInt> index)
 {
-	Value *element = LValue<T>::getElementPointer(index.value, true);
+	Value *element = LValue<T>::getElementPointer(index.value(), true);
 
 	return Reference<T>(element);
 }
@@ -3144,7 +3150,7 @@
 RValue<T> IfThenElse(RValue<Bool> condition, RValue<T> ifTrue, RValue<T> ifFalse)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<T>(Nucleus::createSelect(condition.value, ifTrue.value, ifFalse.value));
+	return RValue<T>(Nucleus::createSelect(condition.value(), ifTrue.value(), ifFalse.value()));
 }
 
 template<class T>
@@ -3153,7 +3159,7 @@
 	RR_DEBUG_INFO_UPDATE_LOC();
 	Value *trueValue = ifTrue.loadValue();
 
-	return RValue<T>(Nucleus::createSelect(condition.value, trueValue, ifFalse.value));
+	return RValue<T>(Nucleus::createSelect(condition.value(), trueValue, ifFalse.value()));
 }
 
 template<class T>
@@ -3162,7 +3168,7 @@
 	RR_DEBUG_INFO_UPDATE_LOC();
 	Value *falseValue = ifFalse.loadValue();
 
-	return RValue<T>(Nucleus::createSelect(condition.value, ifTrue.value, falseValue));
+	return RValue<T>(Nucleus::createSelect(condition.value(), ifTrue.value(), falseValue));
 }
 
 template<class T>
@@ -3172,7 +3178,7 @@
 	Value *trueValue = ifTrue.loadValue();
 	Value *falseValue = ifFalse.loadValue();
 
-	return RValue<T>(Nucleus::createSelect(condition.value, trueValue, falseValue));
+	return RValue<T>(Nucleus::createSelect(condition.value(), trueValue, falseValue));
 }
 
 template<typename Return, typename... Arguments>
@@ -3228,7 +3234,7 @@
 RValue<T> ReinterpretCast(RValue<S> val)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<T>(Nucleus::createBitCast(val.value, T::type()));
+	return RValue<T>(Nucleus::createBitCast(val.value(), T::type()));
 }
 
 template<class T, class S>
@@ -3445,7 +3451,7 @@
 		BasicBlock *bodyBB = Nucleus::createBasicBlock();
 		endBB = Nucleus::createBasicBlock();
 
-		Nucleus::createCondBr(cmp.value, bodyBB, endBB);
+		Nucleus::createCondBr(cmp.value(), bodyBB, endBB);
 		Nucleus::setInsertBlock(bodyBB);
 
 		return true;
@@ -3469,7 +3475,7 @@
 	IfElseData(RValue<Bool> cmp)
 	    : iteration(0)
 	{
-		condition = cmp.value;
+		condition = cmp.value();
 
 		beginBB = Nucleus::getInsertBlock();
 		trueBB = Nucleus::createBasicBlock();
@@ -3530,13 +3536,13 @@
 		Nucleus::createBr(body__);                        \
 		Nucleus::setInsertBlock(body__);
 
-#define Until(cond)                                     \
-	BasicBlock *end__ = Nucleus::createBasicBlock();    \
-	Nucleus::createCondBr((cond).value, end__, body__); \
-	Nucleus::setInsertBlock(end__);                     \
-	}                                                   \
-	do                                                  \
-	{                                                   \
+#define Until(cond)                                       \
+	BasicBlock *end__ = Nucleus::createBasicBlock();      \
+	Nucleus::createCondBr((cond).value(), end__, body__); \
+	Nucleus::setInsertBlock(end__);                       \
+	}                                                     \
+	do                                                    \
+	{                                                     \
 	} while(false)  // Require a semi-colon at the end of the Until()
 
 enum
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
index 67026e5..12f115f 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -2213,12 +2213,12 @@
 
 RValue<Byte> Extract(RValue<Byte8> val, int i)
 {
-	return RValue<Byte>(Nucleus::createExtractElement(val.value, Byte::type(), i));
+	return RValue<Byte>(Nucleus::createExtractElement(val.value(), Byte::type(), i));
 }
 
 RValue<Byte8> Insert(RValue<Byte8> val, RValue<Byte> element, int i)
 {
-	return RValue<Byte8>(Nucleus::createInsertElement(val.value, element.value, i));
+	return RValue<Byte8>(Nucleus::createInsertElement(val.value(), element.value(), i));
 }
 }  // namespace
 
@@ -2245,8 +2245,8 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::AddSaturateUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto paddusb = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		paddusb->addArg(x.value);
-		paddusb->addArg(y.value);
+		paddusb->addArg(x.value());
+		paddusb->addArg(y.value());
 		::basicBlock->appendInst(paddusb);
 
 		return RValue<Byte8>(V(result));
@@ -2276,8 +2276,8 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::SubtractSaturateUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto psubusw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		psubusw->addArg(x.value);
-		psubusw->addArg(y.value);
+		psubusw->addArg(x.value());
+		psubusw->addArg(y.value());
 		::basicBlock->appendInst(psubusw);
 
 		return RValue<Byte8>(V(result));
@@ -2287,13 +2287,13 @@
 RValue<SByte> Extract(RValue<SByte8> val, int i)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<SByte>(Nucleus::createExtractElement(val.value, SByte::type(), i));
+	return RValue<SByte>(Nucleus::createExtractElement(val.value(), SByte::type(), i));
 }
 
 RValue<SByte8> Insert(RValue<SByte8> val, RValue<SByte> element, int i)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<SByte8>(Nucleus::createInsertElement(val.value, element.value, i));
+	return RValue<SByte8>(Nucleus::createInsertElement(val.value(), element.value(), i));
 }
 
 RValue<SByte8> operator>>(RValue<SByte8> lhs, unsigned char rhs)
@@ -2322,7 +2322,7 @@
 
 		return As<SByte8>(hi | lo);
 #else
-		return RValue<SByte8>(Nucleus::createAShr(lhs.value, V(::context->getConstantInt32(rhs))));
+		return RValue<SByte8>(Nucleus::createAShr(lhs.value(), V(::context->getConstantInt32(rhs))));
 #endif
 	}
 }
@@ -2341,7 +2341,7 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::SignMask, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto movmsk = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
-		movmsk->addArg(x.value);
+		movmsk->addArg(x.value());
 		::basicBlock->appendInst(movmsk);
 
 		return RValue<Int>(V(result)) & 0xFF;
@@ -2350,13 +2350,13 @@
 
 //	RValue<Byte8> CmpGT(RValue<Byte8> x, RValue<Byte8> y)
 //	{
-//		return RValue<Byte8>(createIntCompare(Ice::InstIcmp::Ugt, x.value, y.value));
+//		return RValue<Byte8>(createIntCompare(Ice::InstIcmp::Ugt, x.value(), y.value()));
 //	}
 
 RValue<Byte8> CmpEQ(RValue<Byte8> x, RValue<Byte8> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Byte8>(Nucleus::createICmpEQ(x.value, y.value));
+	return RValue<Byte8>(Nucleus::createICmpEQ(x.value(), y.value()));
 }
 
 Type *Byte8::type()
@@ -2366,12 +2366,12 @@
 
 //	RValue<SByte8> operator<<(RValue<SByte8> lhs, unsigned char rhs)
 //	{
-//		return RValue<SByte8>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
+//		return RValue<SByte8>(Nucleus::createShl(lhs.value(), V(::context->getConstantInt32(rhs))));
 //	}
 
 //	RValue<SByte8> operator>>(RValue<SByte8> lhs, unsigned char rhs)
 //	{
-//		return RValue<SByte8>(Nucleus::createAShr(lhs.value, V(::context->getConstantInt32(rhs))));
+//		return RValue<SByte8>(Nucleus::createAShr(lhs.value(), V(::context->getConstantInt32(rhs))));
 //	}
 
 RValue<SByte> SaturateSigned(RValue<Short> x)
@@ -2403,8 +2403,8 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::AddSaturateSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto paddsb = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		paddsb->addArg(x.value);
-		paddsb->addArg(y.value);
+		paddsb->addArg(x.value());
+		paddsb->addArg(y.value());
 		::basicBlock->appendInst(paddsb);
 
 		return RValue<SByte8>(V(result));
@@ -2434,8 +2434,8 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::SubtractSaturateSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto psubsb = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		psubsb->addArg(x.value);
-		psubsb->addArg(y.value);
+		psubsb->addArg(x.value());
+		psubsb->addArg(y.value());
 		::basicBlock->appendInst(psubsb);
 
 		return RValue<SByte8>(V(result));
@@ -2456,7 +2456,7 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::SignMask, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto movmsk = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
-		movmsk->addArg(x.value);
+		movmsk->addArg(x.value());
 		::basicBlock->appendInst(movmsk);
 
 		return RValue<Int>(V(result)) & 0xFF;
@@ -2466,13 +2466,13 @@
 RValue<Byte8> CmpGT(RValue<SByte8> x, RValue<SByte8> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Byte8>(createIntCompare(Ice::InstIcmp::Sgt, x.value, y.value));
+	return RValue<Byte8>(createIntCompare(Ice::InstIcmp::Sgt, x.value(), y.value()));
 }
 
 RValue<Byte8> CmpEQ(RValue<SByte8> x, RValue<SByte8> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Byte8>(Nucleus::createICmpEQ(x.value, y.value));
+	return RValue<Byte8>(Nucleus::createICmpEQ(x.value(), y.value()));
 }
 
 Type *SByte8::type()
@@ -2503,10 +2503,10 @@
 Short4::Short4(RValue<Int4> cast)
 {
 	int select[8] = { 0, 2, 4, 6, 0, 2, 4, 6 };
-	Value *short8 = Nucleus::createBitCast(cast.value, Short8::type());
+	Value *short8 = Nucleus::createBitCast(cast.value(), Short8::type());
 	Value *packed = Nucleus::createShuffleVector(short8, short8, select);
 
-	Value *int2 = RValue<Int2>(Int2(As<Int4>(packed))).value;
+	Value *int2 = RValue<Int2>(Int2(As<Int4>(packed))).value();
 	Value *short4 = Nucleus::createBitCast(int2, Short4::type());
 
 	storeValue(short4);
@@ -2539,7 +2539,7 @@
 	}
 	else
 	{
-		return RValue<Short4>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
+		return RValue<Short4>(Nucleus::createShl(lhs.value(), V(::context->getConstantInt32(rhs))));
 	}
 }
 
@@ -2558,7 +2558,7 @@
 	}
 	else
 	{
-		return RValue<Short4>(Nucleus::createAShr(lhs.value, V(::context->getConstantInt32(rhs))));
+		return RValue<Short4>(Nucleus::createAShr(lhs.value(), V(::context->getConstantInt32(rhs))));
 	}
 }
 
@@ -2566,11 +2566,11 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v8i1);
-	auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Sle, condition, x.value, y.value);
+	auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Sle, condition, x.value(), y.value());
 	::basicBlock->appendInst(cmp);
 
 	Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
-	auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value);
+	auto select = Ice::InstSelect::create(::function, result, condition, y.value(), x.value());
 	::basicBlock->appendInst(select);
 
 	return RValue<Short4>(V(result));
@@ -2580,11 +2580,11 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v8i1);
-	auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Sgt, condition, x.value, y.value);
+	auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Sgt, condition, x.value(), y.value());
 	::basicBlock->appendInst(cmp);
 
 	Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
-	auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value);
+	auto select = Ice::InstSelect::create(::function, result, condition, y.value(), x.value());
 	::basicBlock->appendInst(select);
 
 	return RValue<Short4>(V(result));
@@ -2615,8 +2615,8 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::AddSaturateSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto paddsw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		paddsw->addArg(x.value);
-		paddsw->addArg(y.value);
+		paddsw->addArg(x.value());
+		paddsw->addArg(y.value());
 		::basicBlock->appendInst(paddsw);
 
 		return RValue<Short4>(V(result));
@@ -2642,8 +2642,8 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::SubtractSaturateSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto psubsw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		psubsw->addArg(x.value);
-		psubsw->addArg(y.value);
+		psubsw->addArg(x.value());
+		psubsw->addArg(y.value());
 		::basicBlock->appendInst(psubsw);
 
 		return RValue<Short4>(V(result));
@@ -2669,8 +2669,8 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::MultiplyHighSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto pmulhw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		pmulhw->addArg(x.value);
-		pmulhw->addArg(y.value);
+		pmulhw->addArg(x.value());
+		pmulhw->addArg(y.value());
 		::basicBlock->appendInst(pmulhw);
 
 		return RValue<Short4>(V(result));
@@ -2694,8 +2694,8 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::MultiplyAddPairs, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto pmaddwd = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		pmaddwd->addArg(x.value);
-		pmaddwd->addArg(y.value);
+		pmaddwd->addArg(x.value());
+		pmaddwd->addArg(y.value());
 		::basicBlock->appendInst(pmaddwd);
 
 		return As<Int2>(V(result));
@@ -2725,8 +2725,8 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::VectorPackSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto pack = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		pack->addArg(x.value);
-		pack->addArg(y.value);
+		pack->addArg(x.value());
+		pack->addArg(y.value());
 		::basicBlock->appendInst(pack);
 
 		return As<SByte8>(Swizzle(As<Int4>(V(result)), 0x0202));
@@ -2756,8 +2756,8 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::VectorPackUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto pack = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		pack->addArg(x.value);
-		pack->addArg(y.value);
+		pack->addArg(x.value());
+		pack->addArg(y.value());
 		::basicBlock->appendInst(pack);
 
 		return As<Byte8>(Swizzle(As<Int4>(V(result)), 0x0202));
@@ -2767,13 +2767,13 @@
 RValue<Short4> CmpGT(RValue<Short4> x, RValue<Short4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Short4>(createIntCompare(Ice::InstIcmp::Sgt, x.value, y.value));
+	return RValue<Short4>(createIntCompare(Ice::InstIcmp::Sgt, x.value(), y.value()));
 }
 
 RValue<Short4> CmpEQ(RValue<Short4> x, RValue<Short4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Short4>(Nucleus::createICmpEQ(x.value, y.value));
+	return RValue<Short4>(Nucleus::createICmpEQ(x.value(), y.value()));
 }
 
 Type *Short4::type()
@@ -2811,12 +2811,12 @@
 
 RValue<UShort> Extract(RValue<UShort4> val, int i)
 {
-	return RValue<UShort>(Nucleus::createExtractElement(val.value, UShort::type(), i));
+	return RValue<UShort>(Nucleus::createExtractElement(val.value(), UShort::type(), i));
 }
 
 RValue<UShort4> Insert(RValue<UShort4> val, RValue<UShort> element, int i)
 {
-	return RValue<UShort4>(Nucleus::createInsertElement(val.value, element.value, i));
+	return RValue<UShort4>(Nucleus::createInsertElement(val.value(), element.value(), i));
 }
 
 RValue<UShort4> operator<<(RValue<UShort4> lhs, unsigned char rhs)
@@ -2835,7 +2835,7 @@
 	}
 	else
 	{
-		return RValue<UShort4>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
+		return RValue<UShort4>(Nucleus::createShl(lhs.value(), V(::context->getConstantInt32(rhs))));
 	}
 }
 
@@ -2854,7 +2854,7 @@
 	}
 	else
 	{
-		return RValue<UShort4>(Nucleus::createLShr(lhs.value, V(::context->getConstantInt32(rhs))));
+		return RValue<UShort4>(Nucleus::createLShr(lhs.value(), V(::context->getConstantInt32(rhs))));
 	}
 }
 
@@ -2862,11 +2862,11 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v8i1);
-	auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Ule, condition, x.value, y.value);
+	auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Ule, condition, x.value(), y.value());
 	::basicBlock->appendInst(cmp);
 
 	Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
-	auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value);
+	auto select = Ice::InstSelect::create(::function, result, condition, y.value(), x.value());
 	::basicBlock->appendInst(select);
 
 	return RValue<UShort4>(V(result));
@@ -2875,11 +2875,11 @@
 RValue<UShort4> Min(RValue<UShort4> x, RValue<UShort4> y)
 {
 	Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v8i1);
-	auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Ugt, condition, x.value, y.value);
+	auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Ugt, condition, x.value(), y.value());
 	::basicBlock->appendInst(cmp);
 
 	Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
-	auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value);
+	auto select = Ice::InstSelect::create(::function, result, condition, y.value(), x.value());
 	::basicBlock->appendInst(select);
 
 	return RValue<UShort4>(V(result));
@@ -2910,8 +2910,8 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::AddSaturateUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto paddusw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		paddusw->addArg(x.value);
-		paddusw->addArg(y.value);
+		paddusw->addArg(x.value());
+		paddusw->addArg(y.value());
 		::basicBlock->appendInst(paddusw);
 
 		return RValue<UShort4>(V(result));
@@ -2937,8 +2937,8 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::SubtractSaturateUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto psubusw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		psubusw->addArg(x.value);
-		psubusw->addArg(y.value);
+		psubusw->addArg(x.value());
+		psubusw->addArg(y.value());
 		::basicBlock->appendInst(psubusw);
 
 		return RValue<UShort4>(V(result));
@@ -2964,8 +2964,8 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::MultiplyHighUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto pmulhuw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		pmulhuw->addArg(x.value);
-		pmulhuw->addArg(y.value);
+		pmulhuw->addArg(x.value());
+		pmulhuw->addArg(y.value());
 		::basicBlock->appendInst(pmulhuw);
 
 		return RValue<UShort4>(V(result));
@@ -3035,13 +3035,13 @@
 RValue<Short> Extract(RValue<Short8> val, int i)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Short>(Nucleus::createExtractElement(val.value, Short::type(), i));
+	return RValue<Short>(Nucleus::createExtractElement(val.value(), Short::type(), i));
 }
 
 RValue<Short8> Insert(RValue<Short8> val, RValue<Short> element, int i)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Short8>(Nucleus::createInsertElement(val.value, element.value, i));
+	return RValue<Short8>(Nucleus::createInsertElement(val.value(), element.value(), i));
 }
 
 RValue<Short8> operator<<(RValue<Short8> lhs, unsigned char rhs)
@@ -3063,7 +3063,7 @@
 	}
 	else
 	{
-		return RValue<Short8>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
+		return RValue<Short8>(Nucleus::createShl(lhs.value(), V(::context->getConstantInt32(rhs))));
 	}
 }
 
@@ -3086,7 +3086,7 @@
 	}
 	else
 	{
-		return RValue<Short8>(Nucleus::createAShr(lhs.value, V(::context->getConstantInt32(rhs))));
+		return RValue<Short8>(Nucleus::createAShr(lhs.value(), V(::context->getConstantInt32(rhs))));
 	}
 }
 
@@ -3112,13 +3112,13 @@
 RValue<UShort> Extract(RValue<UShort8> val, int i)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<UShort>(Nucleus::createExtractElement(val.value, UShort::type(), i));
+	return RValue<UShort>(Nucleus::createExtractElement(val.value(), UShort::type(), i));
 }
 
 RValue<UShort8> Insert(RValue<UShort8> val, RValue<UShort> element, int i)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<UShort8>(Nucleus::createInsertElement(val.value, element.value, i));
+	return RValue<UShort8>(Nucleus::createInsertElement(val.value(), element.value(), i));
 }
 
 RValue<UShort8> operator<<(RValue<UShort8> lhs, unsigned char rhs)
@@ -3140,7 +3140,7 @@
 	}
 	else
 	{
-		return RValue<UShort8>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
+		return RValue<UShort8>(Nucleus::createShl(lhs.value(), V(::context->getConstantInt32(rhs))));
 	}
 }
 
@@ -3163,7 +3163,7 @@
 	}
 	else
 	{
-		return RValue<UShort8>(Nucleus::createLShr(lhs.value, V(::context->getConstantInt32(rhs))));
+		return RValue<UShort8>(Nucleus::createLShr(lhs.value(), V(::context->getConstantInt32(rhs))));
 	}
 }
 
@@ -3223,7 +3223,7 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::Nearbyint, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto nearbyint = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
-		nearbyint->addArg(cast.value);
+		nearbyint->addArg(cast.value());
 		::basicBlock->appendInst(nearbyint);
 
 		return RValue<Int>(V(result));
@@ -3255,7 +3255,7 @@
 	                       As<Int>(As<UInt>(Int(cast - Float(ustartf))) + UInt(ustart)),
 	                       // Otherwise, just convert normally
 	                       Int(cast)))
-	               .value);
+	               .value());
 }
 
 RValue<UInt> operator++(UInt &val, int)  // Post-increment
@@ -3300,7 +3300,7 @@
 
 //	Int2::Int2(RValue<Int> cast)
 //	{
-//		Value *extend = Nucleus::createZExt(cast.value, Long::type());
+//		Value *extend = Nucleus::createZExt(cast.value(), Long::type());
 //		Value *vector = Nucleus::createBitCast(extend, Int2::type());
 //
 //		Constant *shuffle[2];
@@ -3325,7 +3325,7 @@
 	}
 	else
 	{
-		return RValue<Int2>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
+		return RValue<Int2>(Nucleus::createShl(lhs.value(), V(::context->getConstantInt32(rhs))));
 	}
 }
 
@@ -3342,7 +3342,7 @@
 	}
 	else
 	{
-		return RValue<Int2>(Nucleus::createAShr(lhs.value, V(::context->getConstantInt32(rhs))));
+		return RValue<Int2>(Nucleus::createAShr(lhs.value(), V(::context->getConstantInt32(rhs))));
 	}
 }
 
@@ -3364,7 +3364,7 @@
 	}
 	else
 	{
-		return RValue<UInt2>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
+		return RValue<UInt2>(Nucleus::createShl(lhs.value(), V(::context->getConstantInt32(rhs))));
 	}
 }
 
@@ -3381,7 +3381,7 @@
 	}
 	else
 	{
-		return RValue<UInt2>(Nucleus::createLShr(lhs.value, V(::context->getConstantInt32(rhs))));
+		return RValue<UInt2>(Nucleus::createLShr(lhs.value(), V(::context->getConstantInt32(rhs))));
 	}
 }
 
@@ -3394,7 +3394,7 @@
     : XYZW(this)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	Value *x = Nucleus::createBitCast(cast.value, Int::type());
+	Value *x = Nucleus::createBitCast(cast.value(), Int::type());
 	Value *a = Nucleus::createInsertElement(loadValue(), x, 0);
 
 	Value *e;
@@ -3414,7 +3414,7 @@
     : XYZW(this)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	Value *x = Nucleus::createBitCast(cast.value, Int::type());
+	Value *x = Nucleus::createBitCast(cast.value(), Int::type());
 	Value *a = Nucleus::createInsertElement(loadValue(), x, 0);
 
 	int swizzle[16] = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };
@@ -3433,7 +3433,7 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	int swizzle[8] = { 0, 0, 1, 1, 2, 2, 3, 3 };
-	Value *c = Nucleus::createShuffleVector(cast.value, cast.value, swizzle);
+	Value *c = Nucleus::createShuffleVector(cast.value(), cast.value(), swizzle);
 
 	*this = As<Int4>(c) >> 16;
 }
@@ -3443,7 +3443,7 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	int swizzle[8] = { 0, 8, 1, 9, 2, 10, 3, 11 };
-	Value *c = Nucleus::createShuffleVector(cast.value, Short8(0, 0, 0, 0, 0, 0, 0, 0).loadValue(), swizzle);
+	Value *c = Nucleus::createShuffleVector(cast.value(), Short8(0, 0, 0, 0, 0, 0, 0, 0).loadValue(), swizzle);
 	Value *d = Nucleus::createBitCast(c, Int4::type());
 	storeValue(d);
 }
@@ -3452,7 +3452,7 @@
     : XYZW(this)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	Value *vector = Nucleus::createBitCast(rhs.value, Int4::type());
+	Value *vector = Nucleus::createBitCast(rhs.value(), Int4::type());
 
 	int swizzle[4] = { 0, 0, 0, 0 };
 	Value *replicate = Nucleus::createShuffleVector(vector, vector, swizzle);
@@ -3475,7 +3475,7 @@
 	}
 	else
 	{
-		return RValue<Int4>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
+		return RValue<Int4>(Nucleus::createShl(lhs.value(), V(::context->getConstantInt32(rhs))));
 	}
 }
 
@@ -3494,55 +3494,55 @@
 	}
 	else
 	{
-		return RValue<Int4>(Nucleus::createAShr(lhs.value, V(::context->getConstantInt32(rhs))));
+		return RValue<Int4>(Nucleus::createAShr(lhs.value(), V(::context->getConstantInt32(rhs))));
 	}
 }
 
 RValue<Int4> CmpEQ(RValue<Int4> x, RValue<Int4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createICmpEQ(x.value, y.value));
+	return RValue<Int4>(Nucleus::createICmpEQ(x.value(), y.value()));
 }
 
 RValue<Int4> CmpLT(RValue<Int4> x, RValue<Int4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createICmpSLT(x.value, y.value));
+	return RValue<Int4>(Nucleus::createICmpSLT(x.value(), y.value()));
 }
 
 RValue<Int4> CmpLE(RValue<Int4> x, RValue<Int4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createICmpSLE(x.value, y.value));
+	return RValue<Int4>(Nucleus::createICmpSLE(x.value(), y.value()));
 }
 
 RValue<Int4> CmpNEQ(RValue<Int4> x, RValue<Int4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createICmpNE(x.value, y.value));
+	return RValue<Int4>(Nucleus::createICmpNE(x.value(), y.value()));
 }
 
 RValue<Int4> CmpNLT(RValue<Int4> x, RValue<Int4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createICmpSGE(x.value, y.value));
+	return RValue<Int4>(Nucleus::createICmpSGE(x.value(), y.value()));
 }
 
 RValue<Int4> CmpNLE(RValue<Int4> x, RValue<Int4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createICmpSGT(x.value, y.value));
+	return RValue<Int4>(Nucleus::createICmpSGT(x.value(), y.value()));
 }
 
 RValue<Int4> Max(RValue<Int4> x, RValue<Int4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v4i1);
-	auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Sle, condition, x.value, y.value);
+	auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Sle, condition, x.value(), y.value());
 	::basicBlock->appendInst(cmp);
 
 	Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4i32);
-	auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value);
+	auto select = Ice::InstSelect::create(::function, result, condition, y.value(), x.value());
 	::basicBlock->appendInst(select);
 
 	return RValue<Int4>(V(result));
@@ -3552,11 +3552,11 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v4i1);
-	auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Sgt, condition, x.value, y.value);
+	auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Sgt, condition, x.value(), y.value());
 	::basicBlock->appendInst(cmp);
 
 	Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4i32);
-	auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value);
+	auto select = Ice::InstSelect::create(::function, result, condition, y.value(), x.value());
 	::basicBlock->appendInst(select);
 
 	return RValue<Int4>(V(result));
@@ -3576,7 +3576,7 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::Nearbyint, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto nearbyint = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
-		nearbyint->addArg(cast.value);
+		nearbyint->addArg(cast.value());
 		::basicBlock->appendInst(nearbyint);
 
 		return RValue<Int4>(V(result));
@@ -3606,8 +3606,8 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::VectorPackSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto pack = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		pack->addArg(x.value);
-		pack->addArg(y.value);
+		pack->addArg(x.value());
+		pack->addArg(y.value());
 		::basicBlock->appendInst(pack);
 
 		return RValue<Short8>(V(result));
@@ -3633,8 +3633,8 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::VectorPackUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto pack = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		pack->addArg(x.value);
-		pack->addArg(y.value);
+		pack->addArg(x.value());
+		pack->addArg(y.value());
 		::basicBlock->appendInst(pack);
 
 		return RValue<UShort8>(V(result));
@@ -3655,7 +3655,7 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::SignMask, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto movmsk = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
-		movmsk->addArg(x.value);
+		movmsk->addArg(x.value());
 		::basicBlock->appendInst(movmsk);
 
 		return RValue<Int>(V(result));
@@ -3682,14 +3682,14 @@
 	          // Otherwise, just convert normally
 	          (~uiValue & Int4(cast));
 	// If the value is negative, store 0, otherwise store the result of the conversion
-	storeValue((~(As<Int4>(cast) >> 31) & uiValue).value);
+	storeValue((~(As<Int4>(cast) >> 31) & uiValue).value());
 }
 
 UInt4::UInt4(RValue<UInt> rhs)
     : XYZW(this)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	Value *vector = Nucleus::createBitCast(rhs.value, UInt4::type());
+	Value *vector = Nucleus::createBitCast(rhs.value(), UInt4::type());
 
 	int swizzle[4] = { 0, 0, 0, 0 };
 	Value *replicate = Nucleus::createShuffleVector(vector, vector, swizzle);
@@ -3712,7 +3712,7 @@
 	}
 	else
 	{
-		return RValue<UInt4>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
+		return RValue<UInt4>(Nucleus::createShl(lhs.value(), V(::context->getConstantInt32(rhs))));
 	}
 }
 
@@ -3731,55 +3731,55 @@
 	}
 	else
 	{
-		return RValue<UInt4>(Nucleus::createLShr(lhs.value, V(::context->getConstantInt32(rhs))));
+		return RValue<UInt4>(Nucleus::createLShr(lhs.value(), V(::context->getConstantInt32(rhs))));
 	}
 }
 
 RValue<UInt4> CmpEQ(RValue<UInt4> x, RValue<UInt4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<UInt4>(Nucleus::createICmpEQ(x.value, y.value));
+	return RValue<UInt4>(Nucleus::createICmpEQ(x.value(), y.value()));
 }
 
 RValue<UInt4> CmpLT(RValue<UInt4> x, RValue<UInt4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<UInt4>(Nucleus::createICmpULT(x.value, y.value));
+	return RValue<UInt4>(Nucleus::createICmpULT(x.value(), y.value()));
 }
 
 RValue<UInt4> CmpLE(RValue<UInt4> x, RValue<UInt4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<UInt4>(Nucleus::createICmpULE(x.value, y.value));
+	return RValue<UInt4>(Nucleus::createICmpULE(x.value(), y.value()));
 }
 
 RValue<UInt4> CmpNEQ(RValue<UInt4> x, RValue<UInt4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<UInt4>(Nucleus::createICmpNE(x.value, y.value));
+	return RValue<UInt4>(Nucleus::createICmpNE(x.value(), y.value()));
 }
 
 RValue<UInt4> CmpNLT(RValue<UInt4> x, RValue<UInt4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<UInt4>(Nucleus::createICmpUGE(x.value, y.value));
+	return RValue<UInt4>(Nucleus::createICmpUGE(x.value(), y.value()));
 }
 
 RValue<UInt4> CmpNLE(RValue<UInt4> x, RValue<UInt4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<UInt4>(Nucleus::createICmpUGT(x.value, y.value));
+	return RValue<UInt4>(Nucleus::createICmpUGT(x.value(), y.value()));
 }
 
 RValue<UInt4> Max(RValue<UInt4> x, RValue<UInt4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v4i1);
-	auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Ule, condition, x.value, y.value);
+	auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Ule, condition, x.value(), y.value());
 	::basicBlock->appendInst(cmp);
 
 	Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4i32);
-	auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value);
+	auto select = Ice::InstSelect::create(::function, result, condition, y.value(), x.value());
 	::basicBlock->appendInst(select);
 
 	return RValue<UInt4>(V(result));
@@ -3789,11 +3789,11 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v4i1);
-	auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Ugt, condition, x.value, y.value);
+	auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Ugt, condition, x.value(), y.value());
 	::basicBlock->appendInst(cmp);
 
 	Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4i32);
-	auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value);
+	auto select = Ice::InstSelect::create(::function, result, condition, y.value(), x.value());
 	::basicBlock->appendInst(select);
 
 	return RValue<UInt4>(V(result));
@@ -3828,7 +3828,7 @@
 	const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::Sqrt, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 	auto target = ::context->getConstantUndef(Ice::IceType_i32);
 	auto sqrt = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
-	sqrt->addArg(x.value);
+	sqrt->addArg(x.value());
 	::basicBlock->appendInst(sqrt);
 
 	return RValue<Float>(V(result));
@@ -3878,7 +3878,7 @@
     : XYZW(this)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	Value *vector = Nucleus::createBitCast(rhs.value, Float4::type());
+	Value *vector = Nucleus::createBitCast(rhs.value(), Float4::type());
 
 	int swizzle[4] = { 0, 0, 0, 0 };
 	Value *replicate = Nucleus::createShuffleVector(vector, vector, swizzle);
@@ -3890,11 +3890,11 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v4i1);
-	auto cmp = Ice::InstFcmp::create(::function, Ice::InstFcmp::Ogt, condition, x.value, y.value);
+	auto cmp = Ice::InstFcmp::create(::function, Ice::InstFcmp::Ogt, condition, x.value(), y.value());
 	::basicBlock->appendInst(cmp);
 
 	Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4f32);
-	auto select = Ice::InstSelect::create(::function, result, condition, x.value, y.value);
+	auto select = Ice::InstSelect::create(::function, result, condition, x.value(), y.value());
 	::basicBlock->appendInst(select);
 
 	return RValue<Float4>(V(result));
@@ -3904,11 +3904,11 @@
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
 	Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v4i1);
-	auto cmp = Ice::InstFcmp::create(::function, Ice::InstFcmp::Olt, condition, x.value, y.value);
+	auto cmp = Ice::InstFcmp::create(::function, Ice::InstFcmp::Olt, condition, x.value(), y.value());
 	::basicBlock->appendInst(cmp);
 
 	Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4f32);
-	auto select = Ice::InstSelect::create(::function, result, condition, x.value, y.value);
+	auto select = Ice::InstSelect::create(::function, result, condition, x.value(), y.value());
 	::basicBlock->appendInst(select);
 
 	return RValue<Float4>(V(result));
@@ -3945,7 +3945,7 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::Sqrt, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto sqrt = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
-		sqrt->addArg(x.value);
+		sqrt->addArg(x.value());
 		::basicBlock->appendInst(sqrt);
 
 		return RValue<Float4>(V(result));
@@ -3966,7 +3966,7 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::SignMask, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto movmsk = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
-		movmsk->addArg(x.value);
+		movmsk->addArg(x.value());
 		::basicBlock->appendInst(movmsk);
 
 		return RValue<Int>(V(result));
@@ -3976,73 +3976,73 @@
 RValue<Int4> CmpEQ(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createFCmpOEQ(x.value, y.value));
+	return RValue<Int4>(Nucleus::createFCmpOEQ(x.value(), y.value()));
 }
 
 RValue<Int4> CmpLT(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createFCmpOLT(x.value, y.value));
+	return RValue<Int4>(Nucleus::createFCmpOLT(x.value(), y.value()));
 }
 
 RValue<Int4> CmpLE(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createFCmpOLE(x.value, y.value));
+	return RValue<Int4>(Nucleus::createFCmpOLE(x.value(), y.value()));
 }
 
 RValue<Int4> CmpNEQ(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createFCmpONE(x.value, y.value));
+	return RValue<Int4>(Nucleus::createFCmpONE(x.value(), y.value()));
 }
 
 RValue<Int4> CmpNLT(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createFCmpOGE(x.value, y.value));
+	return RValue<Int4>(Nucleus::createFCmpOGE(x.value(), y.value()));
 }
 
 RValue<Int4> CmpNLE(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createFCmpOGT(x.value, y.value));
+	return RValue<Int4>(Nucleus::createFCmpOGT(x.value(), y.value()));
 }
 
 RValue<Int4> CmpUEQ(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createFCmpUEQ(x.value, y.value));
+	return RValue<Int4>(Nucleus::createFCmpUEQ(x.value(), y.value()));
 }
 
 RValue<Int4> CmpULT(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createFCmpULT(x.value, y.value));
+	return RValue<Int4>(Nucleus::createFCmpULT(x.value(), y.value()));
 }
 
 RValue<Int4> CmpULE(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createFCmpULE(x.value, y.value));
+	return RValue<Int4>(Nucleus::createFCmpULE(x.value(), y.value()));
 }
 
 RValue<Int4> CmpUNEQ(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createFCmpUNE(x.value, y.value));
+	return RValue<Int4>(Nucleus::createFCmpUNE(x.value(), y.value()));
 }
 
 RValue<Int4> CmpUNLT(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createFCmpUGE(x.value, y.value));
+	return RValue<Int4>(Nucleus::createFCmpUGE(x.value(), y.value()));
 }
 
 RValue<Int4> CmpUNLE(RValue<Float4> x, RValue<Float4> y)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return RValue<Int4>(Nucleus::createFCmpUGT(x.value, y.value));
+	return RValue<Int4>(Nucleus::createFCmpUGT(x.value(), y.value()));
 }
 
 RValue<Float4> Round(RValue<Float4> x)
@@ -4059,7 +4059,7 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::Round, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto round = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		round->addArg(x.value);
+		round->addArg(x.value());
 		round->addArg(::context->getConstantInt32(0));
 		::basicBlock->appendInst(round);
 
@@ -4080,7 +4080,7 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::Round, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto round = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		round->addArg(x.value);
+		round->addArg(x.value());
 		round->addArg(::context->getConstantInt32(3));
 		::basicBlock->appendInst(round);
 
@@ -4122,7 +4122,7 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::Round, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto round = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		round->addArg(x.value);
+		round->addArg(x.value());
 		round->addArg(::context->getConstantInt32(1));
 		::basicBlock->appendInst(round);
 
@@ -4143,7 +4143,7 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::Round, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto round = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-		round->addArg(x.value);
+		round->addArg(x.value());
 		round->addArg(::context->getConstantInt32(2));
 		::basicBlock->appendInst(round);
 
@@ -4182,7 +4182,7 @@
 Value *Call(RValue<Pointer<Byte>> fptr, Type *retTy, std::initializer_list<Value *> args, std::initializer_list<Type *> argTys)
 {
 	RR_DEBUG_INFO_UPDATE_LOC();
-	return V(sz::Call(::function, ::basicBlock, T(retTy), V(fptr.value), V(args), false));
+	return V(sz::Call(::function, ::basicBlock, T(retTy), V(fptr.value()), V(args), false));
 }
 
 void Breakpoint()
@@ -4375,7 +4375,7 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::Ctlz, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto ctlz = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
-		ctlz->addArg(x.value);
+		ctlz->addArg(x.value());
 		::basicBlock->appendInst(ctlz);
 
 		return RValue<UInt>(V(result));
@@ -4416,7 +4416,7 @@
 		const Ice::Intrinsics::IntrinsicInfo intrinsic = { Ice::Intrinsics::Cttz, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F };
 		auto target = ::context->getConstantUndef(Ice::IceType_i32);
 		auto ctlz = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
-		ctlz->addArg(x.value);
+		ctlz->addArg(x.value());
 		::basicBlock->appendInst(ctlz);
 
 		return RValue<UInt>(V(result));
