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
if(unroll)
{
DetectLoopDiscontinuity detectLoopDiscontinuity;
unroll = !detectLoopDiscontinuity.traverse(node);
LoopUnrollable loopUnrollable;
unroll = loopUnrollable.traverse(node);
}
TIntermNode *init = node->getInit();
......@@ -3506,17 +3506,17 @@ namespace glsl
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 @@ namespace glsl
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 @@ namespace glsl
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;
}
}
......@@ -60,7 +60,7 @@ namespace glsl
GLenum precision;
std::string name;
int arraySize;
int registerIndex;
int blockId;
......@@ -141,7 +141,7 @@ namespace glsl
std::string name;
int arraySize;
int location;
int registerIndex;
};
......@@ -205,7 +205,7 @@ namespace glsl
TIntermSequence *arg;
TIntermTyped *ret;
};
typedef sw::Shader::Instruction Instruction;
class Temporary;
......@@ -348,8 +348,7 @@ namespace glsl
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 @@ namespace glsl
bool visitAggregate(Visit visit, TIntermAggregate *node);
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