Skip to content

Commit d00187d

Browse files
wenju-hesys-ce-bb
authored andcommitted
Translate llvm.minimumnum/maximumnum intrinsics to OpenCL extended inst fmin/fmax (#3281)
The intrinsics were added in llvm/llvm-project@89881480 and their behavior matches with OpenCL fmin/fmax built-in. This PR fixes llvm-spirv error when compiling __builtin_elementwise_maximumnum for libclc spirv target. Original commit: KhronosGroup/SPIRV-LLVM-Translator@251cbb43efd82a3
1 parent de17ed2 commit d00187d

File tree

3 files changed

+36
-2
lines changed

3 files changed

+36
-2
lines changed

llvm-spirv/lib/SPIRV/SPIRVUtil.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1887,8 +1887,10 @@ bool checkTypeForSPIRVExtendedInstLowering(IntrinsicInst *II, SPIRVModule *BM) {
18871887
case Intrinsic::log:
18881888
case Intrinsic::log10:
18891889
case Intrinsic::log2:
1890+
case Intrinsic::maximumnum:
18901891
case Intrinsic::maximum:
18911892
case Intrinsic::maxnum:
1893+
case Intrinsic::minimumnum:
18921894
case Intrinsic::minimum:
18931895
case Intrinsic::minnum:
18941896
case Intrinsic::nearbyint:

llvm-spirv/lib/SPIRV/SPIRVWriter.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3937,10 +3937,12 @@ bool LLVMToSPIRVBase::isKnownIntrinsic(Intrinsic::ID Id) {
39373937
case Intrinsic::log:
39383938
case Intrinsic::log10:
39393939
case Intrinsic::log2:
3940+
case Intrinsic::maximumnum:
39403941
case Intrinsic::maximum:
39413942
case Intrinsic::maxnum:
39423943
case Intrinsic::smax:
39433944
case Intrinsic::umax:
3945+
case Intrinsic::minimumnum:
39443946
case Intrinsic::minimum:
39453947
case Intrinsic::minnum:
39463948
case Intrinsic::smin:
@@ -4079,12 +4081,12 @@ static SPIRVWord getBuiltinIdForIntrinsic(Intrinsic::ID IID) {
40794081
return OpenCLLIB::Log10;
40804082
case Intrinsic::log2:
40814083
return OpenCLLIB::Log2;
4084+
case Intrinsic::maximumnum:
40824085
case Intrinsic::maximum:
4083-
return OpenCLLIB::Fmax;
40844086
case Intrinsic::maxnum:
40854087
return OpenCLLIB::Fmax;
4088+
case Intrinsic::minimumnum:
40864089
case Intrinsic::minimum:
4087-
return OpenCLLIB::Fmin;
40884090
case Intrinsic::minnum:
40894091
return OpenCLLIB::Fmin;
40904092
case Intrinsic::nearbyint:
@@ -4359,8 +4361,10 @@ SPIRVValue *LLVMToSPIRVBase::transIntrinsicInst(IntrinsicInst *II,
43594361
case Intrinsic::copysign:
43604362
case Intrinsic::pow:
43614363
case Intrinsic::powi:
4364+
case Intrinsic::maximumnum:
43624365
case Intrinsic::maximum:
43634366
case Intrinsic::maxnum:
4367+
case Intrinsic::minimumnum:
43644368
case Intrinsic::minimum:
43654369
case Intrinsic::minnum: {
43664370
if (!checkTypeForSPIRVExtendedInstLowering(II, BM))

llvm-spirv/test/llvm-intrinsics/fp-intrinsics.ll

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,20 @@ entry:
228228

229229
declare float @llvm.minimum.f32(float, float)
230230

231+
; CHECK: Function
232+
; CHECK: FunctionParameter {{[0-9]+}} [[x:[0-9]+]]
233+
; CHECK: FunctionParameter {{[0-9]+}} [[y:[0-9]+]]
234+
; CHECK: ExtInst {{[0-9]+}} [[res:[0-9]+]] {{[0-9]+}} fmin [[x]] [[y]]
235+
; CHECK: ReturnValue [[res]]
236+
237+
define spir_func float @TestMinimumnum(float %x, float %y) {
238+
entry:
239+
%t = call float @llvm.minimumnum.f32(float %x, float %y)
240+
ret float %t
241+
}
242+
243+
declare float @llvm.minimumnum.f32(float, float)
244+
231245
; CHECK: Function
232246
; CHECK: FunctionParameter {{[0-9]+}} [[x:[0-9]+]]
233247
; CHECK: FunctionParameter {{[0-9]+}} [[y:[0-9]+]]
@@ -242,6 +256,20 @@ entry:
242256

243257
declare float @llvm.maximum.f32(float, float)
244258

259+
; CHECK: Function
260+
; CHECK: FunctionParameter {{[0-9]+}} [[x:[0-9]+]]
261+
; CHECK: FunctionParameter {{[0-9]+}} [[y:[0-9]+]]
262+
; CHECK: ExtInst {{[0-9]+}} [[res:[0-9]+]] {{[0-9]+}} fmax [[x]] [[y]]
263+
; CHECK: ReturnValue [[res]]
264+
265+
define spir_func float @TestMaximumnum(float %x, float %y) {
266+
entry:
267+
%t = call float @llvm.maximumnum.f32(float %x, float %y)
268+
ret float %t
269+
}
270+
271+
declare float @llvm.maximumnum.f32(float, float)
272+
245273
; CHECK: Function
246274
; CHECK: FunctionParameter {{[0-9]+}} [[x:[0-9]+]]
247275
; CHECK: FunctionParameter {{[0-9]+}} [[y:[0-9]+]]

0 commit comments

Comments
 (0)