From cc0b718aaa35bfb2a9ca5dd59078ae7e54dbc4bb Mon Sep 17 00:00:00 2001 From: Olivia Crain Date: Thu, 15 Oct 2020 08:40:40 -0500 Subject: [PATCH 1/6] Mark inout asm! operands as used in liveness pass --- compiler/rustc_passes/src/liveness.rs | 2 +- src/test/ui/liveness/liveness-issue-77915.rs | 36 ++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/liveness/liveness-issue-77915.rs diff --git a/compiler/rustc_passes/src/liveness.rs b/compiler/rustc_passes/src/liveness.rs index ae810b9e79a5f..7288015e17029 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 0000000000000..300e4ad8b0106 --- /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() {} From fd193f2d7f7ebed086de9977951cac76211533b0 Mon Sep 17 00:00:00 2001 From: Olivia Crain Date: Sat, 17 Oct 2020 16:36:58 -0500 Subject: [PATCH 2/6] Treat InOut variables like other input variables --- compiler/rustc_passes/src/liveness.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/rustc_passes/src/liveness.rs b/compiler/rustc_passes/src/liveness.rs index 7288015e17029..e88b6cb11e5cf 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 | ACC_USE); + succ = self.write_place(expr, succ, ACC_READ | ACC_WRITE); } hir::InlineAsmOperand::SplitInOut { out_expr, .. } => { if let Some(expr) = out_expr { @@ -1199,7 +1199,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { } } hir::InlineAsmOperand::InOut { expr, .. } => { - succ = self.propagate_through_place_components(expr, succ); + succ = self.propagate_through_expr(expr, succ); } hir::InlineAsmOperand::SplitInOut { in_expr, out_expr, .. } => { if let Some(expr) = out_expr { From 17c6c5932c8de780fcd1d06aff230e8cc6bca9f8 Mon Sep 17 00:00:00 2001 From: Olivia Crain Date: Sun, 18 Oct 2020 23:51:10 -0500 Subject: [PATCH 3/6] Mark InOut operands as used in RWU table with write_place --- compiler/rustc_passes/src/liveness.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/rustc_passes/src/liveness.rs b/compiler/rustc_passes/src/liveness.rs index e88b6cb11e5cf..7288015e17029 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 { @@ -1199,7 +1199,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { } } hir::InlineAsmOperand::InOut { expr, .. } => { - succ = self.propagate_through_expr(expr, succ); + succ = self.propagate_through_place_components(expr, succ); } hir::InlineAsmOperand::SplitInOut { in_expr, out_expr, .. } => { if let Some(expr) = out_expr { From 8f0bceda13ac871dd452841d3b6aa049f9f649a1 Mon Sep 17 00:00:00 2001 From: Olivia Crain Date: Sun, 18 Oct 2020 23:52:15 -0500 Subject: [PATCH 4/6] Refactor liveness-issue-77915 to liveness-asm and improve tests --- src/test/ui/liveness/liveness-asm.rs | 43 ++++++++++++++++++++ src/test/ui/liveness/liveness-asm.stderr | 23 +++++++++++ src/test/ui/liveness/liveness-issue-77915.rs | 36 ---------------- 3 files changed, 66 insertions(+), 36 deletions(-) create mode 100644 src/test/ui/liveness/liveness-asm.rs create mode 100644 src/test/ui/liveness/liveness-asm.stderr delete mode 100644 src/test/ui/liveness/liveness-issue-77915.rs diff --git a/src/test/ui/liveness/liveness-asm.rs b/src/test/ui/liveness/liveness-asm.rs new file mode 100644 index 0000000000000..e64335a8cc589 --- /dev/null +++ b/src/test/ui/liveness/liveness-asm.rs @@ -0,0 +1,43 @@ +// Ensure inout asm! operands are marked as used by the liveness pass + +// check-pass + +#![feature(asm)] +#![allow(dead_code)] +#![warn(unused_assignments)] +#![warn(unused_variables)] + +// Test the single inout case +unsafe fn f1(mut src: *const u8) { + asm!("/*{0}*/", inout(reg) src); //~ WARN value assigned to `src` is never read +} + +unsafe fn f2(mut src: *const u8) -> *const u8 { + asm!("/*{0}*/", inout(reg) src); + src +} + +// Test the split inout case +unsafe fn f3(mut src: *const u8) { + asm!("/*{0}*/", inout(reg) src => src); //~ WARN value assigned to `src` is never read +} + +unsafe fn f4(mut src: *const u8) -> *const u8 { + asm!("/*{0}*/", inout(reg) src => src); + src +} + +// Tests the use of field projections +struct S { + field: *mut u8, +} + +unsafe fn f5(src: &mut S) { + asm!("/*{0}*/", inout(reg) src.field); +} + +unsafe fn f6(src: &mut S) { + asm!("/*{0}*/", inout(reg) src.field => src.field); +} + +fn main() {} diff --git a/src/test/ui/liveness/liveness-asm.stderr b/src/test/ui/liveness/liveness-asm.stderr new file mode 100644 index 0000000000000..b8c04b5c4429e --- /dev/null +++ b/src/test/ui/liveness/liveness-asm.stderr @@ -0,0 +1,23 @@ +warning: value assigned to `src` is never read + --> $DIR/liveness-asm.rs:12:32 + | +LL | asm!("/*{0}*/", inout(reg) src); + | ^^^ + | +note: the lint level is defined here + --> $DIR/liveness-asm.rs:7:9 + | +LL | #![warn(unused_assignments)] + | ^^^^^^^^^^^^^^^^^^ + = help: maybe it is overwritten before being read? + +warning: value assigned to `src` is never read + --> $DIR/liveness-asm.rs:22:39 + | +LL | asm!("/*{0}*/", inout(reg) src => src); + | ^^^ + | + = help: maybe it is overwritten before being read? + +warning: 2 warnings emitted + diff --git a/src/test/ui/liveness/liveness-issue-77915.rs b/src/test/ui/liveness/liveness-issue-77915.rs deleted file mode 100644 index 300e4ad8b0106..0000000000000 --- a/src/test/ui/liveness/liveness-issue-77915.rs +++ /dev/null @@ -1,36 +0,0 @@ -// 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() {} From 2720b2da18ef9a0cd0b5ec9ebafc09b68e3cfb7a Mon Sep 17 00:00:00 2001 From: Olivia Crain Date: Wed, 21 Oct 2020 00:34:01 -0500 Subject: [PATCH 5/6] Limit liveness-asm tests to x86_64 --- src/test/ui/liveness/liveness-asm.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/ui/liveness/liveness-asm.rs b/src/test/ui/liveness/liveness-asm.rs index e64335a8cc589..b51da0e0d8cdd 100644 --- a/src/test/ui/liveness/liveness-asm.rs +++ b/src/test/ui/liveness/liveness-asm.rs @@ -1,5 +1,6 @@ // Ensure inout asm! operands are marked as used by the liveness pass +// only-x86_64 // check-pass #![feature(asm)] From dc29c7a72f63dcad65e5ec3899a0eb114798bdfd Mon Sep 17 00:00:00 2001 From: Olivia Crain Date: Wed, 21 Oct 2020 00:56:22 -0500 Subject: [PATCH 6/6] Bless liveness-asm output --- src/test/ui/liveness/liveness-asm.stderr | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/ui/liveness/liveness-asm.stderr b/src/test/ui/liveness/liveness-asm.stderr index b8c04b5c4429e..f385d7a8065b6 100644 --- a/src/test/ui/liveness/liveness-asm.stderr +++ b/src/test/ui/liveness/liveness-asm.stderr @@ -1,18 +1,18 @@ warning: value assigned to `src` is never read - --> $DIR/liveness-asm.rs:12:32 + --> $DIR/liveness-asm.rs:13:32 | LL | asm!("/*{0}*/", inout(reg) src); | ^^^ | note: the lint level is defined here - --> $DIR/liveness-asm.rs:7:9 + --> $DIR/liveness-asm.rs:8:9 | LL | #![warn(unused_assignments)] | ^^^^^^^^^^^^^^^^^^ = help: maybe it is overwritten before being read? warning: value assigned to `src` is never read - --> $DIR/liveness-asm.rs:22:39 + --> $DIR/liveness-asm.rs:23:39 | LL | asm!("/*{0}*/", inout(reg) src => src); | ^^^