diff options
| author | bors <bors@rust-lang.org> | 2024-08-10 01:59:54 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-08-10 01:59:54 +0000 |
| commit | 69b380dc1c61f2dfc499b90aa97a659203a06c81 (patch) | |
| tree | d3356f39eb1d255b4b3fca9b92a059250ab6cc3c | |
| parent | 68d2e8a66e0003178baf7dd9bbc62dc76f54a1af (diff) | |
| parent | b5c453d7a28ab156dd6e2ed81674500cb1dbe7ec (diff) | |
| download | rust-69b380dc1c61f2dfc499b90aa97a659203a06c81.tar.gz rust-69b380dc1c61f2dfc499b90aa97a659203a06c81.zip | |
Auto merge of #128584 - DianQK:tests-for-llvm-19, r=nikic
Add a set of tests for LLVM 19 Close #107681. Close #118306. Close #126585. r? compiler
| -rw-r--r-- | tests/codegen/issues/issue-107681-unwrap_unchecked.rs | 20 | ||||
| -rw-r--r-- | tests/codegen/issues/issue-118306.rs | 23 | ||||
| -rw-r--r-- | tests/codegen/issues/issue-126585.rs | 24 |
3 files changed, 67 insertions, 0 deletions
diff --git a/tests/codegen/issues/issue-107681-unwrap_unchecked.rs b/tests/codegen/issues/issue-107681-unwrap_unchecked.rs new file mode 100644 index 00000000000..7d9679d2322 --- /dev/null +++ b/tests/codegen/issues/issue-107681-unwrap_unchecked.rs @@ -0,0 +1,20 @@ +//@ compile-flags: -O +//@ min-llvm-version: 19 + +// Test for #107681. +// Make sure we don't create `br` or `select` instructions. + +#![crate_type = "lib"] + +use std::iter::Copied; +use std::slice::Iter; + +#[no_mangle] +pub unsafe fn foo(x: &mut Copied<Iter<'_, u32>>) -> u32 { + // CHECK-LABEL: @foo( + // CHECK-NOT: br + // CHECK-NOT: select + // CHECK: [[RET:%.*]] = load i32, ptr + // CHECK-NEXT: ret i32 [[RET]] + x.next().unwrap_unchecked() +} diff --git a/tests/codegen/issues/issue-118306.rs b/tests/codegen/issues/issue-118306.rs new file mode 100644 index 00000000000..8af1c6a971c --- /dev/null +++ b/tests/codegen/issues/issue-118306.rs @@ -0,0 +1,23 @@ +//@ compile-flags: -O +//@ min-llvm-version: 19 +//@ only-x86_64 + +// Test for #118306. +// Make sure we don't create `br` or `select` instructions. + +#![crate_type = "lib"] + +#[no_mangle] +pub fn branchy(input: u64) -> u64 { + // CHECK-LABEL: @branchy( + // CHECK-NEXT: start: + // CHECK-NEXT: [[_2:%.*]] = and i64 [[INPUT:%.*]], 3 + // CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [4 x i64], ptr @switch.table.branchy, i64 0, i64 [[_2]] + // CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i64, ptr [[SWITCH_GEP]] + // CHECK-NEXT: ret i64 [[SWITCH_LOAD]] + match input % 4 { + 1 | 2 => 1, + 3 => 2, + _ => 0, + } +} diff --git a/tests/codegen/issues/issue-126585.rs b/tests/codegen/issues/issue-126585.rs new file mode 100644 index 00000000000..a468efd728d --- /dev/null +++ b/tests/codegen/issues/issue-126585.rs @@ -0,0 +1,24 @@ +//@ compile-flags: -Copt-level=s +//@ min-llvm-version: 19 +//@ only-x86_64 + +// Test for #126585. +// Ensure that this IR doesn't have extra undef phi input, which also guarantees that this asm +// doesn't have subsequent labels and unnecessary `jmp` instructions. + +#![crate_type = "lib"] + +#[no_mangle] +fn checked_div_round(a: u64, b: u64) -> Option<u64> { + // CHECK-LABEL: @checked_div_round + // CHECK: phi + // CHECK-NOT: undef + // CHECK: phi + // CHECK-NOT: undef + match b { + 0 => None, + 1 => Some(a), + // `a / b` is computable and `(a % b) * 2` can not overflow since `b >= 2`. + b => Some(a / b + if (a % b) * 2 >= b { 1 } else { 0 }), + } +} |
