Fix unrolling loops with return statements.
Change-Id: I8974a6bb4137d1dfad9f5dd3a92cc9306c38294c
Reviewed-on: https://swiftshader-review.googlesource.com/5184
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/compiler/OutputASM.cpp b/src/OpenGL/compiler/OutputASM.cpp
index f8915c9..fd8148e 100644
--- a/src/OpenGL/compiler/OutputASM.cpp
+++ b/src/OpenGL/compiler/OutputASM.cpp
@@ -1624,8 +1624,8 @@
if(unroll)
{
- DetectLoopDiscontinuity detectLoopDiscontinuity;
- unroll = !detectLoopDiscontinuity.traverse(node);
+ LoopUnrollable loopUnrollable;
+ unroll = loopUnrollable.traverse(node);
}
TIntermNode *init = node->getInit();
@@ -3506,17 +3506,17 @@
return ~0u;
}
- bool DetectLoopDiscontinuity::traverse(TIntermNode *node)
+ bool LoopUnrollable::traverse(TIntermNode *node)
{
loopDepth = 0;
- loopDiscontinuity = false;
+ loopUnrollable = true;
node->traverse(this);
- return loopDiscontinuity;
+ return loopUnrollable;
}
- bool DetectLoopDiscontinuity::visitLoop(Visit visit, TIntermLoop *loop)
+ bool LoopUnrollable::visitLoop(Visit visit, TIntermLoop *loop)
{
if(visit == PreVisit)
{
@@ -3530,9 +3530,9 @@
return true;
}
- bool DetectLoopDiscontinuity::visitBranch(Visit visit, TIntermBranch *node)
+ bool LoopUnrollable::visitBranch(Visit visit, TIntermBranch *node)
{
- if(loopDiscontinuity)
+ if(!loopUnrollable)
{
return false;
}
@@ -3545,20 +3545,20 @@
switch(node->getFlowOp())
{
case EOpKill:
+ case EOpReturn:
break;
case EOpBreak:
case EOpContinue:
- case EOpReturn:
- loopDiscontinuity = true;
+ loopUnrollable = false;
break;
default: UNREACHABLE(node->getFlowOp());
}
- return !loopDiscontinuity;
+ return loopUnrollable;
}
- bool DetectLoopDiscontinuity::visitAggregate(Visit visit, TIntermAggregate *node)
+ bool LoopUnrollable::visitAggregate(Visit visit, TIntermAggregate *node)
{
- return !loopDiscontinuity;
+ return loopUnrollable;
}
}
diff --git a/src/OpenGL/compiler/OutputASM.h b/src/OpenGL/compiler/OutputASM.h
index 83d2e62..2329cf5 100644
--- a/src/OpenGL/compiler/OutputASM.h
+++ b/src/OpenGL/compiler/OutputASM.h
@@ -60,7 +60,7 @@
GLenum precision;
std::string name;
int arraySize;
-
+
int registerIndex;
int blockId;
@@ -141,7 +141,7 @@
std::string name;
int arraySize;
int location;
-
+
int registerIndex;
};
@@ -205,7 +205,7 @@
TIntermSequence *arg;
TIntermTyped *ret;
};
-
+
typedef sw::Shader::Instruction Instruction;
class Temporary;
@@ -348,8 +348,7 @@
TParseContext &mContext;
};
- // Checks whether a loop can run for a variable number of iterations
- class DetectLoopDiscontinuity : public TIntermTraverser
+ class LoopUnrollable : public TIntermTraverser
{
public:
bool traverse(TIntermNode *node);
@@ -360,7 +359,7 @@
bool visitAggregate(Visit visit, TIntermAggregate *node);
int loopDepth;
- bool loopDiscontinuity;
+ bool loopUnrollable;
};
}