Commit c7f17838 by Nicolas Capens

Limit loop init scope to till end of loop.

Bug swiftshader:13 Change-Id: I03cdbb3e5ea28643eb941e162125da68d183d1c6 Reviewed-on: https://swiftshader-review.googlesource.com/7810Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent 19e6eec2
...@@ -6718,16 +6718,6 @@ namespace sw ...@@ -6718,16 +6718,6 @@ namespace sw
Nucleus::createUnreachable(); Nucleus::createUnreachable();
} }
BasicBlock *beginLoop()
{
BasicBlock *loopBB = Nucleus::createBasicBlock();
Nucleus::createBr(loopBB);
Nucleus::setInsertBlock(loopBB);
return loopBB;
}
bool branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB) bool branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB)
{ {
Nucleus::createCondBr(cmp.value, bodyBB, endBB); Nucleus::createCondBr(cmp.value, bodyBB, endBB);
......
...@@ -290,11 +290,18 @@ TEST(SubzeroReactorTest, Branching) ...@@ -290,11 +290,18 @@ TEST(SubzeroReactorTest, Branching)
x += 10000; x += 10000;
} }
For(Int j = 0, j < 2, j++) For(Int i = 0, i < 10, i++)
If(x == 402222) for(int i = 0; i < 10; i++)
{ For(Int i = 0, i < 10, i++)
If(x != 402222) {
x += 1000000; x += 1000000;
}
For(Int i = 0, i < 2, i++)
If(x == 1000402222)
{
If(x != 1000402222)
x += 1000000000;
} }
Else Else
x = -5; x = -5;
...@@ -309,7 +316,7 @@ TEST(SubzeroReactorTest, Branching) ...@@ -309,7 +316,7 @@ TEST(SubzeroReactorTest, Branching)
int(*callable)() = (int(*)())routine->getEntry(); int(*callable)() = (int(*)())routine->getEntry();
int result = callable(); int result = callable();
EXPECT_EQ(result, 402222); EXPECT_EQ(result, 1000402222);
} }
} }
......
...@@ -2225,7 +2225,60 @@ namespace sw ...@@ -2225,7 +2225,60 @@ namespace sw
// RValue<Array<T>> operator--(const Array<T> &val, int); // Post-decrement // RValue<Array<T>> operator--(const Array<T> &val, int); // Post-decrement
// const Array<T> &operator--(const Array<T> &val); // Pre-decrement // const Array<T> &operator--(const Array<T> &val); // Pre-decrement
BasicBlock *beginLoop(); struct Loop
{
Loop(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;
};
bool branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB); bool branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB);
void endIf(BasicBlock *falseBB); void endIf(BasicBlock *falseBB);
bool elseBlock(BasicBlock *falseBB); bool elseBlock(BasicBlock *falseBB);
...@@ -2817,27 +2870,24 @@ namespace sw ...@@ -2817,27 +2870,24 @@ namespace sw
return ReinterpretCast<T>(val); return ReinterpretCast<T>(val);
} }
#define For(init, cond, inc) \ extern BasicBlock *falseBB__;
init; \
for(BasicBlock *loopBB__ = beginLoop(), \ #define For(init, cond, inc) \
*bodyBB__ = Nucleus::createBasicBlock(), \ for(Loop loop__ = true; loop__; loop__ = false) \
*endBB__ = Nucleus::createBasicBlock(), \ for(init; loop__.setup() && loop__.test(cond); inc, loop__.end())
*onceBB__ = endBB__; \
onceBB__ && branch(cond, bodyBB__, endBB__); \
inc, onceBB__ = 0, Nucleus::createBr(loopBB__), Nucleus::setInsertBlock(endBB__))
#define While(cond) For(((void*)0), cond, ((void*)0)) #define While(cond) For((void)0, cond, (void)0)
#define Do \ #define Do \
{ \ { \
BasicBlock *body = Nucleus::createBasicBlock(); \ BasicBlock *body__ = Nucleus::createBasicBlock(); \
Nucleus::createBr(body); \ Nucleus::createBr(body__); \
Nucleus::setInsertBlock(body); Nucleus::setInsertBlock(body__);
#define Until(cond) \ #define Until(cond) \
BasicBlock *end = Nucleus::createBasicBlock(); \ BasicBlock *end__ = Nucleus::createBasicBlock(); \
Nucleus::createCondBr((cond).value, end, body); \ Nucleus::createCondBr((cond).value, end__, body__); \
Nucleus::setInsertBlock(end); \ Nucleus::setInsertBlock(end__); \
} }
#define If(cond) \ #define If(cond) \
......
...@@ -6147,16 +6147,6 @@ namespace sw ...@@ -6147,16 +6147,6 @@ namespace sw
Nucleus::createUnreachable(); Nucleus::createUnreachable();
} }
BasicBlock *beginLoop()
{
BasicBlock *loopBB = Nucleus::createBasicBlock();
Nucleus::createBr(loopBB);
Nucleus::setInsertBlock(loopBB);
return loopBB;
}
bool branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB) bool branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB)
{ {
Nucleus::createCondBr(cmp.value, bodyBB, endBB); Nucleus::createCondBr(cmp.value, bodyBB, endBB);
......
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