The patch adds SPIR-V specific intrinsics required to keep information critical to SPIR-V consistency (types, constants, etc.) during translation from IR to MIR. Two related passes (SPIRVEmitIntrinsics and SPIRVPreLegalizer) and several LIT tests (passed with this change) have also been added. It also fixes the issue with opaque pointers in SPIRVGlobalRegistry.cpp and the mismatch of the data layout between the SPIR-V backend and clang (Issue #55122). Differential Revision: https://reviews.llvm.org/D124416 Co-authored-by: Aleksandr Bezzubikov <zuban32s@gmail.com> Co-authored-by: Michal Paszkowski <michal.paszkowski@outlook.com> Co-authored-by: Andrey Tretyakov <andrey1.tretyakov@intel.com> Co-authored-by: Konrad Trifunovic <konrad.trifunovic@intel.com>
152 lines
4.8 KiB
LLVM
152 lines
4.8 KiB
LLVM
; RUN: llc %s -o - | FileCheck %s
|
|
|
|
target triple = "spirv32-unknown-unknown"
|
|
|
|
; CHECK-DAG: OpName [[EQ:%.*]] "test_eq"
|
|
; CHECK-DAG: OpName [[NE:%.*]] "test_ne"
|
|
; CHECK-DAG: OpName [[ULT:%.*]] "test_ult"
|
|
; CHECK-DAG: OpName [[SLT:%.*]] "test_slt"
|
|
; CHECK-DAG: OpName [[ULE:%.*]] "test_ule"
|
|
; CHECK-DAG: OpName [[SLE:%.*]] "test_sle"
|
|
; CHECK-DAG: OpName [[UGT:%.*]] "test_ugt"
|
|
; CHECK-DAG: OpName [[SGT:%.*]] "test_sgt"
|
|
; CHECK-DAG: OpName [[UGE:%.*]] "test_uge"
|
|
; CHECK-DAG: OpName [[SGE:%.*]] "test_sge"
|
|
|
|
; FIXME: Translator uses OpIEqual/OpINotEqual for test_eq/test_ne cases
|
|
; CHECK: [[EQ]] = OpFunction
|
|
; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: OpLabel
|
|
; CHECK-NEXT: [[R:%.*]] = OpPtrEqual {{%.+}} [[A]] [[B]]
|
|
; CHECK-NEXT: OpReturnValue [[R]]
|
|
; CHECK-NEXT: OpFunctionEnd
|
|
define i1 @test_eq(i16* %a, i16* %b) {
|
|
%r = icmp eq i16* %a, %b
|
|
ret i1 %r
|
|
}
|
|
|
|
; CHECK: [[NE]] = OpFunction
|
|
; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: OpLabel
|
|
; CHECK-NEXT: [[R:%.*]] = OpPtrNotEqual {{%.+}} [[A]] [[B]]
|
|
; CHECK-NEXT: OpReturnValue [[R]]
|
|
; CHECK-NEXT: OpFunctionEnd
|
|
define i1 @test_ne(i16* %a, i16* %b) {
|
|
%r = icmp ne i16* %a, %b
|
|
ret i1 %r
|
|
}
|
|
|
|
; CHECK: [[SLT]] = OpFunction
|
|
; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: OpLabel
|
|
; CHECK-NEXT: [[AI:%.*]] = OpConvertPtrToU {{%.+}} [[A]]
|
|
; CHECK-NEXT: [[BI:%.*]] = OpConvertPtrToU {{%.+}} [[B]]
|
|
; CHECK: [[R:%.*]] = OpSLessThan {{%.+}} [[AI]] [[BI]]
|
|
; CHECK-NEXT: OpReturnValue [[R]]
|
|
; CHECK-NEXT: OpFunctionEnd
|
|
define i1 @test_slt(i16* %a, i16* %b) {
|
|
%r = icmp slt i16* %a, %b
|
|
ret i1 %r
|
|
}
|
|
|
|
; CHECK: [[ULT]] = OpFunction
|
|
; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: OpLabel
|
|
; CHECK-NEXT: [[AI:%.*]] = OpConvertPtrToU {{%.+}} [[A]]
|
|
; CHECK-NEXT: [[BI:%.*]] = OpConvertPtrToU {{%.+}} [[B]]
|
|
; CHECK: [[R:%.*]] = OpULessThan {{%.+}} [[AI]] [[BI]]
|
|
; CHECK-NEXT: OpReturnValue [[R]]
|
|
; CHECK-NEXT: OpFunctionEnd
|
|
define i1 @test_ult(i16* %a, i16* %b) {
|
|
%r = icmp ult i16* %a, %b
|
|
ret i1 %r
|
|
}
|
|
|
|
; CHECK: [[ULE]] = OpFunction
|
|
; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: OpLabel
|
|
; CHECK-NEXT: [[AI:%.*]] = OpConvertPtrToU {{%.+}} [[A]]
|
|
; CHECK-NEXT: [[BI:%.*]] = OpConvertPtrToU {{%.+}} [[B]]
|
|
; CHECK: [[R:%.*]] = OpULessThanEqual {{%.+}} [[AI]] [[BI]]
|
|
; CHECK-NEXT: OpReturnValue [[R]]
|
|
; CHECK-NEXT: OpFunctionEnd
|
|
define i1 @test_ule(i16* %a, i16* %b) {
|
|
%r = icmp ule i16* %a, %b
|
|
ret i1 %r
|
|
}
|
|
|
|
; CHECK: [[SLE]] = OpFunction
|
|
; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: OpLabel
|
|
; CHECK-NEXT: [[AI:%.*]] = OpConvertPtrToU {{%.+}} [[A]]
|
|
; CHECK-NEXT: [[BI:%.*]] = OpConvertPtrToU {{%.+}} [[B]]
|
|
; CHECK: [[R:%.*]] = OpSLessThanEqual {{%.+}} [[AI]] [[BI]]
|
|
; CHECK-NEXT: OpReturnValue [[R]]
|
|
; CHECK-NEXT: OpFunctionEnd
|
|
define i1 @test_sle(i16* %a, i16* %b) {
|
|
%r = icmp sle i16* %a, %b
|
|
ret i1 %r
|
|
}
|
|
|
|
; CHECK: [[UGT]] = OpFunction
|
|
; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: OpLabel
|
|
; CHECK-NEXT: [[AI:%.*]] = OpConvertPtrToU {{%.+}} [[A]]
|
|
; CHECK-NEXT: [[BI:%.*]] = OpConvertPtrToU {{%.+}} [[B]]
|
|
; CHECK: [[R:%.*]] = OpUGreaterThan {{%.+}} [[AI]] [[BI]]
|
|
; CHECK-NEXT: OpReturnValue [[R]]
|
|
; CHECK-NEXT: OpFunctionEnd
|
|
define i1 @test_ugt(i16* %a, i16* %b) {
|
|
%r = icmp ugt i16* %a, %b
|
|
ret i1 %r
|
|
}
|
|
|
|
; CHECK: [[SGT]] = OpFunction
|
|
; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: OpLabel
|
|
; CHECK-NEXT: [[AI:%.*]] = OpConvertPtrToU {{%.+}} [[A]]
|
|
; CHECK-NEXT: [[BI:%.*]] = OpConvertPtrToU {{%.+}} [[B]]
|
|
; CHECK: [[R:%.*]] = OpSGreaterThan {{%.+}} [[AI]] [[BI]]
|
|
; CHECK-NEXT: OpReturnValue [[R]]
|
|
; CHECK-NEXT: OpFunctionEnd
|
|
define i1 @test_sgt(i16* %a, i16* %b) {
|
|
%r = icmp sgt i16* %a, %b
|
|
ret i1 %r
|
|
}
|
|
|
|
; CHECK: [[UGE]] = OpFunction
|
|
; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: OpLabel
|
|
; CHECK-NEXT: [[AI:%.*]] = OpConvertPtrToU {{%.+}} [[A]]
|
|
; CHECK-NEXT: [[BI:%.*]] = OpConvertPtrToU {{%.+}} [[B]]
|
|
; CHECK: [[R:%.*]] = OpUGreaterThanEqual {{%.+}} [[AI]] [[BI]]
|
|
; CHECK-NEXT: OpReturnValue [[R]]
|
|
; CHECK-NEXT: OpFunctionEnd
|
|
define i1 @test_uge(i16* %a, i16* %b) {
|
|
%r = icmp uge i16* %a, %b
|
|
ret i1 %r
|
|
}
|
|
|
|
; CHECK: [[SGE]] = OpFunction
|
|
; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter
|
|
; CHECK-NEXT: OpLabel
|
|
; CHECK-NEXT: [[AI:%.*]] = OpConvertPtrToU {{%.+}} [[A]]
|
|
; CHECK-NEXT: [[BI:%.*]] = OpConvertPtrToU {{%.+}} [[B]]
|
|
; CHECK: [[R:%.*]] = OpSGreaterThanEqual {{%.+}} [[AI]] [[BI]]
|
|
; CHECK-NEXT: OpReturnValue [[R]]
|
|
; CHECK-NEXT: OpFunctionEnd
|
|
define i1 @test_sge(i16* %a, i16* %b) {
|
|
%r = icmp sge i16* %a, %b
|
|
ret i1 %r
|
|
}
|