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. " + "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@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits