diff options
Diffstat (limited to 'tests/codegen/enum/enum-match.rs')
| -rw-r--r-- | tests/codegen/enum/enum-match.rs | 779 |
1 files changed, 0 insertions, 779 deletions
diff --git a/tests/codegen/enum/enum-match.rs b/tests/codegen/enum/enum-match.rs deleted file mode 100644 index 57db44ec74e..00000000000 --- a/tests/codegen/enum/enum-match.rs +++ /dev/null @@ -1,779 +0,0 @@ -//@ compile-flags: -Copt-level=1 -//@ only-64bit - -#![crate_type = "lib"] -#![feature(core_intrinsics)] - -// Check each of the 3 cases for `codegen_get_discr`. - -// FIXME: once our min-bar LLVM has `range` attributes, update the various -// tests here to no longer have the `range`s and `nsw`s as optional. - -// Case 0: One tagged variant. -pub enum Enum0 { - A(bool), - B, -} - -// CHECK-LABEL: define{{( dso_local)?}} noundef{{( range\(i8 [0-9]+, [0-9]+\))?}} i8 @match0(i8{{.+}}%0) -// CHECK-NEXT: start: -// CHECK-NEXT: %[[IS_B:.+]] = icmp eq i8 %0, 2 -// CHECK-NEXT: %[[TRUNC:.+]] = and i8 %0, 1 -// CHECK-NEXT: %[[R:.+]] = select i1 %[[IS_B]], i8 13, i8 %[[TRUNC]] -// CHECK-NEXT: ret i8 %[[R]] -#[no_mangle] -pub fn match0(e: Enum0) -> u8 { - use Enum0::*; - match e { - A(b) => b as u8, - B => 13, - } -} - -// Case 1: Niche values are on a boundary for `range`. -pub enum Enum1 { - A(bool), - B, - C, -} - -// CHECK-LABEL: define{{( dso_local)?}} noundef{{( range\(i8 [0-9]+, [0-9]+\))?}} i8 @match1(i8{{.+}}%0) -// CHECK-NEXT: start: -// CHECK-NEXT: %[[REL_VAR:.+]] = add{{( nsw)?}} i8 %0, -2 -// CHECK-NEXT: %[[REL_VAR_WIDE:.+]] = zext i8 %[[REL_VAR]] to i64 -// CHECK-NEXT: %[[IS_NICHE:.+]] = icmp{{( samesign)?}} ugt i8 %0, 1 -// CHECK-NEXT: %[[NICHE_DISCR:.+]] = add nuw nsw i64 %[[REL_VAR_WIDE]], 1 -// CHECK-NEXT: %[[DISCR:.+]] = select i1 %[[IS_NICHE]], i64 %[[NICHE_DISCR]], i64 0 -// CHECK-NEXT: switch i64 %[[DISCR]] -#[no_mangle] -pub fn match1(e: Enum1) -> u8 { - use Enum1::*; - match e { - A(b) => b as u8, - B => 13, - C => 100, - } -} - -// Case 2: Special cases don't apply. -#[rustfmt::skip] -pub enum X { - _2=2, _3, _4, _5, _6, _7, _8, _9, _10, _11, - _12, _13, _14, _15, _16, _17, _18, _19, _20, - _21, _22, _23, _24, _25, _26, _27, _28, _29, - _30, _31, _32, _33, _34, _35, _36, _37, _38, - _39, _40, _41, _42, _43, _44, _45, _46, _47, - _48, _49, _50, _51, _52, _53, _54, _55, _56, - _57, _58, _59, _60, _61, _62, _63, _64, _65, - _66, _67, _68, _69, _70, _71, _72, _73, _74, - _75, _76, _77, _78, _79, _80, _81, _82, _83, - _84, _85, _86, _87, _88, _89, _90, _91, _92, - _93, _94, _95, _96, _97, _98, _99, _100, _101, - _102, _103, _104, _105, _106, _107, _108, _109, - _110, _111, _112, _113, _114, _115, _116, _117, - _118, _119, _120, _121, _122, _123, _124, _125, - _126, _127, _128, _129, _130, _131, _132, _133, - _134, _135, _136, _137, _138, _139, _140, _141, - _142, _143, _144, _145, _146, _147, _148, _149, - _150, _151, _152, _153, _154, _155, _156, _157, - _158, _159, _160, _161, _162, _163, _164, _165, - _166, _167, _168, _169, _170, _171, _172, _173, - _174, _175, _176, _177, _178, _179, _180, _181, - _182, _183, _184, _185, _186, _187, _188, _189, - _190, _191, _192, _193, _194, _195, _196, _197, - _198, _199, _200, _201, _202, _203, _204, _205, - _206, _207, _208, _209, _210, _211, _212, _213, - _214, _215, _216, _217, _218, _219, _220, _221, - _222, _223, _224, _225, _226, _227, _228, _229, - _230, _231, _232, _233, _234, _235, _236, _237, - _238, _239, _240, _241, _242, _243, _244, _245, - _246, _247, _248, _249, _250, _251, _252, _253, -} - -pub enum Enum2 { - A(X), - B, - C, - D, - E, -} - -// CHECK-LABEL: define{{( dso_local)?}} noundef{{( range\(i8 [0-9]+, -?[0-9]+\))?}} i8 @match2(i8{{.+}}%0) -// CHECK-NEXT: start: -// CHECK-NEXT: %[[REL_VAR:.+]] = add i8 %0, 2 -// CHECK-NEXT: %[[REL_VAR_WIDE:.+]] = zext i8 %[[REL_VAR]] to i64 -// CHECK-NEXT: %[[IS_NICHE:.+]] = icmp ult i8 %[[REL_VAR]], 4 -// CHECK-NEXT: %[[NICHE_DISCR:.+]] = add nuw nsw i64 %[[REL_VAR_WIDE]], 1 -// CHECK-NEXT: %[[DISCR:.+]] = select i1 %[[IS_NICHE]], i64 %[[NICHE_DISCR]], i64 0 -// CHECK-NEXT: switch i64 %[[DISCR]] -#[no_mangle] -pub fn match2(e: Enum2) -> u8 { - use Enum2::*; - match e { - A(b) => b as u8, - B => 13, - C => 100, - D => 200, - E => 250, - } -} - -// And make sure it works even if the niched scalar is a pointer. -// (For example, that we don't try to `sub` on pointers.) - -// CHECK-LABEL: define{{( dso_local)?}} noundef{{( range\(i16 -?[0-9]+, -?[0-9]+\))?}} i16 @match3(ptr{{.+}}%0) -// CHECK-NEXT: start: -// CHECK-NEXT: %[[IS_NULL:.+]] = icmp eq ptr %0, null -// CHECK-NEXT: br i1 %[[IS_NULL]] -#[no_mangle] -pub fn match3(e: Option<&u8>) -> i16 { - match e { - Some(r) => *r as _, - None => -1, - } -} - -// If the untagged variant is in the middle, there's an impossible value that's -// not reflected in the `range` parameter attribute, so we assume it away. - -#[derive(PartialEq)] -pub enum MiddleNiche { - A, - B, - C(bool), - D, - E, -} - -// CHECK-LABEL: define{{( dso_local)?}} noundef{{( range\(i8 -?[0-9]+, -?[0-9]+\))?}} i8 @match4(i8{{.+}}%0) -// CHECK-NEXT: start: -// CHECK-NEXT: %[[REL_VAR:.+]] = add{{( nsw)?}} i8 %0, -2 -// CHECK-NEXT: %[[NOT_IMPOSSIBLE:.+]] = icmp ne i8 %[[REL_VAR]], 2 -// CHECK-NEXT: call void @llvm.assume(i1 %[[NOT_IMPOSSIBLE]]) -// CHECK-NEXT: %[[NOT_NICHE:.+]] = icmp{{( samesign)?}} ult i8 %0, 2 -// CHECK-NEXT: %[[DISCR:.+]] = select i1 %[[NOT_NICHE]], i8 2, i8 %[[REL_VAR]] -// CHECK-NEXT: switch i8 %[[DISCR]] -#[no_mangle] -pub fn match4(e: MiddleNiche) -> u8 { - use MiddleNiche::*; - match e { - A => 13, - B => 100, - C(b) => b as u8, - D => 200, - E => 250, - } -} - -// CHECK-LABEL: define{{.+}}i1 @match4_is_c(i8{{.+}}%e) -// CHECK-NEXT: start -// CHECK-NEXT: %[[NOT_IMPOSSIBLE:.+]] = icmp ne i8 %e, 4 -// CHECK-NEXT: call void @llvm.assume(i1 %[[NOT_IMPOSSIBLE]]) -// CHECK-NEXT: %[[IS_C:.+]] = icmp{{( samesign)?}} ult i8 %e, 2 -// CHECK-NEXT: ret i1 %[[IS_C]] -#[no_mangle] -pub fn match4_is_c(e: MiddleNiche) -> bool { - // Before #139098, this couldn't optimize out the `select` because it looked - // like it was possible for a `2` to be produced on both sides. - - std::intrinsics::discriminant_value(&e) == 2 -} - -// You have to do something pretty obnoxious to get a variant index that doesn't -// fit in the tag size, but it's possible - -pub enum Never {} - -pub enum HugeVariantIndex { - V000(Never), - V001(Never), - V002(Never), - V003(Never), - V004(Never), - V005(Never), - V006(Never), - V007(Never), - V008(Never), - V009(Never), - V010(Never), - V011(Never), - V012(Never), - V013(Never), - V014(Never), - V015(Never), - V016(Never), - V017(Never), - V018(Never), - V019(Never), - V020(Never), - V021(Never), - V022(Never), - V023(Never), - V024(Never), - V025(Never), - V026(Never), - V027(Never), - V028(Never), - V029(Never), - V030(Never), - V031(Never), - V032(Never), - V033(Never), - V034(Never), - V035(Never), - V036(Never), - V037(Never), - V038(Never), - V039(Never), - V040(Never), - V041(Never), - V042(Never), - V043(Never), - V044(Never), - V045(Never), - V046(Never), - V047(Never), - V048(Never), - V049(Never), - V050(Never), - V051(Never), - V052(Never), - V053(Never), - V054(Never), - V055(Never), - V056(Never), - V057(Never), - V058(Never), - V059(Never), - V060(Never), - V061(Never), - V062(Never), - V063(Never), - V064(Never), - V065(Never), - V066(Never), - V067(Never), - V068(Never), - V069(Never), - V070(Never), - V071(Never), - V072(Never), - V073(Never), - V074(Never), - V075(Never), - V076(Never), - V077(Never), - V078(Never), - V079(Never), - V080(Never), - V081(Never), - V082(Never), - V083(Never), - V084(Never), - V085(Never), - V086(Never), - V087(Never), - V088(Never), - V089(Never), - V090(Never), - V091(Never), - V092(Never), - V093(Never), - V094(Never), - V095(Never), - V096(Never), - V097(Never), - V098(Never), - V099(Never), - V100(Never), - V101(Never), - V102(Never), - V103(Never), - V104(Never), - V105(Never), - V106(Never), - V107(Never), - V108(Never), - V109(Never), - V110(Never), - V111(Never), - V112(Never), - V113(Never), - V114(Never), - V115(Never), - V116(Never), - V117(Never), - V118(Never), - V119(Never), - V120(Never), - V121(Never), - V122(Never), - V123(Never), - V124(Never), - V125(Never), - V126(Never), - V127(Never), - V128(Never), - V129(Never), - V130(Never), - V131(Never), - V132(Never), - V133(Never), - V134(Never), - V135(Never), - V136(Never), - V137(Never), - V138(Never), - V139(Never), - V140(Never), - V141(Never), - V142(Never), - V143(Never), - V144(Never), - V145(Never), - V146(Never), - V147(Never), - V148(Never), - V149(Never), - V150(Never), - V151(Never), - V152(Never), - V153(Never), - V154(Never), - V155(Never), - V156(Never), - V157(Never), - V158(Never), - V159(Never), - V160(Never), - V161(Never), - V162(Never), - V163(Never), - V164(Never), - V165(Never), - V166(Never), - V167(Never), - V168(Never), - V169(Never), - V170(Never), - V171(Never), - V172(Never), - V173(Never), - V174(Never), - V175(Never), - V176(Never), - V177(Never), - V178(Never), - V179(Never), - V180(Never), - V181(Never), - V182(Never), - V183(Never), - V184(Never), - V185(Never), - V186(Never), - V187(Never), - V188(Never), - V189(Never), - V190(Never), - V191(Never), - V192(Never), - V193(Never), - V194(Never), - V195(Never), - V196(Never), - V197(Never), - V198(Never), - V199(Never), - V200(Never), - V201(Never), - V202(Never), - V203(Never), - V204(Never), - V205(Never), - V206(Never), - V207(Never), - V208(Never), - V209(Never), - V210(Never), - V211(Never), - V212(Never), - V213(Never), - V214(Never), - V215(Never), - V216(Never), - V217(Never), - V218(Never), - V219(Never), - V220(Never), - V221(Never), - V222(Never), - V223(Never), - V224(Never), - V225(Never), - V226(Never), - V227(Never), - V228(Never), - V229(Never), - V230(Never), - V231(Never), - V232(Never), - V233(Never), - V234(Never), - V235(Never), - V236(Never), - V237(Never), - V238(Never), - V239(Never), - V240(Never), - V241(Never), - V242(Never), - V243(Never), - V244(Never), - V245(Never), - V246(Never), - V247(Never), - V248(Never), - V249(Never), - V250(Never), - V251(Never), - V252(Never), - V253(Never), - V254(Never), - V255(Never), - V256(Never), - - Possible257, - Bool258(bool), - Possible259, -} - -// CHECK-LABEL: define{{( dso_local)?}} noundef{{( range\(i8 [0-9]+, [0-9]+\))?}} i8 @match5(i8{{.+}}%0) -// CHECK-NEXT: start: -// CHECK-NEXT: %[[REL_VAR:.+]] = add{{( nsw)?}} i8 %0, -2 -// CHECK-NEXT: %[[REL_VAR_WIDE:.+]] = zext i8 %[[REL_VAR]] to i64 -// CHECK-NEXT: %[[IS_NICHE:.+]] = icmp{{( samesign)?}} ugt i8 %0, 1 -// CHECK-NEXT: %[[NICHE_DISCR:.+]] = add nuw nsw i64 %[[REL_VAR_WIDE]], 257 -// CHECK-NEXT: %[[NOT_IMPOSSIBLE:.+]] = icmp ne i64 %[[NICHE_DISCR]], 258 -// CHECK-NEXT: call void @llvm.assume(i1 %[[NOT_IMPOSSIBLE]]) -// CHECK-NEXT: %[[DISCR:.+]] = select i1 %[[IS_NICHE]], i64 %[[NICHE_DISCR]], i64 258 -// CHECK-NEXT: switch i64 %[[DISCR]], -// CHECK-NEXT: i64 257, -// CHECK-NEXT: i64 258, -// CHECK-NEXT: i64 259, -#[no_mangle] -pub fn match5(e: HugeVariantIndex) -> u8 { - use HugeVariantIndex::*; - match e { - Possible257 => 13, - Bool258(b) => b as u8, - Possible259 => 100, - } -} - -// Make an enum where the niche tags wrap both as signed and as unsigned, to hit -// the most-fallback case where there's just nothing smart to do. - -pub enum E10Through65 { - D10 = 10, - D11 = 11, - D12 = 12, - D13 = 13, - D14 = 14, - D15 = 15, - D16 = 16, - D17 = 17, - D18 = 18, - D19 = 19, - D20 = 20, - D21 = 21, - D22 = 22, - D23 = 23, - D24 = 24, - D25 = 25, - D26 = 26, - D27 = 27, - D28 = 28, - D29 = 29, - D30 = 30, - D31 = 31, - D32 = 32, - D33 = 33, - D34 = 34, - D35 = 35, - D36 = 36, - D37 = 37, - D38 = 38, - D39 = 39, - D40 = 40, - D41 = 41, - D42 = 42, - D43 = 43, - D44 = 44, - D45 = 45, - D46 = 46, - D47 = 47, - D48 = 48, - D49 = 49, - D50 = 50, - D51 = 51, - D52 = 52, - D53 = 53, - D54 = 54, - D55 = 55, - D56 = 56, - D57 = 57, - D58 = 58, - D59 = 59, - D60 = 60, - D61 = 61, - D62 = 62, - D63 = 63, - D64 = 64, - D65 = 65, -} - -pub enum Tricky { - Untagged(E10Through65), - V001, - V002, - V003, - V004, - V005, - V006, - V007, - V008, - V009, - V010, - V011, - V012, - V013, - V014, - V015, - V016, - V017, - V018, - V019, - V020, - V021, - V022, - V023, - V024, - V025, - V026, - V027, - V028, - V029, - V030, - V031, - V032, - V033, - V034, - V035, - V036, - V037, - V038, - V039, - V040, - V041, - V042, - V043, - V044, - V045, - V046, - V047, - V048, - V049, - V050, - V051, - V052, - V053, - V054, - V055, - V056, - V057, - V058, - V059, - V060, - V061, - V062, - V063, - V064, - V065, - V066, - V067, - V068, - V069, - V070, - V071, - V072, - V073, - V074, - V075, - V076, - V077, - V078, - V079, - V080, - V081, - V082, - V083, - V084, - V085, - V086, - V087, - V088, - V089, - V090, - V091, - V092, - V093, - V094, - V095, - V096, - V097, - V098, - V099, - V100, - V101, - V102, - V103, - V104, - V105, - V106, - V107, - V108, - V109, - V110, - V111, - V112, - V113, - V114, - V115, - V116, - V117, - V118, - V119, - V120, - V121, - V122, - V123, - V124, - V125, - V126, - V127, - V128, - V129, - V130, - V131, - V132, - V133, - V134, - V135, - V136, - V137, - V138, - V139, - V140, - V141, - V142, - V143, - V144, - V145, - V146, - V147, - V148, - V149, - V150, - V151, - V152, - V153, - V154, - V155, - V156, - V157, - V158, - V159, - V160, - V161, - V162, - V163, - V164, - V165, - V166, - V167, - V168, - V169, - V170, - V171, - V172, - V173, - V174, - V175, - V176, - V177, - V178, - V179, - V180, - V181, - V182, - V183, - V184, - V185, - V186, - V187, - V188, - V189, - V190, - V191, - V192, - V193, - V194, - V195, - V196, - V197, - V198, - V199, - V200, -} - -const _: () = assert!(std::intrinsics::discriminant_value(&Tricky::V100) == 100); - -// CHECK-LABEL: define noundef{{( range\(i8 [0-9]+, [0-9]+\))?}} i8 @discriminant6(i8 noundef %e) -// CHECK-NEXT: start: -// CHECK-NEXT: %[[REL_VAR:.+]] = add i8 %e, -66 -// CHECK-NEXT: %[[IS_NICHE:.+]] = icmp ult i8 %[[REL_VAR]], -56 -// CHECK-NEXT: %[[TAGGED_DISCR:.+]] = add i8 %e, -65 -// CHECK-NEXT: %[[DISCR:.+]] = select i1 %[[IS_NICHE]], i8 %[[TAGGED_DISCR]], i8 0 -// CHECK-NEXT: ret i8 %[[DISCR]] -#[no_mangle] -pub fn discriminant6(e: Tricky) -> u8 { - std::intrinsics::discriminant_value(&e) as _ -} - -// Case from <https://github.com/rust-lang/rust/issues/104519>, -// where sign-extension is important. - -pub enum OpenResult { - Ok(()), - Err(()), - TransportErr(TransportErr), -} - -#[repr(i32)] -pub enum TransportErr { - UnknownMethod = -2, -} - -#[no_mangle] -pub fn match7(result: OpenResult) -> u8 { - // CHECK-LABEL: define noundef{{( range\(i8 [0-9]+, [0-9]+\))?}} i8 @match7(i32{{.+}}%result) - // CHECK-NEXT: start: - // CHECK-NEXT: %[[NOT_OK:.+]] = icmp ne i32 %result, -1 - // CHECK-NEXT: %[[RET:.+]] = zext i1 %[[NOT_OK]] to i8 - // CHECK-NEXT: ret i8 %[[RET]] - match result { - OpenResult::Ok(()) => 0, - _ => 1, - } -} |
