wgpu/naga/tests/out/spv/bounds-check-zero.spvasm
Jim Blandy 3693da27f9 [naga spv-out] Bounds-check runtime-sized array access correctly.
Do not neglect to apply bounds checks to indexing operations on
runtime-sized arrays, even when they are accessed via an `AccessIndex`
instruction.

Before this commit, `BlockContext::write_expression_pointer` would not
apply bounds checks to `OpAccessChain` indices provided by an
`AccessIndex` instruction, apparently with the rationale that any
out-of-bounds accesses should have been reported by constant
evaluation.

While it is true that the `index` operand of an `AccessIndex`
expression is known at compile time, and that the WGSL constant
evaluation rules require accesses that can be statically determined to
be out-of-bounds to be shader creation or pipeline creation time
errors, accesses to runtime-sized arrays don't follow this pattern:
even if the index is known, the length with which it must be compared
is not.

Fixes #4441.
2024-10-08 11:53:15 -07:00

344 lines
8.2 KiB
Plaintext

; SPIR-V
; Version: 1.1
; Generator: rspirv
; Bound: 220
OpCapability Shader
OpCapability Linkage
OpExtension "SPV_KHR_storage_buffer_storage_class"
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpDecorate %4 ArrayStride 4
OpDecorate %9 ArrayStride 4
OpMemberDecorate %10 0 Offset 0
OpMemberDecorate %10 1 Offset 48
OpMemberDecorate %10 2 Offset 64
OpMemberDecorate %10 2 ColMajor
OpMemberDecorate %10 2 MatrixStride 16
OpMemberDecorate %10 3 Offset 112
OpDecorate %10 Block
OpDecorate %12 DescriptorSet 0
OpDecorate %12 Binding 0
%2 = OpTypeVoid
%3 = OpTypeFloat 32
%6 = OpTypeInt 32 0
%5 = OpConstant %6 10
%4 = OpTypeArray %3 %5
%7 = OpTypeVector %3 4
%8 = OpTypeMatrix %7 3
%9 = OpTypeRuntimeArray %3
%10 = OpTypeStruct %4 %7 %8 %9
%11 = OpTypeInt 32 1
%13 = OpTypePointer StorageBuffer %10
%12 = OpVariable %13 StorageBuffer
%17 = OpTypeFunction %3 %11
%19 = OpTypePointer StorageBuffer %4
%20 = OpTypePointer StorageBuffer %3
%22 = OpTypeBool
%23 = OpConstant %6 0
%25 = OpConstantNull %3
%34 = OpTypePointer StorageBuffer %9
%37 = OpConstant %6 3
%47 = OpTypePointer StorageBuffer %7
%48 = OpTypePointer StorageBuffer %3
%49 = OpConstant %6 4
%51 = OpConstant %6 1
%61 = OpTypeFunction %3 %7 %11
%71 = OpTypeFunction %7 %11
%73 = OpTypePointer StorageBuffer %8
%74 = OpTypePointer StorageBuffer %7
%76 = OpConstant %6 2
%78 = OpConstantNull %7
%87 = OpTypeFunction %3 %11 %11
%100 = OpConstant %3 100.0
%115 = OpTypeFunction %3
%117 = OpConstant %6 9
%130 = OpTypeFunction %2 %11 %3
%159 = OpTypeFunction %2 %11 %7
%170 = OpTypeFunction %2 %11 %11 %3
%195 = OpTypeFunction %2 %3
%204 = OpConstant %6 1000
%16 = OpFunction %3 None %17
%15 = OpFunctionParameter %11
%14 = OpLabel
OpBranch %18
%18 = OpLabel
%21 = OpULessThan %22 %15 %5
OpSelectionMerge %26 None
OpBranchConditional %21 %27 %26
%27 = OpLabel
%24 = OpAccessChain %20 %12 %23 %15
%28 = OpLoad %3 %24
OpBranch %26
%26 = OpLabel
%29 = OpPhi %3 %25 %18 %28 %27
OpReturnValue %29
OpFunctionEnd
%32 = OpFunction %3 None %17
%31 = OpFunctionParameter %11
%30 = OpLabel
OpBranch %33
%33 = OpLabel
%35 = OpArrayLength %6 %12 3
%36 = OpULessThan %22 %31 %35
OpSelectionMerge %39 None
OpBranchConditional %36 %40 %39
%40 = OpLabel
%38 = OpAccessChain %20 %12 %37 %31
%41 = OpLoad %3 %38
OpBranch %39
%39 = OpLabel
%42 = OpPhi %3 %25 %33 %41 %40
OpReturnValue %42
OpFunctionEnd
%45 = OpFunction %3 None %17
%44 = OpFunctionParameter %11
%43 = OpLabel
OpBranch %46
%46 = OpLabel
%50 = OpULessThan %22 %44 %49
OpSelectionMerge %53 None
OpBranchConditional %50 %54 %53
%54 = OpLabel
%52 = OpAccessChain %48 %12 %51 %44
%55 = OpLoad %3 %52
OpBranch %53
%53 = OpLabel
%56 = OpPhi %3 %25 %46 %55 %54
OpReturnValue %56
OpFunctionEnd
%60 = OpFunction %3 None %61
%58 = OpFunctionParameter %7
%59 = OpFunctionParameter %11
%57 = OpLabel
OpBranch %62
%62 = OpLabel
%63 = OpULessThan %22 %59 %49
OpSelectionMerge %64 None
OpBranchConditional %63 %65 %64
%65 = OpLabel
%66 = OpVectorExtractDynamic %3 %58 %59
OpBranch %64
%64 = OpLabel
%67 = OpPhi %3 %25 %62 %66 %65
OpReturnValue %67
OpFunctionEnd
%70 = OpFunction %7 None %71
%69 = OpFunctionParameter %11
%68 = OpLabel
OpBranch %72
%72 = OpLabel
%75 = OpULessThan %22 %69 %37
OpSelectionMerge %79 None
OpBranchConditional %75 %80 %79
%80 = OpLabel
%77 = OpAccessChain %74 %12 %76 %69
%81 = OpLoad %7 %77
OpBranch %79
%79 = OpLabel
%82 = OpPhi %7 %78 %72 %81 %80
OpReturnValue %82
OpFunctionEnd
%86 = OpFunction %3 None %87
%84 = OpFunctionParameter %11
%85 = OpFunctionParameter %11
%83 = OpLabel
OpBranch %88
%88 = OpLabel
%89 = OpULessThan %22 %85 %49
%90 = OpULessThan %22 %84 %37
%91 = OpLogicalAnd %22 %89 %90
OpSelectionMerge %93 None
OpBranchConditional %91 %94 %93
%94 = OpLabel
%92 = OpAccessChain %48 %12 %76 %84 %85
%95 = OpLoad %3 %92
OpBranch %93
%93 = OpLabel
%96 = OpPhi %3 %25 %88 %95 %94
OpReturnValue %96
OpFunctionEnd
%99 = OpFunction %3 None %17
%98 = OpFunctionParameter %11
%97 = OpLabel
OpBranch %101
%101 = OpLabel
%102 = OpConvertSToF %3 %98
%103 = OpFDiv %3 %102 %100
%104 = OpExtInst %3 %1 Sin %103
%105 = OpFMul %3 %104 %100
%106 = OpConvertFToS %11 %105
%107 = OpULessThan %22 %106 %5
OpSelectionMerge %109 None
OpBranchConditional %107 %110 %109
%110 = OpLabel
%108 = OpAccessChain %20 %12 %23 %106
%111 = OpLoad %3 %108
OpBranch %109
%109 = OpLabel
%112 = OpPhi %3 %25 %101 %111 %110
OpReturnValue %112
OpFunctionEnd
%114 = OpFunction %3 None %115
%113 = OpLabel
OpBranch %116
%116 = OpLabel
%118 = OpAccessChain %20 %12 %23 %117
%119 = OpLoad %3 %118
%120 = OpAccessChain %48 %12 %51 %37
%121 = OpLoad %3 %120
%122 = OpFAdd %3 %119 %121
%123 = OpAccessChain %48 %12 %76 %76 %37
%124 = OpLoad %3 %123
%125 = OpFAdd %3 %122 %124
OpReturnValue %125
OpFunctionEnd
%129 = OpFunction %2 None %130
%127 = OpFunctionParameter %11
%128 = OpFunctionParameter %3
%126 = OpLabel
OpBranch %131
%131 = OpLabel
%132 = OpULessThan %22 %127 %5
OpSelectionMerge %134 None
OpBranchConditional %132 %135 %134
%135 = OpLabel
%133 = OpAccessChain %20 %12 %23 %127
OpStore %133 %128
OpBranch %134
%134 = OpLabel
OpReturn
OpFunctionEnd
%139 = OpFunction %2 None %130
%137 = OpFunctionParameter %11
%138 = OpFunctionParameter %3
%136 = OpLabel
OpBranch %140
%140 = OpLabel
%141 = OpArrayLength %6 %12 3
%142 = OpULessThan %22 %137 %141
OpSelectionMerge %144 None
OpBranchConditional %142 %145 %144
%145 = OpLabel
%143 = OpAccessChain %20 %12 %37 %137
OpStore %143 %138
OpBranch %144
%144 = OpLabel
OpReturn
OpFunctionEnd
%149 = OpFunction %2 None %130
%147 = OpFunctionParameter %11
%148 = OpFunctionParameter %3
%146 = OpLabel
OpBranch %150
%150 = OpLabel
%151 = OpULessThan %22 %147 %49
OpSelectionMerge %153 None
OpBranchConditional %151 %154 %153
%154 = OpLabel
%152 = OpAccessChain %48 %12 %51 %147
OpStore %152 %148
OpBranch %153
%153 = OpLabel
OpReturn
OpFunctionEnd
%158 = OpFunction %2 None %159
%156 = OpFunctionParameter %11
%157 = OpFunctionParameter %7
%155 = OpLabel
OpBranch %160
%160 = OpLabel
%161 = OpULessThan %22 %156 %37
OpSelectionMerge %163 None
OpBranchConditional %161 %164 %163
%164 = OpLabel
%162 = OpAccessChain %74 %12 %76 %156
OpStore %162 %157
OpBranch %163
%163 = OpLabel
OpReturn
OpFunctionEnd
%169 = OpFunction %2 None %170
%166 = OpFunctionParameter %11
%167 = OpFunctionParameter %11
%168 = OpFunctionParameter %3
%165 = OpLabel
OpBranch %171
%171 = OpLabel
%172 = OpULessThan %22 %167 %49
%173 = OpULessThan %22 %166 %37
%174 = OpLogicalAnd %22 %172 %173
OpSelectionMerge %176 None
OpBranchConditional %174 %177 %176
%177 = OpLabel
%175 = OpAccessChain %48 %12 %76 %166 %167
OpStore %175 %168
OpBranch %176
%176 = OpLabel
OpReturn
OpFunctionEnd
%181 = OpFunction %2 None %130
%179 = OpFunctionParameter %11
%180 = OpFunctionParameter %3
%178 = OpLabel
OpBranch %182
%182 = OpLabel
%183 = OpConvertSToF %3 %179
%184 = OpFDiv %3 %183 %100
%185 = OpExtInst %3 %1 Sin %184
%186 = OpFMul %3 %185 %100
%187 = OpConvertFToS %11 %186
%188 = OpULessThan %22 %187 %5
OpSelectionMerge %190 None
OpBranchConditional %188 %191 %190
%191 = OpLabel
%189 = OpAccessChain %20 %12 %23 %187
OpStore %189 %180
OpBranch %190
%190 = OpLabel
OpReturn
OpFunctionEnd
%194 = OpFunction %2 None %195
%193 = OpFunctionParameter %3
%192 = OpLabel
OpBranch %196
%196 = OpLabel
%197 = OpAccessChain %20 %12 %23 %117
OpStore %197 %193
%198 = OpAccessChain %48 %12 %51 %37
OpStore %198 %193
%199 = OpAccessChain %48 %12 %76 %76 %37
OpStore %199 %193
OpReturn
OpFunctionEnd
%201 = OpFunction %3 None %115
%200 = OpLabel
OpBranch %202
%202 = OpLabel
%203 = OpArrayLength %6 %12 3
%205 = OpULessThan %22 %204 %203
OpSelectionMerge %207 None
OpBranchConditional %205 %208 %207
%208 = OpLabel
%206 = OpAccessChain %20 %12 %37 %204
%209 = OpLoad %3 %206
OpBranch %207
%207 = OpLabel
%210 = OpPhi %3 %25 %202 %209 %208
OpReturnValue %210
OpFunctionEnd
%213 = OpFunction %2 None %195
%212 = OpFunctionParameter %3
%211 = OpLabel
OpBranch %214
%214 = OpLabel
%215 = OpArrayLength %6 %12 3
%216 = OpULessThan %22 %204 %215
OpSelectionMerge %218 None
OpBranchConditional %216 %219 %218
%219 = OpLabel
%217 = OpAccessChain %20 %12 %37 %204
OpStore %217 %212
OpBranch %218
%218 = OpLabel
OpReturn
OpFunctionEnd