Skip to content

Commit 7c5f3d2

Browse files
vmustyaigcbot
authored andcommitted
Optimize string comparison for SPIRV-friendly IR lowering in VC
.
1 parent 91de6a0 commit 7c5f3d2

File tree

1 file changed

+34
-22
lines changed

1 file changed

+34
-22
lines changed

IGC/VectorCompiler/lib/GenXOpts/CMTrans/GenXTranslateSPIRVBuiltins.cpp

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -116,27 +116,35 @@ Value *SPIRVExpander::visitCallInst(CallInst &CI) {
116116
auto *Ty = CI.getType();
117117
auto CalleeName = Callee->getName();
118118

119+
// Check if it's a SPIR-V function
120+
const StringRef Prefix("__spirv_");
121+
const auto PrefixPos = CalleeName.find(Prefix);
122+
if (PrefixPos == StringRef::npos)
123+
return nullptr;
124+
125+
CalleeName = CalleeName.drop_front(PrefixPos + Prefix.size());
126+
119127
// Addrspace-related builtins.
120-
if (CalleeName.contains("__spirv_GenericCastToPtrExplicit"))
128+
if (CalleeName.startswith("GenericCastToPtrExplicit"))
121129
return emitIntrinsic(Builder, vc::InternalIntrinsic::cast_to_ptr_explicit,
122130
Ty, {CI.getArgOperand(0)});
123131

124132
// SPV_INTEL_bfloat16_conversion extension.
125-
if (CalleeName.contains("__spirv_ConvertFToBF16INTEL")) {
133+
if (CalleeName.startswith("ConvertFToBF16INTEL")) {
126134
auto *Arg = CI.getArgOperand(0);
127135
auto *ArgTy = Arg->getType();
128136
return emitIntrinsic(Builder, vc::InternalIntrinsic::cast_to_bf16,
129137
{Ty, ArgTy}, {Arg});
130138
}
131-
if (CalleeName.contains("__spirv_ConvertBF16ToFINTEL")) {
139+
if (CalleeName.startswith("ConvertBF16ToFINTEL")) {
132140
auto *Arg = CI.getArgOperand(0);
133141
auto *ArgTy = Arg->getType();
134142
return emitIntrinsic(Builder, vc::InternalIntrinsic::cast_from_bf16,
135143
{Ty, ArgTy}, {Arg});
136144
}
137145
// SPV_INTEL_tensor_float32_rounding extension.
138-
if (CalleeName.contains("__spirv_RoundFToTF32INTEL") ||
139-
CalleeName.contains("__spirv_ConvertFToTF32INTEL")) {
146+
if (CalleeName.startswith("RoundFToTF32INTEL") ||
147+
CalleeName.startswith("ConvertFToTF32INTEL")) {
140148
auto *Arg = CI.getArgOperand(0);
141149
auto *ArgTy = Arg->getType();
142150
Type *ResTy = Builder.getInt32Ty();
@@ -148,68 +156,72 @@ Value *SPIRVExpander::visitCallInst(CallInst &CI) {
148156
return Builder.CreateBitCast(Intr, Ty);
149157
}
150158

151-
// Math builtins.
152-
if (!CalleeName.contains("__spirv_ocl_native_") &&
153-
!CalleeName.contains("__spirv_ocl_half_"))
159+
// OpenCL extended instruction set
160+
if (!CalleeName.consume_front("ocl_"))
161+
return nullptr;
162+
163+
// Native subset
164+
if (!CalleeName.consume_front("native_") &&
165+
!CalleeName.consume_front("half_"))
154166
return nullptr;
155167

156-
if (CalleeName.contains("cos"))
168+
if (CalleeName.startswith("cos"))
157169
return emitMathIntrinsic(Builder, Intrinsic::cos, Ty, {CI.getArgOperand(0)},
158170
true);
159-
if (CalleeName.contains("divide"))
171+
if (CalleeName.startswith("divide"))
160172
return emitFDiv(Builder, CI.getArgOperand(0), CI.getArgOperand(1), true);
161-
if (CalleeName.contains("exp2"))
173+
if (CalleeName.startswith("exp2"))
162174
return emitMathIntrinsic(Builder, Intrinsic::exp2, Ty,
163175
{CI.getArgOperand(0)}, true);
164-
if (CalleeName.contains("exp10")) {
176+
if (CalleeName.startswith("exp10")) {
165177
// exp10(x) == exp2(x * log2(10))
166178
auto *C = ConstantFP::get(Ty, Log2_10);
167179
auto *ArgV = Builder.CreateFMul(CI.getArgOperand(0), C);
168180
return emitMathIntrinsic(Builder, Intrinsic::exp2, Ty, {ArgV}, true);
169181
}
170-
if (CalleeName.contains("exp")) {
182+
if (CalleeName.startswith("exp")) {
171183
// exp(x) == exp2(x * log2(e))
172184
auto *C = ConstantFP::get(Ty, Log2E);
173185
auto *ArgV = Builder.CreateFMul(CI.getArgOperand(0), C);
174186
return emitMathIntrinsic(Builder, Intrinsic::exp2, Ty, {ArgV}, true);
175187
}
176-
if (CalleeName.contains("log2"))
188+
if (CalleeName.startswith("log2"))
177189
return emitMathIntrinsic(Builder, Intrinsic::log2, Ty,
178190
{CI.getArgOperand(0)}, true);
179-
if (CalleeName.contains("log10")) {
191+
if (CalleeName.startswith("log10")) {
180192
// log10(x) == log2(x) * log10(2)
181193
auto *LogV = emitMathIntrinsic(Builder, Intrinsic::log2, Ty,
182194
{CI.getArgOperand(0)}, true);
183195
auto *C = ConstantFP::get(Ty, Log10_2);
184196
return Builder.CreateFMul(LogV, C);
185197
}
186-
if (CalleeName.contains("log")) {
198+
if (CalleeName.startswith("log")) {
187199
// ln(x) == log2(x) * ln(2)
188200
auto *LogV = emitMathIntrinsic(Builder, Intrinsic::log2, Ty,
189201
{CI.getArgOperand(0)}, true);
190202
auto *C = ConstantFP::get(Ty, Ln2);
191203
return Builder.CreateFMul(LogV, C);
192204
}
193-
if (CalleeName.contains("powr"))
205+
if (CalleeName.startswith("powr"))
194206
return emitMathIntrinsic(Builder, Intrinsic::pow, Ty,
195207
{CI.getArgOperand(0), CI.getArgOperand(1)}, true);
196-
if (CalleeName.contains("recip")) {
208+
if (CalleeName.startswith("recip")) {
197209
auto *OneC = ConstantFP::get(Ty, 1.0);
198210
return emitFDiv(Builder, OneC, CI.getArgOperand(0), true);
199211
}
200-
if (CalleeName.contains("rsqrt")) {
212+
if (CalleeName.startswith("rsqrt")) {
201213
auto *OneC = ConstantFP::get(Ty, 1.0);
202214
auto *SqrtV = emitMathIntrinsic(Builder, Intrinsic::sqrt, Ty,
203215
{CI.getArgOperand(0)}, true);
204216
return emitFDiv(Builder, OneC, SqrtV, true);
205217
}
206-
if (CalleeName.contains("sin"))
218+
if (CalleeName.startswith("sin"))
207219
return emitMathIntrinsic(Builder, Intrinsic::sin, Ty, {CI.getArgOperand(0)},
208220
true);
209-
if (CalleeName.contains("sqrt"))
221+
if (CalleeName.startswith("sqrt"))
210222
return emitMathIntrinsic(Builder, Intrinsic::sqrt, Ty,
211223
{CI.getArgOperand(0)}, true);
212-
if (CalleeName.contains("tan")) {
224+
if (CalleeName.startswith("tan")) {
213225
// tan(x) == sin(x) / cos(x)
214226
auto *ArgV = CI.getArgOperand(0);
215227
auto *SinV = emitMathIntrinsic(Builder, Intrinsic::sin, Ty, {ArgV}, true);

0 commit comments

Comments
 (0)