IRGen: fix -disable-llvm-optzns

If LLVM optimizations are to be disabled, we cannot just not run all LLVM passes, because there are some mandatory LLVM passes, like coro splitting.
Instead, just run the -O0 LLVM pipeline if -disable-llvm-optzns is used.

Fixes compiler crashes if -disable-llvm-optzns is used.

Note: if one wants to see the output of IRGen, -emit-irgen can be used.
This commit is contained in:
Erik Eckstein
2023-09-22 10:37:30 +02:00
parent 842d26e9b3
commit b5de7e4e49
12 changed files with 24 additions and 17 deletions

View File

@@ -369,8 +369,6 @@ void swift::performLLVMOptimizations(const IRGenOptions &Opts,
MPM.addPass(InlineTreePrinterPass());
// Add bitcode/ll output passes to pass manager.
ModulePassManager EmptyPassManager;
auto &PassManagerToRun = Opts.DisableLLVMOptzns ? EmptyPassManager : MPM;
switch (Opts.OutputKind) {
case IRGenOutputKind::LLVMAssemblyBeforeOptimization:
@@ -380,7 +378,7 @@ void swift::performLLVMOptimizations(const IRGenOptions &Opts,
case IRGenOutputKind::Module:
break;
case IRGenOutputKind::LLVMAssemblyAfterOptimization:
PassManagerToRun.addPass(PrintModulePass(*out, "", false));
MPM.addPass(PrintModulePass(*out, "", false));
break;
case IRGenOutputKind::LLVMBitcode: {
// Emit a module summary by default for Regular LTO except ld64-based ones
@@ -389,7 +387,7 @@ void swift::performLLVMOptimizations(const IRGenOptions &Opts,
TargetMachine->getTargetTriple().getVendor() != llvm::Triple::Apple;
if (Opts.LLVMLTOKind == IRGenLLVMLTOKind::Thin) {
PassManagerToRun.addPass(ThinLTOBitcodeWriterPass(*out, nullptr));
MPM.addPass(ThinLTOBitcodeWriterPass(*out, nullptr));
} else {
if (EmitRegularLTOSummary) {
Module->addModuleFlag(llvm::Module::Error, "ThinLTO", uint32_t(0));
@@ -399,14 +397,14 @@ void swift::performLLVMOptimizations(const IRGenOptions &Opts,
Module->addModuleFlag(llvm::Module::Error, "EnableSplitLTOUnit",
uint32_t(1));
}
PassManagerToRun.addPass(BitcodeWriterPass(
MPM.addPass(BitcodeWriterPass(
*out, /*ShouldPreserveUseListOrder*/ false, EmitRegularLTOSummary));
}
break;
}
}
PassManagerToRun.run(*Module, MAM);
MPM.run(*Module, MAM);
if (AlignModuleToPageSize) {
align(Module);

View File

@@ -1,4 +1,4 @@
// RUN: %target-swift-frontend -g -enable-objc-interop -primary-file %s -emit-ir -sil-verify-all -disable-llvm-optzns -disable-swift-specific-llvm-optzns | %IRGenFileCheck %s
// RUN: %target-swift-frontend -g -enable-objc-interop -primary-file %s -emit-irgen -sil-verify-all | %IRGenFileCheck %s
// RUN: %target-swift-frontend -enable-objc-interop -primary-file %s -emit-ir -sil-verify-all
// REQUIRES: concurrency

View File

@@ -1,4 +1,4 @@
// RUN: %target-swift-frontend -primary-file %s -module-name=test -disable-llvm-optzns -disable-swift-specific-llvm-optzns -emit-ir -sil-verify-all | %IRGenFileCheck %s -check-prefix CHECK-%target-abi
// RUN: %target-swift-frontend -primary-file %s -module-name=test -emit-irgen -sil-verify-all | %IRGenFileCheck %s -check-prefix CHECK-%target-abi
// REQUIRES: concurrency

View File

@@ -1,4 +1,4 @@
// RUN: %target-swift-frontend -primary-file %s -g -emit-ir -disable-availability-checking -disable-llvm-optzns -disable-swift-specific-llvm-optzns | %FileCheck %s
// RUN: %target-swift-frontend -primary-file %s -g -emit-irgen -disable-availability-checking | %FileCheck %s
// REQUIRES: concurrency
// CHECK: call i1 (ptr, i1, ...) @llvm.coro.end.async

View File

@@ -1,10 +1,10 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend -enable-objc-interop -sdk %S/Inputs -primary-file %s -O -disable-sil-perf-optzns -disable-llvm-optzns -emit-ir -Xcc -fstack-protector -I %t | %FileCheck %s
// RUN: %target-swift-frontend -enable-objc-interop -sdk %S/Inputs -primary-file %s -O -disable-sil-perf-optzns -emit-irgen -Xcc -fstack-protector -I %t | %FileCheck %s
// RUN: %empty-directory(%t/Empty.framework/Modules/Empty.swiftmodule)
// RUN: %target-swift-frontend -emit-module-path %t/Empty.framework/Modules/Empty.swiftmodule/%target-swiftmodule-name %S/../Inputs/empty.swift -module-name Empty -I %t
// RUN: %target-swift-frontend -sdk %S/Inputs -primary-file %s -I %t -F %t -DIMPORT_EMPTY -O -disable-sil-perf-optzns -disable-llvm-optzns -emit-ir -Xcc -fstack-protector -enable-objc-interop | %FileCheck %s
// RUN: %target-swift-frontend -sdk %S/Inputs -primary-file %s -I %t -F %t -DIMPORT_EMPTY -O -disable-sil-perf-optzns -emit-irgen -Xcc -fstack-protector -enable-objc-interop | %FileCheck %s
// REQUIRES: CPU=i386 || CPU=x86_64
// REQUIRES: objc_interop

View File

@@ -1,5 +1,5 @@
// RUN: %target-swift-frontend -disable-availability-checking -primary-file %s -emit-sil -O -g | %FileCheck %s --check-prefix CHECK-SIL
// RUN: %target-swift-frontend -disable-availability-checking -primary-file %s -emit-ir -disable-llvm-optzns -O -g | %FileCheck %s
// RUN: %target-swift-frontend -disable-availability-checking -primary-file %s -emit-irgen -O -g | %FileCheck %s
// REQUIRES: CPU=arm64 || CPU=x86_64 || CPU=arm64e

View File

@@ -0,0 +1,9 @@
// RUN: %target-swift-frontend -primary-file %s -disable-availability-checking -c -o /dev/null -O -disable-llvm-optzns
// REQUIRES: concurrency
// Check that -disable-llvm-optzns does not crash the compiler
func testit() async {
print(1)
}

View File

@@ -1,4 +1,4 @@
// RUN: %target-swift-frontend -emit-ir -disable-llvm-optzns -disable-swift-specific-llvm-optzns -primary-file %s | %FileCheck %s
// RUN: %target-swift-frontend -emit-irgen -primary-file %s | %FileCheck %s
extension Dictionary {
subscript(alternate key: Key) -> Value? {
get {

View File

@@ -1,4 +1,4 @@
// RUN: %target-swift-frontend -emit-ir -disable-llvm-optzns -disable-swift-specific-llvm-optzns %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-%target-ptrsize-%target-ptrauth
// RUN: %target-swift-frontend -emit-irgen %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-%target-ptrsize-%target-ptrauth
import Builtin

View File

@@ -1,4 +1,4 @@
// RUN: %target-swift-frontend -emit-ir -disable-llvm-optzns -disable-swift-specific-llvm-optzns %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-%target-ptrsize-%target-ptrauth -DINT=i%target-ptrsize
// RUN: %target-swift-frontend -emit-irgen %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-%target-ptrsize-%target-ptrauth -DINT=i%target-ptrsize
// UNSUPPORTED: CPU=arm64_32
import Builtin

View File

@@ -1,4 +1,4 @@
// RUN: %target-swift-frontend -emit-ir -disable-llvm-optzns -disable-swift-specific-llvm-optzns %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-%target-ptrsize-%target-ptrauth -DINT=i%target-ptrsize
// RUN: %target-swift-frontend -emit-irgen %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-%target-ptrsize-%target-ptrauth -DINT=i%target-ptrsize
// i386 uses a scalar result count of 3 instead of 4, so this test would need
// to be substantially different to test the functionality there. It's easier

View File

@@ -1,4 +1,4 @@
// RUN: %target-swift-frontend -emit-ir -disable-llvm-optzns -disable-swift-specific-llvm-optzns %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-%target-ptrsize-%target-ptrauth -DINT=i%target-ptrsize
// RUN: %target-swift-frontend -emit-irgen %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-%target-ptrsize-%target-ptrauth -DINT=i%target-ptrsize
import Builtin
import Swift