diff options
Diffstat (limited to 'llvm/test/Verifier')
-rw-r--r-- | llvm/test/Verifier/AMDGPU/wmma-f8f6f4.ll | 165 | ||||
-rw-r--r-- | llvm/test/Verifier/amdgpu-cc.ll | 33 | ||||
-rw-r--r-- | llvm/test/Verifier/callee-type-metadata.ll | 33 | ||||
-rw-r--r-- | llvm/test/Verifier/intrinsic-immarg.ll | 6 | ||||
-rw-r--r-- | llvm/test/Verifier/opaque-ptr.ll | 6 |
5 files changed, 239 insertions, 4 deletions
diff --git a/llvm/test/Verifier/AMDGPU/wmma-f8f6f4.ll b/llvm/test/Verifier/AMDGPU/wmma-f8f6f4.ll new file mode 100644 index 0000000..af0d7f1 --- /dev/null +++ b/llvm/test/Verifier/AMDGPU/wmma-f8f6f4.ll @@ -0,0 +1,165 @@ +; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s + +; -------------------------------------------------------------------- +; Wrong mangled types +; -------------------------------------------------------------------- + +; CHECK: operand 1 must be 8, 12 or 16 element i32 vector +; CHECK-NEXT: %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v16i64.v16i32(i32 0, <16 x i64> %A, i32 0, <16 x i32> %B, i16 0, <8 x float> %C) +; CHECK-NEXT: <16 x i64> %A +define amdgpu_ps void @test_wmma_f32_16x16x128_f8f6f4___v16i64_fp8___v16i32_fp8(<16 x i64> %A, <16 x i32> %B, <8 x float> %C, ptr addrspace(1) %out) { +bb: + %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v16i64.v16i32(i32 0, <16 x i64> %A, i32 0, <16 x i32> %B, i16 0, <8 x float> %C) + store <8 x float> %res, ptr addrspace(1) %out + ret void +} + +; CHECK: operand 3 must be 8, 12 or 16 element i32 vector +; CHECK-NEXT: %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v16i32.v16i64(i32 0, <16 x i32> %A, i32 0, <16 x i64> %B, i16 0, <8 x float> %C) +; CHECK-NEXT: <16 x i64> %B +define amdgpu_ps void @test_wmma_f32_16x16x128_f8f6f4___v16i32_fp8___v16i64_fp8(<16 x i32> %A, <16 x i64> %B, <8 x float> %C, ptr addrspace(1) %out) { +bb: + %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v16i32.v16i64(i32 0, <16 x i32> %A, i32 0, <16 x i64> %B, i16 0, <8 x float> %C) + store <8 x float> %res, ptr addrspace(1) %out + ret void +} + +; -------------------------------------------------------------------- +; Impossible vector types +; -------------------------------------------------------------------- + +; CHECK: operand 1 must be 8, 12 or 16 element i32 vector +; CHECK-NEXT: %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v9i32.v16i32(i32 0, <9 x i32> %A, i32 0, <16 x i32> %B, i16 0, <8 x float> %C) +; CHECK-NEXT: <9 x i32> %A +define amdgpu_ps void @test_wmma_f32_16x16x128_f8f6f4___v9i32_fp8___v16i32_fp8(<9 x i32> %A, <16 x i32> %B, <8 x float> %C, ptr addrspace(1) %out) { +bb: + %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v9i32.v16i32(i32 0, <9 x i32> %A, i32 0, <16 x i32> %B, i16 0, <8 x float> %C) + store <8 x float> %res, ptr addrspace(1) %out + ret void +} + +; CHECK: operand 3 must be 8, 12 or 16 element i32 vector +; CHECK-NEXT: %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v16i32.v9i32(i32 0, <16 x i32> %A, i32 0, <9 x i32> %B, i16 0, <8 x float> %C) +; CHECK-NEXT: <9 x i32> %B +define amdgpu_ps void @test_wmma_f32_16x16x128_f8f6f4___v16i32_fp8___v9i32_fp8(<16 x i32> %A, <9 x i32> %B, <8 x float> %C, ptr addrspace(1) %out) { +bb: + %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v16i32.v9i32(i32 0, <16 x i32> %A, i32 0, <9 x i32> %B, i16 0, <8 x float> %C) + store <8 x float> %res, ptr addrspace(1) %out + ret void +} + +; -------------------------------------------------------------------- +; Out of bounds format +; -------------------------------------------------------------------- + +; CHECK: invalid value for matrix format +; CHECK-NEXT: %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v16i32.v16i32(i32 9999, <16 x i32> %A, i32 0, <16 x i32> %B, i16 0, <8 x float> %C) +; CHECK-NEXT: i32 9999 +define amdgpu_ps void @test_wmma_f32_16x16x128_f8f6f4___v16i32_invalid0___v16i32_fp8(<16 x i32> %A, <16 x i32> %B, <8 x float> %C, ptr addrspace(1) %out) { +bb: + %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v16i32.v16i32(i32 9999, <16 x i32> %A, i32 0, <16 x i32> %B, i16 0, <8 x float> %C) + store <8 x float> %res, ptr addrspace(1) %out + ret void +} + +; CHECK: invalid value for matrix format +; CHECK-NEXT: %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v16i32.v16i32(i32 0, <16 x i32> %A, i32 9999, <16 x i32> %B, i16 0, <8 x float> %C) +; CHECK-NEXT: i32 9999 +define amdgpu_ps void @test_wmma_f32_16x16x128_f8f6f4___v16i32_fp8___v16i32_invalid1(<16 x i32> %A, <16 x i32> %B, <8 x float> %C, ptr addrspace(1) %out) { +bb: + %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v16i32.v16i32(i32 0, <16 x i32> %A, i32 9999, <16 x i32> %B, i16 0, <8 x float> %C) + store <8 x float> %res, ptr addrspace(1) %out + ret void +} + +; -------------------------------------------------------------------- +; Incorrect signature for format cases (IR vector too small) +; -------------------------------------------------------------------- + +; CHECK: invalid vector type for format +; CHECK-NEXT: %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v8i32.v16i32(i32 0, <8 x i32> %A, i32 0, <16 x i32> %B, i16 0, <8 x float> %C) +; CHECK-NEXT: <8 x i32> %A +; CHECK-NEXT: i32 0 +define amdgpu_ps void @test_wmma_f32_16x16x128_f8f6f4___v8i32_fp8___v16i32_fp8(<8 x i32> %A, <16 x i32> %B, <8 x float> %C, ptr addrspace(1) %out) { +bb: + %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v8i32.v16i32(i32 0, <8 x i32> %A, i32 0, <16 x i32> %B, i16 0, <8 x float> %C) + store <8 x float> %res, ptr addrspace(1) %out + ret void +} + +; CHECK: invalid vector type for format +; CHECK-NEXT: %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v12i32.v16i32(i32 0, <12 x i32> %A, i32 0, <16 x i32> %B, i16 0, <8 x float> %C) +; CHECK-NEXT: <12 x i32> %A +; CHECK-NEXT: i32 0 +define amdgpu_ps void @test_wmma_f32_16x16x128_f8f6f4___v12i32_fp8___v16i32_fp8(<12 x i32> %A, <16 x i32> %B, <8 x float> %C, ptr addrspace(1) %out) { +bb: + %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v12i32.v16i32(i32 0, <12 x i32> %A, i32 0, <16 x i32> %B, i16 0, <8 x float> %C) + store <8 x float> %res, ptr addrspace(1) %out + ret void +} + +; CHECK: invalid vector type for format +; CHECK-NEXT: %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v8i32.v16i32(i32 1, <8 x i32> %A, i32 0, <16 x i32> %B, i16 0, <8 x float> %C) +; CHECK-NEXT: <8 x i32> %A +; CHECK-NEXT: i32 1 +define amdgpu_ps void @test_wmma_f32_16x16x128_f8f6f4___v8i32_bf8___v16i32_fp8(<8 x i32> %A, <16 x i32> %B, <8 x float> %C, ptr addrspace(1) %out) { +bb: + %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v8i32.v16i32(i32 1, <8 x i32> %A, i32 0, <16 x i32> %B, i16 0, <8 x float> %C) + store <8 x float> %res, ptr addrspace(1) %out + ret void +} + +; CHECK: invalid vector type for format +; CHECK-NEXT: %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v12i32.v16i32(i32 1, <12 x i32> %A, i32 0, <16 x i32> %B, i16 0, <8 x float> %C) +; CHECK-NEXT: <12 x i32> %A +; CHECK-NEXT: i32 1 +define amdgpu_ps void @test_wmma_f32_16x16x128_f8f6f4___v12i32_bf8___v16i32_fp8(<12 x i32> %A, <16 x i32> %B, <8 x float> %C, ptr addrspace(1) %out) { +bb: + %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v12i32.v16i32(i32 1, <12 x i32> %A, i32 0, <16 x i32> %B, i16 0, <8 x float> %C) + store <8 x float> %res, ptr addrspace(1) %out + ret void +} + +; CHECK: invalid vector type for format +; CHECK-NEXT: %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v16i32.v8i32(i32 0, <16 x i32> %A, i32 0, <8 x i32> %B, i16 0, <8 x float> %C) +; CHECK-NEXT: <8 x i32> %B +; CHECK-NEXT: i32 0 +define amdgpu_ps void @test_wmma_f32_16x16x128_f8f6f4___v16i32_fp8___v8i32_fp8(<16 x i32> %A, <8 x i32> %B, <8 x float> %C, ptr addrspace(1) %out) { +bb: + %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v16i32.v8i32(i32 0, <16 x i32> %A, i32 0, <8 x i32> %B, i16 0, <8 x float> %C) + store <8 x float> %res, ptr addrspace(1) %out + ret void +} + +; CHECK: invalid vector type for format +; CHECK-NEXT: %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v16i32.v12i32(i32 0, <16 x i32> %A, i32 0, <12 x i32> %B, i16 0, <8 x float> %C) +; CHECK-NEXT: <12 x i32> %B +; CHECK-NEXT: i32 0 +define amdgpu_ps void @test_wmma_f32_16x16x128_f8f6f4___v16i32_fp8___v12i32_fp8(<16 x i32> %A, <12 x i32> %B, <8 x float> %C, ptr addrspace(1) %out) { +bb: + %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v16i32.v12i32(i32 0, <16 x i32> %A, i32 0, <12 x i32> %B, i16 0, <8 x float> %C) + store <8 x float> %res, ptr addrspace(1) %out + ret void +} + +; CHECK: invalid vector type for format +; CHECK-NEXT: %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v16i32.v8i32(i32 0, <16 x i32> %A, i32 1, <8 x i32> %B, i16 0, <8 x float> %C) +; CHECK-NEXT: <8 x i32> %B +; CHECK-NEXT: i32 1 +define amdgpu_ps void @test_wmma_f32_16x16x128_f8f6f4___v16i32_fp8___v8i32_bf8(<16 x i32> %A, <8 x i32> %B, <8 x float> %C, ptr addrspace(1) %out) { +bb: + %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v16i32.v8i32(i32 0, <16 x i32> %A, i32 1, <8 x i32> %B, i16 0, <8 x float> %C) + store <8 x float> %res, ptr addrspace(1) %out + ret void +} + +; CHECK: invalid vector type for format +; CHECK-NEXT: %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v16i32.v12i32(i32 0, <16 x i32> %A, i32 1, <12 x i32> %B, i16 0, <8 x float> %C) +; CHECK-NEXT: <12 x i32> %B +; CHECK-NEXT: i32 1 +define amdgpu_ps void @test_wmma_f32_16x16x128_f8f6f4___v16i32_fp8___v12i32_bf8(<16 x i32> %A, <12 x i32> %B, <8 x float> %C, ptr addrspace(1) %out) { +bb: + %res = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x128.f8f6f4.v8f32.v16i32.v12i32(i32 0, <16 x i32> %A, i32 1, <12 x i32> %B, i16 0, <8 x float> %C) + store <8 x float> %res, ptr addrspace(1) %out + ret void +} diff --git a/llvm/test/Verifier/amdgpu-cc.ll b/llvm/test/Verifier/amdgpu-cc.ll index aec0977..e86825e 100644 --- a/llvm/test/Verifier/amdgpu-cc.ll +++ b/llvm/test/Verifier/amdgpu-cc.ll @@ -217,3 +217,36 @@ define amdgpu_cs_chain_preserve void @preallocated_cc_amdgpu_cs_chain_preserve(p define amdgpu_cs_chain_preserve void @inalloca_cc_amdgpu_cs_chain_preserve(ptr inalloca(i32) %ptr) { ret void } + +; CHECK: Calling convention requires first argument to be i1 +; CHECK-NEXT: ptr @whole_wave_no_args +define amdgpu_gfx_whole_wave void @whole_wave_no_args() { + ret void +} + +; CHECK: Calling convention requires first argument to be i1 +; CHECK-NEXT: ptr @whole_wave_must_have_i1_active +define amdgpu_gfx_whole_wave void @whole_wave_must_have_i1_active(i32 %x) { + ret void +} + +; CHECK: Calling convention requires first argument to not be inreg +; CHECK-NEXT: ptr @whole_wave_i1_active_inreg +define amdgpu_gfx_whole_wave void @whole_wave_i1_active_inreg(i1 inreg %active) { + ret void +} + +; CHECK: Calling convention does not support varargs +; CHECK-NEXT: ptr @whole_wave_varargs +define amdgpu_gfx_whole_wave void @whole_wave_varargs(i1 %active, i32 %x, ...) { + ret void +} + +declare amdgpu_gfx_whole_wave void @whole_wave_callee(i1 %active) + +; CHECK: calling convention does not permit calls +; CHECK-NEXT: call amdgpu_gfx_whole_wave void @whole_wave_callee(i1 true) +define amdgpu_cs void @cant_call_whole_wave_func() { + call amdgpu_gfx_whole_wave void @whole_wave_callee(i1 true) + ret void +} diff --git a/llvm/test/Verifier/callee-type-metadata.ll b/llvm/test/Verifier/callee-type-metadata.ll new file mode 100644 index 0000000..50cf37b --- /dev/null +++ b/llvm/test/Verifier/callee-type-metadata.ll @@ -0,0 +1,33 @@ +;; Test if the callee_type metadata attached to indirect call sites adhere to the expected format. + +; RUN: not llvm-as -disable-output < %s 2>&1 | FileCheck %s +define i32 @_Z13call_indirectPFicEc(ptr %func, i8 signext %x) !type !0 { +entry: + %func.addr = alloca ptr, align 8 + %x.addr = alloca i8, align 1 + store ptr %func, ptr %func.addr, align 8 + store i8 %x, ptr %x.addr, align 1 + %fptr = load ptr, ptr %func.addr, align 8 + %x_val = load i8, ptr %x.addr, align 1 + ; CHECK: The callee_type metadata must be a list of type metadata nodes + %call = call i32 %fptr(i8 signext %x_val), !callee_type !0 + ; CHECK: Well-formed generalized type metadata must contain exactly two operands + %call1 = call i32 %fptr(i8 signext %x_val), !callee_type !2 + ; CHECK: The first operand of type metadata for functions must be zero + %call2 = call i32 %fptr(i8 signext %x_val), !callee_type !4 + ; CHECK: The first operand of type metadata for functions must be zero + %call3 = call i32 %fptr(i8 signext %x_val), !callee_type !6 + ; CHECK: Only generalized type metadata can be part of the callee_type metadata list + %call4 = call i32 %fptr(i8 signext %x_val), !callee_type !8 + ret i32 %call +} + +!0 = !{i64 0, !"_ZTSFiPvcE.generalized"} +!1 = !{!"_ZTSFicE"} +!2 = !{!2} +!3 = !{i64 1, !"_ZTSFicE"} +!4 = !{!3} +!5 = !{!"expected_int", !"_ZTSFicE"} +!6 = !{!5} +!7 = !{i64 0, !"_ZTSFicE"} +!8 = !{!7} diff --git a/llvm/test/Verifier/intrinsic-immarg.ll b/llvm/test/Verifier/intrinsic-immarg.ll index dd940d5..c1bb932 100644 --- a/llvm/test/Verifier/intrinsic-immarg.ll +++ b/llvm/test/Verifier/intrinsic-immarg.ll @@ -164,19 +164,21 @@ define void @test_scatter_8i32(<8 x i32> %a1, <8 x ptr> %ptr, <8 x i1> %mask, i3 } declare void @llvm.lifetime.start.p0(i64, ptr) -define void @test_lifetime_start(i64 %arg0, ptr %ptr) { +define void @test_lifetime_start(i64 %arg0) { ; CHECK: immarg operand has non-immediate parameter ; CHECK-NEXT: i64 %arg0 ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 %arg0, ptr %ptr) + %ptr = alloca i64 call void @llvm.lifetime.start.p0(i64 %arg0, ptr %ptr) ret void } declare void @llvm.lifetime.end.p0(i64, ptr) -define void @test_lifetime_end(i64 %arg0, ptr %ptr) { +define void @test_lifetime_end(i64 %arg0) { ; CHECK: immarg operand has non-immediate parameter ; CHECK-NEXT: i64 %arg0 ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 %arg0, ptr %ptr) + %ptr = alloca i64 call void @llvm.lifetime.end.p0(i64 %arg0, ptr %ptr) ret void } diff --git a/llvm/test/Verifier/opaque-ptr.ll b/llvm/test/Verifier/opaque-ptr.ll index 1f29000..10e43a4 100644 --- a/llvm/test/Verifier/opaque-ptr.ll +++ b/llvm/test/Verifier/opaque-ptr.ll @@ -37,12 +37,14 @@ define void @atomicrmw(ptr %a, i32 %i) { ret void } -define void @opaque_mangle(ptr %a) { +define void @opaque_mangle() { ; CHECK-LABEL: @opaque_mangle( -; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr [[A:%.*]]) +; CHECK-NEXT: [[A:%.*]] = alloca i64, align 8 +; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr [[A]]) ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 8, ptr [[A]]) ; CHECK-NEXT: ret void ; + %a = alloca i64 call void @llvm.lifetime.start.p0(i64 8, ptr %a) call void @llvm.lifetime.end.p0(i64 8, ptr %a) ret void |