Skip to content

Commit 391f1f4

Browse files
committed
Add tests for autocasts, and other notes and errors
1 parent 5120030 commit 391f1f4

7 files changed

+198
-0
lines changed

tests/codegen/inject-autocast.rs

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
//@ compile-flags: -C opt-level=0
2+
//@ only-x86_64
3+
4+
#![feature(
5+
link_llvm_intrinsics,
6+
abi_unadjusted,
7+
x86_amx_intrinsics,
8+
repr_simd,
9+
simd_ffi,
10+
portable_simd,
11+
f16
12+
)]
13+
#![crate_type = "lib"]
14+
15+
use std::simd::{f32x4, i16x8, i64x2};
16+
17+
#[repr(simd)]
18+
pub struct Tile([i8; 1024]);
19+
20+
#[repr(C, packed)]
21+
pub struct Bar(u32, i64x2, i64x2, i64x2, i64x2, i64x2, i64x2);
22+
// CHECK: %Bar = type <{ i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> }>
23+
24+
#[repr(simd)]
25+
pub struct f16x8([f16; 8]);
26+
27+
// CHECK-LABEL: @amx_autocast
28+
#[no_mangle]
29+
pub unsafe fn amx_autocast(m: u16, n: u16, k: u16, a: Tile, b: Tile, c: Tile) -> Tile {
30+
extern "unadjusted" {
31+
#[link_name = "llvm.x86.tdpbuud.internal"]
32+
fn foo(m: u16, n: u16, k: u16, a: Tile, b: Tile, c: Tile) -> Tile;
33+
}
34+
35+
// CHECK: %0 = load <1024 x i8>, ptr %a, align 1024
36+
// CHECK: %1 = load <1024 x i8>, ptr %b, align 1024
37+
// CHECK: %2 = load <1024 x i8>, ptr %c, align 1024
38+
// CHECK: %3 = call x86_amx @llvm.x86.cast.vector.to.tile.v1024i8(<1024 x i8> %0)
39+
// CHECK: %4 = call x86_amx @llvm.x86.cast.vector.to.tile.v1024i8(<1024 x i8> %1)
40+
// CHECK: %5 = call x86_amx @llvm.x86.cast.vector.to.tile.v1024i8(<1024 x i8> %2)
41+
// CHECK: %6 = call x86_amx @llvm.x86.tdpbuud.internal(i16 %m, i16 %n, i16 %k, x86_amx %3, x86_amx %4, x86_amx %5)
42+
// CHECK: %7 = call <1024 x i8> @llvm.x86.cast.tile.to.vector.v1024i8(x86_amx %6)
43+
// CHECK: store <1024 x i8> %7, ptr %_0, align 1024
44+
foo(m, n, k, a, b, c)
45+
}
46+
47+
// CHECK-LABEL: @struct_with_i1_vector_autocast
48+
#[no_mangle]
49+
pub unsafe fn struct_with_i1_vector_autocast(a: i64x2, b: i64x2) -> (u8, u8) {
50+
extern "unadjusted" {
51+
#[link_name = "llvm.x86.avx512.vp2intersect.q.128"]
52+
fn foo(a: i64x2, b: i64x2) -> (u8, u8);
53+
}
54+
55+
// CHECK: %0 = call { <2 x i1>, <2 x i1> } @llvm.x86.avx512.vp2intersect.q.128(<2 x i64> %a, <2 x i64> %b)
56+
// CHECK: %1 = extractvalue { <2 x i1>, <2 x i1> } %0, 0
57+
// CHECK: %2 = shufflevector <2 x i1> %1, <2 x i1> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 2, i32 3, i32 2, i32 3>
58+
// CHECK: %3 = bitcast <8 x i1> %2 to i8
59+
// CHECK: %4 = insertvalue { i8, i8 } poison, i8 %3, 0
60+
// CHECK: %5 = extractvalue { <2 x i1>, <2 x i1> } %0, 1
61+
// CHECK: %6 = shufflevector <2 x i1> %5, <2 x i1> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 2, i32 3, i32 2, i32 3>
62+
// CHECK: %7 = bitcast <8 x i1> %6 to i8
63+
// CHECK: %8 = insertvalue { i8, i8 } %4, i8 %7, 1
64+
foo(a, b)
65+
}
66+
67+
// CHECK-LABEL: @bf16_vector_autocast
68+
#[no_mangle]
69+
pub unsafe fn bf16_vector_autocast(a: f32x4) -> i16x8 {
70+
extern "unadjusted" {
71+
#[link_name = "llvm.x86.vcvtneps2bf16128"]
72+
fn foo(a: f32x4) -> i16x8;
73+
}
74+
75+
// CHECK: %0 = call <8 x bfloat> @llvm.x86.vcvtneps2bf16128(<4 x float> %a)
76+
// CHECK: %_0 = bitcast <8 x bfloat> %0 to <8 x i16>
77+
foo(a)
78+
}
79+
80+
// CHECK-LABEL: @struct_autocast
81+
#[no_mangle]
82+
pub unsafe fn struct_autocast(key_metadata: u32, key: i64x2) -> Bar {
83+
extern "unadjusted" {
84+
#[link_name = "llvm.x86.encodekey128"]
85+
fn foo(key_metadata: u32, key: i64x2) -> Bar;
86+
}
87+
88+
// CHECK: %0 = call { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.encodekey128(i32 %key_metadata, <2 x i64> %key)
89+
// CHECK: %1 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 0
90+
// CHECK: %2 = insertvalue %Bar poison, i32 %1, 0
91+
// CHECK: %3 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 1
92+
// CHECK: %4 = insertvalue %Bar %2, <2 x i64> %3, 1
93+
// CHECK: %5 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 2
94+
// CHECK: %6 = insertvalue %Bar %4, <2 x i64> %5, 2
95+
// CHECK: %7 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 3
96+
// CHECK: %8 = insertvalue %Bar %6, <2 x i64> %7, 3
97+
// CHECK: %9 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 4
98+
// CHECK: %10 = insertvalue %Bar %8, <2 x i64> %9, 4
99+
// CHECK: %11 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 5
100+
// CHECK: %12 = insertvalue %Bar %10, <2 x i64> %11, 5
101+
// CHECK: %13 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 6
102+
// CHECK: %14 = insertvalue %Bar %12, <2 x i64> %13, 6
103+
foo(key_metadata, key)
104+
}
105+
106+
// CHECK-LABEL: @i1_vector_autocast
107+
#[no_mangle]
108+
pub unsafe fn i1_vector_autocast(a: f16x8) -> u8 {
109+
extern "unadjusted" {
110+
#[link_name = "llvm.x86.avx512fp16.fpclass.ph.128"]
111+
fn foo(a: f16x8, b: i32) -> u8;
112+
}
113+
114+
// CHECK: %0 = call <8 x i1> @llvm.x86.avx512fp16.fpclass.ph.128(<8 x half> %a, i32 immarg 1)
115+
// CHECK: %_0 = bitcast <8 x i1> %0 to i8
116+
foo(a, 1)
117+
}
118+
119+
// CHECK: declare x86_amx @llvm.x86.tdpbuud.internal(i16, i16, i16, x86_amx, x86_amx, x86_amx)
120+
121+
// CHECK: declare x86_amx @llvm.x86.cast.vector.to.tile.v1024i8(<1024 x i8>)
122+
123+
// CHECK: declare <1024 x i8> @llvm.x86.cast.tile.to.vector.v1024i8(x86_amx)
124+
125+
// CHECK: declare { <2 x i1>, <2 x i1> } @llvm.x86.avx512.vp2intersect.q.128(<2 x i64>, <2 x i64>)
126+
127+
// CHECK: declare <8 x bfloat> @llvm.x86.vcvtneps2bf16128(<4 x float>)
128+
129+
// CHECK: declare { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.encodekey128(i32, <2 x i64>)
130+
131+
// CHECK: declare <8 x i1> @llvm.x86.avx512fp16.fpclass.ph.128(<8 x half>, i32 immarg)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//@ add-core-stubs
2+
//@ build-pass
3+
//@ compile-flags: --target aarch64-unknown-linux-gnu
4+
//@ needs-llvm-components: aarch64
5+
#![feature(no_core, lang_items, link_llvm_intrinsics, abi_unadjusted, repr_simd, simd_ffi)]
6+
#![no_std]
7+
#![no_core]
8+
#![allow(internal_features, non_camel_case_types, improper_ctypes)]
9+
#![crate_type = "lib"]
10+
11+
extern crate minicore;
12+
use minicore::*;
13+
14+
#[repr(simd)]
15+
pub struct i8x8([i8; 8]);
16+
17+
extern "unadjusted" {
18+
#[link_name = "llvm.aarch64.neon.rbit.v8i8"]
19+
fn foo(a: i8x8) -> i8x8;
20+
}
21+
22+
#[target_feature(enable = "neon")]
23+
pub unsafe fn bar(a: i8x8) -> i8x8 {
24+
foo(a)
25+
}
26+
27+
//~? NOTE: Using deprecated intrinsic `llvm.aarch64.neon.rbit.v8i8`, `llvm.bitreverse.v8i8` can be used instead
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
note: Using deprecated intrinsic `llvm.aarch64.neon.rbit.v8i8`, `llvm.bitreverse.v8i8` can be used instead
2+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//@ build-fail
2+
3+
#![feature(link_llvm_intrinsics, abi_unadjusted)]
4+
#![allow(internal_features, non_camel_case_types, improper_ctypes)]
5+
6+
extern "unadjusted" {
7+
#[link_name = "llvm.assume"]
8+
fn foo();
9+
}
10+
11+
pub fn main() {
12+
unsafe { foo() }
13+
}
14+
15+
//~? ERROR: Intrinsic signature mismatch for `llvm.assume`: expected signature `void (i1)`
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
error: Intrinsic signature mismatch for `llvm.assume`: expected signature `void (i1)`
2+
3+
error: aborting due to 1 previous error
4+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//@ build-fail
2+
3+
#![feature(link_llvm_intrinsics, abi_unadjusted)]
4+
#![allow(internal_features, non_camel_case_types, improper_ctypes)]
5+
6+
extern "unadjusted" {
7+
#[link_name = "llvm.abcde"]
8+
fn foo();
9+
}
10+
11+
pub fn main() {
12+
unsafe { foo() }
13+
}
14+
15+
//~? ERROR: Invalid LLVM intrinsic: `llvm.abcde`
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
error: Invalid LLVM intrinsic: `llvm.abcde`
2+
3+
error: aborting due to 1 previous error
4+

0 commit comments

Comments
 (0)