Implement Else without using basic block predecessor.

Bug swiftshader:13

Change-Id: Idd49e64aa8415ceb5d1cfee7b65a7d67ea0ebd40
Reviewed-on: https://swiftshader-review.googlesource.com/7792
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-on: https://swiftshader-review.googlesource.com/8143
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
index 98c660e..4ae6dfa 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -47,6 +47,8 @@
 
 	std::mutex codegenMutex;
 
+	sw::BasicBlock *falseBB = nullptr;
+
 	Ice::ELFFileStreamer *elfFile = nullptr;
 	Ice::Fdstream *out = nullptr;
 }
@@ -471,15 +473,10 @@
 
 	void Nucleus::setInsertBlock(BasicBlock *basicBlock)
 	{
-		assert(::basicBlock->getInsts().back().getTerminatorEdges().size() >= 0 && "Previous basic block must have a terminator");
+	//	assert(::basicBlock->getInsts().back().getTerminatorEdges().size() >= 0 && "Previous basic block must have a terminator");
 		::basicBlock = basicBlock;
 	}
 
-	BasicBlock *Nucleus::getPredecessor(BasicBlock *basicBlock)
-	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
-	}
-
 	void Nucleus::createFunction(Type *ReturnType, std::vector<Type*> &Params)
 	{
 		uint32_t sequenceNumber = 0;
@@ -6168,13 +6165,28 @@
 		return true;
 	}
 
+	void endIf(BasicBlock *falseBB)
+	{
+		::falseBB = falseBB;
+	}
+
 	bool elseBlock(BasicBlock *falseBB)
 	{
+		assert(falseBB && "Else not preceded by If");
+		falseBB->getInsts().back().setDeleted();
 		Nucleus::setInsertBlock(falseBB);
 
 		return true;
 	}
 
+	BasicBlock *beginElse()
+	{
+		BasicBlock *falseBB = ::falseBB;
+		::falseBB = nullptr;
+
+		return falseBB;
+	}
+
 	RValue<Long> Ticks()
 	{
 		assert(false && "UNIMPLEMENTED"); return RValue<Long>(V(nullptr));