Fix #2329: don't use invalid initializers.
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index c3b48d6..ba60b82 100644
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -1724,7 +1724,7 @@
spv::StorageClass sc = builder.getStorageClass(id);
// Before SPIR-V 1.4, we only want to include Input and Output.
// Starting with SPIR-V 1.4, we want all globals.
- if ((glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4 && sc != spv::StorageClassFunction) ||
+ if ((glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4 && builder.isGlobalStorage(id)) ||
(sc == spv::StorageClassInput || sc == spv::StorageClassOutput)) {
iOSet.insert(id);
}
diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp
index fba26ad..151e935 100644
--- a/SPIRV/SpvBuilder.cpp
+++ b/SPIRV/SpvBuilder.cpp
@@ -2722,7 +2722,7 @@
setPrecision(id, precision);
} else {
Id lValue = NoResult;
- if (spvVersion >= Spv_1_4) {
+ if (spvVersion >= Spv_1_4 && isValidInitializer(accessChain.base)) {
// make a new function variable for this r-value, using an initializer,
// and mark it as NonWritable so that downstream it can be detected as a lookup
// table
diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h
index ca126d3..83a7116 100644
--- a/SPIRV/SpvBuilder.h
+++ b/SPIRV/SpvBuilder.h
@@ -248,6 +248,13 @@
{ return module.getInstruction(resultId)->getImmediateOperand(0); }
StorageClass getStorageClass(Id resultId) const { return getTypeStorageClass(getTypeId(resultId)); }
+ bool isVariableOpCode(Op opcode) const { return opcode == OpVariable; }
+ bool isVariable(Id resultId) const { return isVariableOpCode(getOpCode(resultId)); }
+ bool isGlobalStorage(Id resultId) const { return getStorageClass(resultId) != StorageClassFunction; }
+ bool isGlobalVariable(Id resultId) const { return isVariable(resultId) && isGlobalStorage(resultId); }
+ // See if a resultId is valid for use as an initializer.
+ bool isValidInitializer(Id resultId) const { return isConstant(resultId) || isGlobalVariable(resultId); }
+
int getScalarTypeWidth(Id typeId) const
{
Id scalarTypeId = getScalarTypeId(typeId);
diff --git a/Test/baseResults/spv.ext.World3x4.rahit.out b/Test/baseResults/spv.ext.World3x4.rahit.out
new file mode 100755
index 0000000..c689c4d
--- /dev/null
+++ b/Test/baseResults/spv.ext.World3x4.rahit.out
@@ -0,0 +1,145 @@
+spv.ext.World3x4.rahit
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 90
+
+ Capability RayTracingProvisionalKHR
+ Extension "SPV_KHR_ray_tracing"
+ 1: ExtInstImport "GLSL.std.450"
+ MemoryModel Logical GLSL450
+ EntryPoint AnyHitKHR 4 "main" 43 60 78 87 89
+ Source GLSL 460
+ SourceExtension "GL_EXT_ray_tracing"
+ Name 4 "main"
+ Name 8 "k"
+ Name 12 "ndx"
+ Name 14 "col"
+ Name 25 "row"
+ Name 39 "p"
+ Name 43 "gl_LaunchIDEXT"
+ Name 53 "r"
+ Name 60 "gl_WorldToObject3x4EXT"
+ Name 66 "indexable"
+ Name 72 "c"
+ Name 78 "result"
+ Name 87 "attribs"
+ Name 89 "hitValue"
+ Decorate 43(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
+ Decorate 60(gl_WorldToObject3x4EXT) BuiltIn WorldToObjectKHR
+ Decorate 78(result) DescriptorSet 0
+ Decorate 78(result) Binding 0
+ Decorate 89(hitValue) Location 0
+ 2: TypeVoid
+ 3: TypeFunction 2
+ 6: TypeFloat 32
+ 7: TypePointer Function 6(float)
+ 9: 6(float) Constant 1233125376
+ 10: TypeInt 32 1
+ 11: TypePointer Function 10(int)
+ 13: 10(int) Constant 4294967295
+ 15: 10(int) Constant 0
+ 22: 10(int) Constant 3
+ 23: TypeBool
+ 32: 10(int) Constant 4
+ 35: 10(int) Constant 1
+ 37: TypeVector 10(int) 3
+ 38: TypePointer Function 37(ivec3)
+ 40: TypeInt 32 0
+ 41: TypeVector 40(int) 3
+ 42: TypePointer Input 41(ivec3)
+43(gl_LaunchIDEXT): 42(ptr) Variable Input
+ 44: TypeVector 40(int) 2
+ 47: TypeVector 10(int) 2
+ 55: TypeVector 6(float) 4
+ 56: TypeMatrix 55(fvec4) 3
+ 57: TypeVector 6(float) 3
+ 58: TypeMatrix 57(fvec3) 4
+ 59: TypePointer Input 58
+60(gl_WorldToObject3x4EXT): 59(ptr) Variable Input
+ 65: TypePointer Function 56
+ 70: TypeVector 10(int) 4
+ 71: TypePointer Function 70(ivec4)
+ 76: TypeImage 10(int) 3D nonsampled format:R32i
+ 77: TypePointer UniformConstant 76
+ 78(result): 77(ptr) Variable UniformConstant
+ 86: TypePointer HitAttributeKHR 57(fvec3)
+ 87(attribs): 86(ptr) Variable HitAttributeKHR
+ 88: TypePointer IncomingRayPayloadKHR 57(fvec3)
+ 89(hitValue): 88(ptr) Variable IncomingRayPayloadKHR
+ 4(main): 2 Function None 3
+ 5: Label
+ 8(k): 7(ptr) Variable Function
+ 12(ndx): 11(ptr) Variable Function
+ 14(col): 11(ptr) Variable Function
+ 25(row): 11(ptr) Variable Function
+ 39(p): 38(ptr) Variable Function
+ 53(r): 7(ptr) Variable Function
+ 66(indexable): 65(ptr) Variable Function
+ 72(c): 71(ptr) Variable Function
+ Store 8(k) 9
+ Store 12(ndx) 13
+ Store 14(col) 15
+ Branch 16
+ 16: Label
+ LoopMerge 18 19 None
+ Branch 20
+ 20: Label
+ 21: 10(int) Load 14(col)
+ 24: 23(bool) SLessThan 21 22
+ BranchConditional 24 17 18
+ 17: Label
+ Store 25(row) 15
+ Branch 26
+ 26: Label
+ LoopMerge 28 29 None
+ Branch 30
+ 30: Label
+ 31: 10(int) Load 25(row)
+ 33: 23(bool) SLessThan 31 32
+ BranchConditional 33 27 28
+ 27: Label
+ 34: 10(int) Load 12(ndx)
+ 36: 10(int) IAdd 34 35
+ Store 12(ndx) 36
+ 45: 41(ivec3) Load 43(gl_LaunchIDEXT)
+ 46: 44(ivec2) VectorShuffle 45 45 0 1
+ 48: 47(ivec2) Bitcast 46
+ 49: 10(int) Load 12(ndx)
+ 50: 10(int) CompositeExtract 48 0
+ 51: 10(int) CompositeExtract 48 1
+ 52: 37(ivec3) CompositeConstruct 50 51 49
+ Store 39(p) 52
+ 54: 6(float) Load 8(k)
+ 61: 58 Load 60(gl_WorldToObject3x4EXT)
+ 62: 56 Transpose 61
+ 63: 10(int) Load 14(col)
+ 64: 10(int) Load 25(row)
+ Store 66(indexable) 62
+ 67: 7(ptr) AccessChain 66(indexable) 63 64
+ 68: 6(float) Load 67
+ 69: 6(float) FMul 54 68
+ Store 53(r) 69
+ 73: 6(float) Load 53(r)
+ 74: 10(int) ConvertFToS 73
+ 75: 70(ivec4) CompositeConstruct 74 15 15 35
+ Store 72(c) 75
+ 79: 76 Load 78(result)
+ 80: 37(ivec3) Load 39(p)
+ 81: 70(ivec4) Load 72(c)
+ ImageWrite 79 80 81 SignExtend
+ Branch 29
+ 29: Label
+ 82: 10(int) Load 25(row)
+ 83: 10(int) IAdd 82 35
+ Store 25(row) 83
+ Branch 26
+ 28: Label
+ Branch 19
+ 19: Label
+ 84: 10(int) Load 14(col)
+ 85: 10(int) IAdd 84 35
+ Store 14(col) 85
+ Branch 16
+ 18: Label
+ Return
+ FunctionEnd
diff --git a/Test/spv.ext.World3x4.rahit b/Test/spv.ext.World3x4.rahit
new file mode 100644
index 0000000..4f541f8
--- /dev/null
+++ b/Test/spv.ext.World3x4.rahit
@@ -0,0 +1,21 @@
+#version 460
+#extension GL_EXT_ray_tracing : enable
+
+hitAttributeEXT vec3 attribs;
+layout(location = 0) rayPayloadInEXT vec3 hitValue;
+layout(set = 0, binding = 0, r32i) uniform iimage3D result;
+
+void main()
+{
+ float k = 1048576.0f;
+ int ndx = -1;
+ for (int col = 0; col < 3; col++)
+ for (int row = 0; row < 4; row++)
+ {
+ ndx++;
+ ivec3 p = ivec3(gl_LaunchIDEXT.xy, ndx);
+ float r = k * gl_WorldToObject3x4EXT[col][row];
+ ivec4 c = ivec4(int(r),0,0,1);
+ imageStore(result, p, c);
+ }
+}
diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
index 9634262..714ef3c 100644
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -560,6 +560,7 @@
"spv.ext.RayGenShader.rgen",
"spv.ext.RayGenShader11.rgen",
"spv.ext.RayGenShaderArray.rgen",
+ "spv.ext.World3x4.rahit",
})),
FileNameAsCustomTestSuffix
);