about summary refs log tree commit diff
path: root/src/librustc_codegen_llvm
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2018-10-23 00:59:14 -0700
committerAlex Crichton <alex@alexcrichton.com>2018-10-23 00:59:14 -0700
commit086f5a55be73dff71ce5d93f16cdf5652d833090 (patch)
treeda23072131ac5e092d2142a8797622eaebf8f929 /src/librustc_codegen_llvm
parentd570b36cd9dd0a3c1b94e6fc4004ee5557140d31 (diff)
downloadrust-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.rs12
-rw-r--r--src/librustc_codegen_llvm/back/write.rs34
-rw-r--r--src/librustc_codegen_llvm/llvm/ffi.rs2
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;