Skip to content

Commit e5717fb

Browse files
authored
[clang][wasm] Replace the target iminmax intrinsics with the equivalent generic __builtin_elementwise_min/max intrinsics (#109259)
Noticed while working on #109160
1 parent af4dcbb commit e5717fb

File tree

4 files changed

+12
-138
lines changed

4 files changed

+12
-138
lines changed

clang/include/clang/Basic/BuiltinsWebAssembly.def

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -83,19 +83,6 @@ TARGET_BUILTIN(__builtin_wasm_abs_i16x8, "V8sV8s", "nc", "simd128")
8383
TARGET_BUILTIN(__builtin_wasm_abs_i32x4, "V4iV4i", "nc", "simd128")
8484
TARGET_BUILTIN(__builtin_wasm_abs_i64x2, "V2LLiV2LLi", "nc", "simd128")
8585

86-
TARGET_BUILTIN(__builtin_wasm_min_s_i8x16, "V16ScV16ScV16Sc", "nc", "simd128")
87-
TARGET_BUILTIN(__builtin_wasm_min_u_i8x16, "V16UcV16UcV16Uc", "nc", "simd128")
88-
TARGET_BUILTIN(__builtin_wasm_max_s_i8x16, "V16ScV16ScV16Sc", "nc", "simd128")
89-
TARGET_BUILTIN(__builtin_wasm_max_u_i8x16, "V16UcV16UcV16Uc", "nc", "simd128")
90-
TARGET_BUILTIN(__builtin_wasm_min_s_i16x8, "V8sV8sV8s", "nc", "simd128")
91-
TARGET_BUILTIN(__builtin_wasm_min_u_i16x8, "V8UsV8UsV8Us", "nc", "simd128")
92-
TARGET_BUILTIN(__builtin_wasm_max_s_i16x8, "V8sV8sV8s", "nc", "simd128")
93-
TARGET_BUILTIN(__builtin_wasm_max_u_i16x8, "V8UsV8UsV8Us", "nc", "simd128")
94-
TARGET_BUILTIN(__builtin_wasm_min_s_i32x4, "V4iV4iV4i", "nc", "simd128")
95-
TARGET_BUILTIN(__builtin_wasm_min_u_i32x4, "V4UiV4UiV4Ui", "nc", "simd128")
96-
TARGET_BUILTIN(__builtin_wasm_max_s_i32x4, "V4iV4iV4i", "nc", "simd128")
97-
TARGET_BUILTIN(__builtin_wasm_max_u_i32x4, "V4UiV4UiV4Ui", "nc", "simd128")
98-
9986
TARGET_BUILTIN(__builtin_wasm_avgr_u_i8x16, "V16UcV16UcV16Uc", "nc", "simd128")
10087
TARGET_BUILTIN(__builtin_wasm_avgr_u_i16x8, "V8UsV8UsV8Us", "nc", "simd128")
10188

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -21487,47 +21487,6 @@ Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID,
2148721487
Value *ICmp = Builder.CreateICmpSLT(Vec, Zero, "abscond");
2148821488
return Builder.CreateSelect(ICmp, Neg, Vec, "abs");
2148921489
}
21490-
case WebAssembly::BI__builtin_wasm_min_s_i8x16:
21491-
case WebAssembly::BI__builtin_wasm_min_u_i8x16:
21492-
case WebAssembly::BI__builtin_wasm_max_s_i8x16:
21493-
case WebAssembly::BI__builtin_wasm_max_u_i8x16:
21494-
case WebAssembly::BI__builtin_wasm_min_s_i16x8:
21495-
case WebAssembly::BI__builtin_wasm_min_u_i16x8:
21496-
case WebAssembly::BI__builtin_wasm_max_s_i16x8:
21497-
case WebAssembly::BI__builtin_wasm_max_u_i16x8:
21498-
case WebAssembly::BI__builtin_wasm_min_s_i32x4:
21499-
case WebAssembly::BI__builtin_wasm_min_u_i32x4:
21500-
case WebAssembly::BI__builtin_wasm_max_s_i32x4:
21501-
case WebAssembly::BI__builtin_wasm_max_u_i32x4: {
21502-
Value *LHS = EmitScalarExpr(E->getArg(0));
21503-
Value *RHS = EmitScalarExpr(E->getArg(1));
21504-
Value *ICmp;
21505-
switch (BuiltinID) {
21506-
case WebAssembly::BI__builtin_wasm_min_s_i8x16:
21507-
case WebAssembly::BI__builtin_wasm_min_s_i16x8:
21508-
case WebAssembly::BI__builtin_wasm_min_s_i32x4:
21509-
ICmp = Builder.CreateICmpSLT(LHS, RHS);
21510-
break;
21511-
case WebAssembly::BI__builtin_wasm_min_u_i8x16:
21512-
case WebAssembly::BI__builtin_wasm_min_u_i16x8:
21513-
case WebAssembly::BI__builtin_wasm_min_u_i32x4:
21514-
ICmp = Builder.CreateICmpULT(LHS, RHS);
21515-
break;
21516-
case WebAssembly::BI__builtin_wasm_max_s_i8x16:
21517-
case WebAssembly::BI__builtin_wasm_max_s_i16x8:
21518-
case WebAssembly::BI__builtin_wasm_max_s_i32x4:
21519-
ICmp = Builder.CreateICmpSGT(LHS, RHS);
21520-
break;
21521-
case WebAssembly::BI__builtin_wasm_max_u_i8x16:
21522-
case WebAssembly::BI__builtin_wasm_max_u_i16x8:
21523-
case WebAssembly::BI__builtin_wasm_max_u_i32x4:
21524-
ICmp = Builder.CreateICmpUGT(LHS, RHS);
21525-
break;
21526-
default:
21527-
llvm_unreachable("unexpected builtin ID");
21528-
}
21529-
return Builder.CreateSelect(ICmp, LHS, RHS);
21530-
}
2153121490
case WebAssembly::BI__builtin_wasm_avgr_u_i8x16:
2153221491
case WebAssembly::BI__builtin_wasm_avgr_u_i16x8: {
2153321492
Value *LHS = EmitScalarExpr(E->getArg(0));

clang/lib/Headers/wasm_simd128.h

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,22 +1007,22 @@ static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u8x16_sub_sat(v128_t __a,
10071007

10081008
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i8x16_min(v128_t __a,
10091009
v128_t __b) {
1010-
return (v128_t)__builtin_wasm_min_s_i8x16((__i8x16)__a, (__i8x16)__b);
1010+
return (v128_t)__builtin_elementwise_min((__i8x16)__a, (__i8x16)__b);
10111011
}
10121012

10131013
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u8x16_min(v128_t __a,
10141014
v128_t __b) {
1015-
return (v128_t)__builtin_wasm_min_u_i8x16((__u8x16)__a, (__u8x16)__b);
1015+
return (v128_t)__builtin_elementwise_min((__u8x16)__a, (__u8x16)__b);
10161016
}
10171017

10181018
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i8x16_max(v128_t __a,
10191019
v128_t __b) {
1020-
return (v128_t)__builtin_wasm_max_s_i8x16((__i8x16)__a, (__i8x16)__b);
1020+
return (v128_t)__builtin_elementwise_max((__i8x16)__a, (__i8x16)__b);
10211021
}
10221022

10231023
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u8x16_max(v128_t __a,
10241024
v128_t __b) {
1025-
return (v128_t)__builtin_wasm_max_u_i8x16((__u8x16)__a, (__u8x16)__b);
1025+
return (v128_t)__builtin_elementwise_max((__u8x16)__a, (__u8x16)__b);
10261026
}
10271027

10281028
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u8x16_avgr(v128_t __a,
@@ -1098,22 +1098,22 @@ static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i16x8_mul(v128_t __a,
10981098

10991099
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i16x8_min(v128_t __a,
11001100
v128_t __b) {
1101-
return (v128_t)__builtin_wasm_min_s_i16x8((__i16x8)__a, (__i16x8)__b);
1101+
return (v128_t)__builtin_elementwise_min((__i16x8)__a, (__i16x8)__b);
11021102
}
11031103

11041104
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u16x8_min(v128_t __a,
11051105
v128_t __b) {
1106-
return (v128_t)__builtin_wasm_min_u_i16x8((__u16x8)__a, (__u16x8)__b);
1106+
return (v128_t)__builtin_elementwise_min((__u16x8)__a, (__u16x8)__b);
11071107
}
11081108

11091109
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i16x8_max(v128_t __a,
11101110
v128_t __b) {
1111-
return (v128_t)__builtin_wasm_max_s_i16x8((__i16x8)__a, (__i16x8)__b);
1111+
return (v128_t)__builtin_elementwise_max((__i16x8)__a, (__i16x8)__b);
11121112
}
11131113

11141114
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u16x8_max(v128_t __a,
11151115
v128_t __b) {
1116-
return (v128_t)__builtin_wasm_max_u_i16x8((__u16x8)__a, (__u16x8)__b);
1116+
return (v128_t)__builtin_elementwise_max((__u16x8)__a, (__u16x8)__b);
11171117
}
11181118

11191119
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u16x8_avgr(v128_t __a,
@@ -1169,22 +1169,22 @@ static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i32x4_mul(v128_t __a,
11691169

11701170
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i32x4_min(v128_t __a,
11711171
v128_t __b) {
1172-
return (v128_t)__builtin_wasm_min_s_i32x4((__i32x4)__a, (__i32x4)__b);
1172+
return (v128_t)__builtin_elementwise_min((__i32x4)__a, (__i32x4)__b);
11731173
}
11741174

11751175
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u32x4_min(v128_t __a,
11761176
v128_t __b) {
1177-
return (v128_t)__builtin_wasm_min_u_i32x4((__u32x4)__a, (__u32x4)__b);
1177+
return (v128_t)__builtin_elementwise_min((__u32x4)__a, (__u32x4)__b);
11781178
}
11791179

11801180
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i32x4_max(v128_t __a,
11811181
v128_t __b) {
1182-
return (v128_t)__builtin_wasm_max_s_i32x4((__i32x4)__a, (__i32x4)__b);
1182+
return (v128_t)__builtin_elementwise_max((__i32x4)__a, (__i32x4)__b);
11831183
}
11841184

11851185
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u32x4_max(v128_t __a,
11861186
v128_t __b) {
1187-
return (v128_t)__builtin_wasm_max_u_i32x4((__u32x4)__a, (__u32x4)__b);
1187+
return (v128_t)__builtin_elementwise_max((__u32x4)__a, (__u32x4)__b);
11881188
}
11891189

11901190
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i32x4_dot_i16x8(v128_t __a,

clang/test/CodeGen/builtins-wasm.c

Lines changed: 0 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -257,78 +257,6 @@ i64x2 abs_i64x2(i64x2 v) {
257257
// WEBASSEMBLY-NEXT: ret
258258
}
259259

260-
i8x16 min_s_i8x16(i8x16 x, i8x16 y) {
261-
return __builtin_wasm_min_s_i8x16(x, y);
262-
// WEBASSEMBLY: call <16 x i8> @llvm.smin.v16i8(<16 x i8> %x, <16 x i8> %y)
263-
// WEBASSEMBLY-NEXT: ret
264-
}
265-
266-
u8x16 min_u_i8x16(u8x16 x, u8x16 y) {
267-
return __builtin_wasm_min_u_i8x16(x, y);
268-
// WEBASSEMBLY: call <16 x i8> @llvm.umin.v16i8(<16 x i8> %x, <16 x i8> %y)
269-
// WEBASSEMBLY-NEXT: ret
270-
}
271-
272-
i8x16 max_s_i8x16(i8x16 x, i8x16 y) {
273-
return __builtin_wasm_max_s_i8x16(x, y);
274-
// WEBASSEMBLY: call <16 x i8> @llvm.smax.v16i8(<16 x i8> %x, <16 x i8> %y)
275-
// WEBASSEMBLY-NEXT: ret
276-
}
277-
278-
u8x16 max_u_i8x16(u8x16 x, u8x16 y) {
279-
return __builtin_wasm_max_u_i8x16(x, y);
280-
// WEBASSEMBLY: call <16 x i8> @llvm.umax.v16i8(<16 x i8> %x, <16 x i8> %y)
281-
// WEBASSEMBLY-NEXT: ret
282-
}
283-
284-
i16x8 min_s_i16x8(i16x8 x, i16x8 y) {
285-
return __builtin_wasm_min_s_i16x8(x, y);
286-
// WEBASSEMBLY: call <8 x i16> @llvm.smin.v8i16(<8 x i16> %x, <8 x i16> %y)
287-
// WEBASSEMBLY-NEXT: ret
288-
}
289-
290-
u16x8 min_u_i16x8(u16x8 x, u16x8 y) {
291-
return __builtin_wasm_min_u_i16x8(x, y);
292-
// WEBASSEMBLY: call <8 x i16> @llvm.umin.v8i16(<8 x i16> %x, <8 x i16> %y)
293-
// WEBASSEMBLY-NEXT: ret
294-
}
295-
296-
i16x8 max_s_i16x8(i16x8 x, i16x8 y) {
297-
return __builtin_wasm_max_s_i16x8(x, y);
298-
// WEBASSEMBLY: call <8 x i16> @llvm.smax.v8i16(<8 x i16> %x, <8 x i16> %y)
299-
// WEBASSEMBLY-NEXT: ret
300-
}
301-
302-
u16x8 max_u_i16x8(u16x8 x, u16x8 y) {
303-
return __builtin_wasm_max_u_i16x8(x, y);
304-
// WEBASSEMBLY: call <8 x i16> @llvm.umax.v8i16(<8 x i16> %x, <8 x i16> %y)
305-
// WEBASSEMBLY-NEXT: ret
306-
}
307-
308-
i32x4 min_s_i32x4(i32x4 x, i32x4 y) {
309-
return __builtin_wasm_min_s_i32x4(x, y);
310-
// WEBASSEMBLY: call <4 x i32> @llvm.smin.v4i32(<4 x i32> %x, <4 x i32> %y)
311-
// WEBASSEMBLY-NEXT: ret
312-
}
313-
314-
u32x4 min_u_i32x4(u32x4 x, u32x4 y) {
315-
return __builtin_wasm_min_u_i32x4(x, y);
316-
// WEBASSEMBLY: call <4 x i32> @llvm.umin.v4i32(<4 x i32> %x, <4 x i32> %y)
317-
// WEBASSEMBLY-NEXT: ret
318-
}
319-
320-
i32x4 max_s_i32x4(i32x4 x, i32x4 y) {
321-
return __builtin_wasm_max_s_i32x4(x, y);
322-
// WEBASSEMBLY: call <4 x i32> @llvm.smax.v4i32(<4 x i32> %x, <4 x i32> %y)
323-
// WEBASSEMBLY-NEXT: ret
324-
}
325-
326-
u32x4 max_u_i32x4(u32x4 x, u32x4 y) {
327-
return __builtin_wasm_max_u_i32x4(x, y);
328-
// WEBASSEMBLY: call <4 x i32> @llvm.umax.v4i32(<4 x i32> %x, <4 x i32> %y)
329-
// WEBASSEMBLY-NEXT: ret
330-
}
331-
332260
i16x8 sub_sat_s_i16x8(i16x8 x, i16x8 y) {
333261
return __builtin_wasm_sub_sat_s_i16x8(x, y);
334262
// WEBASSEMBLY: call <8 x i16> @llvm.wasm.sub.sat.signed.v8i16(

0 commit comments

Comments
 (0)