Skip to content

Commit 8c80d2e

Browse files
Add Three Codegen Tests
1 parent 9fb94b3 commit 8c80d2e

File tree

3 files changed

+90
-0
lines changed

3 files changed

+90
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//@ assembly-output: emit-asm
2+
//@ only-x86_64
3+
//@ ignore-sgx Test incompatible with LVI mitigations
4+
//@ compile-flags: -C opt-level=3
5+
//! Ensure that indexing a slice with `bool` does not
6+
//! generate any redundant `jmp` and `and` instructions.
7+
//! Discovered in issue #123216.
8+
9+
#![crate_type = "lib"]
10+
11+
#[no_mangle]
12+
fn f(a: u32, b: bool, c: bool, d: &mut [u128; 2]) {
13+
// CHECK-LABEL: f:
14+
// CHECK: testl %esi, %esi
15+
// CHECK: je
16+
// CHECK: xorb %dl, %dil
17+
// CHECK: orb $1, (%rcx)
18+
// CHECK: movzbl %dil, %eax
19+
// CHECK: andl $1, %eax
20+
// CHECK: shll $4, %eax
21+
// CHECK: orb $1, (%rcx,%rax)
22+
// CHECK-NOT: jmp
23+
// CHECK-NOT: andl %dil, $1
24+
// CHECK: retq
25+
let mut a = a & 1 != 0;
26+
if b {
27+
a ^= c;
28+
d[0] |= 1;
29+
}
30+
d[a as usize] |= 1;
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//@ compile-flags: -C opt-level=3
2+
//! Ensure that `.get()` on `std::num::NonZero*` types do not
3+
//! check for zero equivalency.
4+
//! Discovered in issue #49572.
5+
6+
#![crate_type = "lib"]
7+
8+
#[no_mangle]
9+
pub fn foo(x: std::num::NonZeroU32) -> bool {
10+
// CHECK-LABEL: @foo(
11+
// CHECK: ret i1 true
12+
x.get() != 0
13+
}
14+
15+
#[no_mangle]
16+
pub fn bar(x: std::num::NonZeroI64) -> bool {
17+
// CHECK-LABEL: @bar(
18+
// CHECK: ret i1 true
19+
x.get() != 0
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
//@ compile-flags: -C opt-level=3
2+
//! Ensure that matching on `x % 5` generates an unreachable
3+
//! branch for values greater than 4.
4+
//! Discovered in issue #93514.
5+
6+
#![crate_type = "lib"]
7+
8+
#[no_mangle]
9+
pub unsafe fn parse0(x: u32) -> u32 {
10+
// CHECK-LABEL: i32 @parse0(
11+
// CHECK: [[_2:%.*]] = urem
12+
// CHECK-NEXT: switch i32 [[_2]], label %[[DEFAULT_UNREACHABLE1:.*]] [
13+
// CHECK-NEXT: i32 0
14+
// CHECK-NEXT: i32 1
15+
// CHECK-NEXT: i32 2
16+
// CHECK-NEXT: i32 3
17+
// CHECK-NEXT: i32 4
18+
// CHECK-NEXT: ]
19+
// CHECK: [[DEFAULT_UNREACHABLE1]]:
20+
// CHECK-NEXT: unreachable
21+
// CHECK: ret i32
22+
match x % 5 {
23+
0 => f1(x),
24+
1 => f2(x),
25+
2 => f3(x),
26+
3 => f4(x),
27+
4 => f5(x),
28+
_ => eliminate_me(),
29+
}
30+
}
31+
32+
extern "Rust" {
33+
fn eliminate_me() -> u32;
34+
fn f1(x: u32) -> u32;
35+
fn f2(x: u32) -> u32;
36+
fn f3(x: u32) -> u32;
37+
fn f4(x: u32) -> u32;
38+
fn f5(x: u32) -> u32;
39+
}

0 commit comments

Comments
 (0)