Commit 37ed908c by Nicolas Capens

Eliminate "false" basic block when no Else clause.

Bug swiftshader:13 Change-Id: I5dd2ce4ddf1eaf0ec2fc732d022ccad2331e6b6b Reviewed-on: https://swiftshader-review.googlesource.com/8070Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-on: https://swiftshader-review.googlesource.com/8230Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com>
parent 8884a235
...@@ -69,8 +69,6 @@ namespace ...@@ -69,8 +69,6 @@ namespace
llvm::Function *function = nullptr; llvm::Function *function = nullptr;
sw::BackoffLock codegenMutex; sw::BackoffLock codegenMutex;
sw::BasicBlock *falseBB = nullptr;
} }
namespace sw namespace sw
...@@ -6717,28 +6715,6 @@ namespace sw ...@@ -6717,28 +6715,6 @@ namespace sw
return true; return true;
} }
void endIf(BasicBlock *falseBB)
{
::falseBB = falseBB;
}
bool elseBlock(BasicBlock *falseBB)
{
assert(falseBB && "Else not preceded by If");
falseBB->back().eraseFromParent();
Nucleus::setInsertBlock(falseBB);
return true;
}
BasicBlock *beginElse()
{
BasicBlock *falseBB = ::falseBB;
::falseBB = nullptr;
return falseBB;
}
RValue<Long> Ticks() RValue<Long> Ticks()
{ {
llvm::Function *rdtsc = Intrinsic::getDeclaration(::module, Intrinsic::readcyclecounter); llvm::Function *rdtsc = Intrinsic::getDeclaration(::module, Intrinsic::readcyclecounter);
......
...@@ -2226,129 +2226,6 @@ namespace sw ...@@ -2226,129 +2226,6 @@ namespace sw
// const Array<T> &operator--(const Array<T> &val); // Pre-decrement // const Array<T> &operator--(const Array<T> &val); // Pre-decrement
bool branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB); bool branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB);
void endIf(BasicBlock *falseBB);
bool elseBlock(BasicBlock *falseBB);
BasicBlock *beginElse();
class ForData
{
public:
ForData(bool init) : loopOnce(init)
{
}
operator bool()
{
return loopOnce;
}
bool operator=(bool value)
{
return loopOnce = value;
}
bool setup()
{
if(Nucleus::getInsertBlock() != endBB)
{
testBB = Nucleus::createBasicBlock();
Nucleus::createBr(testBB);
Nucleus::setInsertBlock(testBB);
return true;
}
return false;
}
bool test(RValue<Bool> cmp)
{
BasicBlock *bodyBB = Nucleus::createBasicBlock();
endBB = Nucleus::createBasicBlock();
Nucleus::createCondBr(cmp.value, bodyBB, endBB);
Nucleus::setInsertBlock(bodyBB);
return true;
}
void end()
{
Nucleus::createBr(testBB);
Nucleus::setInsertBlock(endBB);
}
private:
BasicBlock *testBB = nullptr;
BasicBlock *endBB = nullptr;
bool loopOnce = true;
};
class IfData
{
public:
IfData(RValue<Bool> cmp) : loopOnce(true)
{
trueBB = Nucleus::createBasicBlock();
falseBB = Nucleus::createBasicBlock();
endBB = Nucleus::createBasicBlock();
branch(cmp, trueBB, falseBB);
}
operator bool()
{
return loopOnce;
}
bool operator=(bool value)
{
Nucleus::createBr(endBB);
Nucleus::setInsertBlock(falseBB);
Nucleus::createBr(endBB);
Nucleus::setInsertBlock(endBB);
endIf(falseBB);
return loopOnce = value;
}
private:
BasicBlock *trueBB;
BasicBlock *falseBB;
BasicBlock *endBB;
bool loopOnce;
};
class ElseData
{
public:
ElseData(bool init) : loopOnce(init)
{
elseBB = beginElse();
endBB = Nucleus::getInsertBlock();
elseBlock(elseBB);
}
operator bool()
{
return loopOnce;
}
bool operator=(bool value)
{
Nucleus::createBr(endBB);
Nucleus::setInsertBlock(endBB);
return loopOnce = value;
}
private:
BasicBlock *elseBB;
BasicBlock *endBB;
bool loopOnce;
};
void Return(); void Return();
void Return(bool ret); void Return(bool ret);
...@@ -2942,6 +2819,115 @@ namespace sw ...@@ -2942,6 +2819,115 @@ namespace sw
return ReinterpretCast<T>(val); return ReinterpretCast<T>(val);
} }
class ForData
{
public:
ForData(bool init) : loopOnce(init)
{
}
operator bool()
{
return loopOnce;
}
bool operator=(bool value)
{
return loopOnce = value;
}
bool setup()
{
if(Nucleus::getInsertBlock() != endBB)
{
testBB = Nucleus::createBasicBlock();
Nucleus::createBr(testBB);
Nucleus::setInsertBlock(testBB);
return true;
}
return false;
}
bool test(RValue<Bool> cmp)
{
BasicBlock *bodyBB = Nucleus::createBasicBlock();
endBB = Nucleus::createBasicBlock();
Nucleus::createCondBr(cmp.value, bodyBB, endBB);
Nucleus::setInsertBlock(bodyBB);
return true;
}
void end()
{
Nucleus::createBr(testBB);
Nucleus::setInsertBlock(endBB);
}
private:
BasicBlock *testBB = nullptr;
BasicBlock *endBB = nullptr;
bool loopOnce = true;
};
class IfElseData
{
public:
IfElseData(RValue<Bool> cmp) : iteration(0)
{
condition = cmp.value;
beginBB = Nucleus::getInsertBlock();
trueBB = Nucleus::createBasicBlock();
falseBB = nullptr;
endBB = Nucleus::createBasicBlock();
Nucleus::setInsertBlock(trueBB);
}
~IfElseData()
{
Nucleus::createBr(endBB);
Nucleus::setInsertBlock(beginBB);
Nucleus::createCondBr(condition, trueBB, falseBB ? falseBB : endBB);
Nucleus::setInsertBlock(endBB);
}
operator int()
{
return iteration;
}
IfElseData &operator++()
{
++iteration;
return *this;
}
void elseClause()
{
Nucleus::createBr(endBB);
falseBB = Nucleus::createBasicBlock();
Nucleus::setInsertBlock(falseBB);
}
private:
Value *condition;
BasicBlock *beginBB;
BasicBlock *trueBB;
BasicBlock *falseBB;
BasicBlock *endBB;
int iteration;
};
#define For(init, cond, inc) \ #define For(init, cond, inc) \
for(ForData for__ = true; for__; for__ = false) \ for(ForData for__ = true; for__; for__ = false) \
for(init; for__.setup() && for__.test(cond); inc, for__.end()) for(init; for__.setup() && for__.test(cond); inc, for__.end())
...@@ -2960,11 +2946,18 @@ namespace sw ...@@ -2960,11 +2946,18 @@ namespace sw
Nucleus::setInsertBlock(end__); \ Nucleus::setInsertBlock(end__); \
} }
#define If(cond) \ enum {IF_BLOCK__, ELSE_CLAUSE__, ELSE_BLOCK__, IFELSE_NUM__};
for(IfData if__ = cond; if__; if__ = false)
#define If(cond) \
for(IfElseData ifElse__(cond); ifElse__ < IFELSE_NUM__; ++ifElse__) \
if(ifElse__ == IF_BLOCK__)
#define Else \ #define Else \
for(ElseData else__ = true; else__; else__ = false) else if(ifElse__ == ELSE_CLAUSE__) \
{ \
ifElse__.elseClause(); \
} \
else // ELSE_BLOCK__
} }
#endif // sw_Reactor_hpp #endif // sw_Reactor_hpp
...@@ -47,8 +47,6 @@ namespace ...@@ -47,8 +47,6 @@ namespace
std::mutex codegenMutex; std::mutex codegenMutex;
sw::BasicBlock *falseBB = nullptr;
Ice::ELFFileStreamer *elfFile = nullptr; Ice::ELFFileStreamer *elfFile = nullptr;
Ice::Fdstream *out = nullptr; Ice::Fdstream *out = nullptr;
} }
...@@ -6531,31 +6529,8 @@ namespace sw ...@@ -6531,31 +6529,8 @@ namespace sw
return true; 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() RValue<Long> Ticks()
{ {
assert(false && "UNIMPLEMENTED"); return RValue<Long>(V(nullptr)); assert(false && "UNIMPLEMENTED"); return RValue<Long>(V(nullptr));
} }
} }
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