Skip to content

Commit

Permalink
Auto merge of rust-lang#128584 - DianQK:tests-for-llvm-19, r=nikic
Browse files Browse the repository at this point in the history
Add a set of tests for LLVM 19

Close rust-lang#107681. Close rust-lang#118306. Close rust-lang#126585.

r? compiler
  • Loading branch information
bors committed Aug 4, 2024
2 parents 176e545 + 3e5429e commit df62a42
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 0 deletions.
20 changes: 20 additions & 0 deletions tests/codegen/issues/issue-107681-unwrap_unchecked.rs
Original file line number Diff line number Diff line change
@@ -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()
}
22 changes: 22 additions & 0 deletions tests/codegen/issues/issue-118306.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
//@ compile-flags: -O
//@ min-llvm-version: 19

// 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,
}
}
23 changes: 23 additions & 0 deletions tests/codegen/issues/issue-126585.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
//@ compile-flags: -Copt-level=s
//@ min-llvm-version: 19

// 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 }),
}
}

0 comments on commit df62a42

Please sign in to comment.