glslang -> SPV: 1) Include post switch-break unreachable blocks and 2) Generally, don't emit degenerate (basically empty) unreachable blocks.
git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@31023 e7fa87d3-cd2b-0410-9028-fcbf551c1848
This commit is contained in:
parent
968c8f8e78
commit
735a2efa70
@ -1683,6 +1683,7 @@ void Builder::addSwitchBreak()
|
|||||||
{
|
{
|
||||||
// branch to the top of the merge block stack
|
// branch to the top of the merge block stack
|
||||||
createBranch(switchMerges.top());
|
createBranch(switchMerges.top());
|
||||||
|
createAndSetNoPredecessorBlock("post-switch-break");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Comments in header
|
// Comments in header
|
||||||
@ -1993,11 +1994,12 @@ void Builder::simplifyAccessChainSwizzle()
|
|||||||
void Builder::createAndSetNoPredecessorBlock(const char* name)
|
void Builder::createAndSetNoPredecessorBlock(const char* name)
|
||||||
{
|
{
|
||||||
Block* block = new Block(getUniqueId(), buildPoint->getParent());
|
Block* block = new Block(getUniqueId(), buildPoint->getParent());
|
||||||
|
block->setUnreachable();
|
||||||
buildPoint->getParent().addBlock(block);
|
buildPoint->getParent().addBlock(block);
|
||||||
setBuildPoint(block);
|
setBuildPoint(block);
|
||||||
|
|
||||||
if (name)
|
//if (name)
|
||||||
addName(block->getId(), name);
|
// addName(block->getId(), name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Comments in header
|
// Comments in header
|
||||||
|
@ -162,8 +162,6 @@ protected:
|
|||||||
|
|
||||||
class Block {
|
class Block {
|
||||||
public:
|
public:
|
||||||
// Setting insert to true indicates to add this new block
|
|
||||||
// to the end of the parent function.
|
|
||||||
Block(Id id, Function& parent);
|
Block(Id id, Function& parent);
|
||||||
virtual ~Block()
|
virtual ~Block()
|
||||||
{
|
{
|
||||||
@ -177,6 +175,8 @@ public:
|
|||||||
void addPredecessor(Block* pred) { predecessors.push_back(pred); }
|
void addPredecessor(Block* pred) { predecessors.push_back(pred); }
|
||||||
void addLocalVariable(Instruction* inst) { localVariables.push_back(inst); }
|
void addLocalVariable(Instruction* inst) { localVariables.push_back(inst); }
|
||||||
int getNumPredecessors() const { return (int)predecessors.size(); }
|
int getNumPredecessors() const { return (int)predecessors.size(); }
|
||||||
|
void setUnreachable() { unreachable = true; }
|
||||||
|
bool isUnreachable() const { return unreachable; }
|
||||||
|
|
||||||
bool isTerminated() const
|
bool isTerminated() const
|
||||||
{
|
{
|
||||||
@ -195,6 +195,12 @@ public:
|
|||||||
|
|
||||||
void dump(std::vector<unsigned int>& out) const
|
void dump(std::vector<unsigned int>& out) const
|
||||||
{
|
{
|
||||||
|
// skip the degenerate unreachable blocks
|
||||||
|
// TODO: code gen: skip all unreachable blocks (transitive closure)
|
||||||
|
// (but, until that's done safer to keep non-degenerate unreachable blocks, in case others depend on something)
|
||||||
|
if (unreachable && instructions.size() <= 2)
|
||||||
|
return;
|
||||||
|
|
||||||
instructions[0]->dump(out);
|
instructions[0]->dump(out);
|
||||||
for (int i = 0; i < (int)localVariables.size(); ++i)
|
for (int i = 0; i < (int)localVariables.size(); ++i)
|
||||||
localVariables[i]->dump(out);
|
localVariables[i]->dump(out);
|
||||||
@ -212,6 +218,11 @@ protected:
|
|||||||
std::vector<Block*> predecessors;
|
std::vector<Block*> predecessors;
|
||||||
std::vector<Instruction*> localVariables;
|
std::vector<Instruction*> localVariables;
|
||||||
Function& parent;
|
Function& parent;
|
||||||
|
|
||||||
|
// track whether this block is known to be uncreachable (not necessarily
|
||||||
|
// true for all unreachable blocks, but should be set at least
|
||||||
|
// for the extraneous ones introduced by the builder).
|
||||||
|
bool unreachable;
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -338,7 +349,7 @@ __inline void Function::addLocalVariable(Instruction* inst)
|
|||||||
parent.mapInstruction(inst);
|
parent.mapInstruction(inst);
|
||||||
}
|
}
|
||||||
|
|
||||||
__inline Block::Block(Id id, Function& parent) : parent(parent)
|
__inline Block::Block(Id id, Function& parent) : parent(parent), unreachable(false)
|
||||||
{
|
{
|
||||||
instructions.push_back(new Instruction(id, NoType, OpLabel));
|
instructions.push_back(new Instruction(id, NoType, OpLabel));
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ ERROR: 0:120: 'default' : cannot appear outside switch statement
|
|||||||
ERROR: 0:126: 'onlyInSwitch' : undeclared identifier
|
ERROR: 0:126: 'onlyInSwitch' : undeclared identifier
|
||||||
WARNING: 0:128: 'switch' : last case/default label not followed by statements
|
WARNING: 0:128: 'switch' : last case/default label not followed by statements
|
||||||
ERROR: 0:140: 'nestedX' : undeclared identifier
|
ERROR: 0:140: 'nestedX' : undeclared identifier
|
||||||
ERROR: 0:156: 'nestedZ' : undeclared identifier
|
ERROR: 0:157: 'nestedZ' : undeclared identifier
|
||||||
ERROR: 17 compilation errors. No code generated.
|
ERROR: 17 compilation errors. No code generated.
|
||||||
|
|
||||||
|
|
||||||
@ -322,27 +322,28 @@ ERROR: node is still EOpNull!
|
|||||||
0:144 3 (const int)
|
0:144 3 (const int)
|
||||||
0:? Sequence
|
0:? Sequence
|
||||||
0:146 Branch: Break
|
0:146 Branch: Break
|
||||||
0:147 case: with expression
|
0:147 Branch: Break
|
||||||
0:147 Constant:
|
0:148 case: with expression
|
||||||
0:147 4 (const int)
|
0:148 Constant:
|
||||||
|
0:148 4 (const int)
|
||||||
0:? Sequence
|
0:? Sequence
|
||||||
0:148 Sequence
|
0:149 Sequence
|
||||||
0:148 move second child to first child (temp mediump int)
|
0:149 move second child to first child (temp mediump int)
|
||||||
0:148 'linearY' (temp mediump int)
|
0:149 'linearY' (temp mediump int)
|
||||||
0:148 'linearZ' (temp mediump int)
|
0:149 'linearZ' (temp mediump int)
|
||||||
0:149 Branch: Break
|
0:150 Branch: Break
|
||||||
0:150 case: with expression
|
0:151 case: with expression
|
||||||
0:150 Constant:
|
0:151 Constant:
|
||||||
0:150 5 (const int)
|
0:151 5 (const int)
|
||||||
0:? Sequence
|
|
||||||
0:152 Branch: Break
|
|
||||||
0:153 case: with expression
|
|
||||||
0:153 Constant:
|
|
||||||
0:153 6 (const int)
|
|
||||||
0:? Sequence
|
0:? Sequence
|
||||||
|
0:153 Branch: Break
|
||||||
|
0:154 case: with expression
|
||||||
0:154 Constant:
|
0:154 Constant:
|
||||||
0:154 4 (const int)
|
0:154 6 (const int)
|
||||||
0:156 'nestedZ' (temp float)
|
0:? Sequence
|
||||||
|
0:155 Constant:
|
||||||
|
0:155 4 (const int)
|
||||||
|
0:157 'nestedZ' (temp float)
|
||||||
0:? Linker Objects
|
0:? Linker Objects
|
||||||
0:? 'c' (uniform mediump int)
|
0:? 'c' (uniform mediump int)
|
||||||
0:? 'd' (uniform mediump int)
|
0:? 'd' (uniform mediump int)
|
||||||
@ -653,27 +654,28 @@ ERROR: node is still EOpNull!
|
|||||||
0:144 3 (const int)
|
0:144 3 (const int)
|
||||||
0:? Sequence
|
0:? Sequence
|
||||||
0:146 Branch: Break
|
0:146 Branch: Break
|
||||||
0:147 case: with expression
|
0:147 Branch: Break
|
||||||
0:147 Constant:
|
0:148 case: with expression
|
||||||
0:147 4 (const int)
|
0:148 Constant:
|
||||||
|
0:148 4 (const int)
|
||||||
0:? Sequence
|
0:? Sequence
|
||||||
0:148 Sequence
|
0:149 Sequence
|
||||||
0:148 move second child to first child (temp mediump int)
|
0:149 move second child to first child (temp mediump int)
|
||||||
0:148 'linearY' (temp mediump int)
|
0:149 'linearY' (temp mediump int)
|
||||||
0:148 'linearZ' (temp mediump int)
|
0:149 'linearZ' (temp mediump int)
|
||||||
0:149 Branch: Break
|
0:150 Branch: Break
|
||||||
0:150 case: with expression
|
0:151 case: with expression
|
||||||
0:150 Constant:
|
0:151 Constant:
|
||||||
0:150 5 (const int)
|
0:151 5 (const int)
|
||||||
0:? Sequence
|
|
||||||
0:152 Branch: Break
|
|
||||||
0:153 case: with expression
|
|
||||||
0:153 Constant:
|
|
||||||
0:153 6 (const int)
|
|
||||||
0:? Sequence
|
0:? Sequence
|
||||||
|
0:153 Branch: Break
|
||||||
|
0:154 case: with expression
|
||||||
0:154 Constant:
|
0:154 Constant:
|
||||||
0:154 4 (const int)
|
0:154 6 (const int)
|
||||||
0:156 'nestedZ' (temp float)
|
0:? Sequence
|
||||||
|
0:155 Constant:
|
||||||
|
0:155 4 (const int)
|
||||||
|
0:157 'nestedZ' (temp float)
|
||||||
0:? Linker Objects
|
0:? Linker Objects
|
||||||
0:? 'c' (uniform mediump int)
|
0:? 'c' (uniform mediump int)
|
||||||
0:? 'd' (uniform mediump int)
|
0:? 'd' (uniform mediump int)
|
||||||
|
@ -144,6 +144,7 @@ void main()
|
|||||||
case 3:
|
case 3:
|
||||||
int linearZ;
|
int linearZ;
|
||||||
break;
|
break;
|
||||||
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
int linearY = linearZ;
|
int linearY = linearZ;
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user