162 lines · plain
1; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s2; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}3 4; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s --translator-compatibility-mode -o - | FileCheck %s --check-prefix=CHECK-COMPAT5; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s --translator-compatibility-mode -o - -filetype=obj | spirv-val %}6 7; CHECK-DAG: OpName [[EQ:%.*]] "test_eq"8; CHECK-DAG: OpName [[NE:%.*]] "test_ne"9; CHECK-COMPAT-DAG: OpName [[EQ:%.*]] "test_eq"10; CHECK-COMPAT-DAG: OpName [[NE:%.*]] "test_ne"11; CHECK-DAG: OpName [[ULT:%.*]] "test_ult"12; CHECK-DAG: OpName [[SLT:%.*]] "test_slt"13; CHECK-DAG: OpName [[ULE:%.*]] "test_ule"14; CHECK-DAG: OpName [[SLE:%.*]] "test_sle"15; CHECK-DAG: OpName [[UGT:%.*]] "test_ugt"16; CHECK-DAG: OpName [[SGT:%.*]] "test_sgt"17; CHECK-DAG: OpName [[UGE:%.*]] "test_uge"18; CHECK-DAG: OpName [[SGE:%.*]] "test_sge"19 20;; FIXME: Translator uses OpIEqual/OpINotEqual for test_eq/test_ne cases21; CHECK: [[EQ]] = OpFunction22; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter23; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter24; CHECK-NEXT: OpLabel25; CHECK-NEXT: [[R:%.*]] = OpPtrEqual {{%.+}} [[A]] [[B]]26; CHECK-NEXT: OpReturnValue [[R]]27; CHECK-NEXT: OpFunctionEnd28; CHECK-COMPAT: [[EQ]] = OpFunction29; CHECK-COMPAT-NOT: OpPtrEqual30; CHECK-COMPAT: OpFunctionEnd31define i1 @test_eq(i16* %a, i16* %b) {32 %r = icmp eq i16* %a, %b33 ret i1 %r34}35 36; CHECK: [[NE]] = OpFunction37; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter38; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter39; CHECK-NEXT: OpLabel40; CHECK-NEXT: [[R:%.*]] = OpPtrNotEqual {{%.+}} [[A]] [[B]]41; CHECK-NEXT: OpReturnValue [[R]]42; CHECK-NEXT: OpFunctionEnd43; CHECK-COMPAT: [[NE]] = OpFunction44; CHECK-COMPAT-NOT: OpPtrNotEqual45; CHECK-COMPAT: OpFunctionEnd46define i1 @test_ne(i16* %a, i16* %b) {47 %r = icmp ne i16* %a, %b48 ret i1 %r49}50 51; CHECK: [[SLT]] = OpFunction52; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter53; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter54; CHECK-NEXT: OpLabel55; CHECK-NEXT: [[AI:%.*]] = OpConvertPtrToU {{%.+}} [[A]]56; CHECK-NEXT: [[BI:%.*]] = OpConvertPtrToU {{%.+}} [[B]]57; CHECK: [[R:%.*]] = OpSLessThan {{%.+}} [[AI]] [[BI]]58; CHECK-NEXT: OpReturnValue [[R]]59; CHECK-NEXT: OpFunctionEnd60define i1 @test_slt(i16* %a, i16* %b) {61 %r = icmp slt i16* %a, %b62 ret i1 %r63}64 65; CHECK: [[ULT]] = OpFunction66; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter67; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter68; CHECK-NEXT: OpLabel69; CHECK-NEXT: [[AI:%.*]] = OpConvertPtrToU {{%.+}} [[A]]70; CHECK-NEXT: [[BI:%.*]] = OpConvertPtrToU {{%.+}} [[B]]71; CHECK: [[R:%.*]] = OpULessThan {{%.+}} [[AI]] [[BI]]72; CHECK-NEXT: OpReturnValue [[R]]73; CHECK-NEXT: OpFunctionEnd74define i1 @test_ult(i16* %a, i16* %b) {75 %r = icmp ult i16* %a, %b76 ret i1 %r77}78 79; CHECK: [[ULE]] = OpFunction80; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter81; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter82; CHECK-NEXT: OpLabel83; CHECK-NEXT: [[AI:%.*]] = OpConvertPtrToU {{%.+}} [[A]]84; CHECK-NEXT: [[BI:%.*]] = OpConvertPtrToU {{%.+}} [[B]]85; CHECK: [[R:%.*]] = OpULessThanEqual {{%.+}} [[AI]] [[BI]]86; CHECK-NEXT: OpReturnValue [[R]]87; CHECK-NEXT: OpFunctionEnd88define i1 @test_ule(i16* %a, i16* %b) {89 %r = icmp ule i16* %a, %b90 ret i1 %r91}92 93; CHECK: [[SLE]] = OpFunction94; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter95; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter96; CHECK-NEXT: OpLabel97; CHECK-NEXT: [[AI:%.*]] = OpConvertPtrToU {{%.+}} [[A]]98; CHECK-NEXT: [[BI:%.*]] = OpConvertPtrToU {{%.+}} [[B]]99; CHECK: [[R:%.*]] = OpSLessThanEqual {{%.+}} [[AI]] [[BI]]100; CHECK-NEXT: OpReturnValue [[R]]101; CHECK-NEXT: OpFunctionEnd102define i1 @test_sle(i16* %a, i16* %b) {103 %r = icmp sle i16* %a, %b104 ret i1 %r105}106 107; CHECK: [[UGT]] = OpFunction108; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter109; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter110; CHECK-NEXT: OpLabel111; CHECK-NEXT: [[AI:%.*]] = OpConvertPtrToU {{%.+}} [[A]]112; CHECK-NEXT: [[BI:%.*]] = OpConvertPtrToU {{%.+}} [[B]]113; CHECK: [[R:%.*]] = OpUGreaterThan {{%.+}} [[AI]] [[BI]]114; CHECK-NEXT: OpReturnValue [[R]]115; CHECK-NEXT: OpFunctionEnd116define i1 @test_ugt(i16* %a, i16* %b) {117 %r = icmp ugt i16* %a, %b118 ret i1 %r119}120 121; CHECK: [[SGT]] = OpFunction122; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter123; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter124; CHECK-NEXT: OpLabel125; CHECK-NEXT: [[AI:%.*]] = OpConvertPtrToU {{%.+}} [[A]]126; CHECK-NEXT: [[BI:%.*]] = OpConvertPtrToU {{%.+}} [[B]]127; CHECK: [[R:%.*]] = OpSGreaterThan {{%.+}} [[AI]] [[BI]]128; CHECK-NEXT: OpReturnValue [[R]]129; CHECK-NEXT: OpFunctionEnd130define i1 @test_sgt(i16* %a, i16* %b) {131 %r = icmp sgt i16* %a, %b132 ret i1 %r133}134 135; CHECK: [[UGE]] = OpFunction136; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter137; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter138; CHECK-NEXT: OpLabel139; CHECK-NEXT: [[AI:%.*]] = OpConvertPtrToU {{%.+}} [[A]]140; CHECK-NEXT: [[BI:%.*]] = OpConvertPtrToU {{%.+}} [[B]]141; CHECK: [[R:%.*]] = OpUGreaterThanEqual {{%.+}} [[AI]] [[BI]]142; CHECK-NEXT: OpReturnValue [[R]]143; CHECK-NEXT: OpFunctionEnd144define i1 @test_uge(i16* %a, i16* %b) {145 %r = icmp uge i16* %a, %b146 ret i1 %r147}148 149; CHECK: [[SGE]] = OpFunction150; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter151; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter152; CHECK-NEXT: OpLabel153; CHECK-NEXT: [[AI:%.*]] = OpConvertPtrToU {{%.+}} [[A]]154; CHECK-NEXT: [[BI:%.*]] = OpConvertPtrToU {{%.+}} [[B]]155; CHECK: [[R:%.*]] = OpSGreaterThanEqual {{%.+}} [[AI]] [[BI]]156; CHECK-NEXT: OpReturnValue [[R]]157; CHECK-NEXT: OpFunctionEnd158define i1 @test_sge(i16* %a, i16* %b) {159 %r = icmp sge i16* %a, %b160 ret i1 %r161}162