about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOlivia Crain <olivia@olivia.dev>2020-10-15 08:40:40 -0500
committerOlivia Crain <olivia@olivia.dev>2020-10-17 16:37:45 -0500
commitcc0b718aaa35bfb2a9ca5dd59078ae7e54dbc4bb (patch)
tree493be7070aae724c48936671c5b05222aa2d2989
parentffeeb20398bb9a25c1f75599b942f57c85a2140d (diff)
downloadrust-cc0b718aaa35bfb2a9ca5dd59078ae7e54dbc4bb.tar.gz
rust-cc0b718aaa35bfb2a9ca5dd59078ae7e54dbc4bb.zip
Mark inout asm! operands as used in liveness pass
-rw-r--r--compiler/rustc_passes/src/liveness.rs2
-rw-r--r--src/test/ui/liveness/liveness-issue-77915.rs36
2 files changed, 37 insertions, 1 deletions
diff --git a/compiler/rustc_passes/src/liveness.rs b/compiler/rustc_passes/src/liveness.rs
index ae810b9e79a..7288015e170 100644
--- a/compiler/rustc_passes/src/liveness.rs
+++ b/compiler/rustc_passes/src/liveness.rs
@@ -1174,7 +1174,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
                             }
                         }
                         hir::InlineAsmOperand::InOut { expr, .. } => {
-                            succ = self.write_place(expr, succ, ACC_READ | ACC_WRITE);
+                            succ = self.write_place(expr, succ, ACC_READ | ACC_WRITE | ACC_USE);
                         }
                         hir::InlineAsmOperand::SplitInOut { out_expr, .. } => {
                             if let Some(expr) = out_expr {
diff --git a/src/test/ui/liveness/liveness-issue-77915.rs b/src/test/ui/liveness/liveness-issue-77915.rs
new file mode 100644
index 00000000000..300e4ad8b01
--- /dev/null
+++ b/src/test/ui/liveness/liveness-issue-77915.rs
@@ -0,0 +1,36 @@
+// Ensure inout asm! operands are marked as used by the liveness pass
+
+// only-x86_64
+// check-pass
+
+#![feature(asm)]
+#![allow(dead_code)]
+#![deny(unused_variables)]
+
+// Tests the single variable inout case
+unsafe fn rep_movsb(mut dest: *mut u8, mut src: *const u8, mut n: usize) -> *mut u8 {
+    while n != 0 {
+        asm!(
+            "rep movsb",
+            inout("rcx") n,
+            inout("rsi") src,
+            inout("rdi") dest,
+        );
+    }
+    dest
+}
+
+// Tests the split inout case
+unsafe fn rep_movsb2(mut dest: *mut u8, mut src: *const u8, mut n: usize) -> *mut u8 {
+    while n != 0 {
+        asm!(
+            "rep movsb",
+            inout("rcx") n,
+            inout("rsi") src => src,
+            inout("rdi") dest,
+        );
+    }
+    dest
+}
+
+fn main() {}