Merge pull request #501 from jbrodman/sven

Fix branch tests for breaks and returns.
This commit is contained in:
Dmitry Babokin
2013-05-21 08:07:10 -07:00
2 changed files with 13 additions and 2 deletions

View File

@@ -841,6 +841,9 @@ FunctionEmitContext::jumpIfAllLoopLanesAreDone(llvm::BasicBlock *target) {
if (breakLanesPtr == NULL) { if (breakLanesPtr == NULL) {
llvm::Value *continued = LoadInst(continueLanesPtr, llvm::Value *continued = LoadInst(continueLanesPtr,
"continue_lanes"); "continue_lanes");
continued = BinaryOperator(llvm::Instruction::And,
continued, GetFunctionMask(),
"continued&func");
allDone = MasksAllEqual(continued, blockEntryMask); allDone = MasksAllEqual(continued, blockEntryMask);
} }
else { else {
@@ -860,6 +863,10 @@ FunctionEmitContext::jumpIfAllLoopLanesAreDone(llvm::BasicBlock *target) {
finishedLanes = BinaryOperator(llvm::Instruction::Or, finishedLanes, finishedLanes = BinaryOperator(llvm::Instruction::Or, finishedLanes,
continued, "returned|breaked|continued"); continued, "returned|breaked|continued");
} }
finishedLanes = BinaryOperator(llvm::Instruction::And,
finishedLanes, GetFunctionMask(),
"finished&func");
// Do we match the mask at loop or switch statement entry? // Do we match the mask at loop or switch statement entry?
allDone = MasksAllEqual(finishedLanes, blockEntryMask); allDone = MasksAllEqual(finishedLanes, blockEntryMask);
@@ -1266,7 +1273,7 @@ FunctionEmitContext::CurrentLanesReturned(Expr *expr, bool doCoherenceCheck) {
LoadInst(returnedLanesPtr, "old_returned_lanes"); LoadInst(returnedLanesPtr, "old_returned_lanes");
llvm::Value *newReturnedLanes = llvm::Value *newReturnedLanes =
BinaryOperator(llvm::Instruction::Or, oldReturnedLanes, BinaryOperator(llvm::Instruction::Or, oldReturnedLanes,
GetInternalMask(), "old_mask|returned_lanes"); GetFullMask(), "old_mask|returned_lanes");
// For 'coherent' return statements, emit code to check if all // For 'coherent' return statements, emit code to check if all
// lanes have returned // lanes have returned

View File

@@ -374,6 +374,7 @@ lEmitIfStatements(FunctionEmitContext *ctx, Stmt *stmts, const char *trueOrFalse
/** Returns true if the "true" block for the if statement consists of a /** Returns true if the "true" block for the if statement consists of a
single 'break' statement, and the "false" block is empty. */ single 'break' statement, and the "false" block is empty. */
/*
static bool static bool
lCanApplyBreakOptimization(Stmt *trueStmts, Stmt *falseStmts) { lCanApplyBreakOptimization(Stmt *trueStmts, Stmt *falseStmts) {
if (falseStmts != NULL) { if (falseStmts != NULL) {
@@ -392,7 +393,7 @@ lCanApplyBreakOptimization(Stmt *trueStmts, Stmt *falseStmts) {
else else
return false; return false;
} }
*/
void void
IfStmt::EmitCode(FunctionEmitContext *ctx) const { IfStmt::EmitCode(FunctionEmitContext *ctx) const {
@@ -447,6 +448,8 @@ IfStmt::EmitCode(FunctionEmitContext *ctx) const {
ctx->SetCurrentBasicBlock(bexit); ctx->SetCurrentBasicBlock(bexit);
ctx->EndIf(); ctx->EndIf();
} }
/*
// Disabled for performance reasons. Change to an optional compile-time opt switch.
else if (lCanApplyBreakOptimization(trueStmts, falseStmts)) { else if (lCanApplyBreakOptimization(trueStmts, falseStmts)) {
// If we have a simple break statement inside the 'if' and are // If we have a simple break statement inside the 'if' and are
// under varying control flow, just update the execution mask // under varying control flow, just update the execution mask
@@ -456,6 +459,7 @@ IfStmt::EmitCode(FunctionEmitContext *ctx) const {
// benefit in this case. // benefit in this case.
ctx->SetInternalMaskAndNot(ctx->GetInternalMask(), testValue); ctx->SetInternalMaskAndNot(ctx->GetInternalMask(), testValue);
} }
*/
else else
emitVaryingIf(ctx, testValue); emitVaryingIf(ctx, testValue);
} }