|
1 | 1 | // RUN: mlir-translate -mlir-to-llvmir -split-input-file -verify-diagnostics %s | FileCheck %s
|
2 | 2 |
|
3 |
| -// CHECK: ; ModuleID = 'LLVMDialectModule' |
4 |
| -// CHECK: source_filename = "LLVMDialectModule" |
5 |
| -// CHECK: declare ptr @malloc(i64) |
6 |
| -// CHECK: declare void @free(ptr) |
7 | 3 | // CHECK: define <4 x float> @round_sse41() {
|
8 |
| -// CHECK: %1 = call reassoc <4 x float> @llvm.x86.sse41.round.ss(<4 x float> <float 0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000>, <4 x float> <float 0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000>, i32 1) |
| 4 | +// CHECK: %1 = call reassoc <4 x float> @llvm.x86.sse41.round.ss(<4 x float> {{.*}}, <4 x float> {{.*}}, i32 1) |
9 | 5 | // CHECK: ret <4 x float> %1
|
10 | 6 | // CHECK: }
|
11 | 7 | llvm.func @round_sse41() -> vector<4xf32> {
|
12 |
| - %0 = llvm.mlir.constant(1 : i32) : i32 |
13 |
| - %1 = llvm.mlir.constant(dense<0.2> : vector<4xf32>) : vector<4xf32> |
14 |
| - %res = llvm.call_intrinsic "llvm.x86.sse41.round.ss"(%1, %1, %0) : (vector<4xf32>, vector<4xf32>, i32) -> vector<4xf32> {fastmathFlags = #llvm.fastmath<reassoc>} |
15 |
| - llvm.return %res: vector<4xf32> |
| 8 | + %0 = llvm.mlir.constant(1 : i32) : i32 |
| 9 | + %1 = llvm.mlir.constant(dense<0.2> : vector<4xf32>) : vector<4xf32> |
| 10 | + %res = llvm.call_intrinsic "llvm.x86.sse41.round.ss"(%1, %1, %0) : (vector<4xf32>, vector<4xf32>, i32) -> vector<4xf32> {fastmathFlags = #llvm.fastmath<reassoc>} |
| 11 | + llvm.return %res: vector<4xf32> |
16 | 12 | }
|
17 | 13 |
|
18 | 14 | // -----
|
19 | 15 |
|
20 |
| -// CHECK: ; ModuleID = 'LLVMDialectModule' |
21 |
| -// CHECK: source_filename = "LLVMDialectModule" |
22 |
| - |
23 |
| -// CHECK: declare ptr @malloc(i64) |
24 |
| - |
25 |
| -// CHECK: declare void @free(ptr) |
26 |
| - |
27 | 16 | // CHECK: define float @round_overloaded() {
|
28 | 17 | // CHECK: %1 = call float @llvm.round.f32(float 1.000000e+00)
|
29 | 18 | // CHECK: ret float %1
|
30 | 19 | // CHECK: }
|
31 | 20 | llvm.func @round_overloaded() -> f32 {
|
32 |
| - %0 = llvm.mlir.constant(1.0 : f32) : f32 |
33 |
| - %res = llvm.call_intrinsic "llvm.round"(%0) : (f32) -> f32 {} |
34 |
| - llvm.return %res: f32 |
| 21 | + %0 = llvm.mlir.constant(1.0 : f32) : f32 |
| 22 | + %res = llvm.call_intrinsic "llvm.round"(%0) : (f32) -> f32 {} |
| 23 | + llvm.return %res: f32 |
35 | 24 | }
|
36 | 25 |
|
37 | 26 | // -----
|
38 | 27 |
|
39 |
| -// CHECK: ; ModuleID = 'LLVMDialectModule' |
40 |
| -// CHECK: source_filename = "LLVMDialectModule" |
41 |
| -// CHECK: declare ptr @malloc(i64) |
42 |
| -// CHECK: declare void @free(ptr) |
43 | 28 | // CHECK: define void @lifetime_start() {
|
44 | 29 | // CHECK: %1 = alloca float, i8 1, align 4
|
45 | 30 | // CHECK: call void @llvm.lifetime.start.p0(i64 4, ptr %1)
|
46 | 31 | // CHECK: ret void
|
47 | 32 | // CHECK: }
|
48 | 33 | llvm.func @lifetime_start() {
|
49 |
| - %0 = llvm.mlir.constant(4 : i64) : i64 |
50 |
| - %1 = llvm.mlir.constant(1 : i8) : i8 |
51 |
| - %2 = llvm.alloca %1 x f32 : (i8) -> !llvm.ptr |
52 |
| - llvm.call_intrinsic "llvm.lifetime.start"(%0, %2) : (i64, !llvm.ptr) -> () {} |
53 |
| - llvm.return |
| 34 | + %0 = llvm.mlir.constant(4 : i64) : i64 |
| 35 | + %1 = llvm.mlir.constant(1 : i8) : i8 |
| 36 | + %2 = llvm.alloca %1 x f32 : (i8) -> !llvm.ptr |
| 37 | + llvm.call_intrinsic "llvm.lifetime.start"(%0, %2) : (i64, !llvm.ptr) -> () {} |
| 38 | + llvm.return |
54 | 39 | }
|
55 | 40 |
|
56 | 41 | // -----
|
57 | 42 |
|
| 43 | +// CHECK-LABEL: define void @variadic() |
58 | 44 | llvm.func @variadic() {
|
59 |
| - %0 = llvm.mlir.constant(1 : i8) : i8 |
60 |
| - %1 = llvm.alloca %0 x f32 : (i8) -> !llvm.ptr |
61 |
| - llvm.call_intrinsic "llvm.localescape"(%1, %1) : (!llvm.ptr, !llvm.ptr) -> () |
62 |
| - llvm.return |
| 45 | + %0 = llvm.mlir.constant(1 : i8) : i8 |
| 46 | + %1 = llvm.alloca %0 x f32 : (i8) -> !llvm.ptr |
| 47 | + // CHECK: call void (...) @llvm.localescape(ptr %1, ptr %1) |
| 48 | + llvm.call_intrinsic "llvm.localescape"(%1, %1) : (!llvm.ptr, !llvm.ptr) -> () |
| 49 | + llvm.return |
63 | 50 | }
|
64 | 51 |
|
65 | 52 | // -----
|
66 | 53 |
|
67 | 54 | llvm.func @no_intrinsic() {
|
68 |
| - // expected-error@below {{'llvm.call_intrinsic' op couldn't find intrinsic: "llvm.does_not_exist"}} |
69 |
| - // expected-error@below {{LLVM Translation failed for operation: llvm.call_intrinsic}} |
70 |
| - llvm.call_intrinsic "llvm.does_not_exist"() : () -> () |
71 |
| - llvm.return |
| 55 | + // expected-error@below {{could not find LLVM intrinsic: "llvm.does_not_exist"}} |
| 56 | + // expected-error@below {{LLVM Translation failed for operation: llvm.call_intrinsic}} |
| 57 | + llvm.call_intrinsic "llvm.does_not_exist"() : () -> () |
| 58 | + llvm.return |
72 | 59 | }
|
73 | 60 |
|
74 | 61 | // -----
|
75 | 62 |
|
76 | 63 | llvm.func @bad_types() {
|
77 |
| - %0 = llvm.mlir.constant(1 : i8) : i8 |
78 |
| - // expected-error@below {{'llvm.call_intrinsic' op intrinsic type is not a match}} |
79 |
| - // expected-error@below {{LLVM Translation failed for operation: llvm.call_intrinsic}} |
80 |
| - llvm.call_intrinsic "llvm.round"(%0) : (i8) -> i8 {} |
81 |
| - llvm.return |
| 64 | + %0 = llvm.mlir.constant(1 : i8) : i8 |
| 65 | + // expected-error@below {{call intrinsic signature i8 (i8) to overloaded intrinsic "llvm.round" does not match any of the overloads}} |
| 66 | + // expected-error@below {{LLVM Translation failed for operation: llvm.call_intrinsic}} |
| 67 | + llvm.call_intrinsic "llvm.round"(%0) : (i8) -> i8 {} |
| 68 | + llvm.return |
| 69 | +} |
| 70 | + |
| 71 | +// ----- |
| 72 | + |
| 73 | +llvm.func @bad_result() { |
| 74 | + // expected-error @below {{intrinsic call returns void but "llvm.x86.sse41.round.ss" actually returns <4 x float>}} |
| 75 | + // expected-error@below {{LLVM Translation failed for operation: llvm.call_intrinsic}} |
| 76 | + llvm.call_intrinsic "llvm.x86.sse41.round.ss"() : () -> () |
| 77 | + llvm.return |
| 78 | +} |
| 79 | + |
| 80 | +// ----- |
| 81 | + |
| 82 | +llvm.func @bad_result() { |
| 83 | + // expected-error @below {{intrinsic call returns <8 x float> but "llvm.x86.sse41.round.ss" actually returns <4 x float>}} |
| 84 | + // expected-error@below {{LLVM Translation failed for operation: llvm.call_intrinsic}} |
| 85 | + llvm.call_intrinsic "llvm.x86.sse41.round.ss"() : () -> (vector<8xf32>) |
| 86 | + llvm.return |
| 87 | +} |
| 88 | + |
| 89 | +// ----- |
| 90 | + |
| 91 | +llvm.func @bad_args() { |
| 92 | + // expected-error @below {{intrinsic call has 0 operands but "llvm.x86.sse41.round.ss" expects 3}} |
| 93 | + // expected-error@below {{LLVM Translation failed for operation: llvm.call_intrinsic}} |
| 94 | + llvm.call_intrinsic "llvm.x86.sse41.round.ss"() : () -> (vector<4xf32>) |
| 95 | + llvm.return |
| 96 | +} |
| 97 | + |
| 98 | +// ----- |
| 99 | + |
| 100 | +llvm.func @bad_args() { |
| 101 | + %0 = llvm.mlir.constant(1 : i64) : i64 |
| 102 | + %1 = llvm.mlir.constant(dense<0.2> : vector<4xf32>) : vector<4xf32> |
| 103 | + // expected-error @below {{intrinsic call operand #2 has type i64 but "llvm.x86.sse41.round.ss" expects i32}} |
| 104 | + // expected-error@below {{LLVM Translation failed for operation: llvm.call_intrinsic}} |
| 105 | + %res = llvm.call_intrinsic "llvm.x86.sse41.round.ss"(%1, %1, %0) : (vector<4xf32>, vector<4xf32>, i64) -> vector<4xf32> {fastmathFlags = #llvm.fastmath<reassoc>} |
| 106 | + llvm.return |
82 | 107 | }
|
0 commit comments