2024-04-23 11:31:57 -05:00
|
|
|
//@ compile-flags: -O
|
|
|
|
|
|
|
|
#![crate_type = "lib"]
|
|
|
|
|
|
|
|
// Ensure that when val < base, we do not divide or multiply.
|
|
|
|
|
|
|
|
// CHECK-LABEL: @checked_ilog
|
2024-10-19 19:36:36 -05:00
|
|
|
// CHECK-SAME: (i16{{.*}} %val, i16{{.*}} %base)
|
2024-04-23 11:31:57 -05:00
|
|
|
#[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)
|
|
|
|
}
|