-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[clang][wasm] Replace the target iminmax intrinsics with the equivalent generic __builtin_elementwise_min/max
intrinsics
#109259
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
…nt generic `__builtin_elementwise_min/max` intrinsics
@llvm/pr-subscribers-backend-x86 @llvm/pr-subscribers-backend-webassembly Author: Simon Pilgrim (RKSimon) ChangesNoticed while working on #109160 Full diff: https://github.com/llvm/llvm-project/pull/109259.diff 4 Files Affected:
diff --git a/clang/include/clang/Basic/BuiltinsWebAssembly.def b/clang/include/clang/Basic/BuiltinsWebAssembly.def
index ad73f031922a0b..26c93c90799305 100644
--- a/clang/include/clang/Basic/BuiltinsWebAssembly.def
+++ b/clang/include/clang/Basic/BuiltinsWebAssembly.def
@@ -83,19 +83,6 @@ TARGET_BUILTIN(__builtin_wasm_abs_i16x8, "V8sV8s", "nc", "simd128")
TARGET_BUILTIN(__builtin_wasm_abs_i32x4, "V4iV4i", "nc", "simd128")
TARGET_BUILTIN(__builtin_wasm_abs_i64x2, "V2LLiV2LLi", "nc", "simd128")
-TARGET_BUILTIN(__builtin_wasm_min_s_i8x16, "V16ScV16ScV16Sc", "nc", "simd128")
-TARGET_BUILTIN(__builtin_wasm_min_u_i8x16, "V16UcV16UcV16Uc", "nc", "simd128")
-TARGET_BUILTIN(__builtin_wasm_max_s_i8x16, "V16ScV16ScV16Sc", "nc", "simd128")
-TARGET_BUILTIN(__builtin_wasm_max_u_i8x16, "V16UcV16UcV16Uc", "nc", "simd128")
-TARGET_BUILTIN(__builtin_wasm_min_s_i16x8, "V8sV8sV8s", "nc", "simd128")
-TARGET_BUILTIN(__builtin_wasm_min_u_i16x8, "V8UsV8UsV8Us", "nc", "simd128")
-TARGET_BUILTIN(__builtin_wasm_max_s_i16x8, "V8sV8sV8s", "nc", "simd128")
-TARGET_BUILTIN(__builtin_wasm_max_u_i16x8, "V8UsV8UsV8Us", "nc", "simd128")
-TARGET_BUILTIN(__builtin_wasm_min_s_i32x4, "V4iV4iV4i", "nc", "simd128")
-TARGET_BUILTIN(__builtin_wasm_min_u_i32x4, "V4UiV4UiV4Ui", "nc", "simd128")
-TARGET_BUILTIN(__builtin_wasm_max_s_i32x4, "V4iV4iV4i", "nc", "simd128")
-TARGET_BUILTIN(__builtin_wasm_max_u_i32x4, "V4UiV4UiV4Ui", "nc", "simd128")
-
TARGET_BUILTIN(__builtin_wasm_avgr_u_i8x16, "V16UcV16UcV16Uc", "nc", "simd128")
TARGET_BUILTIN(__builtin_wasm_avgr_u_i16x8, "V8UsV8UsV8Us", "nc", "simd128")
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 7e18aafcdd4b8a..2b80de49ec93e9 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -21522,47 +21522,6 @@ Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID,
Value *ICmp = Builder.CreateICmpSLT(Vec, Zero, "abscond");
return Builder.CreateSelect(ICmp, Neg, Vec, "abs");
}
- case WebAssembly::BI__builtin_wasm_min_s_i8x16:
- case WebAssembly::BI__builtin_wasm_min_u_i8x16:
- case WebAssembly::BI__builtin_wasm_max_s_i8x16:
- case WebAssembly::BI__builtin_wasm_max_u_i8x16:
- case WebAssembly::BI__builtin_wasm_min_s_i16x8:
- case WebAssembly::BI__builtin_wasm_min_u_i16x8:
- case WebAssembly::BI__builtin_wasm_max_s_i16x8:
- case WebAssembly::BI__builtin_wasm_max_u_i16x8:
- case WebAssembly::BI__builtin_wasm_min_s_i32x4:
- case WebAssembly::BI__builtin_wasm_min_u_i32x4:
- case WebAssembly::BI__builtin_wasm_max_s_i32x4:
- case WebAssembly::BI__builtin_wasm_max_u_i32x4: {
- Value *LHS = EmitScalarExpr(E->getArg(0));
- Value *RHS = EmitScalarExpr(E->getArg(1));
- Value *ICmp;
- switch (BuiltinID) {
- case WebAssembly::BI__builtin_wasm_min_s_i8x16:
- case WebAssembly::BI__builtin_wasm_min_s_i16x8:
- case WebAssembly::BI__builtin_wasm_min_s_i32x4:
- ICmp = Builder.CreateICmpSLT(LHS, RHS);
- break;
- case WebAssembly::BI__builtin_wasm_min_u_i8x16:
- case WebAssembly::BI__builtin_wasm_min_u_i16x8:
- case WebAssembly::BI__builtin_wasm_min_u_i32x4:
- ICmp = Builder.CreateICmpULT(LHS, RHS);
- break;
- case WebAssembly::BI__builtin_wasm_max_s_i8x16:
- case WebAssembly::BI__builtin_wasm_max_s_i16x8:
- case WebAssembly::BI__builtin_wasm_max_s_i32x4:
- ICmp = Builder.CreateICmpSGT(LHS, RHS);
- break;
- case WebAssembly::BI__builtin_wasm_max_u_i8x16:
- case WebAssembly::BI__builtin_wasm_max_u_i16x8:
- case WebAssembly::BI__builtin_wasm_max_u_i32x4:
- ICmp = Builder.CreateICmpUGT(LHS, RHS);
- break;
- default:
- llvm_unreachable("unexpected builtin ID");
- }
- return Builder.CreateSelect(ICmp, LHS, RHS);
- }
case WebAssembly::BI__builtin_wasm_avgr_u_i8x16:
case WebAssembly::BI__builtin_wasm_avgr_u_i16x8: {
Value *LHS = EmitScalarExpr(E->getArg(0));
diff --git a/clang/lib/Headers/wasm_simd128.h b/clang/lib/Headers/wasm_simd128.h
index 14e36e85da8efa..5050f01d6fc33d 100644
--- a/clang/lib/Headers/wasm_simd128.h
+++ b/clang/lib/Headers/wasm_simd128.h
@@ -1007,22 +1007,22 @@ static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u8x16_sub_sat(v128_t __a,
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i8x16_min(v128_t __a,
v128_t __b) {
- return (v128_t)__builtin_wasm_min_s_i8x16((__i8x16)__a, (__i8x16)__b);
+ return (v128_t)__builtin_elementwise_min((__i8x16)__a, (__i8x16)__b);
}
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u8x16_min(v128_t __a,
v128_t __b) {
- return (v128_t)__builtin_wasm_min_u_i8x16((__u8x16)__a, (__u8x16)__b);
+ return (v128_t)__builtin_elementwise_min((__u8x16)__a, (__u8x16)__b);
}
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i8x16_max(v128_t __a,
v128_t __b) {
- return (v128_t)__builtin_wasm_max_s_i8x16((__i8x16)__a, (__i8x16)__b);
+ return (v128_t)__builtin_elementwise_max((__i8x16)__a, (__i8x16)__b);
}
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u8x16_max(v128_t __a,
v128_t __b) {
- return (v128_t)__builtin_wasm_max_u_i8x16((__u8x16)__a, (__u8x16)__b);
+ return (v128_t)__builtin_elementwise_max((__u8x16)__a, (__u8x16)__b);
}
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,
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i16x8_min(v128_t __a,
v128_t __b) {
- return (v128_t)__builtin_wasm_min_s_i16x8((__i16x8)__a, (__i16x8)__b);
+ return (v128_t)__builtin_elementwise_min((__i16x8)__a, (__i16x8)__b);
}
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u16x8_min(v128_t __a,
v128_t __b) {
- return (v128_t)__builtin_wasm_min_u_i16x8((__u16x8)__a, (__u16x8)__b);
+ return (v128_t)__builtin_elementwise_min((__u16x8)__a, (__u16x8)__b);
}
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i16x8_max(v128_t __a,
v128_t __b) {
- return (v128_t)__builtin_wasm_max_s_i16x8((__i16x8)__a, (__i16x8)__b);
+ return (v128_t)__builtin_elementwise_max((__i16x8)__a, (__i16x8)__b);
}
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u16x8_max(v128_t __a,
v128_t __b) {
- return (v128_t)__builtin_wasm_max_u_i16x8((__u16x8)__a, (__u16x8)__b);
+ return (v128_t)__builtin_elementwise_max((__u16x8)__a, (__u16x8)__b);
}
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,
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i32x4_min(v128_t __a,
v128_t __b) {
- return (v128_t)__builtin_wasm_min_s_i32x4((__i32x4)__a, (__i32x4)__b);
+ return (v128_t)__builtin_elementwise_min((__i32x4)__a, (__i32x4)__b);
}
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u32x4_min(v128_t __a,
v128_t __b) {
- return (v128_t)__builtin_wasm_min_u_i32x4((__u32x4)__a, (__u32x4)__b);
+ return (v128_t)__builtin_elementwise_min((__u32x4)__a, (__u32x4)__b);
}
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i32x4_max(v128_t __a,
v128_t __b) {
- return (v128_t)__builtin_wasm_max_s_i32x4((__i32x4)__a, (__i32x4)__b);
+ return (v128_t)__builtin_elementwise_max((__i32x4)__a, (__i32x4)__b);
}
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u32x4_max(v128_t __a,
v128_t __b) {
- return (v128_t)__builtin_wasm_max_u_i32x4((__u32x4)__a, (__u32x4)__b);
+ return (v128_t)__builtin_elementwise_max((__u32x4)__a, (__u32x4)__b);
}
static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i32x4_dot_i16x8(v128_t __a,
diff --git a/clang/test/CodeGen/builtins-wasm.c b/clang/test/CodeGen/builtins-wasm.c
index 8943a92faad044..48c6d3cb626305 100644
--- a/clang/test/CodeGen/builtins-wasm.c
+++ b/clang/test/CodeGen/builtins-wasm.c
@@ -257,78 +257,6 @@ i64x2 abs_i64x2(i64x2 v) {
// WEBASSEMBLY-NEXT: ret
}
-i8x16 min_s_i8x16(i8x16 x, i8x16 y) {
- return __builtin_wasm_min_s_i8x16(x, y);
- // WEBASSEMBLY: call <16 x i8> @llvm.smin.v16i8(<16 x i8> %x, <16 x i8> %y)
- // WEBASSEMBLY-NEXT: ret
-}
-
-u8x16 min_u_i8x16(u8x16 x, u8x16 y) {
- return __builtin_wasm_min_u_i8x16(x, y);
- // WEBASSEMBLY: call <16 x i8> @llvm.umin.v16i8(<16 x i8> %x, <16 x i8> %y)
- // WEBASSEMBLY-NEXT: ret
-}
-
-i8x16 max_s_i8x16(i8x16 x, i8x16 y) {
- return __builtin_wasm_max_s_i8x16(x, y);
- // WEBASSEMBLY: call <16 x i8> @llvm.smax.v16i8(<16 x i8> %x, <16 x i8> %y)
- // WEBASSEMBLY-NEXT: ret
-}
-
-u8x16 max_u_i8x16(u8x16 x, u8x16 y) {
- return __builtin_wasm_max_u_i8x16(x, y);
- // WEBASSEMBLY: call <16 x i8> @llvm.umax.v16i8(<16 x i8> %x, <16 x i8> %y)
- // WEBASSEMBLY-NEXT: ret
-}
-
-i16x8 min_s_i16x8(i16x8 x, i16x8 y) {
- return __builtin_wasm_min_s_i16x8(x, y);
- // WEBASSEMBLY: call <8 x i16> @llvm.smin.v8i16(<8 x i16> %x, <8 x i16> %y)
- // WEBASSEMBLY-NEXT: ret
-}
-
-u16x8 min_u_i16x8(u16x8 x, u16x8 y) {
- return __builtin_wasm_min_u_i16x8(x, y);
- // WEBASSEMBLY: call <8 x i16> @llvm.umin.v8i16(<8 x i16> %x, <8 x i16> %y)
- // WEBASSEMBLY-NEXT: ret
-}
-
-i16x8 max_s_i16x8(i16x8 x, i16x8 y) {
- return __builtin_wasm_max_s_i16x8(x, y);
- // WEBASSEMBLY: call <8 x i16> @llvm.smax.v8i16(<8 x i16> %x, <8 x i16> %y)
- // WEBASSEMBLY-NEXT: ret
-}
-
-u16x8 max_u_i16x8(u16x8 x, u16x8 y) {
- return __builtin_wasm_max_u_i16x8(x, y);
- // WEBASSEMBLY: call <8 x i16> @llvm.umax.v8i16(<8 x i16> %x, <8 x i16> %y)
- // WEBASSEMBLY-NEXT: ret
-}
-
-i32x4 min_s_i32x4(i32x4 x, i32x4 y) {
- return __builtin_wasm_min_s_i32x4(x, y);
- // WEBASSEMBLY: call <4 x i32> @llvm.smin.v4i32(<4 x i32> %x, <4 x i32> %y)
- // WEBASSEMBLY-NEXT: ret
-}
-
-u32x4 min_u_i32x4(u32x4 x, u32x4 y) {
- return __builtin_wasm_min_u_i32x4(x, y);
- // WEBASSEMBLY: call <4 x i32> @llvm.umin.v4i32(<4 x i32> %x, <4 x i32> %y)
- // WEBASSEMBLY-NEXT: ret
-}
-
-i32x4 max_s_i32x4(i32x4 x, i32x4 y) {
- return __builtin_wasm_max_s_i32x4(x, y);
- // WEBASSEMBLY: call <4 x i32> @llvm.smax.v4i32(<4 x i32> %x, <4 x i32> %y)
- // WEBASSEMBLY-NEXT: ret
-}
-
-u32x4 max_u_i32x4(u32x4 x, u32x4 y) {
- return __builtin_wasm_max_u_i32x4(x, y);
- // WEBASSEMBLY: call <4 x i32> @llvm.umax.v4i32(<4 x i32> %x, <4 x i32> %y)
- // WEBASSEMBLY-NEXT: ret
-}
-
i16x8 sub_sat_s_i16x8(i16x8 x, i16x8 y) {
return __builtin_wasm_sub_sat_s_i16x8(x, y);
// WEBASSEMBLY: call <8 x i16> @llvm.wasm.sub.sat.signed.v8i16(
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great, thank you!
Noticed while working on #109160