Closed
Description
Godbolt: https://rust.godbolt.org/z/PXY1lr
Basically the issue is that you compute s.position + n
, check that it doesn't overflow, and then you verify that s.position + n
is greater than s.position
, which it of course always is, since you checked for an overflow! This is probably an LLVM optimization bug, but I'm starting here :-)
Command line arguments: -C opt-level=3 -C debug-assertions
Source:
pub struct S1<'a> {
data: &'a [u8],
position: usize,
}
pub fn f1<'a>(s: &'a mut S1, n: usize) -> &'a [u8] {
let d = &s.data[s.position..s.position+n];
s.position += n;
return d;
}
ASM:
example::f1:
push rax
mov rax, qword ptr [rdi + 16]
add rsi, rax
jb .LBB0_4
mov rdx, rsi
sub rdx, rax
jb .LBB0_5
mov rcx, qword ptr [rdi + 8]
cmp rcx, rsi
jb .LBB0_6
add rax, qword ptr [rdi]
mov qword ptr [rdi + 16], rsi
pop rcx
ret
.LBB0_4:
lea rdi, [rip + .L__unnamed_1]
call qword ptr [rip + _ZN4core9panicking5panic17h8f422ca74d186618E@GOTPCREL]
ud2
.LBB0_5:
mov rdi, rax
call qword ptr [rip + _ZN4core5slice22slice_index_order_fail17h7ab7c9c6113ae4b8E@GOTPCREL]
ud2
.LBB0_6:
mov rdi, rsi
mov rsi, rcx
call qword ptr [rip + _ZN4core5slice20slice_index_len_fail17h3a0f2c4c66447e54E@GOTPCREL]
ud2
str.0:
.ascii "/tmp/compiler-explorer-compiler119124-62-359u5j.hrbs4/example.rs"
str.1:
.ascii "attempt to add with overflow"
.L__unnamed_1:
.quad str.1
.quad 28
.quad str.0
.quad 64
.long 8
.long 33
Metadata
Metadata
Assignees
Labels
Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.Call for participation: An issue has been fixed and does not reproduce, but no test has been added.Issue: Problems and improvements with respect to performance of generated code.Working group: LLVM backend code generation