diff options
Diffstat (limited to 'lib/CodeGen/CGStmt.cpp')
| -rw-r--r-- | lib/CodeGen/CGStmt.cpp | 50 | 
1 files changed, 17 insertions, 33 deletions
diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index a13c386461647..91fa49a46ef1e 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/lib/CodeGen/CGStmt.cpp @@ -45,7 +45,7 @@ void CodeGenFunction::EmitStopPoint(const Stmt *S) {    }  } -void CodeGenFunction::EmitStmt(const Stmt *S) { +void CodeGenFunction::EmitStmt(const Stmt *S, ArrayRef<const Attr *> Attrs) {    assert(S && "Null statement?");    PGO.setCurrentStmt(S); @@ -131,16 +131,16 @@ void CodeGenFunction::EmitStmt(const Stmt *S) {    case Stmt::IndirectGotoStmtClass:      EmitIndirectGotoStmt(cast<IndirectGotoStmt>(*S)); break; -  case Stmt::IfStmtClass:       EmitIfStmt(cast<IfStmt>(*S));             break; -  case Stmt::WhileStmtClass:    EmitWhileStmt(cast<WhileStmt>(*S));       break; -  case Stmt::DoStmtClass:       EmitDoStmt(cast<DoStmt>(*S));             break; -  case Stmt::ForStmtClass:      EmitForStmt(cast<ForStmt>(*S));           break; +  case Stmt::IfStmtClass:      EmitIfStmt(cast<IfStmt>(*S));              break; +  case Stmt::WhileStmtClass:   EmitWhileStmt(cast<WhileStmt>(*S), Attrs); break; +  case Stmt::DoStmtClass:      EmitDoStmt(cast<DoStmt>(*S), Attrs);       break; +  case Stmt::ForStmtClass:     EmitForStmt(cast<ForStmt>(*S), Attrs);     break; -  case Stmt::ReturnStmtClass:   EmitReturnStmt(cast<ReturnStmt>(*S));     break; +  case Stmt::ReturnStmtClass:  EmitReturnStmt(cast<ReturnStmt>(*S));      break; -  case Stmt::SwitchStmtClass:   EmitSwitchStmt(cast<SwitchStmt>(*S));     break; -  case Stmt::GCCAsmStmtClass:   // Intentional fall-through. -  case Stmt::MSAsmStmtClass:    EmitAsmStmt(cast<AsmStmt>(*S));           break; +  case Stmt::SwitchStmtClass:  EmitSwitchStmt(cast<SwitchStmt>(*S));      break; +  case Stmt::GCCAsmStmtClass:  // Intentional fall-through. +  case Stmt::MSAsmStmtClass:   EmitAsmStmt(cast<AsmStmt>(*S));            break;    case Stmt::CoroutineBodyStmtClass:      EmitCoroutineBody(cast<CoroutineBodyStmt>(*S));      break; @@ -178,7 +178,7 @@ void CodeGenFunction::EmitStmt(const Stmt *S) {      EmitCXXTryStmt(cast<CXXTryStmt>(*S));      break;    case Stmt::CXXForRangeStmtClass: -    EmitCXXForRangeStmt(cast<CXXForRangeStmt>(*S)); +    EmitCXXForRangeStmt(cast<CXXForRangeStmt>(*S), Attrs);      break;    case Stmt::SEHTryStmtClass:      EmitSEHTryStmt(cast<SEHTryStmt>(*S)); @@ -555,23 +555,7 @@ void CodeGenFunction::EmitLabelStmt(const LabelStmt &S) {  }  void CodeGenFunction::EmitAttributedStmt(const AttributedStmt &S) { -  const Stmt *SubStmt = S.getSubStmt(); -  switch (SubStmt->getStmtClass()) { -  case Stmt::DoStmtClass: -    EmitDoStmt(cast<DoStmt>(*SubStmt), S.getAttrs()); -    break; -  case Stmt::ForStmtClass: -    EmitForStmt(cast<ForStmt>(*SubStmt), S.getAttrs()); -    break; -  case Stmt::WhileStmtClass: -    EmitWhileStmt(cast<WhileStmt>(*SubStmt), S.getAttrs()); -    break; -  case Stmt::CXXForRangeStmtClass: -    EmitCXXForRangeStmt(cast<CXXForRangeStmt>(*SubStmt), S.getAttrs()); -    break; -  default: -    EmitStmt(SubStmt); -  } +  EmitStmt(S.getSubStmt(), S.getAttrs());  }  void CodeGenFunction::EmitGotoStmt(const GotoStmt &S) { @@ -2165,10 +2149,11 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {                                            llvm::ConstantAsMetadata::get(Loc)));    } -  if (getLangOpts().CUDA && getLangOpts().CUDAIsDevice) { -    // Conservatively, mark all inline asm blocks in CUDA as convergent -    // (meaning, they may call an intrinsically convergent op, such as bar.sync, -    // and so can't have certain optimizations applied around them). +  if (getLangOpts().assumeFunctionsAreConvergent()) { +    // Conservatively, mark all inline asm blocks in CUDA or OpenCL as +    // convergent (meaning, they may call an intrinsically convergent op, such +    // as bar.sync, and so can't have certain optimizations applied around +    // them).      Result->addAttribute(llvm::AttributeList::FunctionIndex,                           llvm::Attribute::Convergent);    } @@ -2210,7 +2195,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {                     llvm::IntegerType::get(getLLVMContext(), (unsigned)TmpSize));          Tmp = Builder.CreateTrunc(Tmp, TruncTy);        } else if (TruncTy->isIntegerTy()) { -        Tmp = Builder.CreateTrunc(Tmp, TruncTy); +        Tmp = Builder.CreateZExtOrTrunc(Tmp, TruncTy);        } else if (TruncTy->isVectorTy()) {          Tmp = Builder.CreateBitCast(Tmp, TruncTy);        } @@ -2283,7 +2268,6 @@ CodeGenFunction::GenerateCapturedStmtFunction(const CapturedStmt &S) {    Args.append(CD->param_begin(), CD->param_end());    // Create the function declaration. -  FunctionType::ExtInfo ExtInfo;    const CGFunctionInfo &FuncInfo =      CGM.getTypes().arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, Args);    llvm::FunctionType *FuncLLVMTy = CGM.getTypes().GetFunctionType(FuncInfo);  | 
