Fix unreachable-block removal.
Add a test for loop without a condition. Change-Id: Idd7fc462218a84b1e745207e2975a3f2897d30a0
This commit is contained in:
parent
9c6734c8df
commit
e537b8b488
@ -1356,7 +1356,7 @@ bool TGlslangToSpvTraverser::visitLoop(glslang::TVisit /* visit */, glslang::TIn
|
|||||||
|
|
||||||
builder.setBuildPoint(&blocks.body);
|
builder.setBuildPoint(&blocks.body);
|
||||||
if (node->getBody())
|
if (node->getBody())
|
||||||
node->getBody()->traverse(this); // continue->cont, break->exit
|
node->getBody()->traverse(this);
|
||||||
builder.createBranch(&blocks.continue_target);
|
builder.createBranch(&blocks.continue_target);
|
||||||
|
|
||||||
builder.setBuildPoint(&blocks.continue_target);
|
builder.setBuildPoint(&blocks.continue_target);
|
||||||
@ -1368,7 +1368,7 @@ bool TGlslangToSpvTraverser::visitLoop(glslang::TVisit /* visit */, glslang::TIn
|
|||||||
|
|
||||||
builder.setBuildPoint(&blocks.body);
|
builder.setBuildPoint(&blocks.body);
|
||||||
if (node->getBody())
|
if (node->getBody())
|
||||||
node->getBody()->traverse(this); // continue->cont, break->exit
|
node->getBody()->traverse(this);
|
||||||
builder.createBranch(&blocks.continue_target);
|
builder.createBranch(&blocks.continue_target);
|
||||||
|
|
||||||
builder.setBuildPoint(&blocks.continue_target);
|
builder.setBuildPoint(&blocks.continue_target);
|
||||||
|
@ -852,7 +852,7 @@ void Builder::leaveFunction()
|
|||||||
if (unreachable) {
|
if (unreachable) {
|
||||||
// Given that this block is at the end of a function, it must be right after an
|
// Given that this block is at the end of a function, it must be right after an
|
||||||
// explicit return, just remove it.
|
// explicit return, just remove it.
|
||||||
function.popBlock(block);
|
function.removeBlock(block);
|
||||||
} else {
|
} else {
|
||||||
// We'll add a return instruction at the end of the current block,
|
// We'll add a return instruction at the end of the current block,
|
||||||
// which for a non-void function is really error recovery (?), as the source
|
// which for a non-void function is really error recovery (?), as the source
|
||||||
|
@ -52,6 +52,7 @@
|
|||||||
|
|
||||||
#include "spirv.hpp"
|
#include "spirv.hpp"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@ -235,7 +236,13 @@ public:
|
|||||||
Id getParamId(int p) { return parameterInstructions[p]->getResultId(); }
|
Id getParamId(int p) { return parameterInstructions[p]->getResultId(); }
|
||||||
|
|
||||||
void addBlock(Block* block) { blocks.push_back(block); }
|
void addBlock(Block* block) { blocks.push_back(block); }
|
||||||
void popBlock(Block*) { blocks.pop_back(); }
|
void removeBlock(Block* block)
|
||||||
|
{
|
||||||
|
auto found = find(blocks.begin(), blocks.end(), block);
|
||||||
|
assert(found != blocks.end());
|
||||||
|
blocks.erase(found);
|
||||||
|
delete block;
|
||||||
|
}
|
||||||
|
|
||||||
Module& getParent() const { return parent; }
|
Module& getParent() const { return parent; }
|
||||||
Block* getEntryBlock() const { return blocks.front(); }
|
Block* getEntryBlock() const { return blocks.front(); }
|
||||||
|
50
Test/baseResults/spv.for-notest.vert.out
Normal file
50
Test/baseResults/spv.for-notest.vert.out
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
spv.for-notest.vert
|
||||||
|
Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
|
||||||
|
|
||||||
|
|
||||||
|
Linked vertex stage:
|
||||||
|
|
||||||
|
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 80001
|
||||||
|
// Id's are bound by 22
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Vertex 4 "main" 14 20 21
|
||||||
|
Source GLSL 450
|
||||||
|
Name 4 "main"
|
||||||
|
Name 8 "i"
|
||||||
|
Name 14 "r"
|
||||||
|
Name 20 "gl_VertexID"
|
||||||
|
Name 21 "gl_InstanceID"
|
||||||
|
Decorate 14(r) Location 0
|
||||||
|
Decorate 20(gl_VertexID) BuiltIn VertexId
|
||||||
|
Decorate 21(gl_InstanceID) BuiltIn InstanceId
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeInt 32 1
|
||||||
|
7: TypePointer Function 6(int)
|
||||||
|
9: 6(int) Constant 0
|
||||||
|
13: TypePointer Output 6(int)
|
||||||
|
14(r): 13(ptr) Variable Output
|
||||||
|
17: 6(int) Constant 1
|
||||||
|
19: TypePointer Input 6(int)
|
||||||
|
20(gl_VertexID): 19(ptr) Variable Input
|
||||||
|
21(gl_InstanceID): 19(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
|
||||||
|
15: 6(int) Load 8(i)
|
||||||
|
Store 14(r) 15
|
||||||
|
Branch 12
|
||||||
|
12: Label
|
||||||
|
16: 6(int) Load 8(i)
|
||||||
|
18: 6(int) IAdd 16 17
|
||||||
|
Store 8(i) 18
|
||||||
|
Branch 10
|
||||||
|
FunctionEnd
|
6
Test/spv.for-notest.vert
Normal file
6
Test/spv.for-notest.vert
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#version 450
|
||||||
|
layout(location=0) out highp int r;
|
||||||
|
void main() {
|
||||||
|
int i;
|
||||||
|
for (i=0; ; i++) { r = i; }
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user