Skip to content

Commit 6149699

Browse files
committed
--Added support for SPV_EXT_image_raw10_raw12 extension.
1 parent cecfef0 commit 6149699

File tree

7 files changed

+156
-1
lines changed

7 files changed

+156
-1
lines changed

llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1079,6 +1079,23 @@ static bool buildTernaryBitwiseFunctionINTELInst(
10791079
return true;
10801080
}
10811081

1082+
static bool buildImageChannelDataTypeInst(const SPIRV::IncomingCall *Call,
1083+
unsigned Opcode,
1084+
MachineIRBuilder &MIRBuilder,
1085+
SPIRVGlobalRegistry *GR) {
1086+
if (Call->isSpirvOp())
1087+
return buildOpFromWrapper(MIRBuilder, Opcode, Call,
1088+
GR->getSPIRVTypeID(Call->ReturnType));
1089+
1090+
auto MIB = MIRBuilder.buildInstr(Opcode)
1091+
.addDef(Call->ReturnRegister)
1092+
.addUse(GR->getSPIRVTypeID(Call->ReturnType));
1093+
for (unsigned i = 0; i < Call->Arguments.size(); ++i)
1094+
MIB.addUse(Call->Arguments[i]);
1095+
1096+
return true;
1097+
}
1098+
10821099
/// Helper function for building Intel's 2d block io instructions.
10831100
static bool build2DBlockIOINTELInst(const SPIRV::IncomingCall *Call,
10841101
unsigned Opcode,
@@ -2402,6 +2419,16 @@ generateTernaryBitwiseFunctionINTELInst(const SPIRV::IncomingCall *Call,
24022419
return buildTernaryBitwiseFunctionINTELInst(Call, Opcode, MIRBuilder, GR);
24032420
}
24042421

2422+
static bool generateImageChannelDataTypeInst(const SPIRV::IncomingCall *Call,
2423+
MachineIRBuilder &MIRBuilder,
2424+
SPIRVGlobalRegistry *GR) {
2425+
const SPIRV::DemangledBuiltin *Builtin = Call->Builtin;
2426+
unsigned Opcode =
2427+
SPIRV::lookupNativeBuiltin(Builtin->Name, Builtin->Set)->Opcode;
2428+
2429+
return buildImageChannelDataTypeInst(Call, Opcode, MIRBuilder, GR);
2430+
}
2431+
24052432
static bool generate2DBlockIOINTELInst(const SPIRV::IncomingCall *Call,
24062433
MachineIRBuilder &MIRBuilder,
24072434
SPIRVGlobalRegistry *GR) {
@@ -3050,6 +3077,8 @@ std::optional<bool> lowerBuiltin(const StringRef DemangledCall,
30503077
return generatePipeInst(Call.get(), MIRBuilder, GR);
30513078
case SPIRV::PredicatedLoadStore:
30523079
return generatePredicatedLoadStoreInst(Call.get(), MIRBuilder, GR);
3080+
case SPIRV::ImageChannelDataTypes:
3081+
return generateImageChannelDataTypeInst(Call.get(), MIRBuilder, GR);
30533082
}
30543083
return false;
30553084
}

llvm/lib/Target/SPIRV/SPIRVBuiltins.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ def TernaryBitwiseINTEL : BuiltinGroup;
7171
def Block2DLoadStore : BuiltinGroup;
7272
def Pipe : BuiltinGroup;
7373
def PredicatedLoadStore : BuiltinGroup;
74+
def ImageChannelDataTypes : BuiltinGroup;
7475

7576
//===----------------------------------------------------------------------===//
7677
// Class defining a demangled builtin record. The information in the record
@@ -1475,6 +1476,7 @@ defm : DemangledImageQueryBuiltin<"get_image_array_size", OpenCL_std, 3>;
14751476

14761477
defm : DemangledNativeBuiltin<"get_image_num_samples", OpenCL_std, ImageMiscQuery, 1, 1, OpImageQuerySamples>;
14771478
defm : DemangledNativeBuiltin<"get_image_num_mip_levels", OpenCL_std, ImageMiscQuery, 1, 1, OpImageQueryLevels>;
1479+
defm : DemangledNativeBuiltin<"get_image_channel_data_type", OpenCL_std, ImageChannelDataTypes, 1, 1, OpImageQueryFormat>;
14781480

14791481
//===----------------------------------------------------------------------===//
14801482
// Class defining a "convert_destType<_sat><_roundingMode>" call record for

llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,9 @@ static const std::map<std::string, SPIRV::Extension::Extension, std::less<>>
155155
{"SPV_INTEL_predicated_io",
156156
SPIRV::Extension::Extension::SPV_INTEL_predicated_io},
157157
{"SPV_KHR_maximal_reconvergence",
158-
SPIRV::Extension::Extension::SPV_KHR_maximal_reconvergence}};
158+
SPIRV::Extension::Extension::SPV_KHR_maximal_reconvergence},
159+
{"SPV_EXT_image_raw10_raw12",
160+
SPIRV::Extension::Extension::SPV_EXT_image_raw10_raw12}};
159161

