Skip to content

Commit cd15d75

Browse files
esukhovigcbot
authored andcommitted
IGCVectorizer: exp2, maxnum supported and partial
vectorization functionality has been added under flag IGCVectorizer: exp2, maxnum support has been added under flag. partial vectorization functionality with different deletion strategies has been added under flag.
1 parent 60e270f commit cd15d75

File tree

8 files changed

+554
-55
lines changed

8 files changed

+554
-55
lines changed

IGC/Compiler/CISACodeGen/EmitVISAPass.cpp

Lines changed: 111 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2177,6 +2177,14 @@ void EmitPass::EmitAluIntrinsic(llvm::CallInst* I, const SSource source[2], cons
21772177
}
21782178
break;
21792179
}
2180+
case Intrinsic::exp2:
2181+
{
2182+
if (IGC_IS_FLAG_ENABLED(EnableVectorEmitter) && source[0].value->getType()->isVectorTy()) {
2183+
Exp2(source, modifier);
2184+
}
2185+
else EmitSimpleAlu(I, source, modifier);
2186+
break;
2187+
}
21802188
case Intrinsic::powi:
21812189
Powi(source, modifier);
21822190
break;
@@ -4488,22 +4496,6 @@ void EmitPass::BinaryUnary(llvm::Instruction* inst, const SSource source[2], con
44884496
}
44894497
}
44904498

4491-
void EmitPass::Sub(const SSource sources[2], const DstModifier& modifier)
4492-
{
4493-
CVariable* src0 = GetSrcVariable(sources[0]);
4494-
CVariable* src1 = GetSrcVariable(sources[1]);
4495-
e_modifier mod1 = CombineModifier(EMOD_NEG, sources[1].mod);
4496-
4497-
m_encoder->SetDstModifier(modifier);
4498-
SetSourceModifiers(0, sources[0]);
4499-
SetSourceModifiers(1, sources[1]);
4500-
// override modifier of source 1
4501-
m_encoder->SetSrcModifier(1, mod1);
4502-
m_encoder->Add(m_destination, src0, src1);
4503-
m_encoder->Push();
4504-
4505-
}
4506-
45074499
void EmitPass::Mul64(CVariable* dst, CVariable* src[2], SIMDMode simdMode, bool noMask) const
45084500
{
45094501

@@ -4732,6 +4724,68 @@ void EmitPass::FPTrunc(const SSource sources[2], const DstModifier& modifier) {
47324724
}
47334725
}
47344726

