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));