21 lines
574 B
Rust
21 lines
574 B
Rust
|
//@ compile-flags: -O
|
||
|
|
||
|
#![crate_type = "lib"]
|
||
|
|
||
|
// Ensure that when val < base, we do not divide or multiply.
|
||
|
|
||
|
// CHECK-LABEL: @checked_ilog
|
||
|
// CHECK-SAME: (i16 noundef %val, i16 noundef %base)
|
||
|
#[no_mangle]
|
||
|
pub fn checked_ilog(val: u16, base: u16) -> Option<u32> {
|
||
|
// CHECK-NOT: udiv
|
||
|
// CHECK-NOT: mul
|
||
|
// CHECK: %[[IS_LESS:.+]] = icmp ult i16 %val, %base
|
||
|
// CHECK-NEXT: br i1 %[[IS_LESS]], label %[[TRUE:.+]], label %[[FALSE:.+]]
|
||
|
// CHECK: [[TRUE]]:
|
||
|
// CHECK-NOT: udiv
|
||
|
// CHECK-NOT: mul
|
||
|
// CHECK: ret { i32, i32 }
|
||
|
val.checked_ilog(base)
|
||
|
}
|