160162
bool SPIRVExtensionsParser::parse(cl::Option &O, StringRef ArgName,
161163
StringRef ArgValue,

llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1571,6 +1571,48 @@ void addInstrRequirements(const MachineInstr &MI,
15711571
}
15721572
break;
15731573
}
1574+
case SPIRV::OpImageQueryFormat: {
1575+
Register ResultReg = MI.getOperand(0).getReg();
1576+
const MachineRegisterInfo &MRI = MI.getMF()->getRegInfo();
1577+
static const unsigned CompareOps[] = {
1578+
SPIRV::OpIEqual, SPIRV::OpINotEqual,
1579+
SPIRV::OpUGreaterThan, SPIRV::OpUGreaterThanEqual,
1580+
SPIRV::OpULessThan, SPIRV::OpULessThanEqual,
1581+
SPIRV::OpSGreaterThan, SPIRV::OpSGreaterThanEqual,
1582+
SPIRV::OpSLessThan, SPIRV::OpSLessThanEqual};
1583+
1584+
auto CheckAndAddExtension = [&](int64_t ImmVal) {
1585+
if (ImmVal == 4323 || ImmVal == 4324) {
1586+
if (ST.canUseExtension(SPIRV::Extension::SPV_EXT_image_raw10_raw12))
1587+
Reqs.addExtension(SPIRV::Extension::SPV_EXT_image_raw10_raw12);
1588+
else
1589+
report_fatal_error("This requires the "
1590+
"SPV_EXT_image_raw10_raw12 extension");
1591+
}
1592+
};
1593+
1594+
for (MachineInstr &UseInst : MRI.use_instructions(ResultReg)) {
1595+
unsigned Opc = UseInst.getOpcode();
1596+
1597+
if (Opc == SPIRV::OpSwitch) {
1598+
for (const MachineOperand &Op : UseInst.operands())
1599+
if (Op.isImm())
1600+
CheckAndAddExtension(Op.getImm());
1601+
} else if (llvm::is_contained(CompareOps, Opc)) {
1602+
for (unsigned i = 1; i < UseInst.getNumOperands(); ++i) {
1603+
Register UseReg = UseInst.getOperand(i).getReg();
1604+
MachineInstr *ConstInst = MRI.getVRegDef(UseReg);
1605+
if (ConstInst && ConstInst->getOpcode() == SPIRV::OpConstantI) {
1606+
int64_t ImmVal = ConstInst->getOperand(2).getImm();
1607+
if (ImmVal)
1608+
CheckAndAddExtension(ImmVal);
1609+
}
1610+
}
1611+
}
1612+
}
1613+
break;
1614+
}
1615+
15741616
case SPIRV::OpGroupNonUniformShuffle:
15751617
case SPIRV::OpGroupNonUniformShuffleXor:
15761618
Reqs.addCapability(SPIRV::Capability::GroupNonUniformShuffle);

llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,7 @@ defm SPV_INTEL_tensor_float32_conversion : ExtensionOperand<125, [EnvOpenCL]>;
387387
defm SPV_KHR_bfloat16 : ExtensionOperand<126, [EnvVulkan, EnvOpenCL]>;
388388
defm SPV_INTEL_predicated_io : ExtensionOperand<127, [EnvOpenCL]>;
389389
defm SPV_KHR_maximal_reconvergence : ExtensionOperand<128, [EnvVulkan]>;
390+
defm SPV_EXT_image_raw10_raw12 :ExtensionOperand<129, [EnvOpenCL]>;
390391

