mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-30 20:44:34 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			780 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			780 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //@ 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,       // tag 2
 | |
|     B,       // tag 3
 | |
|     C(bool), // untagged
 | |
|     D,       // tag 5
 | |
|     E,       // tag 6
 | |
| }
 | |
| 
 | |
| // CHECK-LABEL: define{{( dso_local)?}} noundef{{( range\(i8 -?[0-9]+, -?[0-9]+\))?}} i8 @match4(i8{{.+}}%0)
 | |
| // CHECK-NEXT: start:
 | |
| // CHECK-NEXT: %[[NOT_IMPOSSIBLE:.+]] = icmp ne i8 %0, 4
 | |
| // CHECK-NEXT: call void @llvm.assume(i1 %[[NOT_IMPOSSIBLE]])
 | |
| // CHECK-NEXT: %[[REL_VAR:.+]] = add{{( nsw)?}} i8 %0, -2
 | |
| // 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,   // tag 2
 | |
|     Bool258(bool), // untagged
 | |
|     Possible259,   // tag 4
 | |
| }
 | |
| 
 | |
| // CHECK-LABEL: define{{( dso_local)?}} noundef{{( range\(i8 [0-9]+, [0-9]+\))?}} i8 @match5(i8{{.+}}%0)
 | |
| // CHECK-NEXT: start:
 | |
| // CHECK-NEXT: %[[NOT_IMPOSSIBLE:.+]] = icmp ne i8 %0, 3
 | |
| // CHECK-NEXT: call void @llvm.assume(i1 %[[NOT_IMPOSSIBLE]])
 | |
| // 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: %[[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,
 | |
|     }
 | |
| }
 | 
