1
- ; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
1
+ ; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,SPIRV15
2
+ ; RUN: llc -verify-machineinstrs -spirv-ext=+SPV_EXT_demote_to_helper_invocation -O0 -mtriple=spirv32v1.6-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,SPIRV16
2
3
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %}
3
4
4
5
5
- define void @test_scalar_lowering (float noundef %Buf ) {
6
+ ; Make sure lowering is correctly generating spirv code.
7
+
8
+ ; CHECK-DAG: %[[#float:]] = OpTypeFloat 32
9
+ ; CHECK-DAG: %[[#void:]] = OpTypeVoid
10
+ ; CHECK-DAG: %[[#bool:]] = OpTypeBool
11
+ ; CHECK-DAG: %[[#v4bool:]] = OpTypeVector %[[#bool]] 4
12
+ ; CHECK-DAG: %[[#v4float:]] = OpTypeVector %[[#float]] 4
13
+ ; CHECK-DAG: %[[#fzero:]] = OpConstant %[[#float]] 0
14
+ ; CHECK-DAG: %[[#v4fzero:]] = OpConstantNull %[[#v4float]]
15
+ ; SPIRV16-DAG: %[[#vecfuncopptr:]] = OpTypePointer Function %[[#v4float]]
16
+ ; SPIRV16-DAG: %[[#funcopptr:]] = OpTypePointer Function %[[#float]]
17
+
18
+ define void @test_scalar (float noundef %Buf ) {
6
19
entry:
20
+ ; CHECK-LABEL: ; -- Begin function test_scalar
21
+ ; SPIRV16: %[[#param:]] = OpVariable %[[#funcopptr]] Function
22
+ ; SPIRV16: %[[#load:]] = OpLoad %[[#float]] %[[#param]] Aligned 4
23
+ ; SPIRV15: %[[#load:]] = OpFunctionParameter %[[#float]]
24
+ ; CHECK: %[[#cmplt:]] = OpFOrdLessThan %[[#bool]] %[[#load]] %[[#fzero]]
25
+ ; CHECK: OpBranchConditional %[[#cmplt]] %[[#truel:]] %[[#endl:]]
26
+ ; CHECK: %[[#truel]] = OpLabel
27
+ ; SPIRV15: OpKill
28
+ ; SPIRV16-NO: OpKill
29
+ ; SPIRV15-NO: OpBranch %[[#endl]]
30
+ ; SPIRV16: OpDemoteToHelperInvocation
31
+ ; SPIRV16: OpBranch %[[#endl]]
32
+ ; CHECK: %[[#endl]] = OpLabel
7
33
%Buf.addr = alloca float , align 4
8
34
store float %Buf , ptr %Buf.addr , align 4
9
- %0 = load float , ptr %Buf.addr , align 4
10
- %1 = fcmp olt float %0 , 0 .000000e+00
11
- br i1 %1 , label %lt0 , label %end
35
+ %1 = load float , ptr %Buf.addr , align 4
36
+ %2 = fcmp olt float %1 , 0 .000000e+00
37
+ br i1 %2 , label %lt0 , label %end
12
38
13
39
lt0: ; preds = %entry
14
40
call void @llvm.spv.clip ()
@@ -17,17 +43,29 @@ lt0: ; preds = %entry
17
43
end: ; preds = %lt0, %entry
18
44
ret void
19
45
}
20
-
21
46
declare void @llvm.spv.clip ()
22
47
23
-
24
48
define void @test_vector (<4 x float > noundef %Buf ) {
25
49
entry:
50
+ ; CHECK-LABEL: ; -- Begin function test_vector
51
+ ; SPIRV16: %[[#param:]] = OpVariable %[[#vecfuncopptr]] Function
52
+ ; SPIRV16: %[[#loadvec:]] = OpLoad %[[#v4float]] %[[#param]] Aligned 16
53
+ ; SPIRV15: %[[#loadvec:]] = OpFunctionParameter %[[#v4float]]
54
+ ; CHECK: %[[#cmplt:]] = OpFOrdLessThan %[[#v4bool]] %[[#loadvec]] %[[#v4fzero]]
55
+ ; CHECK: %[[#opany:]] = OpAny %[[#bool]] %[[#cmplt]]
56
+ ; CHECK: OpBranchConditional %[[#opany]] %[[#truel:]] %[[#endl:]]
57
+ ; CHECK: %[[#truel]] = OpLabel
58
+ ; SPIRV15: OpKill
59
+ ; SPIRV16-NO: OpKill
60
+ ; SPIRV15-NO: OpBranch %[[#endl]]
61
+ ; SPIRV16: OpDemoteToHelperInvocation
62
+ ; SPIRV16: OpBranch %[[#endl]]
63
+ ; CHECK: %[[#endl]] = OpLabel
26
64
%Buf.addr = alloca <4 x float >, align 16
27
65
store <4 x float > %Buf , ptr %Buf.addr , align 16
28
66
%1 = load <4 x float >, ptr %Buf.addr , align 16
29
67
%2 = fcmp olt <4 x float > %1 , zeroinitializer
30
- %3 = call i1 @llvm.vector.reduce.or .v4i1 (<4 x i1 > %2 )
68
+ %3 = call i1 @llvm.spv.any .v4i1 (<4 x i1 > %2 )
31
69
br i1 %3 , label %lt0 , label %end
32
70
33
71
lt0: ; preds = %entry
@@ -37,5 +75,3 @@ lt0: ; preds = %entry
37
75
end: ; preds = %lt0, %entry
38
76
ret void
39
77
}
40
-
41
- declare i1 @llvm.vector.reduce.or.v4i1 (<4 x i1 >) #3
0 commit comments