Skip to content

Commit 33136f1

Browse files
committed
--Added support for SPV_EXT_image_raw10_raw12 extension.
1 parent abffc54 commit 33136f1

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
@@ -1078,6 +1078,23 @@ static bool buildTernaryBitwiseFunctionINTELInst(
10781078
return true;
10791079
}
10801080

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

2394+
static bool generateImageChannelDataTypeInst(const SPIRV::IncomingCall *Call,
2395+
MachineIRBuilder &MIRBuilder,
2396+
SPIRVGlobalRegistry *GR) {
2397+
const SPIRV::DemangledBuiltin *Builtin = Call->Builtin;
2398+
unsigned Opcode =
2399+
SPIRV::lookupNativeBuiltin(Builtin->Name, Builtin->Set)->Opcode;
2400+
2401+
return buildImageChannelDataTypeInst(Call, Opcode, MIRBuilder, GR);
2402+
}
2403+
23772404
static bool generate2DBlockIOINTELInst(const SPIRV::IncomingCall *Call,
23782405
MachineIRBuilder &MIRBuilder,
23792406
SPIRVGlobalRegistry *GR) {
@@ -2999,6 +3026,8 @@ std::optional<bool> lowerBuiltin(const StringRef DemangledCall,
29993026
return generate2DBlockIOINTELInst(Call.get(), MIRBuilder, GR);
30003027
case SPIRV::Pipe:
30013028
return generatePipeInst(Call.get(), MIRBuilder, GR);
3029+
case SPIRV::ImageChannelDataTypes:
3030+
return generateImageChannelDataTypeInst(Call.get(), MIRBuilder, GR);
30023031
}
30033032
return false;
30043033
}

llvm/lib/Target/SPIRV/SPIRVBuiltins.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ def BindlessINTEL : BuiltinGroup;
7070
def TernaryBitwiseINTEL : BuiltinGroup;
7171
def Block2DLoadStore : BuiltinGroup;
7272
def Pipe : BuiltinGroup;
73+
def ImageChannelDataTypes : BuiltinGroup;
7374

7475
//===----------------------------------------------------------------------===//
7576
// Class defining a demangled builtin record. The information in the record
@@ -1469,6 +1470,7 @@ defm : DemangledImageQueryBuiltin<"get_image_array_size", OpenCL_std, 3>;
14691470

14701471
defm : DemangledNativeBuiltin<"get_image_num_samples", OpenCL_std, ImageMiscQuery, 1, 1, OpImageQuerySamples>;
14711472
defm : DemangledNativeBuiltin<"get_image_num_mip_levels", OpenCL_std, ImageMiscQuery, 1, 1, OpImageQueryLevels>;
1473+
defm : DemangledNativeBuiltin<"get_image_channel_data_type", OpenCL_std, ImageChannelDataTypes, 1, 1, OpImageQueryFormat>;
14721474

14731475
//===----------------------------------------------------------------------===//
14741476
// 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
@@ -151,7 +151,9 @@ static const std::map<std::string, SPIRV::Extension::Extension, std::less<>>
151151
{"SPV_KHR_bfloat16", SPIRV::Extension::Extension::SPV_KHR_bfloat16},
152152
{"SPV_EXT_relaxed_printf_string_address_space",
153153
SPIRV::Extension::Extension::
154-
SPV_EXT_relaxed_printf_string_address_space}};
154+
SPV_EXT_relaxed_printf_string_address_space},
155+
{"SPV_EXT_image_raw10_raw12",
156+
SPIRV::Extension::Extension::SPV_EXT_image_raw10_raw12}};
155157

