Commit c8b67a48 by Nicolas Capens

Abstract llvm::BasicBlock usage.

Bug swiftshader:10 Change-Id: Ib45d459aa4f68e572b1deaa03e0aaf83002b7881 Reviewed-on: https://swiftshader-review.googlesource.com/7275Tested-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 ac230129
......@@ -75,9 +75,8 @@ namespace sw
Optimization optimization[10] = {InstructionCombining, Disabled};
class Type : public llvm::Type
{
};
class Type : public llvm::Type {};
class BasicBlock : public llvm::BasicBlock {};
inline Type *T(llvm::Type *t)
{
......@@ -89,6 +88,11 @@ namespace sw
return reinterpret_cast<std::vector<llvm::Type*>&>(t);
}
inline BasicBlock *B(llvm::BasicBlock *t)
{
return reinterpret_cast<BasicBlock*>(t);
}
Nucleus::Nucleus()
{
codegenMutex.lock(); // Reactor and LLVM are currently not thread safe
......@@ -240,7 +244,7 @@ namespace sw
Value *Nucleus::allocateStackVariable(Type *type, int arraySize)
{
// Need to allocate it in the entry block for mem2reg to work
BasicBlock &entryBlock = ::function->getEntryBlock();
llvm::BasicBlock &entryBlock = ::function->getEntryBlock();
Instruction *declaration;
......@@ -260,12 +264,12 @@ namespace sw
BasicBlock *Nucleus::createBasicBlock()
{
return BasicBlock::Create(*::context, "", ::function);
return B(BasicBlock::Create(*::context, "", ::function));
}
BasicBlock *Nucleus::getInsertBlock()
{
return ::builder->GetInsertBlock();
return B(::builder->GetInsertBlock());
}
void Nucleus::setInsertBlock(BasicBlock *basicBlock)
......@@ -276,7 +280,7 @@ namespace sw
BasicBlock *Nucleus::getPredecessor(BasicBlock *basicBlock)
{
return *pred_begin(basicBlock);
return B(*pred_begin(basicBlock));
}
void Nucleus::createFunction(Type *ReturnType, std::vector<Type*> &Params)
......@@ -680,12 +684,12 @@ namespace sw
return ::builder->CreateSelect(C, ifTrue, ifFalse);
}
Value *Nucleus::createSwitch(llvm::Value *V, llvm::BasicBlock *Dest, unsigned NumCases)
Value *Nucleus::createSwitch(llvm::Value *V, BasicBlock *Dest, unsigned NumCases)
{
return ::builder->CreateSwitch(V, Dest, NumCases);
}
void Nucleus::addSwitchCase(llvm::Value *Switch, int Case, llvm::BasicBlock *Branch)
void Nucleus::addSwitchCase(llvm::Value *Switch, int Case, BasicBlock *Branch)
{
static_cast<SwitchInst*>(Switch)->addCase(llvm::ConstantInt::get(Type::getInt32Ty(*::context), Case, true), Branch);
}
......
......@@ -32,12 +32,12 @@ namespace llvm
{
class Value;
class Constant;
class BasicBlock;
}
namespace sw
{
class Type;
class BasicBlock;
enum Optimization
{
......@@ -71,10 +71,10 @@ namespace sw
Routine *acquireRoutine(const wchar_t *name, bool runOptimizations = true);
static llvm::Value *allocateStackVariable(Type *type, int arraySize = 0);
static llvm::BasicBlock *createBasicBlock();
static llvm::BasicBlock *getInsertBlock();
static void setInsertBlock(llvm::BasicBlock *basicBlock);
static llvm::BasicBlock *getPredecessor(llvm::BasicBlock *basicBlock);
static BasicBlock *createBasicBlock();
static BasicBlock *getInsertBlock();
static void setInsertBlock(BasicBlock *basicBlock);
static BasicBlock *getPredecessor(BasicBlock *basicBlock);
static void createFunction(Type *ReturnType, std::vector<Type*> &Params);
static llvm::Value *getArgument(unsigned int index);
......@@ -82,8 +82,8 @@ namespace sw
// Terminators
static llvm::Value *createRetVoid();
static llvm::Value *createRet(llvm::Value *V);
static llvm::Value *createBr(llvm::BasicBlock *dest);
static llvm::Value *createCondBr(llvm::Value *cond, llvm::BasicBlock *ifTrue, llvm::BasicBlock *ifFalse);
static llvm::Value *createBr(BasicBlock *dest);
static llvm::Value *createCondBr(llvm::Value *cond, BasicBlock *ifTrue, BasicBlock *ifFalse);
// Binary operators
static llvm::Value *createAdd(llvm::Value *lhs, llvm::Value *rhs);
......@@ -171,8 +171,8 @@ namespace sw
// Other instructions
static llvm::Value *createSelect(llvm::Value *C, llvm::Value *ifTrue, llvm::Value *ifFalse);
static llvm::Value *createSwitch(llvm::Value *V, llvm::BasicBlock *Dest, unsigned NumCases);
static void addSwitchCase(llvm::Value *Switch, int Case, llvm::BasicBlock *Branch);
static llvm::Value *createSwitch(llvm::Value *V, BasicBlock *Dest, unsigned NumCases);
static void addSwitchCase(llvm::Value *Switch, int Case, BasicBlock *Branch);
static llvm::Value *createUnreachable();
// Derived instructions
......@@ -2451,9 +2451,9 @@ namespace sw
// RValue<Array<T>> operator--(const Array<T> &val, int); // Post-decrement
// const Array<T> &operator--(const Array<T> &val); // Pre-decrement
llvm::BasicBlock *beginLoop();
bool branch(RValue<Bool> cmp, llvm::BasicBlock *bodyBB, llvm::BasicBlock *endBB);
bool elseBlock(llvm::BasicBlock *falseBB);
BasicBlock *beginLoop();
bool branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB);
bool elseBlock(BasicBlock *falseBB);
void Return();
void Return(bool ret);
......
......@@ -19,7 +19,7 @@ namespace sw
{
#define For(init, cond, inc) \
init; \
for(llvm::BasicBlock *loopBB__ = beginLoop(), \
for(BasicBlock *loopBB__ = beginLoop(), \
*bodyBB__ = Nucleus::createBasicBlock(), \
*endBB__ = Nucleus::createBasicBlock(), \
*onceBB__ = endBB__; \
......@@ -30,18 +30,18 @@ namespace sw
#define Do \
{ \
llvm::BasicBlock *body = Nucleus::createBasicBlock(); \
BasicBlock *body = Nucleus::createBasicBlock(); \
Nucleus::createBr(body); \
Nucleus::setInsertBlock(body);
#define Until(cond) \
llvm::BasicBlock *end = Nucleus::createBasicBlock(); \
BasicBlock *end = Nucleus::createBasicBlock(); \
Nucleus::createCondBr((cond).value, end, body); \
Nucleus::setInsertBlock(end); \
}
#define If(cond) \
for(llvm::BasicBlock *trueBB__ = Nucleus::createBasicBlock(), \
for(BasicBlock *trueBB__ = Nucleus::createBasicBlock(), \
*falseBB__ = Nucleus::createBasicBlock(), \
*endBB__ = Nucleus::createBasicBlock(), \
*onceBB__ = endBB__; \
......@@ -49,7 +49,7 @@ namespace sw
onceBB__ = 0, Nucleus::createBr(endBB__), Nucleus::setInsertBlock(falseBB__), Nucleus::createBr(endBB__), Nucleus::setInsertBlock(endBB__))
#define Else \
for(llvm::BasicBlock *endBB__ = Nucleus::getInsertBlock(), \
for(BasicBlock *endBB__ = Nucleus::getInsertBlock(), \
*falseBB__ = Nucleus::getPredecessor(endBB__), \
*onceBB__ = endBB__; \
onceBB__ && elseBlock(falseBB__); \
......
......@@ -1238,8 +1238,8 @@ namespace sw
void PixelProgram::BREAK()
{
llvm::BasicBlock *deadBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *endBlock = loopRepEndBlock[loopRepDepth - 1];
BasicBlock *deadBlock = Nucleus::createBasicBlock();
BasicBlock *endBlock = loopRepEndBlock[loopRepDepth - 1];
if(breakDepth == 0)
{
......@@ -1294,8 +1294,8 @@ namespace sw
{
condition &= enableStack[enableIndex];
llvm::BasicBlock *continueBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *endBlock = loopRepEndBlock[loopRepDepth - 1];
BasicBlock *continueBlock = Nucleus::createBasicBlock();
BasicBlock *endBlock = loopRepEndBlock[loopRepDepth - 1];
enableBreak = enableBreak & ~condition;
Bool allBreak = SignMask(enableBreak) == 0x0;
......@@ -1414,8 +1414,8 @@ namespace sw
{
ifDepth--;
llvm::BasicBlock *falseBlock = ifFalseBlock[ifDepth];
llvm::BasicBlock *endBlock = Nucleus::createBasicBlock();
BasicBlock *falseBlock = ifFalseBlock[ifDepth];
BasicBlock *endBlock = Nucleus::createBasicBlock();
if(isConditionalIf[ifDepth])
{
......@@ -1441,7 +1441,7 @@ namespace sw
{
ifDepth--;
llvm::BasicBlock *endBlock = ifFalseBlock[ifDepth];
BasicBlock *endBlock = ifFalseBlock[ifDepth];
Nucleus::createBr(endBlock);
Nucleus::setInsertBlock(endBlock);
......@@ -1459,8 +1459,8 @@ namespace sw
aL[loopDepth] = aL[loopDepth] + increment[loopDepth]; // FIXME: +=
llvm::BasicBlock *testBlock = loopRepTestBlock[loopRepDepth];
llvm::BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
BasicBlock *testBlock = loopRepTestBlock[loopRepDepth];
BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
Nucleus::createBr(testBlock);
Nucleus::setInsertBlock(endBlock);
......@@ -1473,8 +1473,8 @@ namespace sw
{
loopRepDepth--;
llvm::BasicBlock *testBlock = loopRepTestBlock[loopRepDepth];
llvm::BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
BasicBlock *testBlock = loopRepTestBlock[loopRepDepth];
BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
Nucleus::createBr(testBlock);
Nucleus::setInsertBlock(endBlock);
......@@ -1487,8 +1487,8 @@ namespace sw
{
loopRepDepth--;
llvm::BasicBlock *testBlock = loopRepTestBlock[loopRepDepth];
llvm::BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
BasicBlock *testBlock = loopRepTestBlock[loopRepDepth];
BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
Nucleus::createBr(testBlock);
Nucleus::setInsertBlock(endBlock);
......@@ -1502,7 +1502,7 @@ namespace sw
{
loopRepDepth--;
llvm::BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
Nucleus::createBr(loopRepEndBlock[loopRepDepth]);
Nucleus::setInsertBlock(endBlock);
......@@ -1539,8 +1539,8 @@ namespace sw
condition = !condition;
}
llvm::BasicBlock *trueBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *falseBlock = Nucleus::createBasicBlock();
BasicBlock *trueBlock = Nucleus::createBasicBlock();
BasicBlock *falseBlock = Nucleus::createBasicBlock();
branch(condition, trueBlock, falseBlock);
......@@ -1588,8 +1588,8 @@ namespace sw
enableIndex++;
enableStack[enableIndex] = condition;
llvm::BasicBlock *trueBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *falseBlock = Nucleus::createBasicBlock();
BasicBlock *trueBlock = Nucleus::createBasicBlock();
BasicBlock *falseBlock = Nucleus::createBasicBlock();
Bool notAllFalse = SignMask(condition) != 0;
......@@ -1626,9 +1626,9 @@ namespace sw
// increment[loopDepth] = 1;
// }
llvm::BasicBlock *loopBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *testBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *endBlock = Nucleus::createBasicBlock();
BasicBlock *loopBlock = Nucleus::createBasicBlock();
BasicBlock *testBlock = Nucleus::createBasicBlock();
BasicBlock *endBlock = Nucleus::createBasicBlock();
loopRepTestBlock[loopRepDepth] = testBlock;
loopRepEndBlock[loopRepDepth] = endBlock;
......@@ -1653,9 +1653,9 @@ namespace sw
iteration[loopDepth] = *Pointer<Int>(data + OFFSET(DrawData, ps.i[integerRegister.index][0]));
aL[loopDepth] = aL[loopDepth - 1];
llvm::BasicBlock *loopBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *testBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *endBlock = Nucleus::createBasicBlock();
BasicBlock *loopBlock = Nucleus::createBasicBlock();
BasicBlock *testBlock = Nucleus::createBasicBlock();
BasicBlock *endBlock = Nucleus::createBasicBlock();
loopRepTestBlock[loopRepDepth] = testBlock;
loopRepEndBlock[loopRepDepth] = endBlock;
......@@ -1677,9 +1677,9 @@ namespace sw
{
enableIndex++;
llvm::BasicBlock *loopBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *testBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *endBlock = Nucleus::createBasicBlock();
BasicBlock *loopBlock = Nucleus::createBasicBlock();
BasicBlock *testBlock = Nucleus::createBasicBlock();
BasicBlock *endBlock = Nucleus::createBasicBlock();
loopRepTestBlock[loopRepDepth] = testBlock;
loopRepEndBlock[loopRepDepth] = endBlock;
......@@ -1715,7 +1715,7 @@ namespace sw
enableIndex++;
enableStack[enableIndex] = Int4(0xFFFFFFFF);
llvm::BasicBlock *endBlock = Nucleus::createBasicBlock();
BasicBlock *endBlock = Nucleus::createBasicBlock();
loopRepTestBlock[loopRepDepth] = nullptr;
loopRepEndBlock[loopRepDepth] = endBlock;
......@@ -1733,7 +1733,7 @@ namespace sw
}
else
{
llvm::BasicBlock *unreachableBlock = Nucleus::createBasicBlock();
BasicBlock *unreachableBlock = Nucleus::createBasicBlock();
if(callRetBlock[currentLabel].size() > 1) // Pop the return destination from the call stack
{
......
......@@ -156,13 +156,12 @@ namespace sw
int currentLabel;
bool whileTest;
// FIXME: Get rid of llvm::
llvm::BasicBlock *ifFalseBlock[24 + 24];
llvm::BasicBlock *loopRepTestBlock[4];
llvm::BasicBlock *loopRepEndBlock[4];
llvm::BasicBlock *labelBlock[2048];
std::vector<llvm::BasicBlock*> callRetBlock[2048];
llvm::BasicBlock *returnBlock;
BasicBlock *ifFalseBlock[24 + 24];
BasicBlock *loopRepTestBlock[4];
BasicBlock *loopRepEndBlock[4];
BasicBlock *labelBlock[2048];
std::vector<BasicBlock*> callRetBlock[2048];
BasicBlock *returnBlock;
bool isConditionalIf[24 + 24];
};
}
......
......@@ -999,8 +999,8 @@ namespace sw
void VertexProgram::BREAK()
{
llvm::BasicBlock *deadBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *endBlock = loopRepEndBlock[loopRepDepth - 1];
BasicBlock *deadBlock = Nucleus::createBasicBlock();
BasicBlock *endBlock = loopRepEndBlock[loopRepDepth - 1];
if(breakDepth == 0)
{
......@@ -1055,8 +1055,8 @@ namespace sw
{
condition &= enableStack[enableIndex];
llvm::BasicBlock *continueBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *endBlock = loopRepEndBlock[loopRepDepth - 1];
BasicBlock *continueBlock = Nucleus::createBasicBlock();
BasicBlock *endBlock = loopRepEndBlock[loopRepDepth - 1];
enableBreak = enableBreak & ~condition;
Bool allBreak = SignMask(enableBreak) == 0x0;
......@@ -1175,8 +1175,8 @@ namespace sw
{
ifDepth--;
llvm::BasicBlock *falseBlock = ifFalseBlock[ifDepth];
llvm::BasicBlock *endBlock = Nucleus::createBasicBlock();
BasicBlock *falseBlock = ifFalseBlock[ifDepth];
BasicBlock *endBlock = Nucleus::createBasicBlock();
if(isConditionalIf[ifDepth])
{
......@@ -1202,7 +1202,7 @@ namespace sw
{
ifDepth--;
llvm::BasicBlock *endBlock = ifFalseBlock[ifDepth];
BasicBlock *endBlock = ifFalseBlock[ifDepth];
Nucleus::createBr(endBlock);
Nucleus::setInsertBlock(endBlock);
......@@ -1220,8 +1220,8 @@ namespace sw
aL[loopDepth] = aL[loopDepth] + increment[loopDepth]; // FIXME: +=
llvm::BasicBlock *testBlock = loopRepTestBlock[loopRepDepth];
llvm::BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
BasicBlock *testBlock = loopRepTestBlock[loopRepDepth];
BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
Nucleus::createBr(testBlock);
Nucleus::setInsertBlock(endBlock);
......@@ -1234,8 +1234,8 @@ namespace sw
{
loopRepDepth--;
llvm::BasicBlock *testBlock = loopRepTestBlock[loopRepDepth];
llvm::BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
BasicBlock *testBlock = loopRepTestBlock[loopRepDepth];
BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
Nucleus::createBr(testBlock);
Nucleus::setInsertBlock(endBlock);
......@@ -1248,8 +1248,8 @@ namespace sw
{
loopRepDepth--;
llvm::BasicBlock *testBlock = loopRepTestBlock[loopRepDepth];
llvm::BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
BasicBlock *testBlock = loopRepTestBlock[loopRepDepth];
BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
Nucleus::createBr(testBlock);
Nucleus::setInsertBlock(endBlock);
......@@ -1263,7 +1263,7 @@ namespace sw
{
loopRepDepth--;
llvm::BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
Nucleus::createBr(loopRepEndBlock[loopRepDepth]);
Nucleus::setInsertBlock(endBlock);
......@@ -1300,8 +1300,8 @@ namespace sw
condition = !condition;
}
llvm::BasicBlock *trueBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *falseBlock = Nucleus::createBasicBlock();
BasicBlock *trueBlock = Nucleus::createBasicBlock();
BasicBlock *falseBlock = Nucleus::createBasicBlock();
branch(condition, trueBlock, falseBlock);
......@@ -1349,8 +1349,8 @@ namespace sw
enableIndex++;
enableStack[enableIndex] = condition;
llvm::BasicBlock *trueBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *falseBlock = Nucleus::createBasicBlock();
BasicBlock *trueBlock = Nucleus::createBasicBlock();
BasicBlock *falseBlock = Nucleus::createBasicBlock();
Bool notAllFalse = SignMask(condition) != 0;
......@@ -1388,9 +1388,9 @@ namespace sw
increment[loopDepth] = 1;
}
llvm::BasicBlock *loopBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *testBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *endBlock = Nucleus::createBasicBlock();
BasicBlock *loopBlock = Nucleus::createBasicBlock();
BasicBlock *testBlock = Nucleus::createBasicBlock();
BasicBlock *endBlock = Nucleus::createBasicBlock();
loopRepTestBlock[loopRepDepth] = testBlock;
loopRepEndBlock[loopRepDepth] = endBlock;
......@@ -1415,9 +1415,9 @@ namespace sw
iteration[loopDepth] = *Pointer<Int>(data + OFFSET(DrawData,vs.i[integerRegister.index][0]));
aL[loopDepth] = aL[loopDepth - 1];
llvm::BasicBlock *loopBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *testBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *endBlock = Nucleus::createBasicBlock();
BasicBlock *loopBlock = Nucleus::createBasicBlock();
BasicBlock *testBlock = Nucleus::createBasicBlock();
BasicBlock *endBlock = Nucleus::createBasicBlock();
loopRepTestBlock[loopRepDepth] = testBlock;
loopRepEndBlock[loopRepDepth] = endBlock;
......@@ -1439,9 +1439,9 @@ namespace sw
{
enableIndex++;
llvm::BasicBlock *loopBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *testBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *endBlock = Nucleus::createBasicBlock();
BasicBlock *loopBlock = Nucleus::createBasicBlock();
BasicBlock *testBlock = Nucleus::createBasicBlock();
BasicBlock *endBlock = Nucleus::createBasicBlock();
loopRepTestBlock[loopRepDepth] = testBlock;
loopRepEndBlock[loopRepDepth] = endBlock;
......@@ -1477,7 +1477,7 @@ namespace sw
enableIndex++;
enableStack[enableIndex] = Int4(0xFFFFFFFF);
llvm::BasicBlock *endBlock = Nucleus::createBasicBlock();
BasicBlock *endBlock = Nucleus::createBasicBlock();
loopRepTestBlock[loopRepDepth] = nullptr;
loopRepEndBlock[loopRepDepth] = endBlock;
......@@ -1495,7 +1495,7 @@ namespace sw
}
else
{
llvm::BasicBlock *unreachableBlock = Nucleus::createBasicBlock();
BasicBlock *unreachableBlock = Nucleus::createBasicBlock();
if(callRetBlock[currentLabel].size() > 1) // Pop the return destination from the call stack
{
......
......@@ -126,13 +126,12 @@ namespace sw
int currentLabel;
bool whileTest;
// FIXME: Get rid of llvm::
llvm::BasicBlock *ifFalseBlock[24 + 24];
llvm::BasicBlock *loopRepTestBlock[4];
llvm::BasicBlock *loopRepEndBlock[4];
llvm::BasicBlock *labelBlock[2048];
std::vector<llvm::BasicBlock*> callRetBlock[2048];
llvm::BasicBlock *returnBlock;
BasicBlock *ifFalseBlock[24 + 24];
BasicBlock *loopRepTestBlock[4];
BasicBlock *loopRepEndBlock[4];
BasicBlock *labelBlock[2048];
std::vector<BasicBlock*> callRetBlock[2048];
BasicBlock *returnBlock;
bool isConditionalIf[24 + 24];
};
}
......
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