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
23; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %}
34
45
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 ) {
619entry:
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
733 %Buf.addr = alloca float , align 4
834 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
1238
1339lt0: ; preds = %entry
1440 call void @llvm.spv.clip ()
@@ -17,17 +43,29 @@ lt0: ; preds = %entry
1743end: ; preds = %lt0, %entry
1844 ret void
1945}
20-
2146declare void @llvm.spv.clip ()
2247
23-
2448define void @test_vector (<4 x float > noundef %Buf ) {
2549entry:
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
2664 %Buf.addr = alloca <4 x float >, align 16
2765 store <4 x float > %Buf , ptr %Buf.addr , align 16
2866 %1 = load <4 x float >, ptr %Buf.addr , align 16
2967 %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 )
3169 br i1 %3 , label %lt0 , label %end
3270
3371lt0: ; preds = %entry
@@ -37,5 +75,3 @@ lt0: ; preds = %entry
3775end: ; preds = %lt0, %entry
3876 ret void
3977}
40-
41- declare i1 @llvm.vector.reduce.or.v4i1 (<4 x i1 >) #3
0 commit comments