|
| 1 | +//@ compile-flags: -Cno-prepopulate-passes -O |
| 2 | +//@ only-64bit (I don't care about alignment under different bits) |
| 3 | + |
| 4 | +// Testing different niches updates to the corresponding alignment. |
| 5 | + |
| 6 | +#![crate_type = "lib"] |
| 7 | +#![feature(rustc_attrs)] |
| 8 | +#![feature(never_type)] |
| 9 | + |
| 10 | +#[rustc_layout_scalar_valid_range_start(0)] |
| 11 | +#[rustc_layout_scalar_valid_range_end(0x7fff)] |
| 12 | +struct RestrictedAddress_0_0x7fff(&'static i64); |
| 13 | + |
| 14 | +#[rustc_layout_scalar_valid_range_start(1)] |
| 15 | +#[rustc_layout_scalar_valid_range_end(0x7fff)] |
| 16 | +struct RestrictedAddress_1_0x7fff(&'static i64); |
| 17 | + |
| 18 | +#[rustc_layout_scalar_valid_range_start(0)] |
| 19 | +#[rustc_layout_scalar_valid_range_end(0xf000)] |
| 20 | +struct RestrictedAddress_0_0xf000(&'static i64); |
| 21 | + |
| 22 | +enum MultipleAlign8 { |
| 23 | + Untag(RestrictedAddress_1_0x7fff), |
| 24 | + Niche_32768, |
| 25 | + Uninhabited_1(!), |
| 26 | + Uninhabited_2(!), |
| 27 | + Uninhabited_3(!), |
| 28 | + Uninhabited_4(!), |
| 29 | + Uninhabited_5(!), |
| 30 | + Uninhabited_6(!), |
| 31 | + Uninhabited_7(!), |
| 32 | + Niche_32776, |
| 33 | +} |
| 34 | + |
| 35 | +// CHECK-LABEL: @multiple_niches_align_8 |
| 36 | +// CHECK-SAME: align 8 {{.*}}%a) |
| 37 | +#[no_mangle] |
| 38 | +#[inline(never)] |
| 39 | +fn multiple_niches_align_8(a: MultipleAlign8) {} |
| 40 | + |
| 41 | +// CHECK-LABEL: @call_multiple_niches_align_8 |
| 42 | +#[no_mangle] |
| 43 | +fn call_multiple_niches_align_8() { |
| 44 | + // CHECK: call void @multiple_niches_align_8(ptr {{.*}}align 8 {{.*}}(i64 32768 to ptr) |
| 45 | + multiple_niches_align_8(MultipleAlign8::Niche_32768); |
| 46 | + // CHECK: call void @multiple_niches_align_8(ptr {{.*}}align 8 {{.*}}(i64 32776 to ptr) |
| 47 | + multiple_niches_align_8(MultipleAlign8::Niche_32776); |
| 48 | +} |
| 49 | + |
| 50 | +enum MultipleAlign2 { |
| 51 | + Untag(RestrictedAddress_1_0x7fff), |
| 52 | + Niche_32768, |
| 53 | + Uninhabited_1(!), |
| 54 | + Niche_32770, |
| 55 | +} |
| 56 | + |
| 57 | +// CHECK-LABEL: @multiple_niches_align_2 |
| 58 | +// CHECK-SAME: align 2 {{.*}}%a) |
| 59 | +#[no_mangle] |
| 60 | +#[inline(never)] |
| 61 | +fn multiple_niches_align_2(a: MultipleAlign2) {} |
| 62 | + |
| 63 | +// CHECK-LABEL: @call_multiple_niches_align_2 |
| 64 | +#[no_mangle] |
| 65 | +fn call_multiple_niches_align_2() { |
| 66 | + // CHECK: call void @multiple_niches_align_2(ptr {{.*}}align 2 {{.*}}(i64 32768 to ptr) |
| 67 | + multiple_niches_align_2(MultipleAlign2::Niche_32768); |
| 68 | + // CHECK: call void @multiple_niches_align_2(ptr {{.*}}align 2 {{.*}}(i64 32770 to ptr) |
| 69 | + multiple_niches_align_2(MultipleAlign2::Niche_32770); |
| 70 | +} |
| 71 | + |
| 72 | +enum SingleAlign8 { |
| 73 | + Untag(RestrictedAddress_0_0x7fff), |
| 74 | + Niche_32768, |
| 75 | +} |
| 76 | + |
| 77 | +// CHECK-LABEL: @single_niche_align_8 |
| 78 | +// CHECK-SAME: align 8 {{.*}}%a) |
| 79 | +#[no_mangle] |
| 80 | +#[inline(never)] |
| 81 | +fn single_niche_align_8(a: SingleAlign8) {} |
| 82 | + |
| 83 | +// CHECK-LABEL: @call_single_niche_align_8 |
| 84 | +#[no_mangle] |
| 85 | +fn call_single_niche_align_8() { |
| 86 | + // CHECK: call void @single_niche_align_8(ptr {{.*}}align 8 {{.*}}(i64 32768 to ptr) |
| 87 | + single_niche_align_8(SingleAlign8::Niche_32768); |
| 88 | +} |
| 89 | + |
| 90 | +enum SingleAlign1 { |
| 91 | + Untag(RestrictedAddress_0_0xf000), |
| 92 | + Niche_61441, |
| 93 | +} |
| 94 | + |
| 95 | +// CHECK-LABEL: @single_niche_align_1 |
| 96 | +// CHECK-SAME: align 1 {{.*}}%a) |
| 97 | +#[no_mangle] |
| 98 | +#[inline(never)] |
| 99 | +fn single_niche_align_1(a: SingleAlign1) {} |
| 100 | + |
| 101 | +// CHECK-LABEL: @call_single_niche_align_1 |
| 102 | +#[no_mangle] |
| 103 | +fn call_single_niche_align_1() { |
| 104 | + // CHECK: call void @single_niche_align_1(ptr {{.*}}align 1 {{.*}}(i64 61441 to ptr) |
| 105 | + single_niche_align_1(SingleAlign1::Niche_61441); |
| 106 | +} |
| 107 | + |
| 108 | +// Check that we only apply the new alignment on enum. |
| 109 | + |
| 110 | +// CHECK-LABEL: @restricted_address |
| 111 | +// CHECK-SAME: align 8 {{.*}}%a) |
| 112 | +#[no_mangle] |
| 113 | +fn restricted_address(a: RestrictedAddress_0_0x7fff) {} |
0 commit comments