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