diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2018-10-23 00:59:14 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2018-10-23 00:59:14 -0700 |
| commit | 086f5a55be73dff71ce5d93f16cdf5652d833090 (patch) | |
| tree | da23072131ac5e092d2142a8797622eaebf8f929 /src/librustc_codegen_llvm | |
| parent | d570b36cd9dd0a3c1b94e6fc4004ee5557140d31 (diff) | |
| download | rust-086f5a55be73dff71ce5d93f16cdf5652d833090.tar.gz rust-086f5a55be73dff71ce5d93f16cdf5652d833090.zip | |
Revert "rustc: Fix (again) simd vectors by-val in ABI"
This reverts commit 3cc8f738d4247a9b475d8e074b621e602ac2b7be.
Diffstat (limited to 'src/librustc_codegen_llvm')
| -rw-r--r-- | src/librustc_codegen_llvm/back/lto.rs | 12 | ||||
| -rw-r--r-- | src/librustc_codegen_llvm/back/write.rs | 34 | ||||
| -rw-r--r-- | src/librustc_codegen_llvm/llvm/ffi.rs | 2 |
3 files changed, 8 insertions, 40 deletions
diff --git a/src/librustc_codegen_llvm/back/lto.rs b/src/librustc_codegen_llvm/back/lto.rs index a3704d1154e..61856236a14 100644 --- a/src/librustc_codegen_llvm/back/lto.rs +++ b/src/librustc_codegen_llvm/back/lto.rs @@ -80,7 +80,9 @@ impl LtoModuleCodegen { let module = module.take().unwrap(); { let config = cgcx.config(module.kind); - run_pass_manager(cgcx, &module, config, false); + let llmod = module.module_llvm.llmod(); + let tm = &*module.module_llvm.tm; + run_pass_manager(cgcx, tm, llmod, config, false); timeline.record("fat-done"); } Ok(module) @@ -555,7 +557,8 @@ fn thin_lto(cgcx: &CodegenContext, } fn run_pass_manager(cgcx: &CodegenContext, - module: &ModuleCodegen, + tm: &llvm::TargetMachine, + llmod: &llvm::Module, config: &ModuleConfig, thin: bool) { // Now we have one massive module inside of llmod. Time to run the @@ -566,8 +569,7 @@ fn run_pass_manager(cgcx: &CodegenContext, debug!("running the pass manager"); unsafe { let pm = llvm::LLVMCreatePassManager(); - let llmod = module.module_llvm.llmod(); - llvm::LLVMRustAddAnalysisPasses(module.module_llvm.tm, pm, llmod); + llvm::LLVMRustAddAnalysisPasses(tm, pm, llmod); if config.verify_llvm_ir { let pass = llvm::LLVMRustFindAndCreatePass("verify\0".as_ptr() as *const _); @@ -862,7 +864,7 @@ impl ThinModule { // little differently. info!("running thin lto passes over {}", module.name); let config = cgcx.config(module.kind); - run_pass_manager(cgcx, &module, config, true); + run_pass_manager(cgcx, module.module_llvm.tm, llmod, config, true); cgcx.save_temp_bitcode(&module, "thin-lto-after-pm"); timeline.record("thin-done"); } diff --git a/src/librustc_codegen_llvm/back/write.rs b/src/librustc_codegen_llvm/back/write.rs index ba1315956fb..81619c21975 100644 --- a/src/librustc_codegen_llvm/back/write.rs +++ b/src/librustc_codegen_llvm/back/write.rs @@ -633,7 +633,7 @@ unsafe fn optimize(cgcx: &CodegenContext, None, &format!("llvm module passes [{}]", module_name.unwrap()), || { - llvm::LLVMRunPassManager(mpm, llmod); + llvm::LLVMRunPassManager(mpm, llmod) }); // Deallocate managers that we're now done with @@ -691,38 +691,6 @@ unsafe fn codegen(cgcx: &CodegenContext, create_msvc_imps(cgcx, llcx, llmod); } - // Ok now this one's a super interesting invocations. SIMD in rustc is - // difficult where we want some parts of the program to be able to use - // some SIMD features while other parts of the program don't. The real - // tough part is that we want this to actually work correctly! - // - // We go to great lengths to make sure this works, and one crucial - // aspect is that vector arguments (simd types) are never passed by - // value in the ABI of functions. It turns out, however, that LLVM will - // undo our "clever work" of passing vector types by reference. Its - // argument promotion pass will promote these by-ref arguments to - // by-val. That, however, introduces codegen errors! - // - // The upstream LLVM bug [1] has unfortunatey not really seen a lot of - // activity. The Rust bug [2], however, has seen quite a lot of reports - // of this in the wild. As a result, this is worked around locally here. - // We have a custom transformation, `LLVMRustDemoteSimdArguments`, which - // does the opposite of argument promotion by demoting any by-value SIMD - // arguments in function signatures to pointers intead of being - // by-value. - // - // This operates at the LLVM IR layer because LLVM is thwarting our - // codegen and this is the only chance we get to make sure it's correct - // before we hit codegen. - // - // Hopefully one day the upstream LLVM bug will be fixed and we'll no - // longer need this! - // - // [1]: https://bugs.llvm.org/show_bug.cgi?id=37358 - // [2]: https://github.com/rust-lang/rust/issues/50154 - llvm::LLVMRustDemoteSimdArguments(llmod); - cgcx.save_temp_bitcode(&module, "simd-demoted"); - // A codegen-specific pass manager is used to generate object // files for an LLVM module. // diff --git a/src/librustc_codegen_llvm/llvm/ffi.rs b/src/librustc_codegen_llvm/llvm/ffi.rs index e2b01424909..0b98fa4eaf5 100644 --- a/src/librustc_codegen_llvm/llvm/ffi.rs +++ b/src/librustc_codegen_llvm/llvm/ffi.rs @@ -1138,8 +1138,6 @@ extern "C" { /// Runs a pass manager on a module. pub fn LLVMRunPassManager(PM: &PassManager<'a>, M: &'a Module) -> Bool; - pub fn LLVMRustDemoteSimdArguments(M: &'a Module); - pub fn LLVMInitializePasses(); pub fn LLVMPassManagerBuilderCreate() -> &'static mut PassManagerBuilder; |
