From 4f87499bbb0b227dc6da5ee5deb461fbcaf3c260 Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Thu, 4 Apr 2024 17:05:43 +0200 Subject: [PATCH] Fix enabling optimizations for LLVM 16 The changes to how passes are run in the new pass manager means simply setting the optimization level isn't enough, instead you have to add the pass group "default" where "N" is "O1", "O2" or "O3". This ensures that for example the module inliner is correctly enabled when using --opt=aggressive. The resulting performance still isn't great as LLVM doesn't inline/optimize across modules, but it's better than --opt=aggressive effectively doing very little. --- compiler/src/llvm/passes.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/compiler/src/llvm/passes.rs b/compiler/src/llvm/passes.rs index 72a028608..1e7a7f38a 100644 --- a/compiler/src/llvm/passes.rs +++ b/compiler/src/llvm/passes.rs @@ -617,7 +617,11 @@ impl<'a> Worker<'a> { fn run_passes(&self, module: &Module) { let layout = self.machine.get_target_data().get_data_layout(); let opts = PassBuilderOptions::create(); - let passes = &["mem2reg"]; + let passes = if let Opt::Aggressive = self.shared.state.config.opt { + &["default"] + } else { + &["mem2reg"] + }; module.set_data_layout(&layout); module.set_triple(&self.machine.get_triple());