Commit cce6c4e1 by Nicolas Capens

Fix unrolling loops with return statements.

Change-Id: I8974a6bb4137d1dfad9f5dd3a92cc9306c38294c Reviewed-on: https://swiftshader-review.googlesource.com/5184Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent c3648898
...@@ -1624,8 +1624,8 @@ namespace glsl ...@@ -1624,8 +1624,8 @@ namespace glsl
if(unroll) if(unroll)
{ {
DetectLoopDiscontinuity detectLoopDiscontinuity; LoopUnrollable loopUnrollable;
unroll = !detectLoopDiscontinuity.traverse(node); unroll = loopUnrollable.traverse(node);
} }
TIntermNode *init = node->getInit(); TIntermNode *init = node->getInit();
...@@ -3506,17 +3506,17 @@ namespace glsl ...@@ -3506,17 +3506,17 @@ namespace glsl
return ~0u; return ~0u;
} }
bool DetectLoopDiscontinuity::traverse(TIntermNode *node) bool LoopUnrollable::traverse(TIntermNode *node)
{ {
loopDepth = 0; loopDepth = 0;
loopDiscontinuity = false; loopUnrollable = true;
node->traverse(this); node->traverse(this);
return loopDiscontinuity; return loopUnrollable;
} }
bool DetectLoopDiscontinuity::visitLoop(Visit visit, TIntermLoop *loop) bool LoopUnrollable::visitLoop(Visit visit, TIntermLoop *loop)
{ {
if(visit == PreVisit) if(visit == PreVisit)
{ {
...@@ -3530,9 +3530,9 @@ namespace glsl ...@@ -3530,9 +3530,9 @@ namespace glsl
return true; return true;
} }
bool DetectLoopDiscontinuity::visitBranch(Visit visit, TIntermBranch *node) bool LoopUnrollable::visitBranch(Visit visit, TIntermBranch *node)
{ {
if(loopDiscontinuity) if(!loopUnrollable)
{ {
return false; return false;
} }
...@@ -3545,20 +3545,20 @@ namespace glsl ...@@ -3545,20 +3545,20 @@ namespace glsl
switch(node->getFlowOp()) switch(node->getFlowOp())
{ {
case EOpKill: case EOpKill:
case EOpReturn:
break; break;
case EOpBreak: case EOpBreak:
case EOpContinue: case EOpContinue:
case EOpReturn: loopUnrollable = false;
loopDiscontinuity = true;
break; break;
default: UNREACHABLE(node->getFlowOp()); 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;
} }
} }
...@@ -60,7 +60,7 @@ namespace glsl ...@@ -60,7 +60,7 @@ namespace glsl
GLenum precision; GLenum precision;
std::string name; std::string name;
int arraySize; int arraySize;
int registerIndex; int registerIndex;
int blockId; int blockId;
...@@ -141,7 +141,7 @@ namespace glsl ...@@ -141,7 +141,7 @@ namespace glsl
std::string name; std::string name;
int arraySize; int arraySize;
int location; int location;
int registerIndex; int registerIndex;
}; };
...@@ -205,7 +205,7 @@ namespace glsl ...@@ -205,7 +205,7 @@ namespace glsl
TIntermSequence *arg; TIntermSequence *arg;
TIntermTyped *ret; TIntermTyped *ret;
}; };
typedef sw::Shader::Instruction Instruction; typedef sw::Shader::Instruction Instruction;
class Temporary; class Temporary;
...@@ -348,8 +348,7 @@ namespace glsl ...@@ -348,8 +348,7 @@ namespace glsl
TParseContext &mContext; TParseContext &mContext;
}; };
// Checks whether a loop can run for a variable number of iterations class LoopUnrollable : public TIntermTraverser
class DetectLoopDiscontinuity : public TIntermTraverser
{ {
public: public:
bool traverse(TIntermNode *node); bool traverse(TIntermNode *node);
...@@ -360,7 +359,7 @@ namespace glsl ...@@ -360,7 +359,7 @@ namespace glsl
bool visitAggregate(Visit visit, TIntermAggregate *node); bool visitAggregate(Visit visit, TIntermAggregate *node);
int loopDepth; int loopDepth;
bool loopDiscontinuity; bool loopUnrollable;
}; };
} }
......
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