391392
//===----------------------------------------------------------------------===//
392393
// Multiclass used to define Capabilities enum values and at the same time
@@ -1089,6 +1090,8 @@ defm HalfFloat : ImageChannelDataTypeOperand<13, [Kernel]>;
10891090
defm Float : ImageChannelDataTypeOperand<14, [Kernel]>;
10901091
defm UnormInt24 : ImageChannelDataTypeOperand<15, [Kernel]>;
10911092
defm UnormInt101010_2 : ImageChannelDataTypeOperand<16, [Kernel]>;
1093+
defm UnsignedIntRaw10EXT : ImageChannelDataTypeOperand<17, [Kernel]>;
1094+
defm UnsignedIntRaw12EXT : ImageChannelDataTypeOperand<18, [Kernel]>;
10921095

10931096
//===----------------------------------------------------------------------===//
10941097
// Multiclass used to define ImageOperand enum values and at the same time
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown --spirv-ext=+SPV_EXT_image_raw10_raw12 %s -o - | FileCheck %s
2+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s --spirv-ext=+SPV_EXT_image_raw10_raw12 -o - -filetype=obj | spirv-val %}
3+
4+
; CHECK-NOT: OpExtension "SPV_EXT_image_raw10_raw12"
5+
6+
define dso_local spir_kernel void @test_raw1012(ptr addrspace(1) noundef writeonly align 4 captures(none) %dst, i32 noundef %value) {
7+
entry:
8+
switch i32 %value, label %sw.epilog [
9+
i32 4323, label %sw.epilog.sink.split
10+
i32 4324, label %sw.bb1
11+
]
12+
13+
sw.bb1:
14+
br label %sw.epilog.sink.split
15+
16+
sw.epilog.sink.split:
17+
%.sink = phi i32 [ 12, %sw.bb1 ], [ 10, %entry ]
18+
store i32 %.sink, ptr addrspace(1) %dst, align 4
19+
br label %sw.epilog
20+
21+
sw.epilog:
22+
%0 = add i32 %value, -4323
23+
%or.cond = icmp ult i32 %0, 2
24+
br i1 %or.cond, label %if.then, label %if.end
25+
26+
if.then:
27+
store i32 1012, ptr addrspace(1) %dst, align 4
28+
br label %if.end
29+
30+
if.end:
31+
ret void
32+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown --spirv-ext=+SPV_EXT_image_raw10_raw12 %s -o - | FileCheck %s
2+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s --spirv-ext=+SPV_EXT_image_raw10_raw12 -o - -filetype=obj | spirv-val %}
3+
4+
; CHECK: OpExtension "SPV_EXT_image_raw10_raw12"
5+
6+
define dso_local spir_kernel void @test_raw1012(ptr addrspace(1) noundef writeonly align 4 captures(none) %dst, target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 0) %img) {
7+
entry:
8+
%call = tail call spir_func i32 @_Z27get_image_channel_data_type14ocl_image2d_ro(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 0) %img)
9+
switch i32 %call, label %sw.epilog [
10+
i32 4304, label %sw.epilog.sink.split
11+
i32 4323, label %sw.bb1
12+
i32 4324, label %sw.bb2
13+
]
14+
15+
sw.bb1:
16+
br label %sw.epilog.sink.split
17+
18+
sw.bb2:
19+
br label %sw.epilog.sink.split
20+
21+
sw.epilog.sink.split:
22+
%.sink = phi i32 [ 12, %sw.bb2 ], [ 10, %sw.bb1 ], [ 8, %entry ]
23+
store i32 %.sink, ptr addrspace(1) %dst, align 4
24+
br label %sw.epilog
25+
26+
sw.epilog:
27+
%call3 = tail call spir_func i32 @_Z27get_image_channel_data_type14ocl_image2d_ro(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 0) %img)
28+
%cmp = icmp eq i32 %call3, 4323
29+
br i1 %cmp, label %if.end7.sink.split, label %if.else
30+
31+
if.else:
32+
%call4 = tail call spir_func i32 @_Z27get_image_channel_data_type14ocl_image2d_ro(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 0) %img)
33+
%cmp5 = icmp eq i32 %call4, 4324
34+
br i1 %cmp5, label %if.end7.sink.split, label %if.end7
35+
36+
if.end7.sink.split:
37+
%.sink14 = phi i32 [ 1010, %sw.epilog ], [ 1212, %if.else ]
38+
store i32 %.sink14, ptr addrspace(1) %dst, align 4
39+
br label %if.end7
40+
41+
if.end7:
42+
ret void
43+
}
44+
45+
declare spir_func i32 @_Z27get_image_channel_data_type14ocl_image2d_ro(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 0))

0 commit comments

Comments
 (0)