diff options
| author | Olivia Crain <olivia@olivia.dev> | 2020-10-15 08:40:40 -0500 |
|---|---|---|
| committer | Olivia Crain <olivia@olivia.dev> | 2020-10-17 16:37:45 -0500 |
| commit | cc0b718aaa35bfb2a9ca5dd59078ae7e54dbc4bb (patch) | |
| tree | 493be7070aae724c48936671c5b05222aa2d2989 | |
| parent | ffeeb20398bb9a25c1f75599b942f57c85a2140d (diff) | |
| download | rust-cc0b718aaa35bfb2a9ca5dd59078ae7e54dbc4bb.tar.gz rust-cc0b718aaa35bfb2a9ca5dd59078ae7e54dbc4bb.zip | |
Mark inout asm! operands as used in liveness pass
| -rw-r--r-- | compiler/rustc_passes/src/liveness.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/liveness/liveness-issue-77915.rs | 36 |
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() {} |
