Skip to content

Commit d3b494c

Browse files
committed
only add required capabilities
1 parent 7617b82 commit d3b494c

File tree

2 files changed

+27
-11
lines changed

2 files changed

+27
-11
lines changed

llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1385,13 +1385,28 @@ void addInstrRequirements(const MachineInstr &MI,
13851385
break;
13861386
case SPIRV::OpSDot:
13871387
case SPIRV::OpUDot: {
1388-
if (ST.canUseExtension(SPIRV::Extension::SPV_KHR_integer_dot_product)) {
1388+
if (ST.canUseExtension(SPIRV::Extension::SPV_KHR_integer_dot_product))
13891389
Reqs.addExtension(SPIRV::Extension::SPV_KHR_integer_dot_product);
1390-
}
13911390
Reqs.addCapability(SPIRV::Capability::DotProductKHR);
1392-
Reqs.addCapability(SPIRV::Capability::DotProductInputAllKHR);
1393-
Reqs.addCapability(SPIRV::Capability::DotProductInput4x8BitKHR);
1394-
Reqs.addCapability(SPIRV::Capability::DotProductInput4x8BitPackedKHR);
1391+
1392+
const MachineRegisterInfo &MRI = MI.getMF()->getRegInfo();
1393+
const MachineInstr *InstrPtr = &MI;
1394+
assert(MI.getOperand(1).isReg() && "Unexpected operand in dot");
1395+
1396+
Register TypeReg = InstrPtr->getOperand(1).getReg();
1397+
SPIRVType *TypeDef = MRI.getVRegDef(TypeReg);
1398+
if (TypeDef->getOpcode() == SPIRV::OpTypeInt) {
1399+
assert(TypeDef->getOperand(1).getImm() == 32);
1400+
Reqs.addCapability(SPIRV::Capability::DotProductInput4x8BitPackedKHR);
1401+
} else if (TypeDef->getOpcode() == SPIRV::OpTypeVector) {
1402+
SPIRVType *ScalarTypeDef =
1403+
MRI.getVRegDef(TypeDef->getOperand(1).getReg());
1404+
assert(ScalarTypeDef->getOpcode() == SPIRV::OpTypeInt);
1405+
auto Capability = ScalarTypeDef->getOperand(1).getImm() == 8
1406+
? SPIRV::Capability::DotProductInput4x8BitKHR
1407+
: SPIRV::Capability::DotProductInputAllKHR;
1408+
Reqs.addCapability(Capability);
1409+
}
13951410
break;
13961411
}
13971412
default:

llvm/test/CodeGen/SPIRV/hlsl-intrinsics/dot4add_i8packed.ll

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-EXP
2-
; RUN: llc -O0 -mtriple=spirv32v1.6-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-DOT
3-
; RUN: llc -O0 -mtriple=spirv32-unknown-unknown -spirv-ext=+SPV_KHR_integer_dot_product %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-DOT,CHECK-EXT
4-
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
5-
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32v1.6-unknown-unknown %s -o - -filetype=obj | spirv-val %}
6-
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown -spirv-ext=+SPV_KHR_integer_dot_product %s -o - -filetype=obj | spirv-val %}
1+
; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-EXP
2+
; RUN: llc -O0 -mtriple=spirv1.6-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-DOT
3+
; RUN: llc -O0 -mtriple=spirv-unknown-unknown -spirv-ext=+SPV_KHR_integer_dot_product %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-DOT,CHECK-EXT
4+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %}
5+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv1.6-unknown-unknown %s -o - -filetype=obj | spirv-val %}
6+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown -spirv-ext=+SPV_KHR_integer_dot_product %s -o - -filetype=obj | spirv-val %}
77

8+
; CHECK-DOT: OpCapability DotProductKHR
89
; CHECK-DOT: OpCapability DotProductInput4x8BitPackedKHR
910
; CHECK-EXT: OpExtension "SPV_KHR_integer_dot_product"
1011

0 commit comments

Comments
 (0)