Get desktop application:
View/edit binary Protocol Buffers messages
Used in:
The result id of an OpAccessChain or OpInBoundsAccessChain instruction.
A series of pairs of fresh ids, one per access chain index, for the results of a compare instruction and a select instruction, serving the roles of %t1 and %t2 in the above example.
Used in:
The object being accessed - a scalar or composite
0 or more indices, used to index into a composite object
Used in:
Order the fact options by numeric id (rather than alphabetically).
Used in:
Used in:
An element of a uniform buffer
The words of the associated constant
Used in:
Data descriptors guaranteed to hold identical data.
Used in:
Used in:
The left-hand-side of the equation.
A SPIR-V opcode, from a restricted set of instructions for which equation facts make sense.
The operands to the right-hand-side of the equation.
Used in:
An irrelevant id.
Used in:
A result id of pointer type
Used in:
, , ,An id that we would like to be able to find a use of.
The input operand index at which the use is expected.
Used in:
The instruction's opcode (e.g. OpLabel).
The id of the instruction's result type; 0 if there is no result type.
The id of the instruction's result; 0 if there is no result.
Zero or more input operands.
Used in:
, , , , , , , , , , , , , , , , , , , , , , , , , ,The id of an instruction after which the instruction being described is believed to be located. It might be the using instruction itself.
The opcode for the instruction being described.
The number of matching opcodes to skip over when searching from the base instruction to the instruction being described.
Used in:
,The type of the operand.
The data associated with the operand. For most operands (e.g. ids, storage classes and literals) this will be a single word.
Used in:
The header for the loop.
A fresh id into which the loop limiter's current value can be loaded.
A fresh id that can be used to increment the loaded value by 1.
A fresh id that can be used to compare the loaded value with the loop limit.
A fresh id that can be used to compute the conjunction or disjunction of an original loop exit condition with |compare_id|, if the loop's back edge block can conditionally exit the loop.
A sequence of ids suitable for extending OpPhi instructions of the loop merge block if it did not previously have an incoming edge from the loop back edge block.
TransformationMergeFunctionReturns needs to modify each merge block of loops containing return instructions, by: - adding instructions to decide whether the function is returning - adding instructions to pass on the return value of the function, if it is returning - changing the branch instruction (which must be an unconditional branch) to a conditional branch that, if the function is returning, branches to the merge block of the innermost loop that contains this merge block (which can be the new merge block introduced by the transformation). One such merge block of the form: %block = OpLabel %phi1 = OpPhi %type1 %val1_1 %pred1 %val1_2 %pred2 %phi2 = OpPhi %type2 %val2_1 %pred1 %val2_2 %pred2 OpBranch %next is transformed into: %block = OpLabel %is_returning_id = OpPhi %bool %false %pred1 %false %pred2 %true %ret_bb1 %is_bb2_returning %mer_bb2 %maybe_return_val_id = OpPhi %return_type %any_returnable_val %pred1 %any_returnable_val %pred2 %ret_val1 %ret_bb1 %ret_val2 %mer_bb2 %phi1 = OpPhi %type1 %val1_1 %pred1 %val1_2 %pred2 %any_suitable_id_1 %ret_bb1 %any_suitable_id_1 %mer_bb2 %phi2 = OpPhi %type2 %val2_1 %pred1 %val2_2 %pred2 %any_suitable_id_1 %ret_bb1 %any_suitable_id_1 %mer_bb2 OpBranchConditional %is_returning_id %innermost_loop_merge %next where %ret_bb1 is a block that originally contains a return instruction and %mer_bb2 is the merge block of an inner loop, from where the function might be returning. Note that the block is required to only have OpLabel, OpPhi or OpBranch instructions.
Used in:
The id of the merge block that needs to be modified.
A fresh id for a boolean OpPhi whose value will be true iff the function is returning. This will be used to decide whether to break out of the loop or to use the original branch of the function. This value will also be used by the merge block of the enclosing loop (if there is one) if the function is returning from this block.
A fresh id that will get the value being returned, if the function is returning. If the function return type is void, this is ignored.
A mapping from each existing OpPhi id to a suitable id of the same type available to use before the instruction.
When flattening a conditional branch, it is necessary to enclose instructions that have side effects inside conditionals, so that they are only executed if the condition holds. Otherwise, there might be unintended changes in memory, or crashes that would not originally happen. For example, the instruction %id = OpLoad %type %ptr, found in the true branch of the conditional, will be enclosed in a new conditional (assuming that the block containing it can be split around it) as follows: [previous instructions in the block] OpSelectionMerge %merge_block_id None OpBranchConditional %cond %execute_block_id %alternative_block_id %execute_block_id = OpLabel %actual_result_id = OpLoad %type %ptr OpBranch %merge_block_id %alternative_block_id = OpLabel %placeholder_result_id = OpCopyObject %type %value_to_copy_id OpBranch %merge_block_id %merge_block_id = OpLabel %id = OpPhi %type %actual_result_id %execute_block_id %placeholder_result_id %alternative_block_id [following instructions from the original block] If the instruction does not have a result id, this is simplified. For example, OpStore %ptr %value, found in the true branch of a conditional, is enclosed as follows: [previous instructions in the block] OpSelectionMerge %merge_block None OpBranchConditional %cond %execute_block_id %merge_block_id %execute_block_id = OpLabel OpStore %ptr %value OpBranch %merge_block_id %merge_block_id = OpLabel [following instructions from the original block] The same happens if the instruction is found in the false branch of the conditional being flattened, except that the label ids in the OpBranchConditional are swapped.
Used in:
An instruction descriptor for identifying the instruction to be enclosed inside a conditional. An instruction descriptor is necessary because the instruction might not have a result id.
A fresh id for the new merge block.
A fresh id for the new block where the actual instruction is executed.
A fresh id for the result id of the instruction (the original one is used by the OpPhi instruction).
A fresh id for the new block where the placeholder instruction is placed.
A fresh id for the placeholder instruction.
An id present in the module, available to use at this point in the program and with the same type as the original instruction, that can be used to create a placeholder OpCopyObject instruction.
Used in:
Order the transformation options by numeric id (rather than alphabetically).
Add additional option using the next available number.
Used in:
Result id for the access chain
The pointer from which the access chain starts
Zero or more access chain indices
A descriptor for an instruction in a block before which the new OpAccessChain instruction should be inserted
Additional fresh ids, required to clamp index variables. A pair is needed for each access to a non-struct composite.
Used in:
The bit instruction result id.
The fresh ids required to apply the transformation.
Used in:
If the constant should be marked as irrelevant.
Used in:
Fresh id for the composite
A composite type id
Constituent ids for the composite
If the constant should be marked as irrelevant.
Used in:
Id for the constant
Type of the constant
Used in:
Id for the constant
Id for the scalar type of the constant
Value of the constant
If the constant should be marked as irrelevant.
Used in:
OpCopyMemory will be inserted before this instruction.
Fresh id to copy memory into.
Source to copy memory from.
Storage class for the target variable. Can be either Function or Private.
Result id for the variable's initializer operand. Its type must be equal to variable's pointee type.
Used in:
Fresh id for the dead block
Id of an existing block terminated with OpBranch, such that this OpBranch can be replaced with an OpBranchConditional to its exiting successor or the dead block
Determines whether the condition associated with the OpBranchConditional is true or false
Used in:
The block to break from
The merge block to break to
Determines whether the break condition is true or false
A sequence of ids suitable for extending OpPhi instructions as a result of the new break edge
Used in:
The block to continue from
Determines whether the continue condition is true or false
A sequence of ids suitable for extending OpPhi instructions as a result of the new break edge
Used in:
Fresh id for the function.
Fresh id for the single basic block in the function.
One of OpKill, OpUnreachable, OpTerminateInvocation. If additional early termination instructions are added to SPIR-V they should also be handled here.
Used in:
The series of instructions that comprise the function.
True if and only if the given function should be made livesafe (see FactFunctionIsLivesafe for definition).
Fresh id for a new variable that will serve as a "loop limiter" for the function; only relevant if |is_livesafe| holds.
Id of an existing unsigned integer constant providing the maximum value that the loop limiter can reach before the loop is broken from; only relevant if |is_livesafe| holds.
Fresh ids for each loop in the function that allow the loop limiter to be manipulated; only relevant if |is_livesafe| holds.
Id of an existing global value with the same return type as the function that can be used to replace OpKill and OpReachable instructions with ReturnValue instructions. Ignored if the function has void return type. Only relevant if |is_livesafe| holds.
A mapping (represented as a sequence) from every access chain result id in the function to the ids required to clamp its indices to ensure they are in bounds; only relevant if |is_livesafe| holds.
Used in:
Fresh id for the undefined value
The type of the undefined value
Used in:
Fresh id for the global variable
The type of the global variable
Initial value of the variable
True if and only if the behaviour of the module should not depend on the value of the variable, in which case stores to the variable can be performed in an arbitrary fashion.
Used in:
An vector id with the original coordinate and the unused components.
A descriptor for an image sample instruction.
Used in:
Fresh id for the local variable
The type of the local variable
The id of the function to which the local variable should be added
Initial value of the variable
True if and only if the behaviour of the module should not depend on the value of the variable, in which case stores to the variable can be performed in an arbitrary fashion.
Used in:
The id of the loop header block
A fresh id for the preheader block
Fresh ids for splitting the OpPhi instructions in the header. A new OpPhi instruction in the preheader is needed for each OpPhi instruction in the header, if the header has more than one predecessor outside of the loop. This allows turning instructions of the form: %loop_header_block = OpLabel %id1 = OpPhi %type %val1 %pred1_id %val2 %pred2_id %val3 %backedge_block_id into: %fresh_id = OpLabel %phi_id1 = OpPhi %type %val1 %pred1_id %val2 %pred2_id OpBranch %header_id %loop_header_block = OpLabel %id1 = OpPhi %type %phi_id1 %fresh_id %val3 %backedge_block_id
A transformation that uses a loop to create a synonym for an integer constant C (scalar or vector) using an initial value I, a step value S and a number of iterations N such that C = I - N * S. For each iteration, S is subtracted from the total. The loop can be made up of one or two blocks, and it is inserted before a block with a single predecessor. In the one-block case, it is of the form: %loop_id = OpLabel %ctr_id = OpPhi %int %int_0 %pred %incremented_ctr_id %loop_id %temp_id = OpPhi %type_of_I %I %pred %eventual_syn_id %loop_id %eventual_syn_id = OpISub %type_of_I %temp_id %step_val_id %incremented_ctr_id = OpIAdd %int %ctr_id %int_1 %cond_id = OpSLessThan %bool %incremented_ctr_id %num_iterations_id OpLoopMerge %block_after_loop_id %loop_id None OpBranchConditional %cond_id %loop_id %block_after_loop_id A new OpPhi instruction is then added to %block_after_loop_id, as follows: %block_after_loop_id = OpLabel %syn_id = OpPhi %type_of_I %eventual_syn_id %loop_id This can be translated, assuming that N > 0, to: int syn = I; for (int ctr = 0; ctr < N; ctr++) syn = syn - S; All existing OpPhi instructions in %block_after_loop_id are also updated to reflect the fact that its predecessor is now %loop_id.
Used in:
The id of the integer constant C that we want a synonym of.
The id of the initial value integer constant I.
The id of the step value integer constant S.
The id of the integer scalar constant, its value being the number of iterations N.
The label id of the block before which the loop must be inserted.
A fresh id for the synonym.
A fresh id for the label of the loop,
A fresh id for the counter.
A fresh id taking the value I - S * ctr at the ctr-th iteration.
A fresh id taking the value I - S * (ctr + 1) at the ctr-th iteration, and thus I - S * N at the last iteration.
A fresh id for the incremented counter.
A fresh id for the loop condition.
A fresh id for the additional block. If this is 0, it means that only one block is to be created.
Used in:
Result id to be decorated
Used in:
Label id of the block
Pairs (pred_i, id_i)
Fresh id for the new instruction
Used in:
Result id of the function to add parameters to.
Fresh id for a new parameter.
Type id for a new parameter.
A map that maps from the OpFunctionCall id to the id that will be passed as the new parameter at that call site. It must have the same type as that of the new parameter.
A fresh id for a new function type. This might not be used if a required function type already exists or if we can change the old function type.
Used in:
Result id to be decorated
Used in:
Result id for the new instruction.
Type id for the new instruction.
Opcode operand of the OpSpecConstantOp instruction.
Operands of the |opcode| instruction.
Used in:
Result id of the first synonym.
Type of the synonym to create. See SynonymType for more details.
Fresh result id for a created synonym.
An instruction to insert a new synonym before.
Type of the synonym to apply. Some types might produce instructions with commutative operands. Such types do not specify the order of the operands since we have a special transformation to swap commutable operands. TODO(https://github.com/KhronosGroup/SPIRV-Tools/issues/3499): Consider adding more types here.
Used in:
New synonym is derived by adding zero to the |result_id|.
New synonym is derived by subtracting zero from the |result_id|.
New synonym is derived by multiplying |result_id| by one.
New synonym is derived by applying OpCopyObject instruction to |result_id|.
New synonym is derived by applying OpLogicalOr to |result_id| with the second operand being 'false'.
New synonym is derived by applying OpLogicalAnd to |result_id| with the second operand being 'true'.
New synonym is derived by applying OpBitwiseOr to |result_id| with the second operand being 0 taken with the same bit length as |result_id|
New synonym is derived by applying OpBitwiseXor to |result_id| with the second operand being 0 taken with the same bit length as |result_id|
Used in:
Fresh id for the array type
The array's element type
The array's size
Used in:
Id to be used for the type
Used in:
Id to be used for the type
Floating-point width
Used in:
Fresh id for the function type
The function's return type
The function's argument types
Used in:
Id to be used for the type
Integer width
True if and only if this is a signed type
Used in:
Fresh id for the matrix type
The matrix's column type, which must be a floating-point vector (as per the "data rules" in the SPIR-V specification).
The matrix's column count
Used in:
Id to be used for the type
Pointer storage class
Id of the base type for the pointer
Used in:
Fresh id for the struct type
The struct's member types
Used in:
Fresh id for the vector type
The vector's component type
The vector's component count
Used in:
A descriptor for a branch conditional instruction.
Branch weights of a branch conditional instruction.
Used in:
Id of the type of the composite that is to be constructed
Ids of the objects that will form the components of the composite
A descriptor for an instruction in a block before which the new OpCompositeConstruct instruction should be inserted
A fresh id for the composite object
Used in:
A descriptor for an instruction in a block before which the new OpCompositeExtract instruction should be inserted
Result id for the extract operation.
Id of the composite from which data is to be extracted.
Indices that indicate which part of the composite should be extracted.
Used in:
A descriptor for an instruction before which the new instruction OpCompositeInsert should be inserted.
Result id of the inserted OpCompositeInsert instruction.
Id of the composite used as the basis for the insertion.
Id of the object to be inserted.
Indices that indicate which part of the composite should be inserted into.
Used in:
When searching equivalence classes for implied facts, equivalence classes larger than this size will be skipped.
Used in:
Fresh id for a label of the new entry block.
Id for a boolean expression.
Fresh id for a label of the merge block of the conditional.
Block id of the entry block of the original region.
Block id of the exit block of the original region.
Map that maps from a label in the original region to the corresponding label in the duplicated region.
Map that maps from a result id in the original region to the corresponding result id in the duplicated region.
Map that maps from a result id in the original region to the result id of the corresponding OpPhi instruction.
Used in:
The result id of the new instruction
The instruction's opcode
The input operands to the instruction
A descriptor for an instruction in a block before which the new instruction should be inserted
Used in:
The OpAny or OpAll instruction result id.
The fresh ids required to apply the transformation.
Used in:
The label id of the header block
A boolean field deciding the order in which the original branches will be laid out: the true branch will be laid out first iff this field is true.
If the convergence block contains an OpPhi with bvec2 result type, it may be necessary to introduce a bvec2 with the selection construct's condition in both components in order to turn the OpPhi into an OpSelect. This this field provides a fresh id for an OpCompositeConstruct instruction for this purpose. It should be set to 0 if no such instruction is required.
The same as |fresh_id_for_bvec2_selector| but for the bvec3 case.
The same as |fresh_id_for_bvec2_selector| but for the bvec4 case.
A list of instructions with side effects, which must be enclosed inside smaller conditionals before flattening the main one, and the corresponding fresh ids and module ids needed.
Used in:
A fresh id for the result of the call
Id of the function to be called
Ids for arguments to the function
A descriptor for an instruction in a block before which the new OpFunctionCall instruction should be inserted
Used in:
Result id of the function call instruction.
For each result id defined by the called function, this map provides an associated fresh id that can be used in the inlined version of the function call.
Used in:
Result id of the instruction to invert.
Fresh id that will be used by the operator after the inversion.
Used in:
The result of the load instruction.
The pointer to be loaded from.
True if and only if the load should be atomic.
The memory scope for the atomic load. Ignored unless |is_atomic| is true.
The memory semantics for the atomic load. Ignored unless |is_atomic| is true.
A descriptor for an instruction in a block before which the new OpLoad instruction should be inserted.
Used in:
The composite instruction result id.
The OpCompositeExtract/Insert instructions accept integer literals as indices to the composite object. However, the OpVectorInsert/ExtractDynamic instructions require its single index to be an integer instruction. This is the result id of the integer instruction.
Used in:
The id of the block that is to be merged with its predecessor; the merged block will have the *predecessor's* id.
Used in:
The id of the function to which the transformation is being applied.
A fresh id for the header of the new outer loop.
A fresh id for an unreachable continue construct for the new outer loop.
A fresh id for the new return block of the function, i.e. the merge block of the new outer loop.
A fresh id for the value that will be returned. This is ignored if the function has void return type.
An existing id of the same type as the return value, which is available to use at the end of the entry block. This is ignored if the function has void return type or if no loops in the function contain a return instruction. If the function is not void, the transformation will add an OpPhi instruction to each merge block whose associated loop contains at least a return instruction. The value associated with existing predecessors from which the function cannot be returning will be this id, used as a placeholder.
The information needed to modify the merge blocks of loops containing return instructions.
Used in:
The id of the block to move down.
Used in:
The instruction to move down.
Used in:
Result id of the pointer instruction to mutate.
Fresh id for the OpLoad instruction.
Instruction to insert backup, mutation and restoration code before.
Used in:
Id of the entry block of the single-entry single-exit region to be outlined
Id of the exit block of the single-entry single-exit region to be outlined
Id of a struct that will store the return values of the new function
A fresh id for the type of the outlined function
A fresh id for the outlined function itself
A fresh id to represent the block in the outlined function that represents the first block of the outlined region.
A fresh id for the result of the OpFunctionCall instruction that will call the outlined function
A fresh id to capture the return value of the outlined function - the argument to OpReturn
Ids defined outside the region and used inside the region will become parameters to the outlined function. This is a mapping from used ids to fresh parameter ids.
Ids defined inside the region and used outside the region will become fresh ids defined by the outlined function, which get copied into the function's struct return value and then copied into their destination ids by the caller. This is a mapping from original ids to corresponding fresh ids.
Used in:
Function, whose parameters will be permuted
Fresh id for a new type of the function. This might not be used if a required function type already exists or if we can change the old function type.
An array of size |n|, where |n| is a number of arguments to a function with |function_id|. For each i: 0 <= permutation[i] < n. i-th element of this array contains a position for an i-th function's argument (i.e. i-th argument will be permutation[i]-th after running this transformation)
Used in:
Result id of the instruction to apply the transformation to.
A sequence of numbers in the range [0, n/2 - 1] where |n| is the number of operands of the OpPhi instruction with |result_id|.
Used in:
Id of the block to propagate an instruction from. The decision on what instruction to propagate is made based on whether the instruction interacts with memory, whether that instruction is used in its block etc (see the transformation class for more details).
A fresh id for an OpPhi instruction. This might not be used by the transformation since an OpPhi instruction is created only if needed (e.g. an instruction is propagated into divergent blocks).
A map from the id of some successor of the |block_id| to the fresh id. The map contains a fresh id for at least every successor of the |block_id|. Every fresh id in the map corresponds to the result id of the clone, propagated into the corresponding successor block. This transformation might use overflow ids if they are available and this field doesn't account for every successor of |block_id|.
Used in:
Id of the block to propagate an instruction from.
A map from the id of some predecessor of the |block_id| to the fresh id. The map contains a fresh id for at least every predecessor of the |block_id|. The instruction is propagated by creating a number of clones - one clone for each predecessor. Fresh ids from this field are used as result ids of cloned instructions.
Used in:
The value to be stored.
A fresh id for the result of the load instruction.
A fresh id for the variable to be stored to.
Constant to initialize the variable from.
The variable storage class (global or local).
A descriptor for an instruction which the new OpStore and OpLoad instructions might be inserted before.
Used in:
The id of a constant
The id of the synonym
Used in:
The fresh id of the intermediate result.
The result id of the original instruction.
Used in:
A descriptor for the boolean constant id we would like to replace
Id for the constant to be used on the LHS of the comparison
Id for the constant to be used on the RHS of the comparison
Opcode for binary operator
Id that will store the result of the binary operation instruction
Used in:
The dead block whose terminator is to be replaced.
The opcode of the new terminator.
Ignored unless opcode is OpReturnValue, in which case this field provides a suitable result id to be returned.
Used in:
A descriptor for the id we would like to replace
Uniform descriptor to identify which uniform value to choose
Id that will store the result of an access chain
Id that will store the result of a load
Used in:
The intermediate value.
The instruction descriptor to OpCopyMemory. It is necessary, because OpCopyMemory doesn't have a result id.
Used in:
The result id of initial OpCopyObject instruction
A fresh id for the variable to be stored to.
The variable storage class (Function or Private).
Constant to initialize the variable with.
Used in:
The id use that is to be replaced
The synonymous id
Used in:
The id use that is to be replaced
The replacement id
Used in:
The fresh ids needed to apply the transformation.
A descriptor for a linear algebra instruction.
A transformation that takes a pair of instruction descriptors to OpLoad and OpStore that have the same intermediate value and replaces the OpStore with an equivalent OpCopyMemory.
Used in:
The instruction descriptor to OpLoad
The instruction descriptor to OpStore
Used in:
The result id of the OpPhi instruction.
The label id of one of the predecessors of the block containing the OpPhi instruction, corresponding to the id that we want to replace.
The id that, after the transformation, will be associated with the given predecessor.
Used in:
The result id of the OpSelect instruction.
A fresh id for the new block that the predecessor of the block containing |select_id| will branch to if the condition holds.
A fresh id for the new block that the predecessor of the block containing |select_id| will branch to if the condition does not hold.
Used in:
Fresh id for a new function type. This might not be used if a required function type already exists or if we can change the old function type.
Result id of the OpFunctionParameter instruction to remove.
Fresh id of a global variable used to pass parameter's value to the function.
Used in:
Result ids of parameters to replace.
Fresh id for a new function type. This might be unused if the required type already exists in the module or if we can change the old type.
Fresh id for a new struct function parameter to be used as a replacement.
Fresh ids for struct objects containing values of replaced parameters. This field contains a fresh id for at least every result id of a relevant OpFunctionCall instruction.
Used in:
The result id of an OpFunction instruction
The value to which the 'function control' operand should be set.
Used in:
The id of a basic block that should contain OpLoopMerge
The value to which the 'loop control' operand should be set. This must be a legal loop control mask.
Provides a peel count value for the loop. Used if and only if the PeelCount bit is set. Must be zero if the PeelCount bit is not set (can still be zero if this bit is set).
Provides a partial count value for the loop. Used if and only if the PartialCount bit is set. Must be zero if the PartialCount bit is not set (can still be zero if this bit is set).
Used in:
A descriptor for a memory access instruction, e.g. an OpLoad
A mask of memory operands to be applied to the instruction. It must be the same as the original mask, except that Volatile can be added, and Nontemporal can be added or removed.
Some memory access instructions allow more than one mask to be specified; this field indicates which mask should be set
Used in:
The id of a basic block that should contain OpSelectionMerge
The value to which the 'selection control' operand should be set. Although technically 'selection control' is a literal mask that can be some combination of 'None', 'Flatten' and 'DontFlatten', the combination 'Flatten | DontFlatten' does not make sense and is not allowed here.
Used in:
A descriptor for an instruction such that the block containing the described instruction should be split right before the instruction.
An id that must not yet be used by the module to which this transformation is applied. Rather than having the transformation choose a suitable id on application, we require the id to be given upfront in order to facilitate reducing fuzzed shaders by removing transformations. The reason is that future transformations may refer to the fresh id introduced by this transformation, and if we end up changing what that id is, due to removing earlier transformations, it may inhibit later transformations from applying.
Used in:
The pointer to be stored to.
True if and only if the load should be atomic.
The memory scope for the atomic load. Ignored unless |is_atomic| is true.
The memory semantics for the atomic load. Ignored unless |is_atomic| is true.
The value to be stored.
A descriptor for an instruction in a block before which the new OpStore instruction should be inserted.
Used in:
A descriptor for a commutative instruction
Used in:
Descriptor of the instruction to swap operands of.
Fresh result id for the OpLogicalNot instruction, used to invert the guard.
A transformation that swaps function variables
Used in:
Result id of the first variable.
Result id of the second variable.
A transformation that swaps the position of two functions within the same module.
Used in:
the IDs for the two functions that are swapped.
Used in:
A descriptor for an access chain instruction
Used in:
A descriptor for an instruction in a block before which the new OpVectorShuffle instruction should be inserted
Result id for the shuffle operation.
Id of the first vector operand.
Id of the second vector operand.
Indices that indicate which components of the input vectors should be used.
Used in:
A fresh id for a new OpFunctionCall instruction.
A descriptor for an OpKill, OpUnreachable or OpTerminateInvocation instruction.
An id with the same type as the enclosing function's return type that is available at the early terminator. This is used to change the terminator to OpReturnValue. Ignored if the enclosing function has void return type, in which case OpReturn can be used as the new terminator.
Used in:
The entry block for the region R.
The exit block for the region R.
Boolean value for the condition expression.
A transformation that wraps an arithmetic operation into a vector operation and get the result of the original operation from the corresponding index. For instance, for this transformation, an scalar operation between two scalars: define op ∈ {+, -, *} c = a op b requires the availability of two vectors: va = vector(..., a, ...) vb = vector(..., b, ...) where a and b are in the same position i in each of their corresponding vector and a is synonymous with va[i] and b is synonymous with vb[i]. The transformation then add an instruction vc = va op vb where c is synonymous with vc[i].
Used in:
The result if of the original scalar operation instruction.
The result id for the first vector that contains the first value of the scalar operation.
The result id for the second vector that contains the second value of the scalar operation.
A fresh id for the resulted vector from the addition of the first and second vector.
The position in the vector where the value of original instruction is located. Must be in the corresponding vector range.
Used in:
, , , , , , , , , , ,Used in:
,The descriptor set and binding associated with a uniform variable.
An ordered sequence of indices through composite structures in the uniform buffer.