r244526 - Append options for vectorization when pointer checking threshold is exceeded.

Hal Finkel via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 10 16:35:45 PDT 2015


----- Original Message -----
> From: "Tyler Nowicki via cfe-commits" <cfe-commits at lists.llvm.org>
> To: cfe-commits at lists.llvm.org
> Sent: Monday, August 10, 2015 6:05:17 PM
> Subject: r244526 - Append options for vectorization when pointer checking threshold is exceeded.
> 
> Author: tnowicki
> Date: Mon Aug 10 18:05:16 2015
> New Revision: 244526
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=244526&view=rev
> Log:
> Append options for vectorization when pointer checking threshold is
> exceeded.
> 
> Following one of the appended options will allow the loop to be
> vectorized. We do not include a command line option for modifying
> the pointer checking threshold because there is no clang-level
> interface for this currently.
> 
> Modified:
>     cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
>     cfe/trunk/lib/CodeGen/CodeGenAction.cpp
>     cfe/trunk/test/Frontend/optimization-remark-options.c
> 
> Modified: cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td?rev=244526&r1=244525&r2=244526&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
> (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td Mon Aug
> 10 18:05:16 2015
> @@ -49,6 +49,12 @@ def remark_fe_backend_optimization_remar
>      "allow commutativity by specifying '#pragma clang loop
>      vectorize(enable)' "
>      "before the loop or by providing the compiler option
>      '-ffast-math'">,
>      BackendInfo, InGroup<BackendOptimizationRemarkAnalysis>;
> +def remark_fe_backend_optimization_remark_analysis_aliasing :
> Remark<"%0; "
> +    "avoid runtime pointer checking when you know the arrays will
> always be "
> +    "independent by specifying '#pragma clang loop
> vectorize(assume_safety)' "
> +    "before the loop or by specifying 'restrict' on the array
> arguments. "

Hi Tyler,

Sorry I missed this earlier, but this needs to say '__restrict__' (or '__restrict') when compiling in C++ mode because 'restrict' is not a valid keyword in C++.

Thanks again,
Hal

> +    "Erroneous results will occur if these options are incorrectly
> applied!">,
> +    BackendInfo, InGroup<BackendOptimizationRemarkAnalysis>;
>  def warn_fe_backend_optimization_failure : Warning<"%0">,
>  BackendInfo,
>      InGroup<BackendOptimizationFailure>, DefaultWarn;
>  def note_fe_backend_optimization_remark_invalid_loc : Note<"could "
> 
> Modified: cfe/trunk/lib/CodeGen/CodeGenAction.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenAction.cpp?rev=244526&r1=244525&r2=244526&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenAction.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenAction.cpp Mon Aug 10 18:05:16 2015
> @@ -258,6 +258,8 @@ namespace clang {
>          const llvm::DiagnosticInfoOptimizationRemarkAnalysis &D);
>      void OptimizationRemarkHandler(
>          const
>          llvm::DiagnosticInfoOptimizationRemarkAnalysisFPCommute
>          &D);
> +    void OptimizationRemarkHandler(
> +        const llvm::DiagnosticInfoOptimizationRemarkAnalysisAliasing
> &D);
>      void OptimizationFailureHandler(
>          const llvm::DiagnosticInfoOptimizationFailure &D);
>    };
> @@ -513,6 +515,17 @@ void BackendConsumer::OptimizationRemark
>          D,
>          diag::remark_fe_backend_optimization_remark_analysis_fpcommute);
>  }
>  
> +void BackendConsumer::OptimizationRemarkHandler(
> +    const llvm::DiagnosticInfoOptimizationRemarkAnalysisAliasing &D)
> {
> +  // Optimization analysis remarks are active only if the
> -Rpass-analysis
> +  // flag has a regular expression that matches the name of the pass
> +  // name in \p D.
> +  if (CodeGenOpts.OptimizationRemarkAnalysisPattern &&
> +
>      CodeGenOpts.OptimizationRemarkAnalysisPattern->match(D.getPassName()))
> +    EmitOptimizationMessage(
> +        D,
> diag::remark_fe_backend_optimization_remark_analysis_aliasing);
> +}
> +
>  void BackendConsumer::OptimizationFailureHandler(
>      const llvm::DiagnosticInfoOptimizationFailure &D) {
>    EmitOptimizationMessage(D,
>    diag::warn_fe_backend_optimization_failure);
> @@ -572,6 +585,12 @@ void BackendConsumer::DiagnosticHandlerI
>      OptimizationRemarkHandler(
>          cast<DiagnosticInfoOptimizationRemarkAnalysisFPCommute>(DI));
>      return;
> +  case llvm::DK_OptimizationRemarkAnalysisAliasing:
> +    // Optimization remarks are always handled completely by this
> +    // handler. There is no generic way of emitting them.
> +    OptimizationRemarkHandler(
> +        cast<DiagnosticInfoOptimizationRemarkAnalysisAliasing>(DI));
> +    return;
>    case llvm::DK_OptimizationFailure:
>      // Optimization failures are always handled completely by this
>      // handler.
> 
> Modified: cfe/trunk/test/Frontend/optimization-remark-options.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/optimization-remark-options.c?rev=244526&r1=244525&r2=244526&view=diff
> ==============================================================================
> --- cfe/trunk/test/Frontend/optimization-remark-options.c (original)
> +++ cfe/trunk/test/Frontend/optimization-remark-options.c Mon Aug 10
> 18:05:16 2015
> @@ -10,3 +10,12 @@ double foo(int N) {
>  
>    return v;
>  }
> +
> +// CHECK: {{.*}}:18:13: remark: loop not vectorized: cannot prove
> pointers refer to independent arrays in memory. The loop requires 9
> runtime independence checks to vectorize the loop, but that would
> exceed the limit of 8 checks; avoid runtime pointer checking when
> you know the arrays will always be independent by specifying
> '#pragma clang loop vectorize(assume_safety)' before the loop or by
> specifying 'restrict' on the array arguments. Erroneous results will
> occur if these options are incorrectly applied!
> +
> +void foo2(int *dw, int *uw, int *A, int *B, int *C, int *D, int N) {
> +  for (int i = 0; i < N; i++) {
> +    dw[i] = A[i] + B[i - 1] + C[i - 2] + D[i - 3];
> +    uw[i] = A[i] + B[i + 1] + C[i + 2] + D[i + 3];
> +  }
> +}
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
> 

-- 
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory


More information about the cfe-commits mailing list