4727+
void EmitPass::Sub(const SSource sources[2], const DstModifier& modifier)
4728+
{
4729+
CVariable* src[2];
4730+
for (int i = 0; i < 2; ++i)
4731+
{
4732+
src[i] = GetSrcVariable(sources[i]);
4733+
}
4734+
e_modifier mod1 = CombineModifier(EMOD_NEG, sources[1].mod);
4735+
4736+
if (IGC_IS_FLAG_ENABLED(EnableVectorEmitter) &&
4737+
sources[0].value->getType()->isVectorTy() &&
4738+
sources[1].value->getType()->isVectorTy()) {
4739+
4740+
IGC_ASSERT_EXIT_MESSAGE(m_encoder->GetSimdSize() == lanesToSIMDMode(16), "As of now Vector Emission is only supported for SIMD16");
4741+
4742+
unsigned VectorSize = getVectorSize(sources[0].value);
4743+
4744+
bool AllUniform = src[0]->IsUniform() && src[1]->IsUniform() && m_destination->IsUniform();
4745+
4746+
if (IGC_IS_FLAG_ENABLED(VectorizerUniformValueVectorizationEnabled) && AllUniform && VectorSize <= 16) {
4747+
m_encoder->SetSrcModifier(1, mod1);
4748+
m_encoder->SetSrcRegion(0, 1, 1, 0);
4749+
m_encoder->SetSrcRegion(1, 1, 1, 0);
4750+
m_encoder->SetUniformSIMDSize(lanesToSIMDMode(VectorSize));
4751+
m_encoder->Add(m_destination, src[0], src[1]);
4752+
m_encoder->Push();
4753+
return;
4754+
}
4755+
4756+
for (unsigned i = 0; i < VectorSize; ++i) {
4757+
SetSourceModifiers(0, sources[0]);
4758+
SetSourceModifiers(1, sources[1]);
4759+
m_encoder->SetSrcModifier(1, mod1);
4760+
4761+
if (src[0]->IsUniform())
4762+
m_encoder->SetSrcSubReg(0, i);
4763+
else
4764+
m_encoder->SetSrcSubVar(0, i);
4765+
if (src[1]->IsUniform())
4766+
m_encoder->SetSrcSubReg(1, i);
4767+
else
4768+
m_encoder->SetSrcSubVar(1, i);
4769+
4770+
if (src[0]->IsUniform() && src[1]->IsUniform()) m_encoder->SetDstSubReg(i);
4771+
else m_encoder->SetDstSubVar(i);
4772+
4773+
m_encoder->Add(m_destination, src[0], src[1]);
4774+
m_encoder->Push();
4775+
}
4776+
return;
4777+
}
4778+
4779+
m_encoder->SetDstModifier(modifier);
4780+
SetSourceModifiers(0, sources[0]);
4781+
SetSourceModifiers(1, sources[1]);
4782+
// override modifier of source 1
4783+
m_encoder->SetSrcModifier(1, mod1);
4784+
m_encoder->Add(m_destination, src[0], src[1]);
4785+
m_encoder->Push();
4786+
}
4787+
4788+
47354789
void EmitPass::Add(const SSource sources[2], const DstModifier& modifier)
47364790
{
47374791
CVariable* src[2];
@@ -4874,7 +4928,6 @@ void EmitPass::Div(const SSource sources[2], const DstModifier& modifier)
48744928
sources[0].value->getType()->isVectorTy() &&
48754929
sources[1].value->getType()->isVectorTy()) {
48764930

4877-
llvm::errs() << numLanes(m_encoder->GetSimdSize()) << "\n";
48784931
IGC_ASSERT_EXIT_MESSAGE(numLanes(m_encoder->GetSimdSize()) == 16, "As of now Vector Emission is only supported for SIMD16");
48794932
unsigned VectorSize = getVectorSize(sources[0].value);
48804933

@@ -4907,7 +4960,8 @@ void EmitPass::Inv(const SSource sources[2], const DstModifier& modifier) {
49074960
unsigned VectorSize = getVectorSize(sources[0].value);
49084961

49094962
CVariable* src[1];
4910-
// sources[0] got used to check that it contains all 1
4963+
// sources[0] was used to check that it contains all 1
4964+
// that's why we are in INV
49114965
src[0] = GetSrcVariable(sources[1]);
49124966

49134967
for (unsigned i = 0; i < VectorSize; ++i) {
@@ -4928,6 +4982,45 @@ void EmitPass::Inv(const SSource sources[2], const DstModifier& modifier) {
49284982
return;
49294983
}
49304984

4985+
void EmitPass::Exp2(const SSource sources[2], const DstModifier& modifier) {
4986+
4987+
if (IGC_IS_FLAG_ENABLED(EnableVectorEmitter) &&
4988+
sources[0].value->getType()->isVectorTy()) {
4989+
4990+
IGC_ASSERT_EXIT_MESSAGE(m_encoder->GetSimdSize() == lanesToSIMDMode(16), "As of now Vector Emission is only supported for SIMD16");
4991+
4992+
unsigned VectorSize = getVectorSize(sources[0].value);
4993+
4994+
CVariable* src[1];
4995+
src[0] = GetSrcVariable(sources[0]);
4996+
bool AllUniform = src[0]->IsUniform() && m_destination->IsUniform();
4997+
4998+
if (IGC_IS_FLAG_ENABLED(VectorizerUniformValueVectorizationEnabled) && AllUniform && VectorSize <= 16) {
4999+
m_encoder->SetSrcRegion(0, 1, 1, 0);
5000+
m_encoder->SetUniformSIMDSize(lanesToSIMDMode(VectorSize));
5001+
m_encoder->Exp(m_destination, src[0]);
5002+
m_encoder->Push();
5003+
return;
5004+
}
5005+
5006+
for (unsigned i = 0; i < VectorSize; ++i) {
5007+
SetSourceModifiers(0, sources[0]);
5008+
5009+
if (AllUniform) {
5010+
m_encoder->SetSrcSubReg(0, i);
5011+
m_encoder->SetDstSubReg(i);
5012+
}
5013+
else {
5014+
m_encoder->SetSrcSubVar(0, i);
5015+
m_encoder->SetDstSubVar(i);
5016+
}
5017+
m_encoder->Exp(m_destination, src[0]);
5018+
m_encoder->Push();
5019+
}
5020+
}
5021+
return;
5022+
}
5023+
49315024

49325025
void EmitPass::VectorMad(const SSource sources[3], const DstModifier& modifier) {
49335026

IGC/Compiler/CISACodeGen/EmitVISAPass.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ class EmitPass : public llvm::FunctionPass
104104
void Mul(const SSource[2], const DstModifier& modifier);
105105
void Div(const SSource[2], const DstModifier& modifier);
106106
void Inv(const SSource[2], const DstModifier& modifier);
107+
void Exp2(const SSource[2], const DstModifier& modifier);
107108
void Add(const SSource[2], const DstModifier& modifier);
108109
void FPTrunc(const SSource[2], const DstModifier& modifier);
109110
void Powi(const SSource[2], const DstModifier& modifier);

0 commit comments

Comments
 (0)