r213400 - Recommit: Handle diagnostic warnings in Frontend diagnostic handler.

NAKAMURA Takumi geek4civic at gmail.com
Fri Jul 18 17:12:49 PDT 2014


It seems the test would be incompatible to i686.

For example with -triple i686-linux,

  error: 'warning' diagnostics expected but not seen:
    File clang/test/Misc/backend-optimization-failure.cpp Line 9: loop
not vectorized: failed explicitly specified loop vectorization


2014-07-19 4:40 GMT+09:00 Tyler Nowicki <tnowicki at apple.com>:
> Author: tnowicki
> Date: Fri Jul 18 14:40:19 2014
> New Revision: 213400
>
> URL: http://llvm.org/viewvc/llvm-project?rev=213400&view=rev
> Log:
> Recommit: Handle diagnostic warnings in Frontend diagnostic handler.
>
> Clang uses a diagnostic handler to grab diagnostic messages so it can print them
> with the line of source code they refer to. This patch extends this to handle
> optimization failures that were added to llvm to produce a warning when
> loop vectorization is explicitly specified (using a pragma clang loop directive)
> but fails.
>
> Update renames warning flag name to avoid indicating the flag's severity and
> adds a test.
>
> Reviewed by Alp Toker
>
>
> Added:
>     cfe/trunk/test/Misc/backend-optimization-failure.cpp
> Modified:
>     cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
>     cfe/trunk/include/clang/Basic/DiagnosticGroups.td
>     cfe/trunk/lib/CodeGen/CodeGenAction.cpp
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td?rev=213400&r1=213399&r2=213400&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td Fri Jul 18 14:40:19 2014
> @@ -41,6 +41,8 @@ def remark_fe_backend_optimization_remar
>      InGroup<BackendOptimizationRemarkMissed>, DefaultRemark;
>  def remark_fe_backend_optimization_remark_analysis : Remark<"%0">, BackendInfo,
>      InGroup<BackendOptimizationRemarkAnalysis>, DefaultRemark;
> +def warn_fe_backend_optimization_failure : Warning<"%0">, BackendInfo,
> +    InGroup<BackendOptimizationFailure>, DefaultWarn;
>  def note_fe_backend_optimization_remark_invalid_loc : Note<"could "
>    "not determine the original source location for %0:%1:%2">;
>
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=213400&r1=213399&r2=213400&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Fri Jul 18 14:40:19 2014
> @@ -704,6 +704,7 @@ def RemarkBackendPlugin : DiagGroup<"rem
>  def BackendOptimizationRemark : DiagGroup<"pass">;
>  def BackendOptimizationRemarkMissed : DiagGroup<"pass-missed">;
>  def BackendOptimizationRemarkAnalysis : DiagGroup<"pass-analysis">;
> +def BackendOptimizationFailure : DiagGroup<"pass-failed">;
>
>  // Instrumentation based profiling warnings.
>  def ProfileInstrOutOfDate : DiagGroup<"profile-instr-out-of-date">;
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenAction.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenAction.cpp?rev=213400&r1=213399&r2=213400&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenAction.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenAction.cpp Fri Jul 18 14:40:19 2014
> @@ -238,15 +238,16 @@ namespace clang {
>      /// \brief Specialized handlers for optimization remarks.
>      /// Note that these handlers only accept remarks and they always handle
>      /// them.
> -    void
> -    EmitOptimizationRemark(const llvm::DiagnosticInfoOptimizationBase &D,
> -                           unsigned DiagID);
> +    void EmitOptimizationMessage(const llvm::DiagnosticInfoOptimizationBase &D,
> +                                 unsigned DiagID);
>      void
>      OptimizationRemarkHandler(const llvm::DiagnosticInfoOptimizationRemark &D);
>      void OptimizationRemarkHandler(
>          const llvm::DiagnosticInfoOptimizationRemarkMissed &D);
>      void OptimizationRemarkHandler(
>          const llvm::DiagnosticInfoOptimizationRemarkAnalysis &D);
> +    void OptimizationFailureHandler(
> +        const llvm::DiagnosticInfoOptimizationFailure &D);
>    };
>
>    void BackendConsumer::anchor() {}
> @@ -416,10 +417,11 @@ BackendConsumer::StackSizeDiagHandler(co
>    return false;
>  }
>
> -void BackendConsumer::EmitOptimizationRemark(
> +void BackendConsumer::EmitOptimizationMessage(
>      const llvm::DiagnosticInfoOptimizationBase &D, unsigned DiagID) {
> -  // We only support remarks.
> -  assert(D.getSeverity() == llvm::DS_Remark);
> +  // We only support warnings and remarks.
> +  assert(D.getSeverity() == llvm::DS_Remark ||
> +         D.getSeverity() == llvm::DS_Warning);
>
>    SourceManager &SourceMgr = Context->getSourceManager();
>    FileManager &FileMgr = SourceMgr.getFileManager();
> @@ -442,8 +444,9 @@ void BackendConsumer::EmitOptimizationRe
>      if (const Decl *FD = Gen->GetDeclForMangledName(D.getFunction().getName()))
>        Loc = FD->getASTContext().getFullLoc(FD->getBodyRBrace());
>
> -  Diags.Report(Loc, DiagID) << AddFlagValue(D.getPassName())
> -                            << D.getMsg().str();
> +  Diags.Report(Loc, DiagID)
> +      << AddFlagValue(D.getPassName() ? D.getPassName() : "")
> +      << D.getMsg().str();
>
>    if (DILoc.isInvalid())
>      // If we were not able to translate the file:line:col information
> @@ -460,7 +463,7 @@ void BackendConsumer::OptimizationRemark
>    // expression that matches the name of the pass name in \p D.
>    if (CodeGenOpts.OptimizationRemarkPattern &&
>        CodeGenOpts.OptimizationRemarkPattern->match(D.getPassName()))
> -    EmitOptimizationRemark(D, diag::remark_fe_backend_optimization_remark);
> +    EmitOptimizationMessage(D, diag::remark_fe_backend_optimization_remark);
>  }
>
>  void BackendConsumer::OptimizationRemarkHandler(
> @@ -470,8 +473,8 @@ void BackendConsumer::OptimizationRemark
>    // name in \p D.
>    if (CodeGenOpts.OptimizationRemarkMissedPattern &&
>        CodeGenOpts.OptimizationRemarkMissedPattern->match(D.getPassName()))
> -    EmitOptimizationRemark(D,
> -                           diag::remark_fe_backend_optimization_remark_missed);
> +    EmitOptimizationMessage(D,
> +                            diag::remark_fe_backend_optimization_remark_missed);
>  }
>
>  void BackendConsumer::OptimizationRemarkHandler(
> @@ -481,10 +484,15 @@ void BackendConsumer::OptimizationRemark
>    // name in \p D.
>    if (CodeGenOpts.OptimizationRemarkAnalysisPattern &&
>        CodeGenOpts.OptimizationRemarkAnalysisPattern->match(D.getPassName()))
> -    EmitOptimizationRemark(
> +    EmitOptimizationMessage(
>          D, diag::remark_fe_backend_optimization_remark_analysis);
>  }
>
> +void BackendConsumer::OptimizationFailureHandler(
> +    const llvm::DiagnosticInfoOptimizationFailure &D) {
> +  EmitOptimizationMessage(D, diag::warn_fe_backend_optimization_failure);
> +}
> +
>  /// \brief This function is invoked when the backend needs
>  /// to report something to the user.
>  void BackendConsumer::DiagnosticHandlerImpl(const DiagnosticInfo &DI) {
> @@ -518,6 +526,11 @@ void BackendConsumer::DiagnosticHandlerI
>      OptimizationRemarkHandler(
>          cast<DiagnosticInfoOptimizationRemarkAnalysis>(DI));
>      return;
> +  case llvm::DK_OptimizationFailure:
> +    // Optimization failures are always handled completely by this
> +    // handler.
> +    OptimizationFailureHandler(cast<DiagnosticInfoOptimizationFailure>(DI));
> +    return;
>    default:
>      // Plugin IDs are not bound to any value as they are set dynamically.
>      ComputeDiagRemarkID(Severity, backend_plugin, DiagID);
>
> Added: cfe/trunk/test/Misc/backend-optimization-failure.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/backend-optimization-failure.cpp?rev=213400&view=auto
> ==============================================================================
> --- cfe/trunk/test/Misc/backend-optimization-failure.cpp (added)
> +++ cfe/trunk/test/Misc/backend-optimization-failure.cpp Fri Jul 18 14:40:19 2014
> @@ -0,0 +1,20 @@
> +// RUN: %clang_cc1 %s -O3 -emit-llvm -gline-tables-only -S -verify -o /dev/null
> +
> +// Test verifies optimization failures generated by the backend are handled
> +// correctly by clang. LLVM tests verify all of the failure conditions.
> +
> +void test_switch(int *A, int *B, int Length) {
> +#pragma clang loop vectorize(enable) unroll(disable)
> +  for (int i = 0; i < Length; i++) {
> +    /* expected-warning {{loop not vectorized: failed explicitly specified loop vectorization}} */ switch (A[i]) {
> +    case 0:
> +      B[i] = 1;
> +      break;
> +    case 1:
> +      B[i] = 2;
> +      break;
> +    default:
> +      B[i] = 3;
> +    }
> +  }
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list