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;

 	};

 }