156158
bool SPIRVExtensionsParser::parse(cl::Option &O, StringRef ArgName,
157159
StringRef ArgValue,

llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1489,6 +1489,48 @@ void addInstrRequirements(const MachineInstr &MI,
14891489
}
14901490
break;
14911491
}
1492+
case SPIRV::OpImageQueryFormat: {
1493+
Register ResultReg = MI.getOperand(0).getReg();
1494+
const MachineRegisterInfo &MRI = MI.getMF()->getRegInfo();
1495+
static const unsigned CompareOps[] = {
1496+
SPIRV::OpIEqual, SPIRV::OpINotEqual,
1497+
SPIRV::OpUGreaterThan, SPIRV::OpUGreaterThanEqual,
1498+
SPIRV::OpULessThan, SPIRV::OpULessThanEqual,
1499+
SPIRV::OpSGreaterThan, SPIRV::OpSGreaterThanEqual,
1500+
SPIRV::OpSLessThan, SPIRV::OpSLessThanEqual};
1501+
1502+
auto CheckAndAddExtension = [&](int64_t ImmVal) {
1503+
if (ImmVal == 4323 || ImmVal == 4324) {
1504+
if (ST.canUseExtension(SPIRV::Extension::SPV_EXT_image_raw10_raw12))
1505+
Reqs.addExtension(SPIRV::Extension::SPV_EXT_image_raw10_raw12);
1506+
else
1507+
report_fatal_error("This requires the "
1508+
"SPV_EXT_image_raw10_raw12 extension");
1509+
}
1510+
};
1511+
1512+
for (MachineInstr &UseInst : MRI.use_instructions(ResultReg)) {
1513+
unsigned Opc = UseInst.getOpcode();
1514+
1515+
if (Opc == SPIRV::OpSwitch) {
1516+
for (const MachineOperand &Op : UseInst.operands())
1517+
if (Op.isImm())
1518+
CheckAndAddExtension(Op.getImm());
1519+
} else if (llvm::is_contained(CompareOps, Opc)) {
1520+
for (unsigned i = 1; i < UseInst.getNumOperands(); ++i) {
1521+
Register UseReg = UseInst.getOperand(i).getReg();
1522+
MachineInstr *ConstInst = MRI.getVRegDef(UseReg);
1523+
if (ConstInst && ConstInst->getOpcode() == SPIRV::OpConstantI) {
1524+
int64_t ImmVal = ConstInst->getOperand(2).getImm();
1525+
if (ImmVal)
1526+
CheckAndAddExtension(ImmVal);
1527+
}
1528+
}
1529+
}
1530+
}
1531+
break;
1532+
}
1533+
14921534
case SPIRV::OpGroupNonUniformShuffle:
14931535
case SPIRV::OpGroupNonUniformShuffleXor:
14941536
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
@@ -385,6 +385,7 @@ defm SPV_INTEL_int4 : ExtensionOperand<123, [EnvOpenCL]>;
385385
defm SPV_KHR_float_controls2 : ExtensionOperand<124, [EnvVulkan, EnvOpenCL]>;
386386
defm SPV_INTEL_tensor_float32_conversion : ExtensionOperand<125, [EnvOpenCL]>;
387387
defm SPV_KHR_bfloat16 : ExtensionOperand<126, [EnvVulkan, EnvOpenCL]>;
388+
defm SPV_EXT_image_raw10_raw12 :ExtensionOperand<127, [EnvOpenCL]>;
388389

389390
//===----------------------------------------------------------------------===//
390391
// Multiclass used to define Capabilities enum values and at the same time
@@ -1084,6 +1085,8 @@ defm HalfFloat : ImageChannelDataTypeOperand<13, [Kernel]>;
10841085
defm Float : ImageChannelDataTypeOperand<14, [Kernel]>;
10851086
defm UnormInt24 : ImageChannelDataTypeOperand<15, [Kernel]>;
10861087
defm UnormInt101010_2 : ImageChannelDataTypeOperand<16, [Kernel]>;
1088+
defm UnsignedIntRaw10EXT : ImageChannelDataTypeOperand<17, [Kernel]>;
1089+
defm UnsignedIntRaw12EXT : ImageChannelDataTypeOperand<18, [Kernel]>;
10871090

10881091
//===----------------------------------------------------------------------===//
10891092
// 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)