Commit 10973789 by John Kessenich

Merge branch 'dead-code' of https://github.com/dneto0/glslang into dneto0-dead-code

parents 7f77b2e8 8c3d5b4b
......@@ -1630,11 +1630,11 @@ void TGlslangToSpvTraverser::finishSpv()
for (auto it = iOSet.cbegin(); it != iOSet.cend(); ++it)
entryPoint->addIdOperand(*it);
#ifndef GLSLANG_WEB
// Add capabilities, extensions, remove unneeded decorations, etc.,
// Add capabilities, extensions, remove unneeded decorations, etc.,
// based on the resulting SPIR-V.
// Note: WebGPU code generation must have the opportunity to aggressively
// prune unreachable merge blocks and continue targets.
builder.postProcess();
#endif
}
// Write the SPV into 'out'.
......
......@@ -61,17 +61,22 @@ namespace {
// Use by calling visit() on the root block.
class ReadableOrderTraverser {
public:
explicit ReadableOrderTraverser(std::function<void(Block*)> callback) : callback_(callback) {}
ReadableOrderTraverser(std::function<void(Block*, spv::ReachReason, Block*)> callback)
: callback_(callback) {}
// Visits the block if it hasn't been visited already and isn't currently
// being delayed. Invokes callback(block), then descends into its
// being delayed. Invokes callback(block, why, header), then descends into its
// successors. Delays merge-block and continue-block processing until all
// the branches have been completed.
void visit(Block* block)
// the branches have been completed. If |block| is an unreachable merge block or
// an unreachable continue target, then |header| is the corresponding header block.
void visit(Block* block, spv::ReachReason why, Block* header)
{
assert(block);
if (why == spv::ReachViaControlFlow) {
reachableViaControlFlow_.insert(block);
}
if (visited_.count(block) || delayed_.count(block))
return;
callback_(block);
callback_(block, why, header);
visited_.insert(block);
Block* mergeBlock = nullptr;
Block* continueBlock = nullptr;
......@@ -87,27 +92,40 @@ public:
delayed_.insert(continueBlock);
}
}
const auto successors = block->getSuccessors();
for (auto it = successors.cbegin(); it != successors.cend(); ++it)
visit(*it);
if (why == spv::ReachViaControlFlow) {
const auto& successors = block->getSuccessors();
for (auto it = successors.cbegin(); it != successors.cend(); ++it)
visit(*it, why, nullptr);
}
if (continueBlock) {
const spv::ReachReason continueWhy =
(reachableViaControlFlow_.count(continueBlock) > 0)
? spv::ReachViaControlFlow
: spv::ReachDeadContinue;
delayed_.erase(continueBlock);
visit(continueBlock);
visit(continueBlock, continueWhy, block);
}
if (mergeBlock) {
const spv::ReachReason mergeWhy =
(reachableViaControlFlow_.count(mergeBlock) > 0)
? spv::ReachViaControlFlow
: spv::ReachDeadMerge;
delayed_.erase(mergeBlock);
visit(mergeBlock);
visit(mergeBlock, mergeWhy, block);
}
}
private:
std::function<void(Block*)> callback_;
std::function<void(Block*, spv::ReachReason, Block*)> callback_;
// Whether a block has already been visited or is being delayed.
std::unordered_set<Block *> visited_, delayed_;
// The set of blocks that actually are reached via control flow.
std::unordered_set<Block *> reachableViaControlFlow_;
};
}
void spv::inReadableOrder(Block* root, std::function<void(Block*)> callback)
void spv::inReadableOrder(Block* root, std::function<void(Block*, spv::ReachReason, Block*)> callback)
{
ReadableOrderTraverser(callback).visit(root);
ReadableOrderTraverser(callback).visit(root, spv::ReachViaControlFlow, nullptr);
}
......@@ -683,14 +683,12 @@ public:
// based on the type of the base and the chain of dereferences.
Id accessChainGetInferredType();
// Add capabilities, extensions, remove unneeded decorations, etc.,
// Add capabilities, extensions, remove unneeded decorations, etc.,
// based on the resulting SPIR-V.
void postProcess();
// Hook to visit each instruction in a block in a function
void postProcess(Instruction&);
// Hook to visit each instruction in a reachable block in a function.
void postProcessReachable(const Instruction&);
// Hook to visit each non-32-bit sized float/int operation in a block.
void postProcessType(const Instruction&, spv::Id typeId);
......
......@@ -39,6 +39,7 @@
#include <cassert>
#include <cstdlib>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
......@@ -319,16 +320,14 @@ void Builder::postProcess(Instruction& inst)
}
}
// Called for each instruction in a reachable block.
void Builder::postProcessReachable(const Instruction&)
{
// did have code here, but questionable to do so without deleting the instructions
}
// comment in header
void Builder::postProcess()
{
// reachableBlocks is the set of blockss reached via control flow, or which are
// unreachable continue targert or unreachable merge.
std::unordered_set<const Block*> reachableBlocks;
std::unordered_map<Block*, Block*> headerForUnreachableContinue;
std::unordered_set<Block*> unreachableMerges;
std::unordered_set<Id> unreachableDefinitions;
// Collect IDs defined in unreachable blocks. For each function, label the
// reachable blocks first. Then for each unreachable block, collect the
......@@ -336,16 +335,41 @@ void Builder::postProcess()
for (auto fi = module.getFunctions().cbegin(); fi != module.getFunctions().cend(); fi++) {
Function* f = *fi;
Block* entry = f->getEntryBlock();
inReadableOrder(entry, [&reachableBlocks](const Block* b) { reachableBlocks.insert(b); });
inReadableOrder(entry,
[&reachableBlocks, &unreachableMerges, &headerForUnreachableContinue]
(Block* b, ReachReason why, Block* header) {
reachableBlocks.insert(b);
if (why == ReachDeadContinue) headerForUnreachableContinue[b] = header;
if (why == ReachDeadMerge) unreachableMerges.insert(b);
});
for (auto bi = f->getBlocks().cbegin(); bi != f->getBlocks().cend(); bi++) {
Block* b = *bi;
if (reachableBlocks.count(b) == 0) {
for (auto ii = b->getInstructions().cbegin(); ii != b->getInstructions().cend(); ii++)
if (unreachableMerges.count(b) != 0 || headerForUnreachableContinue.count(b) != 0) {
auto ii = b->getInstructions().cbegin();
++ii; // Keep potential decorations on the label.
for (; ii != b->getInstructions().cend(); ++ii)
unreachableDefinitions.insert(ii->get()->getResultId());
} else if (reachableBlocks.count(b) == 0) {
// The normal case for unreachable code. All definitions are considered dead.
for (auto ii = b->getInstructions().cbegin(); ii != b->getInstructions().cend(); ++ii)
unreachableDefinitions.insert(ii->get()->getResultId());
}
}
}
// Modify unreachable merge blocks and unreachable continue targets.
// Delete their contents.
for (auto mergeIter = unreachableMerges.begin(); mergeIter != unreachableMerges.end(); ++mergeIter) {
(*mergeIter)->rewriteAsCanonicalUnreachableMerge();
}
for (auto continueIter = headerForUnreachableContinue.begin();
continueIter != headerForUnreachableContinue.end();
++continueIter) {
Block* continue_target = continueIter->first;
Block* header = continueIter->second;
continue_target->rewriteAsCanonicalUnreachableContinue(header);
}
// Remove unneeded decorations, for unreachable instructions
decorations.erase(std::remove_if(decorations.begin(), decorations.end(),
[&unreachableDefinitions](std::unique_ptr<Instruction>& I) -> bool {
......@@ -374,13 +398,6 @@ void Builder::postProcess()
}
}
// process all reachable instructions...
for (auto bi = reachableBlocks.cbegin(); bi != reachableBlocks.cend(); ++bi) {
const Block* block = *bi;
const auto function = [this](const std::unique_ptr<Instruction>& inst) { postProcessReachable(*inst.get()); };
std::for_each(block->getInstructions().begin(), block->getInstructions().end(), function);
}
// process all block-contained instructions
for (auto fi = module.getFunctions().cbegin(); fi != module.getFunctions().cend(); fi++) {
Function* f = *fi;
......
......@@ -226,6 +226,36 @@ public:
return nullptr;
}
// Change this block into a canonical dead merge block. Delete instructions
// as necessary. A canonical dead merge block has only an OpLabel and an
// OpUnreachable.
void rewriteAsCanonicalUnreachableMerge() {
assert(localVariables.empty());
// Delete all instructions except for the label.
assert(instructions.size() > 0);
instructions.resize(1);
successors.clear();
Instruction* unreachable = new Instruction(OpUnreachable);
addInstruction(std::unique_ptr<Instruction>(unreachable));
}
// Change this block into a canonical dead continue target branching to the
// given header ID. Delete instructions as necessary. A canonical dead continue
// target has only an OpLabel and an unconditional branch back to the corresponding
// header.
void rewriteAsCanonicalUnreachableContinue(Block* header) {
assert(localVariables.empty());
// Delete all instructions except for the label.
assert(instructions.size() > 0);
instructions.resize(1);
successors.clear();
// Add OpBranch back to the header.
assert(header != nullptr);
Instruction* branch = new Instruction(OpBranch);
branch->addIdOperand(header->getId());
addInstruction(std::move(std::unique_ptr<Instruction>(branch)));
successors.push_back(header);
}
bool isTerminated() const
{
switch (instructions.back()->getOpCode()) {
......@@ -235,6 +265,7 @@ public:
case OpKill:
case OpReturn:
case OpReturnValue:
case OpUnreachable:
return true;
default:
return false;
......@@ -268,10 +299,24 @@ protected:
bool unreachable;
};
// The different reasons for reaching a block in the inReadableOrder traversal.
typedef enum ReachReason {
// Reachable from the entry block via transfers of control, i.e. branches.
ReachViaControlFlow = 0,
// A continue target that is not reachable via control flow.
ReachDeadContinue,
// A merge block that is not reachable via control flow.
ReachDeadMerge
};
// Traverses the control-flow graph rooted at root in an order suited for
// readable code generation. Invokes callback at every node in the traversal
// order.
void inReadableOrder(Block* root, std::function<void(Block*)> callback);
// order. The callback arguments are:
// - the block,
// - the reason we reached the block,
// - if the reason was that block is an unreachable continue or unreachable merge block
// then the last parameter is the corresponding header block.
void inReadableOrder(Block* root, std::function<void(Block*, ReachReason, Block* header)> callback);
//
// SPIR-V IR Function.
......@@ -321,7 +366,7 @@ public:
parameterInstructions[p]->dump(out);
// Blocks
inReadableOrder(blocks[0], [&out](const Block* b) { b->dump(out); });
inReadableOrder(blocks[0], [&out](const Block* b, ReachReason, Block*) { b->dump(out); });
Instruction end(0, 0, OpFunctionEnd);
end.dump(out);
}
......
......@@ -988,7 +988,7 @@ void CompileAndLinkShaderUnits(std::vector<ShaderCompUnit> compUnits)
// Set base bindings
shader->setShiftBinding(res, baseBinding[res][compUnit.stage]);
// Set bindings for particular resource sets
// TODO: use a range based for loop here, when available in all environments.
for (auto i = baseBindingForSet[res][compUnit.stage].begin();
......
......@@ -240,6 +240,5 @@ Validation failed
60: 7(fvec4) CompositeConstruct 59 59 59 59
ReturnValue 60
30: Label
62: 7(fvec4) Undef
ReturnValue 62
Unreachable
FunctionEnd
......@@ -2,68 +2,95 @@ hlsl.doLoop.frag
Shader version: 500
gl_FragCoord origin is upper left
0:? Sequence
0:2 Function Definition: @PixelShaderFunction(f1; ( temp 4-component vector of float)
0:2 Function Parameters:
0:2 'input' ( in float)
0:1 Function Definition: f0( ( temp void)
0:1 Function Parameters:
0:? Sequence
0:3 Loop with condition not tested first: Unroll
0:3 Loop Condition
0:3 Constant:
0:3 false (const bool)
0:3 No loop body
0:4 Loop with condition not tested first: Unroll
0:4 Loop Condition
0:4 Constant:
0:4 false (const bool)
0:4 No loop body
0:5 Loop with condition not tested first
0:5 Loop Condition
0:5 Compare Greater Than ( temp bool)
0:5 'input' ( in float)
0:5 Constant:
0:5 2.000000
0:5 Loop Body
0:? Sequence
0:5 Branch: Return with expression
0:5 Construct vec4 ( temp 4-component vector of float)
0:5 'input' ( in float)
0:6 Loop with condition not tested first
0:2 Loop with condition not tested first: Unroll
0:2 Loop Condition
0:2 Constant:
0:2 false (const bool)
0:2 No loop body
0:5 Function Definition: f1( ( temp void)
0:5 Function Parameters:
0:? Sequence
0:6 Loop with condition not tested first: Unroll
0:6 Loop Condition
0:6 Compare Less Than ( temp bool)
0:6 'input' ( in float)
0:6 Constant:
0:6 10.000000
0:6 Loop Body
0:6 Pre-Increment ( temp float)
0:6 'input' ( in float)
0:7 Loop with condition not tested first
0:7 Loop Condition
0:7 Compare Less Than ( temp bool)
0:7 Pre-Increment ( temp float)
0:7 'input' ( in float)
0:7 Constant:
0:7 10.000000
0:7 Loop Body
0:7 Loop with condition tested first
0:7 Loop Condition
0:7 Compare Less Than ( temp bool)
0:7 Pre-Increment ( temp float)
0:7 'input' ( in float)
0:7 Constant:
0:7 10.000000
0:7 No loop body
0:8 Branch: Return with expression
0:8 Construct vec4 ( temp 4-component vector of float)
0:8 'input' ( in float)
0:2 Function Definition: PixelShaderFunction( ( temp void)
0:2 Function Parameters:
0:6 Constant:
0:6 false (const bool)
0:6 No loop body
0:9 Function Definition: f2(f1; ( temp float)
0:9 Function Parameters:
0:9 'input' ( in float)
0:? Sequence
0:10 Loop with condition not tested first
0:10 Loop Condition
0:10 Compare Greater Than ( temp bool)
0:10 'input' ( in float)
0:10 Constant:
0:10 2.000000
0:10 Loop Body
0:? Sequence
0:10 Branch: Return with expression
0:10 Construct float ( temp float)
0:10 Construct vec4 ( temp 4-component vector of float)
0:10 'input' ( in float)
0:13 Function Definition: f3(f1; ( temp void)
0:13 Function Parameters:
0:13 'input' ( in float)
0:? Sequence
0:2 move second child to first child ( temp float)
0:14 Loop with condition not tested first
0:14 Loop Condition
0:14 Compare Less Than ( temp bool)
0:14 'input' ( in float)
0:14 Constant:
0:14 10.000000
0:14 Loop Body
0:14 Pre-Increment ( temp float)
0:14 'input' ( in float)
0:17 Function Definition: f4(f1; ( temp void)
0:17 Function Parameters:
0:17 'input' ( in float)
0:? Sequence
0:18 Loop with condition not tested first
0:18 Loop Condition
0:18 Compare Less Than ( temp bool)
0:18 Pre-Increment ( temp float)
0:18 'input' ( in float)
0:18 Constant:
0:18 10.000000
0:18 Loop Body
0:18 Loop with condition tested first
0:18 Loop Condition
0:18 Compare Less Than ( temp bool)
0:18 Pre-Increment ( temp float)
0:18 'input' ( in float)
0:18 Constant:
0:18 10.000000
0:18 No loop body
0:22 Function Definition: @PixelShaderFunction(f1; ( temp 4-component vector of float)
0:22 Function Parameters:
0:22 'input' ( in float)
0:? Sequence
0:23 Function Call: f0( ( temp void)
0:24 Function Call: f1( ( temp void)
0:25 Function Call: f2(f1; ( temp float)
0:25 'input' ( in float)
0:26 Function Call: f3(f1; ( temp void)
0:26 'input' ( in float)
0:27 Function Call: f4(f1; ( temp void)
0:27 'input' ( in float)
0:28 Branch: Return with expression
0:28 Construct vec4 ( temp 4-component vector of float)
0:28 'input' ( in float)
0:22 Function Definition: PixelShaderFunction( ( temp void)
0:22 Function Parameters:
0:? Sequence
0:22 move second child to first child ( temp float)
0:? 'input' ( temp float)
0:? 'input' (layout( location=0) in float)
0:2 move second child to first child ( temp 4-component vector of float)
0:22 move second child to first child ( temp 4-component vector of float)
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
0:2 Function Call: @PixelShaderFunction(f1; ( temp 4-component vector of float)
0:22 Function Call: @PixelShaderFunction(f1; ( temp 4-component vector of float)
0:? 'input' ( temp float)
0:? Linker Objects
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
......@@ -76,68 +103,95 @@ Linked fragment stage:
Shader version: 500
gl_FragCoord origin is upper left
0:? Sequence
0:2 Function Definition: @PixelShaderFunction(f1; ( temp 4-component vector of float)
0:2 Function Parameters:
0:2 'input' ( in float)
0:1 Function Definition: f0( ( temp void)
0:1 Function Parameters:
0:? Sequence
0:3 Loop with condition not tested first: Unroll
0:3 Loop Condition
0:3 Constant:
0:3 false (const bool)
0:3 No loop body
0:4 Loop with condition not tested first: Unroll
0:4 Loop Condition
0:4 Constant:
0:4 false (const bool)
0:4 No loop body
0:5 Loop with condition not tested first
0:5 Loop Condition
0:5 Compare Greater Than ( temp bool)
0:5 'input' ( in float)
0:5 Constant:
0:5 2.000000
0:5 Loop Body
0:? Sequence
0:5 Branch: Return with expression
0:5 Construct vec4 ( temp 4-component vector of float)
0:5 'input' ( in float)
0:6 Loop with condition not tested first
0:2 Loop with condition not tested first: Unroll
0:2 Loop Condition
0:2 Constant:
0:2 false (const bool)
0:2 No loop body
0:5 Function Definition: f1( ( temp void)
0:5 Function Parameters:
0:? Sequence
0:6 Loop with condition not tested first: Unroll
0:6 Loop Condition
0:6 Compare Less Than ( temp bool)
0:6 'input' ( in float)
0:6 Constant:
0:6 10.000000
0:6 Loop Body
0:6 Pre-Increment ( temp float)
0:6 'input' ( in float)
0:7 Loop with condition not tested first
0:7 Loop Condition
0:7 Compare Less Than ( temp bool)
0:7 Pre-Increment ( temp float)
0:7 'input' ( in float)
0:7 Constant:
0:7 10.000000
0:7 Loop Body
0:7 Loop with condition tested first
0:7 Loop Condition
0:7 Compare Less Than ( temp bool)
0:7 Pre-Increment ( temp float)
0:7 'input' ( in float)
0:7 Constant:
0:7 10.000000
0:7 No loop body
0:8 Branch: Return with expression
0:8 Construct vec4 ( temp 4-component vector of float)
0:8 'input' ( in float)
0:2 Function Definition: PixelShaderFunction( ( temp void)
0:2 Function Parameters:
0:6 Constant:
0:6 false (const bool)
0:6 No loop body
0:9 Function Definition: f2(f1; ( temp float)
0:9 Function Parameters:
0:9 'input' ( in float)
0:? Sequence
0:10 Loop with condition not tested first
0:10 Loop Condition
0:10 Compare Greater Than ( temp bool)
0:10 'input' ( in float)
0:10 Constant:
0:10 2.000000
0:10 Loop Body
0:? Sequence
0:10 Branch: Return with expression
0:10 Construct float ( temp float)
0:10 Construct vec4 ( temp 4-component vector of float)
0:10 'input' ( in float)
0:13 Function Definition: f3(f1; ( temp void)
0:13 Function Parameters:
0:13 'input' ( in float)
0:? Sequence
0:14 Loop with condition not tested first
0:14 Loop Condition
0:14 Compare Less Than ( temp bool)
0:14 'input' ( in float)
0:14 Constant:
0:14 10.000000
0:14 Loop Body
0:14 Pre-Increment ( temp float)
0:14 'input' ( in float)
0:17 Function Definition: f4(f1; ( temp void)
0:17 Function Parameters:
0:17 'input' ( in float)
0:? Sequence
0:2 move second child to first child ( temp float)
0:18 Loop with condition not tested first
0:18 Loop Condition
0:18 Compare Less Than ( temp bool)
0:18 Pre-Increment ( temp float)
0:18 'input' ( in float)
0:18 Constant:
0:18 10.000000
0:18 Loop Body
0:18 Loop with condition tested first
0:18 Loop Condition
0:18 Compare Less Than ( temp bool)
0:18 Pre-Increment ( temp float)
0:18 'input' ( in float)
0:18 Constant:
0:18 10.000000
0:18 No loop body
0:22 Function Definition: @PixelShaderFunction(f1; ( temp 4-component vector of float)
0:22 Function Parameters:
0:22 'input' ( in float)
0:? Sequence
0:23 Function Call: f0( ( temp void)
0:24 Function Call: f1( ( temp void)
0:25 Function Call: f2(f1; ( temp float)
0:25 'input' ( in float)
0:26 Function Call: f3(f1; ( temp void)
0:26 'input' ( in float)
0:27 Function Call: f4(f1; ( temp void)
0:27 'input' ( in float)
0:28 Branch: Return with expression
0:28 Construct vec4 ( temp 4-component vector of float)
0:28 'input' ( in float)
0:22 Function Definition: PixelShaderFunction( ( temp void)
0:22 Function Parameters:
0:? Sequence
0:22 move second child to first child ( temp float)
0:? 'input' ( temp float)
0:? 'input' (layout( location=0) in float)
0:2 move second child to first child ( temp 4-component vector of float)
0:22 move second child to first child ( temp 4-component vector of float)
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
0:2 Function Call: @PixelShaderFunction(f1; ( temp 4-component vector of float)
0:22 Function Call: @PixelShaderFunction(f1; ( temp 4-component vector of float)
0:? 'input' ( temp float)
0:? Linker Objects
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
......@@ -145,127 +199,176 @@ gl_FragCoord origin is upper left
// Module Version 10000
// Generated by (magic number): 80007
// Id's are bound by 71
// Id's are bound by 99
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "PixelShaderFunction" 64 67
EntryPoint Fragment 4 "PixelShaderFunction" 92 95
ExecutionMode 4 OriginUpperLeft
Source HLSL 500
Name 4 "PixelShaderFunction"
Name 11 "@PixelShaderFunction(f1;"
Name 10 "input"
Name 62 "input"
Name 64 "input"
Name 67 "@entryPointOutput"
Name 68 "param"
Decorate 64(input) Location 0
Decorate 67(@entryPointOutput) Location 0
Name 6 "f0("
Name 8 "f1("
Name 14 "f2(f1;"
Name 13 "input"
Name 18 "f3(f1;"
Name 17 "input"
Name 21 "f4(f1;"
Name 20 "input"
Name 26 "@PixelShaderFunction(f1;"
Name 25 "input"
Name 77 "param"
Name 80 "param"
Name 83 "param"
Name 90 "input"
Name 92 "input"
Name 95 "@entryPointOutput"
Name 96 "param"
Decorate 92(input) Location 0
Decorate 95(@entryPointOutput) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeFloat 32
7: TypePointer Function 6(float)
8: TypeVector 6(float) 4
9: TypeFunction 8(fvec4) 7(ptr)
17: TypeBool
18: 17(bool) ConstantFalse
31: 6(float) Constant 1073741824
38: 6(float) Constant 1065353216
41: 6(float) Constant 1092616192
63: TypePointer Input 6(float)
64(input): 63(ptr) Variable Input
66: TypePointer Output 8(fvec4)
67(@entryPointOutput): 66(ptr) Variable Output
10: TypeFloat 32
11: TypePointer Function 10(float)
12: TypeFunction 10(float) 11(ptr)
16: TypeFunction 2 11(ptr)
23: TypeVector 10(float) 4
24: TypeFunction 23(fvec4) 11(ptr)
32: TypeBool
33: 32(bool) ConstantFalse
47: 10(float) Constant 1073741824
55: 10(float) Constant 1065353216
58: 10(float) Constant 1092616192
91: TypePointer Input 10(float)
92(input): 91(ptr) Variable Input
94: TypePointer Output 23(fvec4)
95(@entryPointOutput): 94(ptr) Variable Output
4(PixelShaderFunction): 2 Function None 3
5: Label
62(input): 7(ptr) Variable Function
68(param): 7(ptr) Variable Function
65: 6(float) Load 64(input)
Store 62(input) 65
69: 6(float) Load 62(input)
Store 68(param) 69
70: 8(fvec4) FunctionCall 11(@PixelShaderFunction(f1;) 68(param)
Store 67(@entryPointOutput) 70
90(input): 11(ptr) Variable Function
96(param): 11(ptr) Variable Function
93: 10(float) Load 92(input)
Store 90(input) 93
97: 10(float) Load 90(input)
Store 96(param) 97
98: 23(fvec4) FunctionCall 26(@PixelShaderFunction(f1;) 96(param)
Store 95(@entryPointOutput) 98
Return
FunctionEnd
11(@PixelShaderFunction(f1;): 8(fvec4) Function None 9
10(input): 7(ptr) FunctionParameter
12: Label
Branch 13
13: Label
LoopMerge 15 16 Unroll
Branch 14
14: Label
Branch 16
16: Label
BranchConditional 18 13 15
15: Label
Branch 19
19: Label
LoopMerge 21 22 Unroll
Branch 20
20: Label
Branch 22
22: Label
BranchConditional 18 19 21
21: Label
Branch 23
23: Label
LoopMerge 25 26 None
Branch 24
24: Label
27: 6(float) Load 10(input)
28: 8(fvec4) CompositeConstruct 27 27 27 27
ReturnValue 28
26: Label
30: 6(float) Load 10(input)
32: 17(bool) FOrdGreaterThan 30 31
BranchConditional 32 23 25
25: Label
Branch 33
33: Label
LoopMerge 35 36 None
6(f0(): 2 Function None 3
7: Label
Branch 28
28: Label
LoopMerge 30 31 Unroll
Branch 29
29: Label
Branch 31
31: Label
BranchConditional 33 28 30
30: Label
Return
FunctionEnd
8(f1(): 2 Function None 3
9: Label
Branch 34
34: Label
37: 6(float) Load 10(input)
39: 6(float) FAdd 37 38
Store 10(input) 39
Branch 36
36: Label
40: 6(float) Load 10(input)
42: 17(bool) FOrdLessThan 40 41
BranchConditional 42 33 35
LoopMerge 36 37 Unroll
Branch 35
35: Label
Branch 43
43: Label
LoopMerge 45 46 None
Branch 44
44: Label
Branch 47
47: Label
LoopMerge 49 50 None
Branch 37
37: Label
BranchConditional 33 34 36
36: Label
Return
FunctionEnd
14(f2(f1;): 10(float) Function None 12
13(input): 11(ptr) FunctionParameter
15: Label
Branch 38
38: Label
LoopMerge 40 41 None
Branch 39
39: Label
42: 10(float) Load 13(input)
43: 23(fvec4) CompositeConstruct 42 42 42 42
44: 10(float) CompositeExtract 43 0
ReturnValue 44
41: Label
Branch 38
40: Label
Unreachable
FunctionEnd
18(f3(f1;): 2 Function None 16
17(input): 11(ptr) FunctionParameter
19: Label
Branch 50
50: Label
LoopMerge 52 53 None
Branch 51
51: Label
52: 6(float) Load 10(input)
53: 6(float) FAdd 52 38
Store 10(input) 53
54: 17(bool) FOrdLessThan 53 41
BranchConditional 54 48 49
48: Label
Branch 50
50: Label
Branch 47
49: Label
Branch 46
46: Label
55: 6(float) Load 10(input)
56: 6(float) FAdd 55 38
Store 10(input) 56
57: 17(bool) FOrdLessThan 56 41
BranchConditional 57 43 45
45: Label
58: 6(float) Load 10(input)
59: 8(fvec4) CompositeConstruct 58 58 58 58
ReturnValue 59
54: 10(float) Load 17(input)
56: 10(float) FAdd 54 55
Store 17(input) 56
Branch 53
53: Label
57: 10(float) Load 17(input)
59: 32(bool) FOrdLessThan 57 58
BranchConditional 59 50 52
52: Label
Return
FunctionEnd
21(f4(f1;): 2 Function None 16
20(input): 11(ptr) FunctionParameter
22: Label
Branch 60
60: Label
LoopMerge 62 63 None
Branch 61
61: Label
Branch 64
64: Label
LoopMerge 66 67 None
Branch 68
68: Label
69: 10(float) Load 20(input)
70: 10(float) FAdd 69 55
Store 20(input) 70
71: 32(bool) FOrdLessThan 70 58
BranchConditional 71 65 66
65: Label
Branch 67
67: Label
Branch 64
66: Label
Branch 63
63: Label
72: 10(float) Load 20(input)
73: 10(float) FAdd 72 55
Store 20(input) 73
74: 32(bool) FOrdLessThan 73 58
BranchConditional 74 60 62
62: Label
Return
FunctionEnd
26(@PixelShaderFunction(f1;): 23(fvec4) Function None 24
25(input): 11(ptr) FunctionParameter
27: Label
77(param): 11(ptr) Variable Function
80(param): 11(ptr) Variable Function
83(param): 11(ptr) Variable Function
75: 2 FunctionCall 6(f0()
76: 2 FunctionCall 8(f1()
78: 10(float) Load 25(input)
Store 77(param) 78
79: 10(float) FunctionCall 14(f2(f1;) 77(param)
81: 10(float) Load 25(input)
Store 80(param) 81
82: 2 FunctionCall 18(f3(f1;) 80(param)
84: 10(float) Load 25(input)
Store 83(param) 84
85: 2 FunctionCall 21(f4(f1;) 83(param)
86: 10(float) Load 25(input)
87: 23(fvec4) CompositeConstruct 86 86 86 86
ReturnValue 87
FunctionEnd
......@@ -2,197 +2,251 @@ hlsl.forLoop.frag
Shader version: 500
gl_FragCoord origin is upper left
0:? Sequence
0:2 Function Definition: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
0:2 Function Parameters:
0:2 'input' ( in 4-component vector of float)
0:1 Function Definition: f0( ( temp void)
0:1 Function Parameters:
0:? Sequence
0:? Sequence
0:3 Loop with condition tested first
0:3 No loop condition
0:3 No loop body
0:4 Sequence
0:4 Pre-Increment ( temp 4-component vector of float)
0:4 'input' ( in 4-component vector of float)
0:4 Loop with condition tested first
0:4 No loop condition
0:4 No loop body
0:2 Loop with condition tested first
0:2 No loop condition
0:2 No loop body
0:5 Function Definition: f1(vf4; ( temp void)
0:5 Function Parameters:
0:5 'input' ( in 4-component vector of float)
0:? Sequence
0:6 Sequence
0:6 Pre-Increment ( temp 4-component vector of float)
0:6 'input' ( in 4-component vector of float)
0:6 Loop with condition tested first
0:6 No loop condition
0:6 No loop body
0:9 Function Definition: f2(vf4; ( temp void)
0:9 Function Parameters:
0:9 'input' ( in 4-component vector of float)
0:? Sequence
0:? Sequence
0:5 Loop with condition tested first: Unroll
0:5 Loop Condition
0:5 any ( temp bool)
0:5 NotEqual ( temp 4-component vector of bool)
0:5 'input' ( in 4-component vector of float)
0:5 'input' ( in 4-component vector of float)
0:5 No loop body
0:10 Loop with condition tested first: Unroll
0:10 Loop Condition
0:10 any ( temp bool)
0:10 NotEqual ( temp 4-component vector of bool)
0:10 'input' ( in 4-component vector of float)
0:10 'input' ( in 4-component vector of float)
0:10 No loop body
0:13 Function Definition: f3(vf4; ( temp float)
0:13 Function Parameters:
0:13 'input' ( in 4-component vector of float)
0:? Sequence
0:? Sequence
0:6 Loop with condition tested first
0:6 Loop Condition
0:6 any ( temp bool)
0:6 NotEqual ( temp 4-component vector of bool)
0:6 'input' ( in 4-component vector of float)
0:6 'input' ( in 4-component vector of float)
0:6 Loop Body
0:14 Loop with condition tested first
0:14 Loop Condition
0:14 any ( temp bool)
0:14 NotEqual ( temp 4-component vector of bool)
0:14 'input' ( in 4-component vector of float)
0:14 'input' ( in 4-component vector of float)
0:14 Loop Body
0:? Sequence
0:6 Branch: Return with expression
0:6 Negate value ( temp 4-component vector of float)
0:6 'input' ( in 4-component vector of float)
0:7 Sequence
0:7 Pre-Decrement ( temp 4-component vector of float)
0:7 'input' ( in 4-component vector of float)
0:7 Loop with condition tested first
0:7 Loop Condition
0:7 any ( temp bool)
0:7 NotEqual ( temp 4-component vector of bool)
0:7 'input' ( in 4-component vector of float)
0:7 'input' ( in 4-component vector of float)
0:7 Loop Body
0:14 Branch: Return with expression
0:14 Construct float ( temp float)
0:14 Negate value ( temp 4-component vector of float)
0:14 'input' ( in 4-component vector of float)
0:17 Function Definition: f4(vf4; ( temp float)
0:17 Function Parameters:
0:17 'input' ( in 4-component vector of float)
0:? Sequence
0:18 Sequence
0:18 Pre-Decrement ( temp 4-component vector of float)
0:18 'input' ( in 4-component vector of float)
0:18 Loop with condition tested first
0:18 Loop Condition
0:18 any ( temp bool)
0:18 NotEqual ( temp 4-component vector of bool)
0:18 'input' ( in 4-component vector of float)
0:18 'input' ( in 4-component vector of float)
0:18 Loop Body
0:? Sequence
0:7 Branch: Return with expression
0:7 Negate value ( temp 4-component vector of float)
0:7 'input' ( in 4-component vector of float)
0:7 Loop Terminal Expression
0:7 add second child into first child ( temp 4-component vector of float)
0:7 'input' ( in 4-component vector of float)
0:7 Constant:
0:7 2.000000
0:18 Branch: Return with expression
0:18 Construct float ( temp float)
0:18 Negate value ( temp 4-component vector of float)
0:18 'input' ( in 4-component vector of float)
0:18 Loop Terminal Expression
0:18 add second child into first child ( temp 4-component vector of float)
0:18 'input' ( in 4-component vector of float)
0:18 Constant:
0:18 2.000000
0:21 Function Definition: f5(vf4; ( temp void)
0:21 Function Parameters:
0:21 'input' ( in 4-component vector of float)
0:? Sequence
0:? Sequence
0:8 Loop with condition tested first
0:8 No loop condition
0:8 Loop Body
0:8 Test condition and select ( temp void)
0:8 Condition
0:8 Compare Greater Than ( temp bool)
0:8 direct index ( temp float)
0:8 'input' ( in 4-component vector of float)
0:8 Constant:
0:8 0 (const int)
0:8 Constant:
0:8 2.000000
0:8 true case
0:8 Branch: Break
0:22 Loop with condition tested first
0:22 No loop condition
0:22 Loop Body
0:22 Test condition and select ( temp void)
0:22 Condition
0:22 Compare Greater Than ( temp bool)
0:22 direct index ( temp float)
0:22 'input' ( in 4-component vector of float)
0:22 Constant:
0:22 0 (const int)
0:22 Constant:
0:22 2.000000
0:22 true case
0:22 Branch: Break
0:25 Function Definition: f6(vf4; ( temp void)
0:25 Function Parameters:
0:25 'input' ( in 4-component vector of float)
0:? Sequence
0:? Sequence
0:9 Loop with condition tested first
0:9 No loop condition
0:9 Loop Body
0:9 Test condition and select ( temp void)
0:9 Condition
0:9 Compare Greater Than ( temp bool)
0:9 direct index ( temp float)
0:9 'input' ( in 4-component vector of float)
0:9 Constant:
0:9 0 (const int)
0:9 Constant:
0:9 2.000000
0:9 true case
0:9 Branch: Continue
0:11 Sequence
0:11 move second child to first child ( temp int)
0:11 'ii' ( temp int)
0:11 Constant:
0:11 -1 (const int)
0:11 Loop with condition tested first
0:11 Loop Condition
0:11 Compare Less Than ( temp bool)
0:11 'ii' ( temp int)
0:11 Constant:
0:11 3 (const int)
0:11 Loop Body
0:11 Test condition and select ( temp void)
0:11 Condition
0:11 Compare Equal ( temp bool)
0:11 'ii' ( temp int)
0:11 Constant:
0:11 2 (const int)
0:11 true case
0:11 Branch: Continue
0:11 Loop Terminal Expression
0:11 Pre-Increment ( temp int)
0:11 'ii' ( temp int)
0:12 Pre-Decrement ( temp float)
0:12 'ii' ( temp float)
0:13 Sequence
0:13 move second child to first child ( temp int)
0:13 'first' ( temp int)
0:13 Constant:
0:13 0 (const int)
0:13 move second child to first child ( temp int)
0:13 'second' ( temp int)
0:13 Constant:
0:13 1 (const int)
0:13 Loop with condition tested first
0:13 No loop condition
0:13 Loop Body
0:13 add ( temp int)
0:13 'first' ( temp int)
0:13 'second' ( temp int)
0:14 Sequence
0:14 move second child to first child ( temp int)
0:14 'i' ( temp int)
0:14 Constant:
0:14 0 (const int)
0:14 move second child to first child ( temp int)
0:14 'count' ( temp int)
0:14 Convert float to int ( temp int)
0:14 'ii' ( temp float)
0:14 Loop with condition tested first
0:14 Loop Condition
0:14 Compare Less Than ( temp bool)
0:14 'i' ( temp int)
0:14 'count' ( temp int)
0:14 No loop body
0:14 Loop Terminal Expression
0:14 Post-Increment ( temp int)
0:14 'i' ( temp int)
0:15 Sequence
0:15 move second child to first child ( temp float)
0:15 'first' ( temp float)
0:15 Constant:
0:15 0.000000
0:15 Loop with condition tested first
0:15 Loop Condition
0:15 Compare Less Than ( temp bool)
0:15 'first' ( temp float)
0:15 direct index ( temp float)
0:15 'second' ( temp 2-element array of float)
0:15 Constant:
0:15 0 (const int)
0:15 Loop Body
0:15 add ( temp float)
0:15 add ( temp float)
0:15 'first' ( temp float)
0:15 direct index ( temp float)
0:15 'second' ( temp 2-element array of float)
0:15 Constant:
0:15 1 (const int)
0:15 'third' ( temp float)
0:15 Loop Terminal Expression
0:15 Pre-Increment ( temp float)
0:15 direct index ( temp float)
0:15 'second' ( temp 2-element array of float)
0:15 Constant:
0:15 1 (const int)
0:26 Loop with condition tested first
0:26 No loop condition
0:26 Loop Body
0:26 Test condition and select ( temp void)
0:26 Condition
0:26 Compare Greater Than ( temp bool)
0:26 direct index ( temp float)
0:26 'input' ( in 4-component vector of float)
0:26 Constant:
0:26 0 (const int)
0:26 Constant:
0:26 2.000000
0:26 true case
0:26 Branch: Continue
0:29 Function Definition: f99( ( temp void)
0:29 Function Parameters:
0:? Sequence
0:30 Sequence
0:30 move second child to first child ( temp int)
0:30 'first' ( temp int)
0:30 Constant:
0:30 0 (const int)
0:30 move second child to first child ( temp int)
0:30 'second' ( temp int)
0:30 Constant:
0:30 1 (const int)
0:30 Loop with condition tested first
0:30 No loop condition
0:30 Loop Body
0:30 add ( temp int)
0:30 'first' ( temp int)
0:30 'second' ( temp int)
0:33 Function Definition: f100(f1; ( temp void)
0:33 Function Parameters:
0:33 'ii' ( in float)
0:? Sequence
0:? Sequence
0:16 Comma ( temp float)
0:16 Comma ( temp float)
0:16 Pre-Decrement ( temp float)
0:16 'ii' ( temp float)
0:16 Pre-Decrement ( temp float)
0:16 'ii' ( temp float)
0:16 Pre-Decrement ( temp float)
0:16 'ii' ( temp float)
0:16 Loop with condition tested first
0:16 No loop condition
0:16 Loop Body
0:16 'ii' ( temp float)
0:2 Function Definition: PixelShaderFunction( ( temp void)
0:2 Function Parameters:
0:34 Comma ( temp float)
0:34 Comma ( temp float)
0:34 Pre-Decrement ( temp float)
0:34 'ii' ( in float)
0:34 Pre-Decrement ( temp float)
0:34 'ii' ( in float)
0:34 Pre-Decrement ( temp float)
0:34 'ii' ( in float)
0:34 Loop with condition tested first
0:34 No loop condition
0:34 Loop Body
0:34 'ii' ( in float)
0:38 Function Definition: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
0:38 Function Parameters:
0:38 'input' ( in 4-component vector of float)
0:? Sequence
0:39 Function Call: f0( ( temp void)
0:40 Function Call: f1(vf4; ( temp void)
0:40 'input' ( in 4-component vector of float)
0:41 Function Call: f2(vf4; ( temp void)
0:41 'input' ( in 4-component vector of float)
0:42 Function Call: f3(vf4; ( temp float)
0:42 'input' ( in 4-component vector of float)
0:43 Function Call: f4(vf4; ( temp float)
0:43 'input' ( in 4-component vector of float)
0:44 Function Call: f5(vf4; ( temp void)
0:44 'input' ( in 4-component vector of float)
0:45 Function Call: f6(vf4; ( temp void)
0:45 'input' ( in 4-component vector of float)
0:48 Sequence
0:48 move second child to first child ( temp int)
0:48 'ii' ( temp int)
0:48 Constant:
0:48 -1 (const int)
0:48 Loop with condition tested first
0:48 Loop Condition
0:48 Compare Less Than ( temp bool)
0:48 'ii' ( temp int)
0:48 Constant:
0:48 3 (const int)
0:48 Loop Body
0:48 Test condition and select ( temp void)
0:48 Condition
0:48 Compare Equal ( temp bool)
0:48 'ii' ( temp int)
0:48 Constant:
0:48 2 (const int)
0:48 true case
0:48 Branch: Continue
0:48 Loop Terminal Expression
0:48 Pre-Increment ( temp int)
0:48 'ii' ( temp int)
0:49 Pre-Decrement ( temp float)
0:49 'ii' ( temp float)
0:51 Function Call: f99( ( temp void)
0:53 Sequence
0:53 move second child to first child ( temp int)
0:53 'i' ( temp int)
0:53 Constant:
0:53 0 (const int)
0:53 move second child to first child ( temp int)
0:53 'count' ( temp int)
0:53 Convert float to int ( temp int)
0:53 'ii' ( temp float)
0:53 Loop with condition tested first
0:53 Loop Condition
0:53 Compare Less Than ( temp bool)
0:53 'i' ( temp int)
0:53 'count' ( temp int)
0:53 No loop body
0:53 Loop Terminal Expression
0:53 Post-Increment ( temp int)
0:53 'i' ( temp int)
0:54 Sequence
0:54 move second child to first child ( temp float)
0:54 'first' ( temp float)
0:54 Constant:
0:54 0.000000
0:54 Loop with condition tested first
0:54 Loop Condition
0:54 Compare Less Than ( temp bool)
0:54 'first' ( temp float)
0:54 direct index ( temp float)
0:54 'second' ( temp 2-element array of float)
0:54 Constant:
0:54 0 (const int)
0:54 Loop Body
0:54 add ( temp float)
0:54 add ( temp float)
0:54 'first' ( temp float)
0:54 direct index ( temp float)
0:54 'second' ( temp 2-element array of float)
0:54 Constant:
0:54 1 (const int)
0:54 'third' ( temp float)
0:54 Loop Terminal Expression
0:54 Pre-Increment ( temp float)
0:54 direct index ( temp float)
0:54 'second' ( temp 2-element array of float)
0:54 Constant:
0:54 1 (const int)
0:56 Function Call: f100(f1; ( temp void)
0:56 'ii' ( temp float)
0:58 Branch: Return with expression
0:58 'input' ( in 4-component vector of float)
0:38 Function Definition: PixelShaderFunction( ( temp void)
0:38 Function Parameters:
0:? Sequence
0:2 move second child to first child ( temp 4-component vector of float)
0:38 move second child to first child ( temp 4-component vector of float)
0:? 'input' ( temp 4-component vector of float)
0:? 'input' (layout( location=0) in 4-component vector of float)
0:2 move second child to first child ( temp 4-component vector of float)
0:38 move second child to first child ( temp 4-component vector of float)
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
0:2 Function Call: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
0:38 Function Call: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
0:? 'input' ( temp 4-component vector of float)
0:? Linker Objects
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
......@@ -205,197 +259,251 @@ Linked fragment stage:
Shader version: 500
gl_FragCoord origin is upper left
0:? Sequence
0:2 Function Definition: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
0:2 Function Parameters:
0:2 'input' ( in 4-component vector of float)
0:1 Function Definition: f0( ( temp void)
0:1 Function Parameters:
0:? Sequence
0:? Sequence
0:3 Loop with condition tested first
0:3 No loop condition
0:3 No loop body
0:4 Sequence
0:4 Pre-Increment ( temp 4-component vector of float)
0:4 'input' ( in 4-component vector of float)
0:4 Loop with condition tested first
0:4 No loop condition
0:4 No loop body
0:2 Loop with condition tested first
0:2 No loop condition
0:2 No loop body
0:5 Function Definition: f1(vf4; ( temp void)
0:5 Function Parameters:
0:5 'input' ( in 4-component vector of float)
0:? Sequence
0:6 Sequence
0:6 Pre-Increment ( temp 4-component vector of float)
0:6 'input' ( in 4-component vector of float)
0:6 Loop with condition tested first
0:6 No loop condition
0:6 No loop body
0:9 Function Definition: f2(vf4; ( temp void)
0:9 Function Parameters:
0:9 'input' ( in 4-component vector of float)
0:? Sequence
0:? Sequence
0:5 Loop with condition tested first: Unroll
0:5 Loop Condition
0:5 any ( temp bool)
0:5 NotEqual ( temp 4-component vector of bool)
0:5 'input' ( in 4-component vector of float)
0:5 'input' ( in 4-component vector of float)
0:5 No loop body
0:10 Loop with condition tested first: Unroll
0:10 Loop Condition
0:10 any ( temp bool)
0:10 NotEqual ( temp 4-component vector of bool)
0:10 'input' ( in 4-component vector of float)
0:10 'input' ( in 4-component vector of float)
0:10 No loop body
0:13 Function Definition: f3(vf4; ( temp float)
0:13 Function Parameters:
0:13 'input' ( in 4-component vector of float)
0:? Sequence
0:? Sequence
0:6 Loop with condition tested first
0:6 Loop Condition
0:6 any ( temp bool)
0:6 NotEqual ( temp 4-component vector of bool)
0:6 'input' ( in 4-component vector of float)
0:6 'input' ( in 4-component vector of float)
0:6 Loop Body
0:14 Loop with condition tested first
0:14 Loop Condition
0:14 any ( temp bool)
0:14 NotEqual ( temp 4-component vector of bool)
0:14 'input' ( in 4-component vector of float)
0:14 'input' ( in 4-component vector of float)
0:14 Loop Body
0:? Sequence
0:6 Branch: Return with expression
0:6 Negate value ( temp 4-component vector of float)
0:6 'input' ( in 4-component vector of float)
0:7 Sequence
0:7 Pre-Decrement ( temp 4-component vector of float)
0:7 'input' ( in 4-component vector of float)
0:7 Loop with condition tested first
0:7 Loop Condition
0:7 any ( temp bool)
0:7 NotEqual ( temp 4-component vector of bool)
0:7 'input' ( in 4-component vector of float)
0:7 'input' ( in 4-component vector of float)
0:7 Loop Body
0:14 Branch: Return with expression
0:14 Construct float ( temp float)
0:14 Negate value ( temp 4-component vector of float)
0:14 'input' ( in 4-component vector of float)
0:17 Function Definition: f4(vf4; ( temp float)
0:17 Function Parameters:
0:17 'input' ( in 4-component vector of float)
0:? Sequence
0:18 Sequence
0:18 Pre-Decrement ( temp 4-component vector of float)
0:18 'input' ( in 4-component vector of float)
0:18 Loop with condition tested first
0:18 Loop Condition
0:18 any ( temp bool)
0:18 NotEqual ( temp 4-component vector of bool)
0:18 'input' ( in 4-component vector of float)
0:18 'input' ( in 4-component vector of float)
0:18 Loop Body
0:? Sequence
0:7 Branch: Return with expression
0:7 Negate value ( temp 4-component vector of float)
0:7 'input' ( in 4-component vector of float)
0:7 Loop Terminal Expression
0:7 add second child into first child ( temp 4-component vector of float)
0:7 'input' ( in 4-component vector of float)
0:7 Constant:
0:7 2.000000
0:18 Branch: Return with expression
0:18 Construct float ( temp float)
0:18 Negate value ( temp 4-component vector of float)
0:18 'input' ( in 4-component vector of float)
0:18 Loop Terminal Expression
0:18 add second child into first child ( temp 4-component vector of float)
0:18 'input' ( in 4-component vector of float)
0:18 Constant:
0:18 2.000000
0:21 Function Definition: f5(vf4; ( temp void)
0:21 Function Parameters:
0:21 'input' ( in 4-component vector of float)
0:? Sequence
0:? Sequence
0:8 Loop with condition tested first
0:8 No loop condition
0:8 Loop Body
0:8 Test condition and select ( temp void)
0:8 Condition
0:8 Compare Greater Than ( temp bool)
0:8 direct index ( temp float)
0:8 'input' ( in 4-component vector of float)
0:8 Constant:
0:8 0 (const int)
0:8 Constant:
0:8 2.000000
0:8 true case
0:8 Branch: Break
0:22 Loop with condition tested first
0:22 No loop condition
0:22 Loop Body
0:22 Test condition and select ( temp void)
0:22 Condition
0:22 Compare Greater Than ( temp bool)
0:22 direct index ( temp float)
0:22 'input' ( in 4-component vector of float)
0:22 Constant:
0:22 0 (const int)
0:22 Constant:
0:22 2.000000
0:22 true case
0:22 Branch: Break
0:25 Function Definition: f6(vf4; ( temp void)
0:25 Function Parameters:
0:25 'input' ( in 4-component vector of float)
0:? Sequence
0:? Sequence
0:9 Loop with condition tested first
0:9 No loop condition
0:9 Loop Body
0:9 Test condition and select ( temp void)
0:9 Condition
0:9 Compare Greater Than ( temp bool)
0:9 direct index ( temp float)
0:9 'input' ( in 4-component vector of float)
0:9 Constant:
0:9 0 (const int)
0:9 Constant:
0:9 2.000000
0:9 true case
0:9 Branch: Continue
0:11 Sequence
0:11 move second child to first child ( temp int)
0:11 'ii' ( temp int)
0:11 Constant:
0:11 -1 (const int)
0:11 Loop with condition tested first
0:11 Loop Condition
0:11 Compare Less Than ( temp bool)
0:11 'ii' ( temp int)
0:11 Constant:
0:11 3 (const int)
0:11 Loop Body
0:11 Test condition and select ( temp void)
0:11 Condition
0:11 Compare Equal ( temp bool)
0:11 'ii' ( temp int)
0:11 Constant:
0:11 2 (const int)
0:11 true case
0:11 Branch: Continue
0:11 Loop Terminal Expression
0:11 Pre-Increment ( temp int)
0:11 'ii' ( temp int)
0:12 Pre-Decrement ( temp float)
0:12 'ii' ( temp float)
0:13 Sequence
0:13 move second child to first child ( temp int)
0:13 'first' ( temp int)
0:13 Constant:
0:13 0 (const int)
0:13 move second child to first child ( temp int)
0:13 'second' ( temp int)
0:13 Constant:
0:13 1 (const int)
0:13 Loop with condition tested first
0:13 No loop condition
0:13 Loop Body
0:13 add ( temp int)
0:13 'first' ( temp int)
0:13 'second' ( temp int)
0:14 Sequence
0:14 move second child to first child ( temp int)
0:14 'i' ( temp int)
0:14 Constant:
0:14 0 (const int)
0:14 move second child to first child ( temp int)
0:14 'count' ( temp int)
0:14 Convert float to int ( temp int)
0:14 'ii' ( temp float)
0:14 Loop with condition tested first
0:14 Loop Condition
0:14 Compare Less Than ( temp bool)
0:14 'i' ( temp int)
0:14 'count' ( temp int)
0:14 No loop body
0:14 Loop Terminal Expression
0:14 Post-Increment ( temp int)
0:14 'i' ( temp int)
0:15 Sequence
0:15 move second child to first child ( temp float)
0:15 'first' ( temp float)
0:15 Constant:
0:15 0.000000
0:15 Loop with condition tested first
0:15 Loop Condition
0:15 Compare Less Than ( temp bool)
0:15 'first' ( temp float)
0:15 direct index ( temp float)
0:15 'second' ( temp 2-element array of float)
0:15 Constant:
0:15 0 (const int)
0:15 Loop Body
0:15 add ( temp float)
0:15 add ( temp float)
0:15 'first' ( temp float)
0:15 direct index ( temp float)
0:15 'second' ( temp 2-element array of float)
0:15 Constant:
0:15 1 (const int)
0:15 'third' ( temp float)
0:15 Loop Terminal Expression
0:15 Pre-Increment ( temp float)
0:15 direct index ( temp float)
0:15 'second' ( temp 2-element array of float)
0:15 Constant:
0:15 1 (const int)
0:26 Loop with condition tested first
0:26 No loop condition
0:26 Loop Body
0:26 Test condition and select ( temp void)
0:26 Condition
0:26 Compare Greater Than ( temp bool)
0:26 direct index ( temp float)
0:26 'input' ( in 4-component vector of float)
0:26 Constant:
0:26 0 (const int)
0:26 Constant:
0:26 2.000000
0:26 true case
0:26 Branch: Continue
0:29 Function Definition: f99( ( temp void)
0:29 Function Parameters:
0:? Sequence
0:30 Sequence
0:30 move second child to first child ( temp int)
0:30 'first' ( temp int)
0:30 Constant:
0:30 0 (const int)
0:30 move second child to first child ( temp int)
0:30 'second' ( temp int)
0:30 Constant:
0:30 1 (const int)
0:30 Loop with condition tested first
0:30 No loop condition
0:30 Loop Body
0:30 add ( temp int)
0:30 'first' ( temp int)
0:30 'second' ( temp int)
0:33 Function Definition: f100(f1; ( temp void)
0:33 Function Parameters:
0:33 'ii' ( in float)
0:? Sequence
0:? Sequence
0:16 Comma ( temp float)
0:16 Comma ( temp float)
0:16 Pre-Decrement ( temp float)
0:16 'ii' ( temp float)
0:16 Pre-Decrement ( temp float)
0:16 'ii' ( temp float)
0:16 Pre-Decrement ( temp float)
0:16 'ii' ( temp float)
0:16 Loop with condition tested first
0:16 No loop condition
0:16 Loop Body
0:16 'ii' ( temp float)
0:2 Function Definition: PixelShaderFunction( ( temp void)
0:2 Function Parameters:
0:34 Comma ( temp float)
0:34 Comma ( temp float)
0:34 Pre-Decrement ( temp float)
0:34 'ii' ( in float)
0:34 Pre-Decrement ( temp float)
0:34 'ii' ( in float)
0:34 Pre-Decrement ( temp float)
0:34 'ii' ( in float)
0:34 Loop with condition tested first
0:34 No loop condition
0:34 Loop Body
0:34 'ii' ( in float)
0:38 Function Definition: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
0:38 Function Parameters:
0:38 'input' ( in 4-component vector of float)
0:? Sequence
0:39 Function Call: f0( ( temp void)
0:40 Function Call: f1(vf4; ( temp void)
0:40 'input' ( in 4-component vector of float)
0:41 Function Call: f2(vf4; ( temp void)
0:41 'input' ( in 4-component vector of float)
0:42 Function Call: f3(vf4; ( temp float)
0:42 'input' ( in 4-component vector of float)
0:43 Function Call: f4(vf4; ( temp float)
0:43 'input' ( in 4-component vector of float)
0:44 Function Call: f5(vf4; ( temp void)
0:44 'input' ( in 4-component vector of float)
0:45 Function Call: f6(vf4; ( temp void)
0:45 'input' ( in 4-component vector of float)
0:48 Sequence
0:48 move second child to first child ( temp int)
0:48 'ii' ( temp int)
0:48 Constant:
0:48 -1 (const int)
0:48 Loop with condition tested first
0:48 Loop Condition
0:48 Compare Less Than ( temp bool)
0:48 'ii' ( temp int)
0:48 Constant:
0:48 3 (const int)
0:48 Loop Body
0:48 Test condition and select ( temp void)
0:48 Condition
0:48 Compare Equal ( temp bool)
0:48 'ii' ( temp int)
0:48 Constant:
0:48 2 (const int)
0:48 true case
0:48 Branch: Continue
0:48 Loop Terminal Expression
0:48 Pre-Increment ( temp int)
0:48 'ii' ( temp int)
0:49 Pre-Decrement ( temp float)
0:49 'ii' ( temp float)
0:51 Function Call: f99( ( temp void)
0:53 Sequence
0:53 move second child to first child ( temp int)
0:53 'i' ( temp int)
0:53 Constant:
0:53 0 (const int)
0:53 move second child to first child ( temp int)
0:53 'count' ( temp int)
0:53 Convert float to int ( temp int)
0:53 'ii' ( temp float)
0:53 Loop with condition tested first
0:53 Loop Condition
0:53 Compare Less Than ( temp bool)
0:53 'i' ( temp int)
0:53 'count' ( temp int)
0:53 No loop body
0:53 Loop Terminal Expression
0:53 Post-Increment ( temp int)
0:53 'i' ( temp int)
0:54 Sequence
0:54 move second child to first child ( temp float)
0:54 'first' ( temp float)
0:54 Constant:
0:54 0.000000
0:54 Loop with condition tested first
0:54 Loop Condition
0:54 Compare Less Than ( temp bool)
0:54 'first' ( temp float)
0:54 direct index ( temp float)
0:54 'second' ( temp 2-element array of float)
0:54 Constant:
0:54 0 (const int)
0:54 Loop Body
0:54 add ( temp float)
0:54 add ( temp float)
0:54 'first' ( temp float)
0:54 direct index ( temp float)
0:54 'second' ( temp 2-element array of float)
0:54 Constant:
0:54 1 (const int)
0:54 'third' ( temp float)
0:54 Loop Terminal Expression
0:54 Pre-Increment ( temp float)
0:54 direct index ( temp float)
0:54 'second' ( temp 2-element array of float)
0:54 Constant:
0:54 1 (const int)
0:56 Function Call: f100(f1; ( temp void)
0:56 'ii' ( temp float)
0:58 Branch: Return with expression
0:58 'input' ( in 4-component vector of float)
0:38 Function Definition: PixelShaderFunction( ( temp void)
0:38 Function Parameters:
0:? Sequence
0:2 move second child to first child ( temp 4-component vector of float)
0:38 move second child to first child ( temp 4-component vector of float)
0:? 'input' ( temp 4-component vector of float)
0:? 'input' (layout( location=0) in 4-component vector of float)
0:2 move second child to first child ( temp 4-component vector of float)
0:38 move second child to first child ( temp 4-component vector of float)
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
0:2 Function Call: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
0:38 Function Call: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
0:? 'input' ( temp 4-component vector of float)
0:? Linker Objects
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
......@@ -403,303 +511,402 @@ gl_FragCoord origin is upper left
// Module Version 10000
// Generated by (magic number): 80007
// Id's are bound by 183
// Id's are bound by 240
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "PixelShaderFunction" 176 179
EntryPoint Fragment 4 "PixelShaderFunction" 233 236
ExecutionMode 4 OriginUpperLeft
Source HLSL 500
Name 4 "PixelShaderFunction"
Name 11 "@PixelShaderFunction(vf4;"
Name 10 "input"
Name 92 "ii"
Name 111 "ii"
Name 114 "first"
Name 116 "second"
Name 124 "i"
Name 125 "count"
Name 138 "first"
Name 149 "second"
Name 157 "third"
Name 174 "input"
Name 176 "input"
Name 179 "@entryPointOutput"
Name 180 "param"
Decorate 176(input) Location 0
Decorate 179(@entryPointOutput) Location 0
Name 6 "f0("
Name 13 "f1(vf4;"
Name 12 "input"
Name 16 "f2(vf4;"
Name 15 "input"
Name 20 "f3(vf4;"
Name 19 "input"
Name 23 "f4(vf4;"
Name 22 "input"
Name 26 "f5(vf4;"
Name 25 "input"
Name 29 "f6(vf4;"
Name 28 "input"
Name 31 "f99("
Name 36 "f100(f1;"
Name 35 "ii"
Name 40 "@PixelShaderFunction(vf4;"
Name 39 "input"
Name 124 "first"
Name 126 "second"
Name 146 "param"
Name 149 "param"
Name 152 "param"
Name 155 "param"
Name 158 "param"
Name 161 "param"
Name 164 "ii"
Name 182 "ii"
Name 186 "i"
Name 187 "count"
Name 200 "first"
Name 211 "second"
Name 219 "third"
Name 225 "param"
Name 231 "input"
Name 233 "input"
Name 236 "@entryPointOutput"
Name 237 "param"
Decorate 233(input) Location 0
Decorate 236(@entryPointOutput) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeFloat 32
7: TypeVector 6(float) 4
8: TypePointer Function 7(fvec4)
9: TypeFunction 7(fvec4) 8(ptr)
18: 6(float) Constant 1065353216
32: TypeBool
33: TypeVector 32(bool) 4
63: 6(float) Constant 1073741824
71: TypeInt 32 0
72: 71(int) Constant 0
73: TypePointer Function 6(float)
90: TypeInt 32 1
91: TypePointer Function 90(int)
93: 90(int) Constant 4294967295
100: 90(int) Constant 3
103: 90(int) Constant 2
109: 90(int) Constant 1
115: 90(int) Constant 0
139: 6(float) Constant 0
146: 71(int) Constant 2
147: TypeArray 6(float) 146
148: TypePointer Function 147
175: TypePointer Input 7(fvec4)
176(input): 175(ptr) Variable Input
178: TypePointer Output 7(fvec4)
179(@entryPointOutput): 178(ptr) Variable Output
8: TypeFloat 32
9: TypeVector 8(float) 4
10: TypePointer Function 9(fvec4)
11: TypeFunction 2 10(ptr)
18: TypeFunction 8(float) 10(ptr)
33: TypePointer Function 8(float)
34: TypeFunction 2 33(ptr)
38: TypeFunction 9(fvec4) 10(ptr)
47: 8(float) Constant 1065353216
61: TypeBool
62: TypeVector 61(bool) 4
95: 8(float) Constant 1073741824
104: TypeInt 32 0
105: 104(int) Constant 0
122: TypeInt 32 1
123: TypePointer Function 122(int)
125: 122(int) Constant 0
127: 122(int) Constant 1
165: 122(int) Constant 4294967295
172: 122(int) Constant 3
175: 122(int) Constant 2
201: 8(float) Constant 0
208: 104(int) Constant 2
209: TypeArray 8(float) 208
210: TypePointer Function 209
232: TypePointer Input 9(fvec4)
233(input): 232(ptr) Variable Input
235: TypePointer Output 9(fvec4)
236(@entryPointOutput): 235(ptr) Variable Output
4(PixelShaderFunction): 2 Function None 3
5: Label
174(input): 8(ptr) Variable Function
180(param): 8(ptr) Variable Function
177: 7(fvec4) Load 176(input)
Store 174(input) 177
181: 7(fvec4) Load 174(input)
Store 180(param) 181
182: 7(fvec4) FunctionCall 11(@PixelShaderFunction(vf4;) 180(param)
Store 179(@entryPointOutput) 182
231(input): 10(ptr) Variable Function
237(param): 10(ptr) Variable Function
234: 9(fvec4) Load 233(input)
Store 231(input) 234
238: 9(fvec4) Load 231(input)
Store 237(param) 238
239: 9(fvec4) FunctionCall 40(@PixelShaderFunction(vf4;) 237(param)
Store 236(@entryPointOutput) 239
Return
FunctionEnd
11(@PixelShaderFunction(vf4;): 7(fvec4) Function None 9
10(input): 8(ptr) FunctionParameter
12: Label
92(ii): 91(ptr) Variable Function
111(ii): 73(ptr) Variable Function
114(first): 91(ptr) Variable Function
116(second): 91(ptr) Variable Function
124(i): 91(ptr) Variable Function
125(count): 91(ptr) Variable Function
138(first): 73(ptr) Variable Function
149(second): 148(ptr) Variable Function
157(third): 73(ptr) Variable Function
Branch 13
13: Label
LoopMerge 15 16 None
Branch 14
6(f0(): 2 Function None 3
7: Label
Branch 42
42: Label
LoopMerge 44 45 None
Branch 43
43: Label
Branch 45
45: Label
Branch 42
44: Label
Unreachable
FunctionEnd
13(f1(vf4;): 2 Function None 11
12(input): 10(ptr) FunctionParameter
14: Label
Branch 16
16: Label
Branch 13
15: Label
17: 7(fvec4) Load 10(input)
19: 7(fvec4) CompositeConstruct 18 18 18 18
20: 7(fvec4) FAdd 17 19
Store 10(input) 20
Branch 21
21: Label
LoopMerge 23 24 None
Branch 22
22: Label
Branch 24
24: Label
Branch 21
23: Label
Branch 25
25: Label
LoopMerge 27 28 Unroll
Branch 29
29: Label
30: 7(fvec4) Load 10(input)
31: 7(fvec4) Load 10(input)
34: 33(bvec4) FOrdNotEqual 30 31
35: 32(bool) Any 34
BranchConditional 35 26 27
26: Label
Branch 28
28: Label
Branch 25
27: Label
Branch 36
36: Label
LoopMerge 38 39 None
Branch 40
40: Label
41: 7(fvec4) Load 10(input)
42: 7(fvec4) Load 10(input)
43: 33(bvec4) FOrdNotEqual 41 42
44: 32(bool) Any 43
BranchConditional 44 37 38
37: Label
45: 7(fvec4) Load 10(input)
46: 7(fvec4) FNegate 45
ReturnValue 46
39: Label
Branch 36
38: Label
48: 7(fvec4) Load 10(input)
49: 7(fvec4) CompositeConstruct 18 18 18 18
50: 7(fvec4) FSub 48 49
Store 10(input) 50
46: 9(fvec4) Load 12(input)
48: 9(fvec4) CompositeConstruct 47 47 47 47
49: 9(fvec4) FAdd 46 48
Store 12(input) 49
Branch 50
50: Label
LoopMerge 52 53 None
Branch 51
51: Label
LoopMerge 53 54 None
Branch 55
55: Label
56: 7(fvec4) Load 10(input)
57: 7(fvec4) Load 10(input)
58: 33(bvec4) FOrdNotEqual 56 57
59: 32(bool) Any 58
BranchConditional 59 52 53
52: Label
60: 7(fvec4) Load 10(input)
61: 7(fvec4) FNegate 60
ReturnValue 61
54: Label
64: 7(fvec4) Load 10(input)
65: 7(fvec4) CompositeConstruct 63 63 63 63
66: 7(fvec4) FAdd 64 65
Store 10(input) 66
Branch 51
Branch 53
53: Label
Branch 67
67: Label
LoopMerge 69 70 None
Branch 68
68: Label
74: 73(ptr) AccessChain 10(input) 72
75: 6(float) Load 74
76: 32(bool) FOrdGreaterThan 75 63
SelectionMerge 78 None
BranchConditional 76 77 78
77: Label
Branch 69
78: Label
Branch 70
70: Label
Branch 67
Branch 50
52: Label
Unreachable
FunctionEnd
16(f2(vf4;): 2 Function None 11
15(input): 10(ptr) FunctionParameter
17: Label
Branch 54
54: Label
LoopMerge 56 57 Unroll
Branch 58
58: Label
59: 9(fvec4) Load 15(input)
60: 9(fvec4) Load 15(input)
63: 62(bvec4) FOrdNotEqual 59 60
64: 61(bool) Any 63
BranchConditional 64 55 56
55: Label
Branch 57
57: Label
Branch 54
56: Label
Return
FunctionEnd
20(f3(vf4;): 8(float) Function None 18
19(input): 10(ptr) FunctionParameter
21: Label
Branch 65
65: Label
LoopMerge 67 68 None
Branch 69
69: Label
Branch 80
80: Label
LoopMerge 82 83 None
Branch 81
81: Label
84: 73(ptr) AccessChain 10(input) 72
85: 6(float) Load 84
86: 32(bool) FOrdGreaterThan 85 63
SelectionMerge 88 None
BranchConditional 86 87 88
87: Label
Branch 83
88: Label
Branch 83
83: Label
Branch 80
70: 9(fvec4) Load 19(input)
71: 9(fvec4) Load 19(input)
72: 62(bvec4) FOrdNotEqual 70 71
73: 61(bool) Any 72
BranchConditional 73 66 67
66: Label
74: 9(fvec4) Load 19(input)
75: 9(fvec4) FNegate 74
76: 8(float) CompositeExtract 75 0
ReturnValue 76
68: Label
Branch 65
67: Label
78: 8(float) Undef
ReturnValue 78
FunctionEnd
23(f4(vf4;): 8(float) Function None 18
22(input): 10(ptr) FunctionParameter
24: Label
79: 9(fvec4) Load 22(input)
80: 9(fvec4) CompositeConstruct 47 47 47 47
81: 9(fvec4) FSub 79 80
Store 22(input) 81
Branch 82
82: Label
Store 92(ii) 93
Branch 94
94: Label
LoopMerge 96 97 None
Branch 98
98: Label
99: 90(int) Load 92(ii)
101: 32(bool) SLessThan 99 100
BranchConditional 101 95 96
95: Label
102: 90(int) Load 92(ii)
104: 32(bool) IEqual 102 103
SelectionMerge 106 None
BranchConditional 104 105 106
105: Label
Branch 97
106: Label
Branch 97
97: Label
108: 90(int) Load 92(ii)
110: 90(int) IAdd 108 109
Store 92(ii) 110
Branch 94
96: Label
112: 6(float) Load 111(ii)
113: 6(float) FSub 112 18
Store 111(ii) 113
Store 114(first) 115
Store 116(second) 109
Branch 117
117: Label
LoopMerge 119 120 None
Branch 118
118: Label
121: 90(int) Load 114(first)
122: 90(int) Load 116(second)
123: 90(int) IAdd 121 122
Branch 120
LoopMerge 84 85 None
Branch 86
86: Label
87: 9(fvec4) Load 22(input)
88: 9(fvec4) Load 22(input)
89: 62(bvec4) FOrdNotEqual 87 88
90: 61(bool) Any 89
BranchConditional 90 83 84
83: Label
91: 9(fvec4) Load 22(input)
92: 9(fvec4) FNegate 91
93: 8(float) CompositeExtract 92 0
ReturnValue 93
85: Label
Branch 82
84: Label
99: 8(float) Undef
ReturnValue 99
FunctionEnd
26(f5(vf4;): 2 Function None 11
25(input): 10(ptr) FunctionParameter
27: Label
Branch 100
100: Label
LoopMerge 102 103 None
Branch 101
101: Label
106: 33(ptr) AccessChain 25(input) 105
107: 8(float) Load 106
108: 61(bool) FOrdGreaterThan 107 95
SelectionMerge 110 None
BranchConditional 108 109 110
109: Label
Branch 102
110: Label
Branch 103
103: Label
Branch 100
102: Label
Return
FunctionEnd
29(f6(vf4;): 2 Function None 11
28(input): 10(ptr) FunctionParameter
30: Label
Branch 112
112: Label
LoopMerge 114 115 None
Branch 113
113: Label
116: 33(ptr) AccessChain 28(input) 105
117: 8(float) Load 116
118: 61(bool) FOrdGreaterThan 117 95
SelectionMerge 120 None
BranchConditional 118 119 120
119: Label
Branch 115
120: Label
Branch 117
119: Label
Store 124(i) 115
126: 6(float) Load 111(ii)
127: 90(int) ConvertFToS 126
Store 125(count) 127
Branch 115
115: Label
Branch 112
114: Label
Unreachable
FunctionEnd
31(f99(): 2 Function None 3
32: Label
124(first): 123(ptr) Variable Function
126(second): 123(ptr) Variable Function
Store 124(first) 125
Store 126(second) 127
Branch 128
128: Label
LoopMerge 130 131 None
Branch 132
132: Label
133: 90(int) Load 124(i)
134: 90(int) Load 125(count)
135: 32(bool) SLessThan 133 134
BranchConditional 135 129 130
129: Label
Branch 131
131: Label
136: 90(int) Load 124(i)
137: 90(int) IAdd 136 109
Store 124(i) 137
Branch 128
Branch 129
129: Label
132: 122(int) Load 124(first)
133: 122(int) Load 126(second)
134: 122(int) IAdd 132 133
Branch 131
131: Label
Branch 128
130: Label
Store 138(first) 139
Branch 140
140: Label
LoopMerge 142 143 None
Unreachable
FunctionEnd
36(f100(f1;): 2 Function None 34
35(ii): 33(ptr) FunctionParameter
37: Label
135: 8(float) Load 35(ii)
136: 8(float) FSub 135 47
Store 35(ii) 136
137: 8(float) Load 35(ii)
138: 8(float) FSub 137 47
Store 35(ii) 138
139: 8(float) Load 35(ii)
140: 8(float) FSub 139 47
Store 35(ii) 140
Branch 141
141: Label
LoopMerge 143 144 None
Branch 142
142: Label
Branch 144
144: Label
145: 6(float) Load 138(first)
150: 73(ptr) AccessChain 149(second) 115
151: 6(float) Load 150
152: 32(bool) FOrdLessThan 145 151
BranchConditional 152 141 142
141: Label
153: 6(float) Load 138(first)
154: 73(ptr) AccessChain 149(second) 109
155: 6(float) Load 154
156: 6(float) FAdd 153 155
158: 6(float) Load 157(third)
159: 6(float) FAdd 156 158
Branch 143
143: Label
160: 73(ptr) AccessChain 149(second) 109
161: 6(float) Load 160
162: 6(float) FAdd 161 18
Store 160 162
Branch 140
142: Label
163: 6(float) Load 111(ii)
164: 6(float) FSub 163 18
Store 111(ii) 164
165: 6(float) Load 111(ii)
166: 6(float) FSub 165 18
Store 111(ii) 166
167: 6(float) Load 111(ii)
168: 6(float) FSub 167 18
Store 111(ii) 168
Branch 169
169: Label
LoopMerge 171 172 None
Branch 141
143: Label
Unreachable
FunctionEnd
40(@PixelShaderFunction(vf4;): 9(fvec4) Function None 38
39(input): 10(ptr) FunctionParameter
41: Label
146(param): 10(ptr) Variable Function
149(param): 10(ptr) Variable Function
152(param): 10(ptr) Variable Function
155(param): 10(ptr) Variable Function
158(param): 10(ptr) Variable Function
161(param): 10(ptr) Variable Function
164(ii): 123(ptr) Variable Function
182(ii): 33(ptr) Variable Function
186(i): 123(ptr) Variable Function
187(count): 123(ptr) Variable Function
200(first): 33(ptr) Variable Function
211(second): 210(ptr) Variable Function
219(third): 33(ptr) Variable Function
225(param): 33(ptr) Variable Function
145: 2 FunctionCall 6(f0()
147: 9(fvec4) Load 39(input)
Store 146(param) 147
148: 2 FunctionCall 13(f1(vf4;) 146(param)
150: 9(fvec4) Load 39(input)
Store 149(param) 150
151: 2 FunctionCall 16(f2(vf4;) 149(param)
153: 9(fvec4) Load 39(input)
Store 152(param) 153
154: 8(float) FunctionCall 20(f3(vf4;) 152(param)
156: 9(fvec4) Load 39(input)
Store 155(param) 156
157: 8(float) FunctionCall 23(f4(vf4;) 155(param)
159: 9(fvec4) Load 39(input)
Store 158(param) 159
160: 2 FunctionCall 26(f5(vf4;) 158(param)
162: 9(fvec4) Load 39(input)
Store 161(param) 162
163: 2 FunctionCall 29(f6(vf4;) 161(param)
Store 164(ii) 165
Branch 166
166: Label
LoopMerge 168 169 None
Branch 170
170: Label
Branch 172
172: Label
Branch 169
171: Label
173: 7(fvec4) Undef
ReturnValue 173
171: 122(int) Load 164(ii)
173: 61(bool) SLessThan 171 172
BranchConditional 173 167 168
167: Label
174: 122(int) Load 164(ii)
176: 61(bool) IEqual 174 175
SelectionMerge 178 None
BranchConditional 176 177 178
177: Label
Branch 169
178: Label
Branch 169
169: Label
180: 122(int) Load 164(ii)
181: 122(int) IAdd 180 127
Store 164(ii) 181
Branch 166
168: Label
183: 8(float) Load 182(ii)
184: 8(float) FSub 183 47
Store 182(ii) 184
185: 2 FunctionCall 31(f99()
Store 186(i) 125
188: 8(float) Load 182(ii)
189: 122(int) ConvertFToS 188
Store 187(count) 189
Branch 190
190: Label
LoopMerge 192 193 None
Branch 194
194: Label
195: 122(int) Load 186(i)
196: 122(int) Load 187(count)
197: 61(bool) SLessThan 195 196
BranchConditional 197 191 192
191: Label
Branch 193
193: Label
198: 122(int) Load 186(i)
199: 122(int) IAdd 198 127
Store 186(i) 199
Branch 190
192: Label
Store 200(first) 201
Branch 202
202: Label
LoopMerge 204 205 None
Branch 206
206: Label
207: 8(float) Load 200(first)
212: 33(ptr) AccessChain 211(second) 125
213: 8(float) Load 212
214: 61(bool) FOrdLessThan 207 213
BranchConditional 214 203 204
203: Label
215: 8(float) Load 200(first)
216: 33(ptr) AccessChain 211(second) 127
217: 8(float) Load 216
218: 8(float) FAdd 215 217
220: 8(float) Load 219(third)
221: 8(float) FAdd 218 220
Branch 205
205: Label
222: 33(ptr) AccessChain 211(second) 127
223: 8(float) Load 222
224: 8(float) FAdd 223 47
Store 222 224
Branch 202
204: Label
226: 8(float) Load 182(ii)
Store 225(param) 226
227: 2 FunctionCall 36(f100(f1;) 225(param)
228: 9(fvec4) Load 39(input)
ReturnValue 228
FunctionEnd
......@@ -2,104 +2,116 @@ hlsl.if.frag
Shader version: 500
gl_FragCoord origin is upper left
0:? Sequence
0:2 Function Definition: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
0:2 Function Parameters:
0:2 'input' ( in 4-component vector of float)
0:1 Function Definition: f0(vf4; ( temp 4-component vector of float)
0:1 Function Parameters:
0:1 'input' ( in 4-component vector of float)
0:? Sequence
0:3 Test condition and select ( temp void)
0:3 Condition
0:3 all ( temp bool)
0:3 Equal ( temp 4-component vector of bool)
0:3 'input' ( in 4-component vector of float)
0:3 'input' ( in 4-component vector of float)
0:3 true case
0:4 Branch: Return with expression
0:4 'input' ( in 4-component vector of float)
0:6 Test condition and select ( temp void)
0:6 Condition
0:6 all ( temp bool)
0:6 Equal ( temp 4-component vector of bool)
0:6 'input' ( in 4-component vector of float)
0:6 'input' ( in 4-component vector of float)
0:6 true case
0:7 Branch: Return with expression
0:7 'input' ( in 4-component vector of float)
0:6 false case
0:9 Branch: Return with expression
0:9 Negate value ( temp 4-component vector of float)
0:2 Test condition and select ( temp void)
0:2 Condition
0:2 all ( temp bool)
0:2 Equal ( temp 4-component vector of bool)
0:2 'input' ( in 4-component vector of float)
0:2 'input' ( in 4-component vector of float)
0:2 true case
0:3 Branch: Return with expression
0:3 'input' ( in 4-component vector of float)
0:2 false case
0:5 Branch: Return with expression
0:5 Negate value ( temp 4-component vector of float)
0:5 'input' ( in 4-component vector of float)
0:8 Function Definition: f1(vf4; ( temp 4-component vector of float)
0:8 Function Parameters:
0:8 'input' ( in 4-component vector of float)
0:? Sequence
0:9 Test condition and select ( temp void)
0:9 Condition
0:9 all ( temp bool)
0:9 Equal ( temp 4-component vector of bool)
0:9 'input' ( in 4-component vector of float)
0:9 'input' ( in 4-component vector of float)
0:11 Test condition and select ( temp void)
0:11 Condition
0:11 all ( temp bool)
0:11 Equal ( temp 4-component vector of bool)
0:11 'input' ( in 4-component vector of float)
0:11 'input' ( in 4-component vector of float)
0:11 true case is null
0:14 Test condition and select ( temp void)
0:14 Condition
0:14 all ( temp bool)
0:14 Equal ( temp 4-component vector of bool)
0:14 'input' ( in 4-component vector of float)
0:14 'input' ( in 4-component vector of float)
0:14 true case is null
0:19 Test condition and select ( temp void): Flatten
0:19 Condition
0:19 all ( temp bool)
0:19 Equal ( temp 4-component vector of bool)
0:19 'input' ( in 4-component vector of float)
0:19 'input' ( in 4-component vector of float)
0:19 true case
0:9 true case
0:? Sequence
0:10 Branch: Return with expression
0:10 'input' ( in 4-component vector of float)
0:9 false case
0:? Sequence
0:20 Branch: Return with expression
0:20 'input' ( in 4-component vector of float)
0:12 Branch: Return with expression
0:12 Negate value ( temp 4-component vector of float)
0:12 'input' ( in 4-component vector of float)
0:17 Function Definition: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
0:17 Function Parameters:
0:17 'input' ( in 4-component vector of float)
0:? Sequence
0:18 Test condition and select ( temp void)
0:18 Condition
0:18 all ( temp bool)
0:18 Equal ( temp 4-component vector of bool)
0:18 'input' ( in 4-component vector of float)
0:18 'input' ( in 4-component vector of float)
0:18 true case
0:19 Branch: Return with expression
0:19 'input' ( in 4-component vector of float)
0:21 Function Call: f0(vf4; ( temp 4-component vector of float)
0:21 'input' ( in 4-component vector of float)
0:23 Test condition and select ( temp void)
0:23 Condition
0:23 all ( temp bool)
0:23 Equal ( temp 4-component vector of bool)
0:23 'input' ( in 4-component vector of float)
0:23 'input' ( in 4-component vector of float)
0:23 true case
0:? Sequence
0:24 Branch: Return with expression
0:24 'input' ( in 4-component vector of float)
0:23 false case
0:23 true case is null
0:26 Test condition and select ( temp void)
0:26 Condition
0:26 all ( temp bool)
0:26 Equal ( temp 4-component vector of bool)
0:26 'input' ( in 4-component vector of float)
0:26 'input' ( in 4-component vector of float)
0:26 true case is null
0:31 Test condition and select ( temp void): Flatten
0:31 Condition
0:31 all ( temp bool)
0:31 Equal ( temp 4-component vector of bool)
0:31 'input' ( in 4-component vector of float)
0:31 'input' ( in 4-component vector of float)
0:31 true case
0:? Sequence
0:26 Branch: Return with expression
0:26 Negate value ( temp 4-component vector of float)
0:26 'input' ( in 4-component vector of float)
0:30 Test condition and select ( temp void)
0:30 Condition
0:30 Convert float to bool ( temp bool)
0:30 move second child to first child ( temp float)
0:30 'ii' ( temp float)
0:30 direct index ( temp float)
0:30 'input' ( in 4-component vector of float)
0:30 Constant:
0:30 2 (const int)
0:30 true case
0:31 Pre-Increment ( temp float)
0:31 'ii' ( temp float)
0:32 Pre-Increment ( temp int)
0:32 'ii' ( temp int)
0:33 Test condition and select ( temp void)
0:33 Condition
0:33 Compare Equal ( temp bool)
0:33 Convert int to float ( temp float)
0:33 'ii' ( temp int)
0:33 Constant:
0:33 1.000000
0:33 true case
0:34 Pre-Increment ( temp int)
0:34 'ii' ( temp int)
0:2 Function Definition: PixelShaderFunction( ( temp void)
0:2 Function Parameters:
0:32 Branch: Return with expression
0:32 'input' ( in 4-component vector of float)
0:35 Function Call: f1(vf4; ( temp 4-component vector of float)
0:35 'input' ( in 4-component vector of float)
0:38 Test condition and select ( temp void)
0:38 Condition
0:38 Convert float to bool ( temp bool)
0:38 move second child to first child ( temp float)
0:38 'ii' ( temp float)
0:38 direct index ( temp float)
0:38 'input' ( in 4-component vector of float)
0:38 Constant:
0:38 2 (const int)
0:38 true case
0:39 Pre-Increment ( temp float)
0:39 'ii' ( temp float)
0:40 Pre-Increment ( temp int)
0:40 'ii' ( temp int)
0:41 Test condition and select ( temp void)
0:41 Condition
0:41 Compare Equal ( temp bool)
0:41 Convert int to float ( temp float)
0:41 'ii' ( temp int)
0:41 Constant:
0:41 1.000000
0:41 true case
0:42 Pre-Increment ( temp int)
0:42 'ii' ( temp int)
0:17 Function Definition: PixelShaderFunction( ( temp void)
0:17 Function Parameters:
0:? Sequence
0:2 move second child to first child ( temp 4-component vector of float)
0:17 move second child to first child ( temp 4-component vector of float)
0:? 'input' ( temp 4-component vector of float)
0:? 'input' (layout( location=0) in 4-component vector of float)
0:2 move second child to first child ( temp 4-component vector of float)
0:17 move second child to first child ( temp 4-component vector of float)
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
0:2 Function Call: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
0:17 Function Call: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
0:? 'input' ( temp 4-component vector of float)
0:? Linker Objects
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
......@@ -112,104 +124,116 @@ Linked fragment stage:
Shader version: 500
gl_FragCoord origin is upper left
0:? Sequence
0:2 Function Definition: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
0:2 Function Parameters:
0:2 'input' ( in 4-component vector of float)
0:1 Function Definition: f0(vf4; ( temp 4-component vector of float)
0:1 Function Parameters:
0:1 'input' ( in 4-component vector of float)
0:? Sequence
0:2 Test condition and select ( temp void)
0:2 Condition
0:2 all ( temp bool)
0:2 Equal ( temp 4-component vector of bool)
0:2 'input' ( in 4-component vector of float)
0:2 'input' ( in 4-component vector of float)
0:2 true case
0:3 Branch: Return with expression
0:3 'input' ( in 4-component vector of float)
0:2 false case
0:5 Branch: Return with expression
0:5 Negate value ( temp 4-component vector of float)
0:5 'input' ( in 4-component vector of float)
0:8 Function Definition: f1(vf4; ( temp 4-component vector of float)
0:8 Function Parameters:
0:8 'input' ( in 4-component vector of float)
0:? Sequence
0:3 Test condition and select ( temp void)
0:3 Condition
0:3 all ( temp bool)
0:3 Equal ( temp 4-component vector of bool)
0:3 'input' ( in 4-component vector of float)
0:3 'input' ( in 4-component vector of float)
0:3 true case
0:4 Branch: Return with expression
0:4 'input' ( in 4-component vector of float)
0:6 Test condition and select ( temp void)
0:6 Condition
0:6 all ( temp bool)
0:6 Equal ( temp 4-component vector of bool)
0:6 'input' ( in 4-component vector of float)
0:6 'input' ( in 4-component vector of float)
0:6 true case
0:7 Branch: Return with expression
0:7 'input' ( in 4-component vector of float)
0:6 false case
0:9 Branch: Return with expression
0:9 Negate value ( temp 4-component vector of float)
0:9 Test condition and select ( temp void)
0:9 Condition
0:9 all ( temp bool)
0:9 Equal ( temp 4-component vector of bool)
0:9 'input' ( in 4-component vector of float)
0:11 Test condition and select ( temp void)
0:11 Condition
0:11 all ( temp bool)
0:11 Equal ( temp 4-component vector of bool)
0:11 'input' ( in 4-component vector of float)
0:11 'input' ( in 4-component vector of float)
0:11 true case is null
0:14 Test condition and select ( temp void)
0:14 Condition
0:14 all ( temp bool)
0:14 Equal ( temp 4-component vector of bool)
0:14 'input' ( in 4-component vector of float)
0:14 'input' ( in 4-component vector of float)
0:14 true case is null
0:19 Test condition and select ( temp void): Flatten
0:19 Condition
0:19 all ( temp bool)
0:19 Equal ( temp 4-component vector of bool)
0:19 'input' ( in 4-component vector of float)
0:19 'input' ( in 4-component vector of float)
0:19 true case
0:9 'input' ( in 4-component vector of float)
0:9 true case
0:? Sequence
0:10 Branch: Return with expression
0:10 'input' ( in 4-component vector of float)
0:9 false case
0:? Sequence
0:20 Branch: Return with expression
0:20 'input' ( in 4-component vector of float)
0:12 Branch: Return with expression
0:12 Negate value ( temp 4-component vector of float)
0:12 'input' ( in 4-component vector of float)
0:17 Function Definition: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
0:17 Function Parameters:
0:17 'input' ( in 4-component vector of float)
0:? Sequence
0:18 Test condition and select ( temp void)
0:18 Condition
0:18 all ( temp bool)
0:18 Equal ( temp 4-component vector of bool)
0:18 'input' ( in 4-component vector of float)
0:18 'input' ( in 4-component vector of float)
0:18 true case
0:19 Branch: Return with expression
0:19 'input' ( in 4-component vector of float)
0:21 Function Call: f0(vf4; ( temp 4-component vector of float)
0:21 'input' ( in 4-component vector of float)
0:23 Test condition and select ( temp void)
0:23 Condition
0:23 all ( temp bool)
0:23 Equal ( temp 4-component vector of bool)
0:23 'input' ( in 4-component vector of float)
0:23 'input' ( in 4-component vector of float)
0:23 true case
0:23 true case is null
0:26 Test condition and select ( temp void)
0:26 Condition
0:26 all ( temp bool)
0:26 Equal ( temp 4-component vector of bool)
0:26 'input' ( in 4-component vector of float)
0:26 'input' ( in 4-component vector of float)
0:26 true case is null
0:31 Test condition and select ( temp void): Flatten
0:31 Condition
0:31 all ( temp bool)
0:31 Equal ( temp 4-component vector of bool)
0:31 'input' ( in 4-component vector of float)
0:31 'input' ( in 4-component vector of float)
0:31 true case
0:? Sequence
0:24 Branch: Return with expression
0:24 'input' ( in 4-component vector of float)
0:23 false case
0:? Sequence
0:26 Branch: Return with expression
0:26 Negate value ( temp 4-component vector of float)
0:26 'input' ( in 4-component vector of float)
0:30 Test condition and select ( temp void)
0:30 Condition
0:30 Convert float to bool ( temp bool)
0:30 move second child to first child ( temp float)
0:30 'ii' ( temp float)
0:30 direct index ( temp float)
0:30 'input' ( in 4-component vector of float)
0:30 Constant:
0:30 2 (const int)
0:30 true case
0:31 Pre-Increment ( temp float)
0:31 'ii' ( temp float)
0:32 Pre-Increment ( temp int)
0:32 'ii' ( temp int)
0:33 Test condition and select ( temp void)
0:33 Condition
0:33 Compare Equal ( temp bool)
0:33 Convert int to float ( temp float)
0:33 'ii' ( temp int)
0:33 Constant:
0:33 1.000000
0:33 true case
0:34 Pre-Increment ( temp int)
0:34 'ii' ( temp int)
0:2 Function Definition: PixelShaderFunction( ( temp void)
0:2 Function Parameters:
0:32 Branch: Return with expression
0:32 'input' ( in 4-component vector of float)
0:35 Function Call: f1(vf4; ( temp 4-component vector of float)
0:35 'input' ( in 4-component vector of float)
0:38 Test condition and select ( temp void)
0:38 Condition
0:38 Convert float to bool ( temp bool)
0:38 move second child to first child ( temp float)
0:38 'ii' ( temp float)
0:38 direct index ( temp float)
0:38 'input' ( in 4-component vector of float)
0:38 Constant:
0:38 2 (const int)
0:38 true case
0:39 Pre-Increment ( temp float)
0:39 'ii' ( temp float)
0:40 Pre-Increment ( temp int)
0:40 'ii' ( temp int)
0:41 Test condition and select ( temp void)
0:41 Condition
0:41 Compare Equal ( temp bool)
0:41 Convert int to float ( temp float)
0:41 'ii' ( temp int)
0:41 Constant:
0:41 1.000000
0:41 true case
0:42 Pre-Increment ( temp int)
0:42 'ii' ( temp int)
0:17 Function Definition: PixelShaderFunction( ( temp void)
0:17 Function Parameters:
0:? Sequence
0:2 move second child to first child ( temp 4-component vector of float)
0:17 move second child to first child ( temp 4-component vector of float)
0:? 'input' ( temp 4-component vector of float)
0:? 'input' (layout( location=0) in 4-component vector of float)
0:2 move second child to first child ( temp 4-component vector of float)
0:17 move second child to first child ( temp 4-component vector of float)
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
0:2 Function Call: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
0:17 Function Call: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
0:? 'input' ( temp 4-component vector of float)
0:? Linker Objects
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
......@@ -217,154 +241,178 @@ gl_FragCoord origin is upper left
// Module Version 10000
// Generated by (magic number): 80007
// Id's are bound by 103
// Id's are bound by 117
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "PixelShaderFunction" 96 99
EntryPoint Fragment 4 "PixelShaderFunction" 110 113
ExecutionMode 4 OriginUpperLeft
Source HLSL 500
Name 4 "PixelShaderFunction"
Name 11 "@PixelShaderFunction(vf4;"
Name 11 "f0(vf4;"
Name 10 "input"
Name 68 "ii"
Name 14 "f1(vf4;"
Name 13 "input"
Name 17 "@PixelShaderFunction(vf4;"
Name 16 "input"
Name 55 "param"
Name 78 "param"
Name 82 "ii"
Name 94 "input"
Name 96 "input"
Name 99 "@entryPointOutput"
Name 100 "param"
Decorate 96(input) Location 0
Decorate 99(@entryPointOutput) Location 0
Name 96 "ii"
Name 108 "input"
Name 110 "input"
Name 113 "@entryPointOutput"
Name 114 "param"
Decorate 110(input) Location 0
Decorate 113(@entryPointOutput) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeFloat 32
7: TypeVector 6(float) 4
8: TypePointer Function 7(fvec4)
9: TypeFunction 7(fvec4) 8(ptr)
15: TypeBool
16: TypeVector 15(bool) 4
67: TypePointer Function 6(float)
69: TypeInt 32 0
70: 69(int) Constant 2
73: 6(float) Constant 0
78: 6(float) Constant 1065353216
80: TypeInt 32 1
81: TypePointer Function 80(int)
84: 80(int) Constant 1
95: TypePointer Input 7(fvec4)
96(input): 95(ptr) Variable Input
98: TypePointer Output 7(fvec4)
99(@entryPointOutput): 98(ptr) Variable Output
21: TypeBool
22: TypeVector 21(bool) 4
81: TypePointer Function 6(float)
83: TypeInt 32 0
84: 83(int) Constant 2
87: 6(float) Constant 0
92: 6(float) Constant 1065353216
94: TypeInt 32 1
95: TypePointer Function 94(int)
98: 94(int) Constant 1
109: TypePointer Input 7(fvec4)
110(input): 109(ptr) Variable Input
112: TypePointer Output 7(fvec4)
113(@entryPointOutput): 112(ptr) Variable Output
4(PixelShaderFunction): 2 Function None 3
5: Label
94(input): 8(ptr) Variable Function
100(param): 8(ptr) Variable Function
97: 7(fvec4) Load 96(input)
Store 94(input) 97
101: 7(fvec4) Load 94(input)
Store 100(param) 101
102: 7(fvec4) FunctionCall 11(@PixelShaderFunction(vf4;) 100(param)
Store 99(@entryPointOutput) 102
108(input): 8(ptr) Variable Function
114(param): 8(ptr) Variable Function
111: 7(fvec4) Load 110(input)
Store 108(input) 111
115: 7(fvec4) Load 108(input)
Store 114(param) 115
116: 7(fvec4) FunctionCall 17(@PixelShaderFunction(vf4;) 114(param)
Store 113(@entryPointOutput) 116
Return
FunctionEnd
11(@PixelShaderFunction(vf4;): 7(fvec4) Function None 9
11(f0(vf4;): 7(fvec4) Function None 9
10(input): 8(ptr) FunctionParameter
12: Label
68(ii): 67(ptr) Variable Function
19: 7(fvec4) Load 10(input)
20: 7(fvec4) Load 10(input)
23: 22(bvec4) FOrdEqual 19 20
24: 21(bool) All 23
SelectionMerge 26 None
BranchConditional 24 25 29
25: Label
27: 7(fvec4) Load 10(input)
ReturnValue 27
29: Label
30: 7(fvec4) Load 10(input)
31: 7(fvec4) FNegate 30
ReturnValue 31
26: Label
Unreachable
FunctionEnd
14(f1(vf4;): 7(fvec4) Function None 9
13(input): 8(ptr) FunctionParameter
15: Label
34: 7(fvec4) Load 13(input)
35: 7(fvec4) Load 13(input)
36: 22(bvec4) FOrdEqual 34 35
37: 21(bool) All 36
SelectionMerge 39 None
BranchConditional 37 38 42
38: Label
40: 7(fvec4) Load 13(input)
ReturnValue 40
42: Label
43: 7(fvec4) Load 13(input)
44: 7(fvec4) FNegate 43
ReturnValue 44
39: Label
Unreachable
FunctionEnd
17(@PixelShaderFunction(vf4;): 7(fvec4) Function None 9
16(input): 8(ptr) FunctionParameter
18: Label
55(param): 8(ptr) Variable Function
78(param): 8(ptr) Variable Function
82(ii): 81(ptr) Variable Function
13: 7(fvec4) Load 10(input)
14: 7(fvec4) Load 10(input)
17: 16(bvec4) FOrdEqual 13 14
18: 15(bool) All 17
SelectionMerge 20 None
BranchConditional 18 19 20
19: Label
21: 7(fvec4) Load 10(input)
ReturnValue 21
20: Label
23: 7(fvec4) Load 10(input)
24: 7(fvec4) Load 10(input)
25: 16(bvec4) FOrdEqual 23 24
26: 15(bool) All 25
SelectionMerge 28 None
BranchConditional 26 27 31
27: Label
29: 7(fvec4) Load 10(input)
ReturnValue 29
31: Label
32: 7(fvec4) Load 10(input)
33: 7(fvec4) FNegate 32
ReturnValue 33
28: Label
35: 7(fvec4) Load 10(input)
36: 7(fvec4) Load 10(input)
37: 16(bvec4) FOrdEqual 35 36
38: 15(bool) All 37
SelectionMerge 40 None
BranchConditional 38 39 40
39: Label
Branch 40
40: Label
41: 7(fvec4) Load 10(input)
42: 7(fvec4) Load 10(input)
43: 16(bvec4) FOrdEqual 41 42
44: 15(bool) All 43
SelectionMerge 46 None
BranchConditional 44 45 46
45: Label
Branch 46
46: Label
47: 7(fvec4) Load 10(input)
48: 7(fvec4) Load 10(input)
49: 16(bvec4) FOrdEqual 47 48
50: 15(bool) All 49
SelectionMerge 52 Flatten
96(ii): 95(ptr) Variable Function
47: 7(fvec4) Load 16(input)
48: 7(fvec4) Load 16(input)
49: 22(bvec4) FOrdEqual 47 48
50: 21(bool) All 49
SelectionMerge 52 None
BranchConditional 50 51 52
51: Label
53: 7(fvec4) Load 10(input)
53: 7(fvec4) Load 16(input)
ReturnValue 53
52: Label
55: 7(fvec4) Load 10(input)
56: 7(fvec4) Load 10(input)
57: 16(bvec4) FOrdEqual 55 56
58: 15(bool) All 57
SelectionMerge 60 None
BranchConditional 58 59 63
59: Label
61: 7(fvec4) Load 10(input)
ReturnValue 61
63: Label
64: 7(fvec4) Load 10(input)
65: 7(fvec4) FNegate 64
ReturnValue 65
60: Label
71: 67(ptr) AccessChain 10(input) 70
72: 6(float) Load 71
Store 68(ii) 72
74: 15(bool) FOrdNotEqual 72 73
SelectionMerge 76 None
BranchConditional 74 75 76
75: Label
77: 6(float) Load 68(ii)
79: 6(float) FAdd 77 78
Store 68(ii) 79
Branch 76
76: Label
83: 80(int) Load 82(ii)
85: 80(int) IAdd 83 84
Store 82(ii) 85
86: 80(int) Load 82(ii)
87: 6(float) ConvertSToF 86
88: 15(bool) FOrdEqual 87 78
56: 7(fvec4) Load 16(input)
Store 55(param) 56
57: 7(fvec4) FunctionCall 11(f0(vf4;) 55(param)
58: 7(fvec4) Load 16(input)
59: 7(fvec4) Load 16(input)
60: 22(bvec4) FOrdEqual 58 59
61: 21(bool) All 60
SelectionMerge 63 None
BranchConditional 61 62 63
62: Label
Branch 63
63: Label
64: 7(fvec4) Load 16(input)
65: 7(fvec4) Load 16(input)
66: 22(bvec4) FOrdEqual 64 65
67: 21(bool) All 66
SelectionMerge 69 None
BranchConditional 67 68 69
68: Label
Branch 69
69: Label
70: 7(fvec4) Load 16(input)
71: 7(fvec4) Load 16(input)
72: 22(bvec4) FOrdEqual 70 71
73: 21(bool) All 72
SelectionMerge 75 Flatten
BranchConditional 73 74 75
74: Label
76: 7(fvec4) Load 16(input)
ReturnValue 76
75: Label
79: 7(fvec4) Load 16(input)
Store 78(param) 79
80: 7(fvec4) FunctionCall 14(f1(vf4;) 78(param)
85: 81(ptr) AccessChain 16(input) 84
86: 6(float) Load 85
Store 82(ii) 86
88: 21(bool) FOrdNotEqual 86 87
SelectionMerge 90 None
BranchConditional 88 89 90
89: Label
91: 80(int) Load 82(ii)
92: 80(int) IAdd 91 84
Store 82(ii) 92
91: 6(float) Load 82(ii)
93: 6(float) FAdd 91 92
Store 82(ii) 93
Branch 90
90: Label
93: 7(fvec4) Undef
ReturnValue 93
97: 94(int) Load 96(ii)
99: 94(int) IAdd 97 98
Store 96(ii) 99
100: 94(int) Load 96(ii)
101: 6(float) ConvertSToF 100
102: 21(bool) FOrdEqual 101 92
SelectionMerge 104 None
BranchConditional 102 103 104
103: Label
105: 94(int) Load 96(ii)
106: 94(int) IAdd 105 98
Store 96(ii) 106
Branch 104
104: Label
107: 7(fvec4) Undef
ReturnValue 107
FunctionEnd
......@@ -305,6 +305,5 @@ gl_FragCoord origin is upper left
66: 9(fvec4) CompositeConstruct 65 65 65 65
ReturnValue 66
45: Label
68: 9(fvec4) Undef
ReturnValue 68
Unreachable
FunctionEnd
......@@ -344,6 +344,5 @@ gl_FragCoord origin is upper left
84: 9(fvec4) CompositeConstruct 83 83 83 83
ReturnValue 84
53: Label
86: 9(fvec4) Undef
ReturnValue 86
Unreachable
FunctionEnd
......@@ -303,6 +303,5 @@ gl_FragCoord origin is upper left
66: 9(fvec4) CompositeConstruct 65 65 65 65
ReturnValue 66
45: Label
68: 9(fvec4) Undef
ReturnValue 68
Unreachable
FunctionEnd
......@@ -118,6 +118,5 @@ gl_FragCoord origin is upper left
23: Label
ReturnValue 24
16: Label
26: 7(fvec4) Undef
ReturnValue 26
Unreachable
FunctionEnd
......@@ -88,7 +88,7 @@ remap.similar_1a.everything.frag
22102: 649(ptr) Variable Function
24151: 12(int) Load 4408
13868: 9(bool) SGreaterThan 24151 2577
SelectionMerge 22309 None
SelectionMerge 14966 None
BranchConditional 13868 9492 17416
9492: Label
15624: 12(int) Load 4408
......@@ -109,7 +109,6 @@ remap.similar_1a.everything.frag
10505: 12(int) IAdd 11462 21176
14626: 13(float) ConvertSToF 10505
ReturnValue 14626
22309: Label
6429: 13(float) Undef
ReturnValue 6429
14966: Label
Unreachable
FunctionEnd
......@@ -124,6 +124,5 @@ remap.similar_1a.none.frag
68: 8(float) ConvertSToF 67
ReturnValue 68
43: Label
70: 8(float) Undef
ReturnValue 70
Unreachable
FunctionEnd
......@@ -93,7 +93,7 @@ remap.similar_1b.everything.frag
22102: 649(ptr) Variable Function
24151: 12(int) Load 4408
13868: 9(bool) SGreaterThan 24151 2577
SelectionMerge 22309 None
SelectionMerge 14966 None
BranchConditional 13868 10822 17416
10822: Label
22680: 12(int) Load 4408
......@@ -115,7 +115,6 @@ remap.similar_1b.everything.frag
10505: 12(int) IAdd 11462 21176
14626: 13(float) ConvertSToF 10505
ReturnValue 14626
22309: Label
6429: 13(float) Undef
ReturnValue 6429
14966: Label
Unreachable
FunctionEnd
......@@ -130,6 +130,5 @@ remap.similar_1b.none.frag
73: 8(float) ConvertSToF 72
ReturnValue 73
46: Label
75: 8(float) Undef
ReturnValue 75
Unreachable
FunctionEnd
spv.controlFlowAttributes.frag
WARNING: 0:20: 'unroll' : expected no arguments
WARNING: 0:21: 'dont_unroll' : expected no arguments
WARNING: 0:22: 'dependency_infinite' : expected no arguments
WARNING: 0:23: 'dependency_length' : expected a single integer argument
WARNING: 0:24: '' : attribute with arguments not recognized, skipping
WARNING: 0:25: '' : attribute with arguments not recognized, skipping
WARNING: 0:26: '' : attribute with arguments not recognized, skipping
WARNING: 0:27: 'unroll' : expected no arguments
WARNING: 0:28: 'dont_unroll' : expected no arguments
WARNING: 0:29: 'dependency_infinite' : expected no arguments
WARNING: 0:30: 'dependency_length' : expected a single integer argument
WARNING: 0:31: '' : attribute with arguments not recognized, skipping
WARNING: 0:32: '' : attribute with arguments not recognized, skipping
WARNING: 0:33: '' : attribute with arguments not recognized, skipping
Validation failed
// Module Version 10000
// Generated by (magic number): 80007
// Id's are bound by 118
// Id's are bound by 123
Capability Shader
1: ExtInstImport "GLSL.std.450"
......@@ -20,220 +20,231 @@ Validation failed
Source GLSL 450
SourceExtension "GL_EXT_control_flow_attributes"
Name 4 "main"
Name 8 "i"
Name 36 "i"
Name 47 "cond"
Name 60 "i"
Name 79 "i"
Name 6 "f0("
Name 8 "f1("
Name 23 "i"
Name 41 "i"
Name 52 "cond"
Name 65 "i"
Name 84 "i"
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 1
7: TypePointer Function 6(int)
9: 6(int) Constant 0
16: 6(int) Constant 8
17: TypeBool
20: 6(int) Constant 1
31: 17(bool) ConstantTrue
46: TypePointer Private 17(bool)
47(cond): 46(ptr) Variable Private
54: 17(bool) ConstantFalse
55: 6(int) Constant 3
19: TypeBool
20: 19(bool) ConstantTrue
21: TypeInt 32 1
22: TypePointer Function 21(int)
24: 21(int) Constant 0
31: 21(int) Constant 8
34: 21(int) Constant 1
51: TypePointer Private 19(bool)
52(cond): 51(ptr) Variable Private
59: 19(bool) ConstantFalse
60: 21(int) Constant 3
4(main): 2 Function None 3
5: Label
8(i): 7(ptr) Variable Function
36(i): 7(ptr) Variable Function
60(i): 7(ptr) Variable Function
79(i): 7(ptr) Variable Function
Store 8(i) 9
Branch 10
10: Label
LoopMerge 12 13 Unroll
Branch 14
14: Label
15: 6(int) Load 8(i)
18: 17(bool) SLessThan 15 16
BranchConditional 18 11 12
11: Label
Branch 13
13: Label
19: 6(int) Load 8(i)
21: 6(int) IAdd 19 20
Store 8(i) 21
Branch 10
12: Label
Branch 22
22: Label
LoopMerge 24 25 DontUnroll
Branch 23
23: Label
23(i): 22(ptr) Variable Function
41(i): 22(ptr) Variable Function
65(i): 22(ptr) Variable Function
84(i): 22(ptr) Variable Function
Store 23(i) 24
Branch 25
25: Label
Branch 22
24: Label
Branch 26
26: Label
LoopMerge 28 29 DontUnroll
Branch 30
30: Label
BranchConditional 31 27 28
27: Label
Branch 29
29: Label
Branch 26
28: Label
Branch 32
32: Label
LoopMerge 34 35 DependencyInfinite
Branch 33
33: Label
Branch 35
35: Label
BranchConditional 31 32 34
34: Label
Store 36(i) 9
LoopMerge 27 28 Unroll
Branch 29
29: Label
30: 21(int) Load 23(i)
32: 19(bool) SLessThan 30 31
BranchConditional 32 26 27
26: Label
Branch 28
28: Label
33: 21(int) Load 23(i)
35: 21(int) IAdd 33 34
Store 23(i) 35
Branch 25
27: Label
36: 2 FunctionCall 6(f0()
Branch 37
37: Label
LoopMerge 39 40 DependencyLength 4
Branch 41
41: Label
42: 6(int) Load 36(i)
43: 17(bool) SLessThan 42 16
BranchConditional 43 38 39
38: Label
Branch 40
40: Label
44: 6(int) Load 36(i)
45: 6(int) IAdd 44 20
Store 36(i) 45
Branch 37
LoopMerge 39 40 DependencyInfinite
Branch 38
38: Label
Branch 40
40: Label
BranchConditional 20 37 39
39: Label
48: 17(bool) Load 47(cond)
SelectionMerge 50 Flatten
BranchConditional 48 49 50
49: Label
Branch 50
50: Label
51: 17(bool) Load 47(cond)
SelectionMerge 53 DontFlatten
BranchConditional 51 52 53
52: Label
Store 47(cond) 54
Branch 53
53: Label
SelectionMerge 57 DontFlatten
Switch 55 57
case 3: 56
56: Label
Branch 57
57: Label
Store 60(i) 9
Branch 61
61: Label
LoopMerge 63 64 None
Branch 65
65: Label
66: 6(int) Load 60(i)
67: 17(bool) SLessThan 66 16
BranchConditional 67 62 63
62: Label
Branch 64
64: Label
68: 6(int) Load 60(i)
69: 6(int) IAdd 68 20
Store 60(i) 69
Branch 61
63: Label
Store 41(i) 24
Branch 42
42: Label
LoopMerge 44 45 DependencyLength 4
Branch 46
46: Label
47: 21(int) Load 41(i)
48: 19(bool) SLessThan 47 31
BranchConditional 48 43 44
43: Label
Branch 45
45: Label
49: 21(int) Load 41(i)
50: 21(int) IAdd 49 34
Store 41(i) 50
Branch 42
44: Label
53: 19(bool) Load 52(cond)
SelectionMerge 55 Flatten
BranchConditional 53 54 55
54: Label
Branch 55
55: Label
56: 19(bool) Load 52(cond)
SelectionMerge 58 DontFlatten
BranchConditional 56 57 58
57: Label
Store 52(cond) 59
Branch 58
58: Label
SelectionMerge 62 DontFlatten
Switch 60 62
case 3: 61
61: Label
Branch 62
62: Label
Store 65(i) 24
Branch 66
66: Label
LoopMerge 68 69 None
Branch 70
70: Label
LoopMerge 72 73 None
Branch 74
74: Label
BranchConditional 31 71 72
71: Label
Branch 73
73: Label
Branch 70
72: Label
71: 21(int) Load 65(i)
72: 19(bool) SLessThan 71 31
BranchConditional 72 67 68
67: Label
Branch 69
69: Label
73: 21(int) Load 65(i)
74: 21(int) IAdd 73 34
Store 65(i) 74
Branch 66
68: Label
Branch 75
75: Label
LoopMerge 77 78 None
Branch 76
76: Label
Branch 78
78: Label
BranchConditional 31 75 77
Branch 79
79: Label
BranchConditional 20 76 77
76: Label
Branch 78
78: Label
Branch 75
77: Label
Store 79(i) 9
Branch 80
80: Label
LoopMerge 82 83 None
Branch 84
84: Label
85: 6(int) Load 79(i)
86: 17(bool) SLessThan 85 16
BranchConditional 86 81 82
81: Label
Branch 83
83: Label
87: 6(int) Load 79(i)
88: 6(int) IAdd 87 20
Store 79(i) 88
Branch 80
Branch 81
81: Label
Branch 83
83: Label
BranchConditional 20 80 82
82: Label
89: 17(bool) Load 47(cond)
SelectionMerge 91 None
BranchConditional 89 90 91
90: Label
Branch 91
91: Label
92: 17(bool) Load 47(cond)
SelectionMerge 94 None
BranchConditional 92 93 94
93: Label
Store 47(cond) 54
Branch 94
94: Label
Store 84(i) 24
Branch 85
85: Label
LoopMerge 87 88 None
Branch 89
89: Label
90: 21(int) Load 84(i)
91: 19(bool) SLessThan 90 31
BranchConditional 91 86 87
86: Label
Branch 88
88: Label
92: 21(int) Load 84(i)
93: 21(int) IAdd 92 34
Store 84(i) 93
Branch 85
87: Label
94: 19(bool) Load 52(cond)
SelectionMerge 96 None
Switch 55 96
case 3: 95
BranchConditional 94 95 96
95: Label
Branch 96
96: Label
Branch 99
97: 19(bool) Load 52(cond)
SelectionMerge 99 None
BranchConditional 97 98 99
98: Label
Store 52(cond) 59
Branch 99
99: Label
LoopMerge 101 102 Unroll DontUnroll DependencyLength 2
Branch 103
103: Label
104: 17(bool) Load 47(cond)
BranchConditional 104 100 101
SelectionMerge 101 None
Switch 60 101
case 3: 100
100: Label
Branch 102
102: Label
Branch 99
Branch 101
101: Label
SelectionMerge 106 DontFlatten
Switch 55 106
case 3: 105
Branch 104
104: Label
LoopMerge 106 107 Unroll DontUnroll DependencyLength 2
Branch 108
108: Label
109: 19(bool) Load 52(cond)
BranchConditional 109 105 106
105: Label
Branch 106
Branch 107
107: Label
Branch 104
106: Label
109: 17(bool) Load 47(cond)
SelectionMerge 111 Flatten
BranchConditional 109 110 111
SelectionMerge 111 DontFlatten
Switch 60 111
case 3: 110
110: Label
Branch 111
111: Label
Branch 112
112: Label
LoopMerge 114 115 DependencyInfinite
Branch 116
116: Label
117: 17(bool) Load 47(cond)
BranchConditional 117 113 114
113: Label
Branch 115
114: 19(bool) Load 52(cond)
SelectionMerge 116 Flatten
BranchConditional 114 115 116
115: Label
Branch 112
114: Label
Branch 116
116: Label
Branch 117
117: Label
LoopMerge 119 120 DependencyInfinite
Branch 121
121: Label
122: 19(bool) Load 52(cond)
BranchConditional 122 118 119
118: Label
Branch 120
120: Label
Branch 117
119: Label
Return
FunctionEnd
6(f0(): 2 Function None 3
7: Label
Branch 10
10: Label
LoopMerge 12 13 DontUnroll
Branch 11
11: Label
Branch 13
13: Label
Branch 10
12: Label
Unreachable
FunctionEnd
8(f1(): 2 Function None 3
9: Label
Branch 14
14: Label
LoopMerge 16 17 DontUnroll
Branch 18
18: Label
BranchConditional 20 15 16
15: Label
Branch 17
17: Label
Branch 14
16: Label
Return
FunctionEnd
spv.dead-after-continue.vert
// Module Version 10000
// Generated by (magic number): 80007
// Id's are bound by 29
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Vertex 4 "main" 20 28
Source GLSL 450
Name 4 "main"
Name 8 "i"
Name 20 "o"
Name 28 "c"
Decorate 20(o) Location 0
Decorate 28(c) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 1
7: TypePointer Function 6(int)
9: 6(int) Constant 0
16: 6(int) Constant 5
17: TypeBool
19: TypePointer Output 6(int)
20(o): 19(ptr) Variable Output
21: 6(int) Constant 1
23: 6(int) Constant 2
26: 6(int) Constant 3
27: TypePointer Input 6(int)
28(c): 27(ptr) Variable Input
4(main): 2 Function None 3
5: Label
8(i): 7(ptr) Variable Function
Store 8(i) 9
Branch 10
10: Label
LoopMerge 12 13 None
Branch 14
14: Label
15: 6(int) Load 8(i)
18: 17(bool) SLessThan 15 16
BranchConditional 18 11 12
11: Label
Store 20(o) 21
Branch 13
13: Label
24: 6(int) Load 8(i)
25: 6(int) IAdd 24 21
Store 8(i) 25
Branch 10
12: Label
Store 20(o) 26
Return
FunctionEnd
spv.dead-after-discard.frag
// Module Version 10000
// Generated by (magic number): 80007
// Id's are bound by 15
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" 8 14
ExecutionMode 4 OriginUpperLeft
Source GLSL 450
Name 4 "main"
Name 8 "o"
Name 14 "c"
Decorate 8(o) Location 0
Decorate 14(c) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 1
7: TypePointer Output 6(int)
8(o): 7(ptr) Variable Output
9: 6(int) Constant 1
11: 6(int) Constant 3
12: TypeFloat 32
13: TypePointer Input 12(float)
14(c): 13(ptr) Variable Input
4(main): 2 Function None 3
5: Label
Store 8(o) 9
Kill
FunctionEnd
spv.dead-after-loop-break.vert
// Module Version 10000
// Generated by (magic number): 80007
// Id's are bound by 36
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Vertex 4 "main" 8 25
Source GLSL 450
Name 4 "main"
Name 8 "o"
Name 11 "i"
Name 25 "c"
Decorate 8(o) Location 0
Decorate 25(c) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 1
7: TypePointer Output 6(int)
8(o): 7(ptr) Variable Output
9: 6(int) Constant 1
10: TypePointer Function 6(int)
12: 6(int) Constant 0
19: 6(int) Constant 5
20: TypeBool
22: 6(int) Constant 2
24: TypePointer Input 6(int)
25(c): 24(ptr) Variable Input
30: 6(int) Constant 3
32: 6(int) Constant 4
35: 6(int) Constant 6
4(main): 2 Function None 3
5: Label
11(i): 10(ptr) Variable Function
Store 8(o) 9
Store 11(i) 12
Branch 13
13: Label
LoopMerge 15 16 None
Branch 17
17: Label
18: 6(int) Load 11(i)
21: 20(bool) SLessThan 18 19
BranchConditional 21 14 15
14: Label
Store 8(o) 22
23: 6(int) Load 11(i)
26: 6(int) Load 25(c)
27: 20(bool) IEqual 23 26
SelectionMerge 29 None
BranchConditional 27 28 29
28: Label
Store 8(o) 30
Branch 15
29: Label
Store 8(o) 19
Branch 16
16: Label
33: 6(int) Load 11(i)
34: 6(int) IAdd 33 9
Store 11(i) 34
Branch 13
15: Label
Store 8(o) 35
Return
FunctionEnd
spv.dead-after-return.vert
// Module Version 10000
// Generated by (magic number): 80007
// Id's are bound by 14
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Vertex 4 "main" 8 13
Source GLSL 450
Name 4 "main"
Name 8 "o"
Name 13 "c"
Decorate 8(o) Location 0
Decorate 13(c) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 1
7: TypePointer Output 6(int)
8(o): 7(ptr) Variable Output
9: 6(int) Constant 1
11: 6(int) Constant 3
12: TypePointer Input 6(int)
13(c): 12(ptr) Variable Input
4(main): 2 Function None 3
5: Label
Store 8(o) 9
Return
FunctionEnd
spv.dead-after-switch-break.vert
// Module Version 10000
// Generated by (magic number): 80007
// Id's are bound by 21
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Vertex 4 "main" 8 14
Source GLSL 450
Name 4 "main"
Name 8 "c"
Name 14 "o"
Decorate 8(c) Location 0
Decorate 14(o) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 1
7: TypePointer Input 6(int)
8(c): 7(ptr) Variable Input
13: TypePointer Output 6(int)
14(o): 13(ptr) Variable Output
15: 6(int) Constant 1
17: 6(int) Constant 2
20: 6(int) Constant 3
4(main): 2 Function None 3
5: Label
9: 6(int) Load 8(c)
SelectionMerge 12 None
Switch 9 11
case 0: 10
11: Label
Branch 12
10: Label
Store 14(o) 15
Branch 12
12: Label
Store 14(o) 20
Return
FunctionEnd
spv.dead-complex-continue-after-return.vert
// Module Version 10000
// Generated by (magic number): 80007
// Id's are bound by 31
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Vertex 4 "main" 11 30
Source GLSL 450
Name 4 "main"
Name 8 "i"
Name 11 "o"
Name 30 "c"
Decorate 11(o) Location 0
Decorate 30(c) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 1
7: TypePointer Function 6(int)
9: 6(int) Constant 0
10: TypePointer Output 6(int)
11(o): 10(ptr) Variable Output
12: 6(int) Constant 1
19: 6(int) Constant 5
20: TypeBool
22: 6(int) Constant 2
24: 6(int) Constant 3
27: 6(int) Constant 99
28: 6(int) Constant 4
29: TypePointer Input 6(int)
30(c): 29(ptr) Variable Input
4(main): 2 Function None 3
5: Label
8(i): 7(ptr) Variable Function
Store 8(i) 9
Store 11(o) 12
Store 8(i) 9
Branch 13
13: Label
LoopMerge 15 16 None
Branch 17
17: Label
18: 6(int) Load 8(i)
21: 20(bool) SLessThan 18 19
BranchConditional 21 14 15
14: Label
Store 11(o) 22
Return
16: Label
Branch 13
15: Label
Store 11(o) 28
Return
FunctionEnd
spv.dead-complex-merge-after-return.vert
// Module Version 10000
// Generated by (magic number): 80007
// Id's are bound by 36
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Vertex 4 "main" 11 27
Source GLSL 450
Name 4 "main"
Name 8 "i"
Name 11 "o"
Name 27 "c"
Decorate 11(o) Location 0
Decorate 27(c) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 1
7: TypePointer Function 6(int)
9: 6(int) Constant 0
10: TypePointer Output 6(int)
11(o): 10(ptr) Variable Output
12: 6(int) Constant 1
17: 6(int) Constant 2
19: 6(int) Constant 3
22: 6(int) Constant 5
23: TypeBool
25: 6(int) Constant 4
26: TypePointer Input 6(int)
27(c): 26(ptr) Variable Input
32: 6(int) Constant 100
34: 6(int) Constant 200
35: 6(int) Constant 300
4(main): 2 Function None 3
5: Label
8(i): 7(ptr) Variable Function
Store 8(i) 9
Store 11(o) 12
Branch 13
13: Label
LoopMerge 15 16 None
Branch 14
14: Label
Store 11(o) 17
Return
16: Label
Branch 13
15: Label
Unreachable
FunctionEnd
......@@ -160,7 +160,7 @@ spv.earlyReturnDiscard.frag
102: Label
Return
100: Label
Branch 67
Unreachable
67: Label
106: 7(fvec4) Load 9(color)
107: 7(fvec4) Load 13(color2)
......
......@@ -38,5 +38,5 @@ spv.for-notest.vert
Store 8(i) 19
Branch 10
12: Label
Return
Unreachable
FunctionEnd
......@@ -99,8 +99,7 @@ spv.forwardFun.frag
45: Label
ReturnValue 46
42: Label
48: 8(float) Undef
ReturnValue 48
Unreachable
FunctionEnd
16(foo(vf4;): 8(float) Function None 14
15(bar): 13(ptr) FunctionParameter
......
......@@ -105,8 +105,7 @@ WARNING: 0:5: varying deprecated in version 130; may be removed in future releas
44: Label
ReturnValue 45
41: Label
47: 6(float) Undef
ReturnValue 47
Unreachable
FunctionEnd
18(missingReturn(): 6(float) Function None 15
19: Label
......
......@@ -37,5 +37,5 @@ spv.merge-unreachable.frag
23: Label
Return
21: Label
Return
Unreachable
FunctionEnd
float4 PixelShaderFunction(float input) : COLOR0
{
void f0() {
[unroll] do {} while (false);
}
void f1() {
[unroll] do {;} while (false);
}
float f2(float input) {
do { return (float4)input; } while (input > 2.0);
}
void f3(float input) {
do ++input; while (input < 10.0);
}
void f4(float input) {
do while (++input < 10.0); while (++input < 10.0); // nest while inside do-while
}
float4 PixelShaderFunction(float input) : COLOR0
{
f0();
f1();
f2(input);
f3(input);
f4(input);
return (float4)input;
}
float4 PixelShaderFunction(float4 input) : COLOR0
{
void f0() {
for (;;) ;
}
void f1(float4 input) {
for (++input; ; ) ;
}
void f2(float4 input) {
[unroll] for (; any(input != input); ) {}
}
float f3(float4 input) {
for (; any(input != input); ) { return -input; }
}
float f4(float4 input) {
for (--input; any(input != input); input += 2) { return -input; }
}
void f5(float4 input) {
for (;;) if (input.x > 2.0) break;
}
void f6(float4 input) {
for (;;) if (input.x > 2.0) continue;
}
void f99() {
for (int first = 0, second = 1; ;) first + second;
}
void f100(float ii) {
for (--ii, --ii, --ii;;) ii;
}
float4 PixelShaderFunction(float4 input) : COLOR0
{
f0();
f1(input);
f2(input);
f3(input);
f4(input);
f5(input);
f6(input);
float ii;
for (int ii = -1; ii < 3; ++ii) if (ii == 2) continue;
--ii;
for (int first = 0, second = 1; ;) first + second;
f99();
for ( int i = 0, count = int(ii); i < count; i++ );
for (float first = 0, second[2], third; first < second[0]; ++second[1]) first + second[1] + third;
for (--ii, --ii, --ii;;) ii;
f100(ii);
return input;
}
float4 PixelShaderFunction(float4 input) : COLOR0
{
float4 f0(float4 input) {
if (all(input == input))
return input;
else
return -input;
}
if (all(input == input))
float4 f1(float4 input) {
if (all(input == input)) {
return input;
else
} else {
return -input;
}
}
float4 PixelShaderFunction(float4 input) : COLOR0
{
if (all(input == input))
return input;
f0(input);
if (all(input == input))
;
......@@ -20,11 +32,7 @@ float4 PixelShaderFunction(float4 input) : COLOR0
return input;
}
if (all(input == input)) {
return input;
} else {
return -input;
}
f1(input);
int ii;
if (float ii = input.z)
......
......@@ -4,11 +4,18 @@
bool cond;
void f0() {
[[loop]] for (;;) { }
}
void f1() {
[[dont_unroll]] while(true) { }
}
void main()
{
[[unroll]] for (int i = 0; i < 8; ++i) { }
[[loop]] for (;;) { }
[[dont_unroll]] while(true) { }
f0();
[[dependency_infinite]] do { } while(true);
[[dependency_length(1+3)]] for (int i = 0; i < 8; ++i) { }
[[flatten]] if (cond) { } else { }
......
#version 450
layout(location =0 ) in int c;
layout(location =0 ) out int o;
void main() {
int i;
for (i=0; i < 5; i++) {
o = 1;
continue;
o = 2;
}
o = 3;
}
#version 450
layout(location =0 ) in float c;
layout(location =0 ) out int o;
void main() {
o = 1;
discard;
o = 3;
}
#version 450
layout(location =0 ) in int c;
layout(location =0 ) out int o;
void main() {
int i;
o = 1;
for (i=0; i < 5; i++) {
o = 2;
if (i==c) {
o = 3;
break;
o = 4;
}
o = 5;
}
o = 6;
}
#version 450
layout(location =0 ) in int c;
layout(location =0 ) out int o;
void main() {
o = 1;
return;
o = 3;
}
#version 450
layout(location =0 ) in int c;
layout(location =0 ) out int o;
void main() {
int i;
switch(c) {
case 0: o=1;
break;
o=2;
default: break;
}
o = 3;
}
#version 450
layout(location =0 ) in int c;
layout(location =0 ) out int o;
void main() {
int i = 0;
o = 1;
// This has non-trivial continue target.
for (i=0; i < 5; ++i, o=99) {
o = 2;
return;
o = 3;
}
// This is considered reachable since Glslang codegen will
// create a conditional branch in the header, and one arm
// of that branch reaches this merge block.
o = 4;
}
#version 450
layout(location =0 ) in int c;
layout(location =0 ) out int o;
void main() {
int i = 0;
o = 1;
do {
o = 2;
return;
o = 3;
} while(i++ < 5);
// All this is a dead merge block.
o = 4;
if (c==4) {
o = 100;
} else {
o = 200;
}
o = 300;
}
......@@ -63,6 +63,7 @@ std::string FileNameAsCustomTestSuffixIoMap(
}
using CompileVulkanToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
using CompileVulkanToSpirvDeadCodeElimTest = GlslangTest<::testing::TestWithParam<std::string>>;
using CompileVulkanToDebugSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
using CompileVulkan1_1ToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
using CompileToSpirv14Test = GlslangTest<::testing::TestWithParam<std::string>>;
......@@ -85,6 +86,13 @@ TEST_P(CompileVulkanToSpirvTest, FromFile)
Target::Spv);
}
TEST_P(CompileVulkanToSpirvDeadCodeElimTest, FromFile)
{
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
Target::Spv);
}
// Compiling GLSL to SPIR-V with debug info under Vulkan semantics. Expected
// to successfully generate SPIR-V.
TEST_P(CompileVulkanToDebugSpirvTest, FromFile)
......@@ -417,6 +425,23 @@ INSTANTIATE_TEST_CASE_P(
FileNameAsCustomTestSuffix
);
// Cases with deliberately unreachable code.
// By default the compiler will aggressively eliminate
// unreachable merges and continues.
INSTANTIATE_TEST_CASE_P(
GlslWithDeadCode, CompileVulkanToSpirvDeadCodeElimTest,
::testing::ValuesIn(std::vector<std::string>({
"spv.dead-after-continue.vert",
"spv.dead-after-discard.frag",
"spv.dead-after-return.vert",
"spv.dead-after-loop-break.vert",
"spv.dead-after-switch-break.vert",
"spv.dead-complex-continue-after-return.vert",
"spv.dead-complex-merge-after-return.vert",
})),
FileNameAsCustomTestSuffix
);
// clang-format off
INSTANTIATE_TEST_CASE_P(
Glsl, CompileVulkanToDebugSpirvTest,
......
......@@ -113,7 +113,7 @@ public:
forceVersionProfile(false),
isForwardCompatible(false) {
// Perform validation by default.
validatorOptions.validate = true;
spirvOptions.validate = true;
}
// Tries to load the contents from the file at the given |path|. On success,
......@@ -693,14 +693,14 @@ public:
expectedOutputFname, result.spirvWarningsErrors);
}
glslang::SpvOptions& options() { return validatorOptions; }
glslang::SpvOptions& options() { return spirvOptions; }
private:
const int defaultVersion;
const EProfile defaultProfile;
const bool forceVersionProfile;
const bool isForwardCompatible;
glslang::SpvOptions validatorOptions;
glslang::SpvOptions spirvOptions;
};
} // namespace glslangtest
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment