Author: Matheus Izvekov Date: 2023-10-03T18:05:54+02:00 New Revision: 1ab68d708aea5f8dd7d9d39dd1de8b23228814f0
URL: https://github.com/llvm/llvm-project/commit/1ab68d708aea5f8dd7d9d39dd1de8b23228814f0 DIFF: https://github.com/llvm/llvm-project/commit/1ab68d708aea5f8dd7d9d39dd1de8b23228814f0.diff LOG: [clang][codegen] Add a verifier IR pass before any further passes. (#68015) This helps check clang generated good IR in the first place, as otherwise this can cause UB in subsequent passes, with the final verification pass not catching any issues. This for example would have helped catch https://github.com/llvm/llvm-project/issues/67937 earlier. Added: Modified: clang/lib/CodeGen/BackendUtil.cpp clang/test/CodeGen/code-coverage.c clang/test/CodeGen/lto-newpm-pipeline.c Removed: ################################################################################ diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index b0fe8e03aa0f5f0..d066819871dfde3 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -923,6 +923,9 @@ void EmitAssemblyHelper::RunOptimizationPipeline( PB.crossRegisterProxies(LAM, FAM, CGAM, MAM); ModulePassManager MPM; + // Add a verifier pass, before any other passes, to catch CodeGen issues. + if (CodeGenOpts.VerifyModule) + MPM.addPass(VerifierPass()); if (!CodeGenOpts.DisableLLVMPasses) { // Map our optimization levels into one of the distinct levels used to @@ -1020,21 +1023,23 @@ void EmitAssemblyHelper::RunOptimizationPipeline( } if (CodeGenOpts.FatLTO) { - MPM = PB.buildFatLTODefaultPipeline(Level, PrepareForThinLTO, - PrepareForThinLTO || - shouldEmitRegularLTOSummary()); + MPM.addPass(PB.buildFatLTODefaultPipeline( + Level, PrepareForThinLTO, + PrepareForThinLTO || shouldEmitRegularLTOSummary())); } else if (PrepareForThinLTO) { - MPM = PB.buildThinLTOPreLinkDefaultPipeline(Level); + MPM.addPass(PB.buildThinLTOPreLinkDefaultPipeline(Level)); } else if (PrepareForLTO) { - MPM = PB.buildLTOPreLinkDefaultPipeline(Level); + MPM.addPass(PB.buildLTOPreLinkDefaultPipeline(Level)); } else { - MPM = PB.buildPerModuleDefaultPipeline(Level); + MPM.addPass(PB.buildPerModuleDefaultPipeline(Level)); } } // Add a verifier pass if requested. We don't have to do this if the action // requires code generation because there will already be a verifier pass in // the code-generation pipeline. + // Since we already added a verifier pass above, this + // might even not run the analysis, if previous passes caused no changes. if (!actionRequiresCodeGen(Action) && CodeGenOpts.VerifyModule) MPM.addPass(VerifierPass()); diff --git a/clang/test/CodeGen/code-coverage.c b/clang/test/CodeGen/code-coverage.c index af02a6ddaef990a..d7994bab35d81a0 100644 --- a/clang/test/CodeGen/code-coverage.c +++ b/clang/test/CodeGen/code-coverage.c @@ -15,10 +15,10 @@ // RUN: %clang_cc1 -emit-llvm-bc -o /dev/null -fdebug-pass-manager -coverage-data-file=/dev/null %s 2>&1 | FileCheck --check-prefix=NEWPM %s // RUN: %clang_cc1 -emit-llvm-bc -o /dev/null -fdebug-pass-manager -coverage-data-file=/dev/null -O3 %s 2>&1 | FileCheck --check-prefix=NEWPM-O3 %s -// NEWPM-NOT: Running pass +// NEWPM: Running pass: VerifierPass // NEWPM: Running pass: GCOVProfilerPass -// NEWPM-O3-NOT: Running pass +// NEWPM-O3: Running pass: VerifierPass // NEWPM-O3: Running pass: Annotation2MetadataPass // NEWPM-O3: Running pass: ForceFunctionAttrsPass // NEWPM-O3: Running pass: GCOVProfilerPass diff --git a/clang/test/CodeGen/lto-newpm-pipeline.c b/clang/test/CodeGen/lto-newpm-pipeline.c index 1aaa7d46f3ff06f..f58757efbf686f2 100644 --- a/clang/test/CodeGen/lto-newpm-pipeline.c +++ b/clang/test/CodeGen/lto-newpm-pipeline.c @@ -25,7 +25,9 @@ // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm-bc -o /dev/null -mllvm -verify-analysis-invalidation=0 -fdebug-pass-manager -flto=thin -Oz %s 2>&1 | FileCheck %s \ // RUN: -check-prefix=CHECK-THIN-OPTIMIZED -// CHECK-FULL-O0: Running pass: AlwaysInlinerPass +// CHECK-FULL-O0: Running pass: VerifierPass +// CHECK-FULL-O0-NEXT: Running analysis: VerifierAnalysis +// CHECK-FULL-O0-NEXT: Running pass: AlwaysInlinerPass // CHECK-FULL-O0-NEXT: Running analysis: InnerAnalysisManagerProxy // CHECK-FULL-O0-NEXT: Running analysis: ProfileSummaryAnalysis // CHECK-FULL-O0-NEXT: Running pass: CoroConditionalWrapper @@ -34,10 +36,11 @@ // CHECK-FULL-O0-NEXT: Running pass: AnnotationRemarksPass // CHECK-FULL-O0-NEXT: Running analysis: TargetLibraryAnalysis // CHECK-FULL-O0-NEXT: Running pass: VerifierPass -// CHECK-FULL-O0-NEXT: Running analysis: VerifierAnalysis // CHECK-FULL-O0-NEXT: Running pass: BitcodeWriterPass -// CHECK-THIN-O0: Running pass: AlwaysInlinerPass +// CHECK-THIN-O0: Running pass: VerifierPass +// CHECK-THIN-O0-NEXT: Running analysis: VerifierAnalysis +// CHECK-THIN-O0-NEXT: Running pass: AlwaysInlinerPass // CHECK-THIN-O0-NEXT: Running analysis: InnerAnalysisManagerProxy // CHECK-THIN-O0-NEXT: Running analysis: ProfileSummaryAnalysis // CHECK-THIN-O0-NEXT: Running pass: CoroConditionalWrapper @@ -46,7 +49,6 @@ // CHECK-THIN-O0-NEXT: Running pass: AnnotationRemarksPass // CHECK-THIN-O0-NEXT: Running analysis: TargetLibraryAnalysis // CHECK-THIN-O0-NEXT: Running pass: VerifierPass -// CHECK-THIN-O0-NEXT: Running analysis: VerifierAnalysis // CHECK-THIN-O0-NEXT: Running pass: ThinLTOBitcodeWriterPass // TODO: The LTO pre-link pipeline currently invokes _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits