Skip to content

Commit 94cf48c

Browse files
KanclerzPiotrigcbot
authored andcommitted
Scalarize smin/smax/umin/umax llvm intrinsic calls for vector types
IGC now scalarizes vector intrinsic calls like llvm.smin, llvm.smax, llvm.umin, llvm.umax, for vector types eg. v4i8
1 parent 3fbae08 commit 94cf48c

File tree

5 files changed

+682
-44
lines changed

5 files changed

+682
-44
lines changed

IGC/Compiler/Optimizer/Scalarizer.cpp

Lines changed: 47 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*========================== begin_copyright_notice ============================
22
3-
Copyright (C) 2017-2024 Intel Corporation
3+
Copyright (C) 2017-2025 Intel Corporation
44
55
SPDX-License-Identifier: MIT
66
@@ -979,57 +979,63 @@ void ScalarizeFunction::visitShuffleVectorInst(ShuffleVectorInst& SI)
979979
m_removedInsts.insert(&SI);
980980
}
981981

982-
void ScalarizeFunction::visitCallInst(CallInst& CI)
982+
void ScalarizeFunction::ScalarizeIntrinsic(IntrinsicInst &II)
983983
{
984-
V_PRINT(scalarizer, "\t\tCall instruction\n");
985-
IGC_ASSERT_MESSAGE(&CI, "instruction type dynamic cast failed");
984+
auto* InstType = dyn_cast<IGCLLVM::FixedVectorType>(II.getType());
985+
if (!InstType) {
986+
recoverNonScalarizableInst(&II);
987+
return;
988+
}
986989

987-
Function* CalledFunc = CI.getCalledFunction();
988-
if (CalledFunc && CalledFunc->getName().startswith("llvm.fshl"))
989-
{
990-
V_PRINT(scalarizer, "\t\tScalarizing fshl intrinsic\n");
990+
SCMEntry* NewEntry = getSCMEntry(&II);
991991

992-
IGCLLVM::FixedVectorType* instType = dyn_cast<IGCLLVM::FixedVectorType>(CI.getType());
993-
if (!instType) {
994-
recoverNonScalarizableInst(&CI);
995-
return;
996-
}
992+
unsigned NumElements = int_cast<unsigned>(InstType->getNumElements());
993+
unsigned NumOperands = II.arg_size();
997994

998-
SCMEntry* newEntry = getSCMEntry(&CI);
995+
SmallVector<SmallVector<Value*, MAX_INPUT_VECTOR_WIDTH>, MAX_INTRINSIC_OPERANDS> Operands(NumOperands);
996+
SmallVector<bool, MAX_INTRINSIC_OPERANDS> IsOpConst(NumOperands);
999997

1000-
unsigned numElements = int_cast<unsigned>(instType->getNumElements());
998+
for(unsigned i = 0; i < NumOperands; i++)
999+
obtainScalarizedValues(Operands[i], &IsOpConst[i], II.getOperand(i), II);
10011000

1002-
SmallVector<Value*, MAX_INPUT_VECTOR_WIDTH> operand0;
1003-
SmallVector<Value*, MAX_INPUT_VECTOR_WIDTH> operand1;
1004-
SmallVector<Value*, MAX_INPUT_VECTOR_WIDTH> operand2;
1005-
bool op0IsConst, op1IsConst, op2IsConst;
1001+
SmallVector<Value*, MAX_INPUT_VECTOR_WIDTH> NewScalarizedInsts(NumElements);
1002+
for (unsigned i = 0; i < NumElements; i++)
1003+
{
1004+
Type* ScalarType = Operands[0][i]->getType();
10061005

1007-
obtainScalarizedValues(operand0, &op0IsConst, CI.getOperand(0), CI);
1008-
obtainScalarizedValues(operand1, &op1IsConst, CI.getOperand(1), CI);
1009-
obtainScalarizedValues(operand2, &op2IsConst, CI.getOperand(2), CI);
1006+
SmallVector<Value*, MAX_INTRINSIC_OPERANDS> ScalarOperands(NumOperands);
1007+
for(unsigned j = 0; j < NumOperands; j++)
1008+
ScalarOperands[j] = Operands[j][i];
10101009

1011-
SmallVector<Value*, MAX_INPUT_VECTOR_WIDTH> newScalarizedInsts;
1012-
newScalarizedInsts.resize(numElements);
1013-
for (unsigned i = 0; i < numElements; i++)
1014-
{
1015-
Type* scalarType = operand0[i]->getType();
1016-
CallInst* scalarFshl = CallInst::Create(
1017-
Intrinsic::getDeclaration(CI.getModule(), Intrinsic::fshl, { scalarType }),
1018-
{ operand0[i], operand1[i], operand2[i] },
1019-
CI.getName() + ".scalar",
1020-
&CI
1021-
);
1022-
scalarFshl->copyMetadata(CI);
1023-
newScalarizedInsts[i] = scalarFshl;
1024-
}
1010+
auto* ScalarIntr = CallInst::Create(
1011+
Intrinsic::getDeclaration(II.getModule(), II.getIntrinsicID(), { ScalarType }),
1012+
ScalarOperands,
1013+
II.getName() + ".scalar",
1014+
&II
1015+
);
1016+
ScalarIntr->copyMetadata(II);
1017+
NewScalarizedInsts[i] = ScalarIntr;
1018+
}
10251019

1026-
updateSCMEntryWithValues(newEntry, &(newScalarizedInsts[0]), &CI, true);
1020+
updateSCMEntryWithValues(NewEntry, &(NewScalarizedInsts[0]), &II, true);
10271021

1028-
m_removedInsts.insert(&CI);
1029-
}
1030-
else
1022+
m_removedInsts.insert(&II);
1023+
}
1024+
1025+
void ScalarizeFunction::visitIntrinsicInst(IntrinsicInst &II)
1026+
{
1027+
switch (II.getIntrinsicID())
10311028
{
1032-
recoverNonScalarizableInst(&CI);
1029+
case Intrinsic::fshl:
1030+
case Intrinsic::smin:
1031+
case Intrinsic::smax:
1032+
case Intrinsic::umin:
1033+
case Intrinsic::umax:
1034+
ScalarizeIntrinsic(II);
1035+
break;
1036+
default:
1037+
recoverNonScalarizableInst(&II);
1038+
break;
10331039
}
10341040
}
10351041

IGC/Compiler/Optimizer/Scalarizer.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*========================== begin_copyright_notice ============================
22
3-
Copyright (C) 2017-2023 Intel Corporation
3+
Copyright (C) 2017-2025 Intel Corporation
44
55
SPDX-License-Identifier: MIT
66
@@ -37,6 +37,9 @@ namespace IGC
3737
// Maximum width supported as input
3838
#define MAX_INPUT_VECTOR_WIDTH 16
3939

40+
// Maximum numbers of arguments in intrinsic call
41+
#define MAX_INTRINSIC_OPERANDS 4
42+
4043
// Define estimated amount of instructions in function
4144
#define ESTIMATED_INST_NUM 128
4245

@@ -94,8 +97,8 @@ namespace IGC
9497
void visitExtractElementInst(llvm::ExtractElementInst& SI);
9598
void visitInsertElementInst(llvm::InsertElementInst& II);
9699
void visitShuffleVectorInst(llvm::ShuffleVectorInst& SI);
97-
void visitCallInst(llvm::CallInst& CI);
98100
void visitGetElementPtrInst(llvm::GetElementPtrInst& GI);
101+
void visitIntrinsicInst(llvm::IntrinsicInst &II);
99102
void visitInstruction(llvm::Instruction& I);
100103

101104
private:
@@ -113,7 +116,8 @@ namespace IGC
113116
/// @param Inst instruction to work on
114117
void recoverNonScalarizableInst(llvm::Instruction* Inst);
115118

116-
119+
/// @brief scalarize Intrinsic Instruction based on numer of operands
120+
void ScalarizeIntrinsic(llvm::IntrinsicInst &II);
117121

118122
/*! \name Scalarizarion Utility Functions
119123
* \{ */

0 commit comments

Comments
 (0)