]> git.lizzy.rs Git - rust.git/commitdiff
Gate llvm.sideeffect under -Z insert-sideeffect
authorXiang Fan <sfanxiang@gmail.com>
Fri, 27 Sep 2019 23:13:53 +0000 (07:13 +0800)
committerXiang Fan <sfanxiang@gmail.com>
Fri, 27 Sep 2019 23:13:53 +0000 (07:13 +0800)
16 files changed:
src/librustc/session/config.rs
src/librustc_codegen_llvm/intrinsic.rs
src/librustc_codegen_ssa/mir/block.rs
src/test/codegen/alloc-optimisation.rs
src/test/codegen/dealloc-no-unwind.rs
src/test/codegen/issue-34947-pow-i32.rs
src/test/codegen/issue-45222.rs
src/test/codegen/naked-functions.rs
src/test/codegen/non-terminate/infinite-loop-1.rs
src/test/codegen/non-terminate/infinite-loop-2.rs
src/test/codegen/non-terminate/infinite-recursion.rs
src/test/codegen/repeat-trusted-len.rs
src/test/codegen/vec-clear.rs
src/test/codegen/vec-iter-collect-len.rs
src/test/codegen/vec-optimizes-away.rs
src/test/run-make-fulldeps/inline-always-many-cgu/Makefile

index 73b731b07619dc68a31337551bcb9a272ed7257d..abfbba53b5936384c242b81d680000d21eefc99f 100644 (file)
@@ -1472,6 +1472,9 @@ fn parse_symbol_mangling_version(
         "which mangling version to use for symbol names"),
     binary_dep_depinfo: bool = (false, parse_bool, [TRACKED],
         "include artifacts (sysroot, crate dependencies) used during compilation in dep-info"),
