Skip to content

Commit cc0b718

Browse files
committed
Mark inout asm! operands as used in liveness pass
1 parent ffeeb20 commit cc0b718

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

compiler/rustc_passes/src/liveness.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1174,7 +1174,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
11741174
}
11751175
}
11761176
hir::InlineAsmOperand::InOut { expr, .. } => {
1177-
succ = self.write_place(expr, succ, ACC_READ | ACC_WRITE);
1177+
succ = self.write_place(expr, succ, ACC_READ | ACC_WRITE | ACC_USE);
11781178
}
11791179
hir::InlineAsmOperand::SplitInOut { out_expr, .. } => {
11801180
if let Some(expr) = out_expr {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Ensure inout asm! operands are marked as used by the liveness pass
2+
3+
// only-x86_64
4+
// check-pass
5+
6+
#![feature(asm)]
7+
#![allow(dead_code)]
8+
#![deny(unused_variables)]
9+
10+
// Tests the single variable inout case
11+
unsafe fn rep_movsb(mut dest: *mut u8, mut src: *const u8, mut n: usize) -> *mut u8 {
12+
while n != 0 {
13+
asm!(
14+
"rep movsb",
15+
inout("rcx") n,
16+
inout("rsi") src,
17+
inout("rdi") dest,
18+
);
19+
}
20+
dest
21+
}
22+
23+
// Tests the split inout case
24+
unsafe fn rep_movsb2(mut dest: *mut u8, mut src: *const u8, mut n: usize) -> *mut u8 {
25+
while n != 0 {
26+
asm!(
27+
"rep movsb",
28+
inout("rcx") n,
29+
inout("rsi") src => src,
30+
inout("rdi") dest,
31+
);
32+
}
33+
dest
34+
}
35+
36+
fn main() {}

0 commit comments

Comments
 (0)