377 lines · plain
1; RUN: not llc -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_KHR_bfloat16 %s -o %t.spvt 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR2; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_INTEL_bfloat16_arithmetic,+SPV_KHR_bfloat16 %s -o - | FileCheck %s3; TODO: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_INTEL_bfloat16_arithmetic,+SPV_KHR_bfloat16 %s -o - -filetype=obj | spirv-val %}4 5; CHECK-ERROR: LLVM ERROR: Relational instructions with bfloat16 arguments require the following SPIR-V extension: SPV_INTEL_bfloat16_arithmetic6 7; CHECK-DAG: OpCapability BFloat16TypeKHR8; CHECK-DAG: OpCapability BFloat16ArithmeticINTEL9; CHECK-DAG: OpExtension "SPV_KHR_bfloat16"10; CHECK-DAG: OpExtension "SPV_INTEL_bfloat16_arithmetic"11; CHECK-DAG: OpName [[UEQ:%.*]] "test_ueq"12; CHECK-DAG: OpName [[OEQ:%.*]] "test_oeq"13; CHECK-DAG: OpName [[UNE:%.*]] "test_une"14; CHECK-DAG: OpName [[ONE:%.*]] "test_one"15; CHECK-DAG: OpName [[ULT:%.*]] "test_ult"16; CHECK-DAG: OpName [[OLT:%.*]] "test_olt"17; CHECK-DAG: OpName [[ULE:%.*]] "test_ule"18; CHECK-DAG: OpName [[OLE:%.*]] "test_ole"19; CHECK-DAG: OpName [[UGT:%.*]] "test_ugt"20; CHECK-DAG: OpName [[OGT:%.*]] "test_ogt"21; CHECK-DAG: OpName [[UGE:%.*]] "test_uge"22; CHECK-DAG: OpName [[OGE:%.*]] "test_oge"23; CHECK-DAG: OpName [[UNO:%.*]] "test_uno"24; CHECK-DAG: OpName [[ORD:%.*]] "test_ord"25; CHECK-DAG: OpName [[v3UEQ:%.*]] "test_v3_ueq"26; CHECK-DAG: OpName [[v3OEQ:%.*]] "test_v3_oeq"27; CHECK-DAG: OpName [[v3UNE:%.*]] "test_v3_une"28; CHECK-DAG: OpName [[v3ONE:%.*]] "test_v3_one"29; CHECK-DAG: OpName [[v3ULT:%.*]] "test_v3_ult"30; CHECK-DAG: OpName [[v3OLT:%.*]] "test_v3_olt"31; CHECK-DAG: OpName [[v3ULE:%.*]] "test_v3_ule"32; CHECK-DAG: OpName [[v3OLE:%.*]] "test_v3_ole"33; CHECK-DAG: OpName [[v3UGT:%.*]] "test_v3_ugt"34; CHECK-DAG: OpName [[v3OGT:%.*]] "test_v3_ogt"35; CHECK-DAG: OpName [[v3UGE:%.*]] "test_v3_uge"36; CHECK-DAG: OpName [[v3OGE:%.*]] "test_v3_oge"37; CHECK-DAG: OpName [[v3UNO:%.*]] "test_v3_uno"38; CHECK-DAG: OpName [[v3ORD:%.*]] "test_v3_ord"39; CHECK: [[BFLOAT:%.*]] = OpTypeFloat 16 040; CHECK: [[BFLOATV:%.*]] = OpTypeVector [[BFLOAT]] 341 42; CHECK: [[UEQ]] = OpFunction43; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOAT]]44; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOAT]]45; CHECK-NEXT: OpLabel46; CHECK-NEXT: [[R:%.*]] = OpFUnordEqual {{%.+}} [[A]] [[B]]47; CHECK-NEXT: OpReturnValue [[R]]48; CHECK-NEXT: OpFunctionEnd49define i1 @test_ueq(bfloat %a, bfloat %b) {50 %r = fcmp ueq bfloat %a, %b51 ret i1 %r52}53 54; CHECK: [[OEQ]] = OpFunction55; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOAT]]56; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOAT]]57; CHECK-NEXT: OpLabel58; CHECK-NEXT: [[R:%.*]] = OpFOrdEqual {{%.+}} [[A]] [[B]]59; CHECK-NEXT: OpReturnValue [[R]]60; CHECK-NEXT: OpFunctionEnd61define i1 @test_oeq(bfloat %a, bfloat %b) {62 %r = fcmp oeq bfloat %a, %b63 ret i1 %r64}65 66; CHECK: [[UNE]] = OpFunction67; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOAT]]68; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOAT]]69; CHECK-NEXT: OpLabel70; CHECK-NEXT: [[R:%.*]] = OpFUnordNotEqual {{%.+}} [[A]] [[B]]71; CHECK-NEXT: OpReturnValue [[R]]72; CHECK-NEXT: OpFunctionEnd73define i1 @test_une(bfloat %a, bfloat %b) {74 %r = fcmp une bfloat %a, %b75 ret i1 %r76}77 78; CHECK: [[ONE]] = OpFunction79; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOAT]]80; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOAT]]81; CHECK-NEXT: OpLabel82; CHECK-NEXT: [[R:%.*]] = OpFOrdNotEqual {{%.+}} [[A]] [[B]]83; CHECK-NEXT: OpReturnValue [[R]]84; CHECK-NEXT: OpFunctionEnd85define i1 @test_one(bfloat %a, bfloat %b) {86 %r = fcmp one bfloat %a, %b87 ret i1 %r88}89 90; CHECK: [[ULT]] = OpFunction91; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOAT]]92; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOAT]]93; CHECK-NEXT: OpLabel94; CHECK-NEXT: [[R:%.*]] = OpFUnordLessThan {{%.+}} [[A]] [[B]]95; CHECK-NEXT: OpReturnValue [[R]]96; CHECK-NEXT: OpFunctionEnd97define i1 @test_ult(bfloat %a, bfloat %b) {98 %r = fcmp ult bfloat %a, %b99 ret i1 %r100}101 102; CHECK: [[OLT]] = OpFunction103; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOAT]]104; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOAT]]105; CHECK-NEXT: OpLabel106; CHECK-NEXT: [[R:%.*]] = OpFOrdLessThan {{%.+}} [[A]] [[B]]107; CHECK-NEXT: OpReturnValue [[R]]108; CHECK-NEXT: OpFunctionEnd109define i1 @test_olt(bfloat %a, bfloat %b) {110 %r = fcmp olt bfloat %a, %b111 ret i1 %r112}113 114; CHECK: [[ULE]] = OpFunction115; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOAT]]116; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOAT]]117; CHECK-NEXT: OpLabel118; CHECK-NEXT: [[R:%.*]] = OpFUnordLessThanEqual {{%.+}} [[A]] [[B]]119; CHECK-NEXT: OpReturnValue [[R]]120; CHECK-NEXT: OpFunctionEnd121define i1 @test_ule(bfloat %a, bfloat %b) {122 %r = fcmp ule bfloat %a, %b123 ret i1 %r124}125 126; CHECK: [[OLE]] = OpFunction127; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOAT]]128; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOAT]]129; CHECK-NEXT: OpLabel130; CHECK-NEXT: [[R:%.*]] = OpFOrdLessThanEqual {{%.+}} [[A]] [[B]]131; CHECK-NEXT: OpReturnValue [[R]]132; CHECK-NEXT: OpFunctionEnd133define i1 @test_ole(bfloat %a, bfloat %b) {134 %r = fcmp ole bfloat %a, %b135 ret i1 %r136}137 138; CHECK: [[UGT]] = OpFunction139; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOAT]]140; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOAT]]141; CHECK-NEXT: OpLabel142; CHECK-NEXT: [[R:%.*]] = OpFUnordGreaterThan {{%.+}} [[A]] [[B]]143; CHECK-NEXT: OpReturnValue [[R]]144; CHECK-NEXT: OpFunctionEnd145define i1 @test_ugt(bfloat %a, bfloat %b) {146 %r = fcmp ugt bfloat %a, %b147 ret i1 %r148}149 150; CHECK: [[OGT]] = OpFunction151; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOAT]]152; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOAT]]153; CHECK-NEXT: OpLabel154; CHECK-NEXT: [[R:%.*]] = OpFOrdGreaterThan {{%.+}} [[A]] [[B]]155; CHECK-NEXT: OpReturnValue [[R]]156; CHECK-NEXT: OpFunctionEnd157define i1 @test_ogt(bfloat %a, bfloat %b) {158 %r = fcmp ogt bfloat %a, %b159 ret i1 %r160}161 162; CHECK: [[UGE]] = OpFunction163; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOAT]]164; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOAT]]165; CHECK-NEXT: OpLabel166; CHECK-NEXT: [[R:%.*]] = OpFUnordGreaterThanEqual {{%.+}} [[A]] [[B]]167; CHECK-NEXT: OpReturnValue [[R]]168; CHECK-NEXT: OpFunctionEnd169define i1 @test_uge(bfloat %a, bfloat %b) {170 %r = fcmp uge bfloat %a, %b171 ret i1 %r172}173 174; CHECK: [[OGE]] = OpFunction175; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOAT]]176; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOAT]]177; CHECK-NEXT: OpLabel178; CHECK-NEXT: [[R:%.*]] = OpFOrdGreaterThanEqual {{%.+}} [[A]] [[B]]179; CHECK-NEXT: OpReturnValue [[R]]180; CHECK-NEXT: OpFunctionEnd181define i1 @test_oge(bfloat %a, bfloat %b) {182 %r = fcmp oge bfloat %a, %b183 ret i1 %r184}185 186; CHECK: [[ORD]] = OpFunction187; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOAT]]188; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOAT]]189; CHECK-NEXT: OpLabel190; CHECK-NEXT: [[R:%.*]] = OpOrdered {{%.+}} [[A]] [[B]]191; CHECK-NEXT: OpReturnValue [[R]]192; CHECK-NEXT: OpFunctionEnd193define i1 @test_ord(bfloat %a, bfloat %b) {194 %r = fcmp ord bfloat %a, %b195 ret i1 %r196}197 198; CHECK: [[UNO]] = OpFunction199; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOAT]]200; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOAT]]201; CHECK-NEXT: OpLabel202; CHECK-NEXT: [[R:%.*]] = OpUnordered {{%.+}} [[A]] [[B]]203; CHECK-NEXT: OpReturnValue [[R]]204; CHECK-NEXT: OpFunctionEnd205define i1 @test_uno(bfloat %a, bfloat %b) {206 %r = fcmp uno bfloat %a, %b207 ret i1 %r208}209 210; CHECK: [[v3UEQ]] = OpFunction211; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOATV]]212; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOATV]]213; CHECK-NEXT: OpLabel214; CHECK-NEXT: [[R:%.*]] = OpFUnordEqual {{%.+}} [[A]] [[B]]215; CHECK-NEXT: OpReturnValue [[R]]216; CHECK-NEXT: OpFunctionEnd217define <3 x i1> @test_v3_ueq(<3 x bfloat> %a, <3 x bfloat> %b) {218 %r = fcmp ueq <3 x bfloat> %a, %b219 ret <3 x i1> %r220}221 222; CHECK: [[v3OEQ]] = OpFunction223; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOATV]]224; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOATV]]225; CHECK-NEXT: OpLabel226; CHECK-NEXT: [[R:%.*]] = OpFOrdEqual {{%.+}} [[A]] [[B]]227; CHECK-NEXT: OpReturnValue [[R]]228; CHECK-NEXT: OpFunctionEnd229define <3 x i1> @test_v3_oeq(<3 x bfloat> %a, <3 x bfloat> %b) {230 %r = fcmp oeq <3 x bfloat> %a, %b231 ret <3 x i1> %r232}233 234; CHECK: [[v3UNE]] = OpFunction235; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOATV]]236; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOATV]]237; CHECK-NEXT: OpLabel238; CHECK-NEXT: [[R:%.*]] = OpFUnordNotEqual {{%.+}} [[A]] [[B]]239; CHECK-NEXT: OpReturnValue [[R]]240; CHECK-NEXT: OpFunctionEnd241define <3 x i1> @test_v3_une(<3 x bfloat> %a, <3 x bfloat> %b) {242 %r = fcmp une <3 x bfloat> %a, %b243 ret <3 x i1> %r244}245 246; CHECK: [[v3ONE]] = OpFunction247; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOATV]]248; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOATV]]249; CHECK-NEXT: OpLabel250; CHECK-NEXT: [[R:%.*]] = OpFOrdNotEqual {{%.+}} [[A]] [[B]]251; CHECK-NEXT: OpReturnValue [[R]]252; CHECK-NEXT: OpFunctionEnd253define <3 x i1> @test_v3_one(<3 x bfloat> %a, <3 x bfloat> %b) {254 %r = fcmp one <3 x bfloat> %a, %b255 ret <3 x i1> %r256}257 258; CHECK: [[v3ULT]] = OpFunction259; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOATV]]260; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOATV]]261; CHECK-NEXT: OpLabel262; CHECK-NEXT: [[R:%.*]] = OpFUnordLessThan {{%.+}} [[A]] [[B]]263; CHECK-NEXT: OpReturnValue [[R]]264; CHECK-NEXT: OpFunctionEnd265define <3 x i1> @test_v3_ult(<3 x bfloat> %a, <3 x bfloat> %b) {266 %r = fcmp ult <3 x bfloat> %a, %b267 ret <3 x i1> %r268}269 270; CHECK: [[v3OLT]] = OpFunction271; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOATV]]272; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOATV]]273; CHECK-NEXT: OpLabel274; CHECK-NEXT: [[R:%.*]] = OpFOrdLessThan {{%.+}} [[A]] [[B]]275; CHECK-NEXT: OpReturnValue [[R]]276; CHECK-NEXT: OpFunctionEnd277define <3 x i1> @test_v3_olt(<3 x bfloat> %a, <3 x bfloat> %b) {278 %r = fcmp olt <3 x bfloat> %a, %b279 ret <3 x i1> %r280}281 282; CHECK: [[v3ULE]] = OpFunction283; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOATV]]284; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOATV]]285; CHECK-NEXT: OpLabel286; CHECK-NEXT: [[R:%.*]] = OpFUnordLessThanEqual {{%.+}} [[A]] [[B]]287; CHECK-NEXT: OpReturnValue [[R]]288; CHECK-NEXT: OpFunctionEnd289define <3 x i1> @test_v3_ule(<3 x bfloat> %a, <3 x bfloat> %b) {290 %r = fcmp ule <3 x bfloat> %a, %b291 ret <3 x i1> %r292}293 294; CHECK: [[v3OLE]] = OpFunction295; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOATV]]296; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOATV]]297; CHECK-NEXT: OpLabel298; CHECK-NEXT: [[R:%.*]] = OpFOrdLessThanEqual {{%.+}} [[A]] [[B]]299; CHECK-NEXT: OpReturnValue [[R]]300; CHECK-NEXT: OpFunctionEnd301define <3 x i1> @test_v3_ole(<3 x bfloat> %a, <3 x bfloat> %b) {302 %r = fcmp ole <3 x bfloat> %a, %b303 ret <3 x i1> %r304}305 306; CHECK: [[v3UGT]] = OpFunction307; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOATV]]308; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOATV]]309; CHECK-NEXT: OpLabel310; CHECK-NEXT: [[R:%.*]] = OpFUnordGreaterThan {{%.+}} [[A]] [[B]]311; CHECK-NEXT: OpReturnValue [[R]]312; CHECK-NEXT: OpFunctionEnd313define <3 x i1> @test_v3_ugt(<3 x bfloat> %a, <3 x bfloat> %b) {314 %r = fcmp ugt <3 x bfloat> %a, %b315 ret <3 x i1> %r316}317 318; CHECK: [[v3OGT]] = OpFunction319; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOATV]]320; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOATV]]321; CHECK-NEXT: OpLabel322; CHECK-NEXT: [[R:%.*]] = OpFOrdGreaterThan {{%.+}} [[A]] [[B]]323; CHECK-NEXT: OpReturnValue [[R]]324; CHECK-NEXT: OpFunctionEnd325define <3 x i1> @test_v3_ogt(<3 x bfloat> %a, <3 x bfloat> %b) {326 %r = fcmp ogt <3 x bfloat> %a, %b327 ret <3 x i1> %r328}329 330; CHECK: [[v3UGE]] = OpFunction331; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOATV]]332; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOATV]]333; CHECK-NEXT: OpLabel334; CHECK-NEXT: [[R:%.*]] = OpFUnordGreaterThanEqual {{%.+}} [[A]] [[B]]335; CHECK-NEXT: OpReturnValue [[R]]336; CHECK-NEXT: OpFunctionEnd337define <3 x i1> @test_v3_uge(<3 x bfloat> %a, <3 x bfloat> %b) {338 %r = fcmp uge <3 x bfloat> %a, %b339 ret <3 x i1> %r340}341 342; CHECK: [[v3OGE]] = OpFunction343; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOATV]]344; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOATV]]345; CHECK-NEXT: OpLabel346; CHECK-NEXT: [[R:%.*]] = OpFOrdGreaterThanEqual {{%.+}} [[A]] [[B]]347; CHECK-NEXT: OpReturnValue [[R]]348; CHECK-NEXT: OpFunctionEnd349define <3 x i1> @test_v3_oge(<3 x bfloat> %a, <3 x bfloat> %b) {350 %r = fcmp oge <3 x bfloat> %a, %b351 ret <3 x i1> %r352}353 354; CHECK: [[v3ORD]] = OpFunction355; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOATV]]356; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOATV]]357; CHECK-NEXT: OpLabel358; CHECK-NEXT: [[R:%.*]] = OpOrdered {{%.+}} [[A]] [[B]]359; CHECK-NEXT: OpReturnValue [[R]]360; CHECK-NEXT: OpFunctionEnd361define <3 x i1> @test_v3_ord(<3 x bfloat> %a, <3 x bfloat> %b) {362 %r = fcmp ord <3 x bfloat> %a, %b363 ret <3 x i1> %r364}365 366; CHECK: [[v3UNO]] = OpFunction367; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[BFLOATV]]368; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[BFLOATV]]369; CHECK-NEXT: OpLabel370; CHECK-NEXT: [[R:%.*]] = OpUnordered {{%.+}} [[A]] [[B]]371; CHECK-NEXT: OpReturnValue [[R]]372; CHECK-NEXT: OpFunctionEnd373define <3 x i1> @test_v3_uno(<3 x bfloat> %a, <3 x bfloat> %b) {374 %r = fcmp uno <3 x bfloat> %a, %b375 ret <3 x i1> %r376}377