+    insert_sideeffect: bool = (false, parse_bool, [TRACKED],
+        "fix undefined behavior when a thread doesn't eventually make progress \
+         (such as entering an empty infinite loop) by inserting llvm.sideeffect"),
 }
 
 pub fn default_lib_output() -> CrateType {
index a8734d338df17e746c1534be886efd1d42c17539..e4ac176576053ffef8b72985d30ebf137c6a0a38 100644 (file)
@@ -726,8 +726,10 @@ fn expect(&mut self, cond: Self::Value, expected: bool) -> Self::Value {
     }
 
     fn sideeffect(&mut self) {
-        let fnname = self.get_intrinsic(&("llvm.sideeffect"));
-        self.call(fnname, &[], None);
+        if self.tcx.sess.opts.debugging_opts.insert_sideeffect {
+            let fnname = self.get_intrinsic(&("llvm.sideeffect"));
+            self.call(fnname, &[], None);
+        }
     }
 
     fn va_start(&mut self, va_list: &'ll Value) -> &'ll Value {
index 99d70e6bb82532c578fcc606713ef038a781d390..8e3243f5e7bd05d6a5602ed3f7116a96683e6318 100644 (file)
@@ -157,13 +157,15 @@ fn maybe_sideeffect<'b, 'tcx2: 'b, Bx: BuilderMethods<'b, 'tcx2>>(
         bx: &mut Bx,
         targets: &[mir::BasicBlock],
     ) {
-        if targets.iter().any(|target| {
-            *target <= *self.bb
-                && target
-                    .start_location()
-                    .is_predecessor_of(self.bb.start_location(), mir)
-        }) {
-            bx.sideeffect();
+        if bx.tcx().sess.opts.debugging_opts.insert_sideeffect {
+            if targets.iter().any(|target| {
+                *target <= *self.bb
+                    && target
+                        .start_location()
+                        .is_predecessor_of(self.bb.start_location(), mir)
+            }) {
+                bx.sideeffect();
+            }
         }
     }
 }
index c1e36a17ec291e53ff42854d9b1133261f2bf028..c3ffaeb9547b3c20a43168cc88d3aed04cbb29d3 100644 (file)
@@ -7,8 +7,7 @@
 pub fn alloc_test(data: u32) {
     // CHECK-LABEL: @alloc_test
     // CHECK-NEXT: start:
-    // CHECK-NOT: alloc
-    // CHECK: ret void
+    // CHECK-NEXT: ret void
     let x = Box::new(data);
     drop(x);
 }
index f8fc663169d9b484c9fc7fc3c3c1e39db170a2d6..ff21b4caa83c3737bc0844603e132c9dac117677 100644 (file)
@@ -17,7 +17,7 @@ fn drop(&mut self) {
 pub fn a(a: Box<i32>) {
     // CHECK-LABEL: define void @a
     // CHECK: call void @__rust_dealloc
-    // CHECK: call void @foo
+    // CHECK-NEXT: call void @foo
     let _a = A;
     drop(a);
 }
index bd8b79adf43b698dfa7b76866cee9b4cec2e6a7e..653da8e8b5f7bff2112f97d12ebccedf3dea137b 100644 (file)
@@ -6,11 +6,8 @@
 #[no_mangle]
 pub fn issue_34947(x: i32) -> i32 {
     // CHECK: mul
-    // CHECK-NOT: br label
-    // CHECK: mul
-    // CHECK-NOT: br label
-    // CHECK: mul
-    // CHECK-NOT: br label
-    // CHECK: ret
+    // CHECK-NEXT: mul
+    // CHECK-NEXT: mul
+    // CHECK-NEXT: ret
     x.pow(5)
 }
index 894927c5c33512cc5129d31c6474c8cddfb9e307..7aadc8a095498a56fbe19d2e1f1b2d07ec5fb9bf 100644 (file)
@@ -1,9 +1,3 @@
-// ignore-test
-
-// FIXME:
-// LLVM can't optimize some loops with a large number of iterations because of
-// @llvm.sideeffect() (see also #59546)
-
 // compile-flags: -O
 // ignore-debug: the debug assertions get in the way
 
index fb683a49a8a809a6067db5b2c5d6a379585e7288..2050193b61b54ec5144b88e07405ffd87f724302 100644 (file)
@@ -1,3 +1,5 @@
+// ignore-tidy-linelength
+
 // compile-flags: -C no-prepopulate-passes
 
 #![crate_type = "lib"]
@@ -51,7 +53,7 @@ pub fn naked_with_args_and_return(a: isize) -> isize {
 #[naked]
 pub fn naked_recursive() {
     // CHECK-NEXT: {{.+}}:
-    // CHECK: call void @naked_empty()
+    // CHECK-NEXT: call void @naked_empty()
 
     // FIXME(#39685) Avoid one block per call.
     // CHECK-NEXT: br label %bb1
@@ -59,19 +61,19 @@ pub fn naked_recursive() {
 
     naked_empty();
 
-    // CHECK: %{{[0-9]+}} = call i{{[0-9]+}} @naked_with_return()
+    // CHECK-NEXT: %{{[0-9]+}} = call i{{[0-9]+}} @naked_with_return()
 
     // FIXME(#39685) Avoid one block per call.
     // CHECK-NEXT: br label %bb2
     // CHECK: bb2:
 
-    // CHECK: %{{[0-9]+}} = call i{{[0-9]+}} @naked_with_args_and_return(i{{[0-9]+}} %{{[0-9]+}})
+    // CHECK-NEXT: %{{[0-9]+}} = call i{{[0-9]+}} @naked_with_args_and_return(i{{[0-9]+}} %{{[0-9]+}})
 
     // FIXME(#39685) Avoid one block per call.
     // CHECK-NEXT: br label %bb3
     // CHECK: bb3:
 
-    // CHECK: call void @naked_with_args(i{{[0-9]+}} %{{[0-9]+}})
+    // CHECK-NEXT: call void @naked_with_args(i{{[0-9]+}} %{{[0-9]+}})
 
     // FIXME(#39685) Avoid one block per call.
     // CHECK-NEXT: br label %bb4
index fa9c66b47c0a47d475233733bf2f7b69ba4fbd20..56b360e0a7f4883ceff22ed802b83d46a95557c4 100644 (file)
@@ -1,4 +1,4 @@
-// compile-flags: -C opt-level=3
+// compile-flags: -C opt-level=3 -Z insert-sideeffect
 
 #![crate_type = "lib"]
 
index 81d62ab33d77855628ddb9e716fa3016ad91c118..2921ab6dc04af460d4cdc5629de2233bddd7bb58 100644 (file)
@@ -1,4 +1,4 @@
-// compile-flags: -C opt-level=3
+// compile-flags: -C opt-level=3 -Z insert-sideeffect
 
 #![crate_type = "lib"]
 
index 6d1f2d4bf8f4ad5ab60c8de9a56ffb6028e11a93..1f292ce379fc0ea8032fb84d056040af6c156712 100644 (file)
@@ -1,4 +1,4 @@
-// compile-flags: -C opt-level=3
+// compile-flags: -C opt-level=3 -Z insert-sideeffect
 
 #![crate_type = "lib"]
 
index 40399e8f76f016ef61428e0cc38cab9776a10b5a..87f29f6047c6a0af8932ad2887a7d343268fa007 100644 (file)
@@ -14,10 +14,6 @@ pub fn helper(_: usize) {
 // CHECK-LABEL: @repeat_take_collect
 #[no_mangle]
 pub fn repeat_take_collect() -> Vec<u8> {
-// FIXME: At the time of writing LLVM transforms this loop into a single
-// `store` and then a `memset` with size = 99999. The correct check should be:
-//        call void @llvm.memset.p0i8.[[USIZE]](i8* {{(nonnull )?}}align 1 %{{[a-z0-9.]+}}, i8 42, [[USIZE]] 100000, i1 false)
-
-// CHECK: call void @llvm.memset.p0i8.[[USIZE]](i8* {{(nonnull )?}}align 1 %{{[a-z0-9.]+}}, i8 42, [[USIZE]] 99999, i1 false)
+// CHECK: call void @llvm.memset.p0i8.[[USIZE]](i8* {{(nonnull )?}}align 1 %{{[0-9]+}}, i8 42, [[USIZE]] 100000, i1 false)
     iter::repeat(42).take(100000).collect()
 }
index 22e1248907a76b44ee353660fb48f32b785f2f11..b9ffce8b0cb3d180d269a2aab8587276bb60a08a 100644 (file)
@@ -1,9 +1,3 @@
-// ignore-test
-
-// FIXME:
-// LLVM can't optimize some loops with unknown number of iterations because of
-// @llvm.sideeffect() (see also #59546)
-
 // ignore-debug: the debug assertions get in the way
 // compile-flags: -O
 
index 893d1b50a4a9781cc9d4848b6708a6895a45bae4..73348ddd063dc55192c06fc530b7a1f472e253a9 100644 (file)
@@ -5,6 +5,8 @@
 
 #[no_mangle]
 pub fn get_len() -> usize {
-    // CHECK-COUNT-1: {{^define}}
+    // CHECK-LABEL: @get_len
+    // CHECK-NOT: call
+    // CHECK-NOT: invoke
     [1, 2, 3].iter().collect::<Vec<_>>().len()
 }
index 08d0332651cb78495c259b3fa75759ee776a2802..ebede0908c6c48d5ac0a01508e07f1d7c6245622 100644 (file)
@@ -8,6 +8,6 @@
 pub fn sum_me() -> i32 {
     // CHECK-LABEL: @sum_me
     // CHECK-NEXT: {{^.*:$}}
-    // CHECK: ret i32 6
+    // CHECK-NEXT: ret i32 6
     vec![1, 2, 3].iter().sum::<i32>()
 }
index fd09df78ffa8d790c3ec063e90b5674f8c8621b7..0cab955f6442bb70d3acb8063ed645666a9ba414 100644 (file)
@@ -2,7 +2,7 @@
 
 all:
        $(RUSTC) foo.rs --emit llvm-ir -C codegen-units=2
-       if cat $(TMPDIR)/*.ll | grep -v 'call void @llvm.sideeffect()' | $(CGREP) -e '\bcall\b'; then \
+       if cat $(TMPDIR)/*.ll | $(CGREP) -e '\bcall\b'; then \
                echo "found call instruction when one wasn't expected"; \
                exit 1; \
        fi