| //@ compile-flags: -Copt-level=3 |
| |
| #![crate_type = "lib"] |
| |
| #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] |
| pub struct Int(u32); |
| |
| const A: Int = Int(201); |
| const B: Int = Int(270); |
| const C: Int = Int(153); |
| |
| // The code is from https://github.com/rust-lang/rust/issues/119520. |
| // This code will basically turn into `matches!(x.partial_cmp(&A), Some(Greater | Equal))`. |
| // The otherwise branch must be `Less`. |
| // CHECK-LABEL: @implicit_match( |
| // CHECK-SAME: [[TMP0:%.*]]) |
| // CHECK-NEXT: start: |
| // CHECK-NEXT: [[TMP1:%.*]] = add i32 [[TMP0]], -201 |
| // CHECK-NEXT: icmp ult i32 [[TMP1]], 70 |
| // CHECK-NEXT: icmp eq i32 [[TMP0]], 153 |
| // CHECK-NEXT: [[SPEC_SELECT:%.*]] = or i1 |
| // CHECK-NEXT: ret i1 [[SPEC_SELECT]] |
| #[no_mangle] |
| pub fn implicit_match(x: Int) -> bool { |
| (x >= A && x <= B) || x == C |
| } |
| |
| // The code is from https://github.com/rust-lang/rust/issues/110097. |
| // We expect it to generate the same optimized code as a full match. |
| // CHECK-LABEL: @if_let( |
| // CHECK: start: |
| // CHECK-NOT: zext |
| // CHECK: select |
| // CHECK-NEXT: insertvalue |
| // CHECK-NEXT: insertvalue |
| // CHECK-NEXT: ret |
| #[no_mangle] |
| pub fn if_let(val: Result<i32, ()>) -> Result<i32, ()> { |
| if let Ok(x) = val { Ok(x * 2) } else { Err(()) } |
| } |