53
stmt.cpp
53
stmt.cpp
@@ -675,39 +675,38 @@ IfStmt::emitMaskMixed(FunctionEmitContext *ctx, llvm::Value *oldMask,
|
|||||||
llvm::Value *ltest, llvm::BasicBlock *bDone) const {
|
llvm::Value *ltest, llvm::BasicBlock *bDone) const {
|
||||||
ctx->StartVaryingIf(oldMask);
|
ctx->StartVaryingIf(oldMask);
|
||||||
llvm::BasicBlock *bNext = ctx->CreateBasicBlock("safe_if_after_true");
|
llvm::BasicBlock *bNext = ctx->CreateBasicBlock("safe_if_after_true");
|
||||||
if (trueStmts != NULL) {
|
|
||||||
llvm::BasicBlock *bRunTrue = ctx->CreateBasicBlock("safe_if_run_true");
|
|
||||||
ctx->SetInternalMaskAnd(oldMask, ltest);
|
|
||||||
|
|
||||||
// Do any of the program instances want to run the 'true'
|
llvm::BasicBlock *bRunTrue = ctx->CreateBasicBlock("safe_if_run_true");
|
||||||
// block? If not, jump ahead to bNext.
|
ctx->SetInternalMaskAnd(oldMask, ltest);
|
||||||
llvm::Value *maskAnyQ = ctx->Any(ctx->GetFullMask());
|
|
||||||
ctx->BranchInst(bRunTrue, bNext, maskAnyQ);
|
|
||||||
|
|
||||||
// Emit statements for true
|
// Do any of the program instances want to run the 'true'
|
||||||
ctx->SetCurrentBasicBlock(bRunTrue);
|
// block? If not, jump ahead to bNext.
|
||||||
|
llvm::Value *maskAnyTrueQ = ctx->Any(ctx->GetFullMask());
|
||||||
|
ctx->BranchInst(bRunTrue, bNext, maskAnyTrueQ);
|
||||||
|
|
||||||
|
// Emit statements for true
|
||||||
|
ctx->SetCurrentBasicBlock(bRunTrue);
|
||||||
|
if (trueStmts != NULL)
|
||||||
lEmitIfStatements(ctx, trueStmts, "if: expr mixed, true statements");
|
lEmitIfStatements(ctx, trueStmts, "if: expr mixed, true statements");
|
||||||
AssertPos(pos, ctx->GetCurrentBasicBlock());
|
AssertPos(pos, ctx->GetCurrentBasicBlock());
|
||||||
ctx->BranchInst(bNext);
|
ctx->BranchInst(bNext);
|
||||||
ctx->SetCurrentBasicBlock(bNext);
|
ctx->SetCurrentBasicBlock(bNext);
|
||||||
}
|
|
||||||
if (falseStmts != NULL) {
|
|
||||||
llvm::BasicBlock *bRunFalse = ctx->CreateBasicBlock("safe_if_run_false");
|
|
||||||
bNext = ctx->CreateBasicBlock("safe_if_after_false");
|
|
||||||
ctx->SetInternalMaskAndNot(oldMask, ltest);
|
|
||||||
|
|
||||||
// Similarly, check to see if any of the instances want to
|
// False...
|
||||||
// run the 'false' block...
|
llvm::BasicBlock *bRunFalse = ctx->CreateBasicBlock("safe_if_run_false");
|
||||||
llvm::Value *maskAnyQ = ctx->Any(ctx->GetFullMask());
|
ctx->SetInternalMaskAndNot(oldMask, ltest);
|
||||||
ctx->BranchInst(bRunFalse, bNext, maskAnyQ);
|
|
||||||
|
|
||||||
// Emit code for false
|
// Similarly, check to see if any of the instances want to
|
||||||
ctx->SetCurrentBasicBlock(bRunFalse);
|
// run the 'false' block...
|
||||||
|
llvm::Value *maskAnyFalseQ = ctx->Any(ctx->GetFullMask());
|
||||||
|
ctx->BranchInst(bRunFalse, bDone, maskAnyFalseQ);
|
||||||
|
|
||||||
|
// Emit code for false
|
||||||
|
ctx->SetCurrentBasicBlock(bRunFalse);
|
||||||
|
if (falseStmts)
|
||||||
lEmitIfStatements(ctx, falseStmts, "if: expr mixed, false statements");
|
lEmitIfStatements(ctx, falseStmts, "if: expr mixed, false statements");
|
||||||
AssertPos(pos, ctx->GetCurrentBasicBlock());
|
AssertPos(pos, ctx->GetCurrentBasicBlock());
|
||||||
ctx->BranchInst(bNext);
|
|
||||||
ctx->SetCurrentBasicBlock(bNext);
|
|
||||||
}
|
|
||||||
ctx->BranchInst(bDone);
|
ctx->BranchInst(bDone);
|
||||||
ctx->SetCurrentBasicBlock(bDone);
|
ctx->SetCurrentBasicBlock(bDone);
|
||||||
ctx->EndIf();
|
ctx->EndIf();
|
||||||
|
|||||||
Reference in New Issue
Block a user