-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[clang] Support constrained fp elementwise builtins #166905
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
Currently only __builtin_elementwise_sqrt emits contrained fp intrinsic and propagates fp options. This commit adds this support for the rest of elementwise builtins.
8513f38 to
4fa4489
Compare
4fa4489 to
1590273
Compare
|
@llvm/pr-subscribers-hlsl @llvm/pr-subscribers-clang Author: Jakub Ficek (ficol) ChangesCurrently only __builtin_elementwise_sqrt emits contrained fp intrinsic and propagates fp options. Patch is 87.20 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/166905.diff 11 Files Affected:
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 0a2ea416e5e4d..d97f0e0d36aa6 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -2727,6 +2727,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_acosf16:
case Builtin::BI__builtin_acosl:
case Builtin::BI__builtin_acosf128:
+ case Builtin::BI__builtin_elementwise_acos:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
*this, E, Intrinsic::acos, Intrinsic::experimental_constrained_acos));
@@ -2738,6 +2739,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_asinf16:
case Builtin::BI__builtin_asinl:
case Builtin::BI__builtin_asinf128:
+ case Builtin::BI__builtin_elementwise_asin:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
*this, E, Intrinsic::asin, Intrinsic::experimental_constrained_asin));
@@ -2749,6 +2751,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_atanf16:
case Builtin::BI__builtin_atanl:
case Builtin::BI__builtin_atanf128:
+ case Builtin::BI__builtin_elementwise_atan:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
*this, E, Intrinsic::atan, Intrinsic::experimental_constrained_atan));
@@ -2760,6 +2763,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_atan2f16:
case Builtin::BI__builtin_atan2l:
case Builtin::BI__builtin_atan2f128:
+ case Builtin::BI__builtin_elementwise_atan2:
return RValue::get(emitBinaryMaybeConstrainedFPBuiltin(
*this, E, Intrinsic::atan2,
Intrinsic::experimental_constrained_atan2));
@@ -2772,6 +2776,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_ceilf16:
case Builtin::BI__builtin_ceill:
case Builtin::BI__builtin_ceilf128:
+ case Builtin::BI__builtin_elementwise_ceil:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
Intrinsic::ceil,
Intrinsic::experimental_constrained_ceil));
@@ -2795,6 +2800,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_cosf16:
case Builtin::BI__builtin_cosl:
case Builtin::BI__builtin_cosf128:
+ case Builtin::BI__builtin_elementwise_cos:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
Intrinsic::cos,
Intrinsic::experimental_constrained_cos));
@@ -2807,6 +2813,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_coshf16:
case Builtin::BI__builtin_coshl:
case Builtin::BI__builtin_coshf128:
+ case Builtin::BI__builtin_elementwise_cosh:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
*this, E, Intrinsic::cosh, Intrinsic::experimental_constrained_cosh));
@@ -2818,6 +2825,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_expf16:
case Builtin::BI__builtin_expl:
case Builtin::BI__builtin_expf128:
+ case Builtin::BI__builtin_elementwise_exp:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
Intrinsic::exp,
Intrinsic::experimental_constrained_exp));
@@ -2830,6 +2838,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_exp2f16:
case Builtin::BI__builtin_exp2l:
case Builtin::BI__builtin_exp2f128:
+ case Builtin::BI__builtin_elementwise_exp2:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
Intrinsic::exp2,
Intrinsic::experimental_constrained_exp2));
@@ -2837,13 +2846,11 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_exp10f:
case Builtin::BI__builtin_exp10f16:
case Builtin::BI__builtin_exp10l:
- case Builtin::BI__builtin_exp10f128: {
+ case Builtin::BI__builtin_exp10f128:
+ case Builtin::BI__builtin_elementwise_exp10:
// TODO: strictfp support
- if (Builder.getIsFPConstrained())
- break;
return RValue::get(
emitBuiltinWithOneOverloadedType<1>(*this, E, Intrinsic::exp10));
- }
case Builtin::BIfabs:
case Builtin::BIfabsf:
case Builtin::BIfabsl:
@@ -2863,6 +2870,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_floorf16:
case Builtin::BI__builtin_floorl:
case Builtin::BI__builtin_floorf128:
+ case Builtin::BI__builtin_elementwise_floor:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
Intrinsic::floor,
Intrinsic::experimental_constrained_floor));
@@ -2875,6 +2883,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_fmaf16:
case Builtin::BI__builtin_fmal:
case Builtin::BI__builtin_fmaf128:
+ case Builtin::BI__builtin_elementwise_fma:
return RValue::get(emitTernaryMaybeConstrainedFPBuiltin(*this, E,
Intrinsic::fma,
Intrinsic::experimental_constrained_fma));
@@ -2939,7 +2948,13 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*this, E);
Value *Arg1 = EmitScalarExpr(E->getArg(0));
Value *Arg2 = EmitScalarExpr(E->getArg(1));
- return RValue::get(Builder.CreateFRem(Arg1, Arg2, "fmod"));
+ if (Builder.getIsFPConstrained()) {
+ Function *F = CGM.getIntrinsic(Intrinsic::experimental_constrained_frem,
+ Arg1->getType());
+ return RValue::get(Builder.CreateConstrainedFPCall(F, {Arg1, Arg2}));
+ } else {
+ return RValue::get(Builder.CreateFRem(Arg1, Arg2, "fmod"));
+ }
}
case Builtin::BIlog:
@@ -2950,6 +2965,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_logf16:
case Builtin::BI__builtin_logl:
case Builtin::BI__builtin_logf128:
+ case Builtin::BI__builtin_elementwise_log:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
Intrinsic::log,
Intrinsic::experimental_constrained_log));
@@ -2962,6 +2978,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_log10f16:
case Builtin::BI__builtin_log10l:
case Builtin::BI__builtin_log10f128:
+ case Builtin::BI__builtin_elementwise_log10:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
Intrinsic::log10,
Intrinsic::experimental_constrained_log10));
@@ -2974,6 +2991,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_log2f16:
case Builtin::BI__builtin_log2l:
case Builtin::BI__builtin_log2f128:
+ case Builtin::BI__builtin_elementwise_log2:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
Intrinsic::log2,
Intrinsic::experimental_constrained_log2));
@@ -2985,6 +3003,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_nearbyintf:
case Builtin::BI__builtin_nearbyintl:
case Builtin::BI__builtin_nearbyintf128:
+ case Builtin::BI__builtin_elementwise_nearbyint:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
Intrinsic::nearbyint,
Intrinsic::experimental_constrained_nearbyint));
@@ -2997,6 +3016,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_powf16:
case Builtin::BI__builtin_powl:
case Builtin::BI__builtin_powf128:
+ case Builtin::BI__builtin_elementwise_pow:
return RValue::get(emitBinaryMaybeConstrainedFPBuiltin(*this, E,
Intrinsic::pow,
Intrinsic::experimental_constrained_pow));
@@ -3009,6 +3029,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_rintf16:
case Builtin::BI__builtin_rintl:
case Builtin::BI__builtin_rintf128:
+ case Builtin::BI__builtin_elementwise_rint:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
Intrinsic::rint,
Intrinsic::experimental_constrained_rint));
@@ -3021,6 +3042,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_roundf16:
case Builtin::BI__builtin_roundl:
case Builtin::BI__builtin_roundf128:
+ case Builtin::BI__builtin_elementwise_round:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
Intrinsic::round,
Intrinsic::experimental_constrained_round));
@@ -3033,6 +3055,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_roundevenf16:
case Builtin::BI__builtin_roundevenl:
case Builtin::BI__builtin_roundevenf128:
+ case Builtin::BI__builtin_elementwise_roundeven:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
Intrinsic::roundeven,
Intrinsic::experimental_constrained_roundeven));
@@ -3045,6 +3068,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_sinf16:
case Builtin::BI__builtin_sinl:
case Builtin::BI__builtin_sinf128:
+ case Builtin::BI__builtin_elementwise_sin:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
Intrinsic::sin,
Intrinsic::experimental_constrained_sin));
@@ -3057,6 +3081,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_sinhf16:
case Builtin::BI__builtin_sinhl:
case Builtin::BI__builtin_sinhf128:
+ case Builtin::BI__builtin_elementwise_sinh:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
*this, E, Intrinsic::sinh, Intrinsic::experimental_constrained_sinh));
@@ -3104,6 +3129,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_tanf16:
case Builtin::BI__builtin_tanl:
case Builtin::BI__builtin_tanf128:
+ case Builtin::BI__builtin_elementwise_tan:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
*this, E, Intrinsic::tan, Intrinsic::experimental_constrained_tan));
@@ -3115,6 +3141,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_tanhf16:
case Builtin::BI__builtin_tanhl:
case Builtin::BI__builtin_tanhf128:
+ case Builtin::BI__builtin_elementwise_tanh:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
*this, E, Intrinsic::tanh, Intrinsic::experimental_constrained_tanh));
@@ -3126,6 +3153,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_truncf16:
case Builtin::BI__builtin_truncl:
case Builtin::BI__builtin_truncf128:
+ case Builtin::BI__builtin_elementwise_trunc:
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
Intrinsic::trunc,
Intrinsic::experimental_constrained_trunc));
@@ -3177,11 +3205,11 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI__builtin_ldexpf:
case Builtin::BI__builtin_ldexpl:
case Builtin::BI__builtin_ldexpf16:
- case Builtin::BI__builtin_ldexpf128: {
+ case Builtin::BI__builtin_ldexpf128:
+ case Builtin::BI__builtin_elementwise_ldexp:
return RValue::get(emitBinaryExpMaybeConstrainedFPBuiltin(
*this, E, Intrinsic::ldexp,
Intrinsic::experimental_constrained_ldexp));
- }
default:
break;
}
@@ -3964,100 +3992,18 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
return RValue::get(Result);
}
- case Builtin::BI__builtin_elementwise_acos:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::acos, "elt.acos"));
- case Builtin::BI__builtin_elementwise_asin:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::asin, "elt.asin"));
- case Builtin::BI__builtin_elementwise_atan:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::atan, "elt.atan"));
- case Builtin::BI__builtin_elementwise_atan2:
- return RValue::get(emitBuiltinWithOneOverloadedType<2>(
- *this, E, Intrinsic::atan2, "elt.atan2"));
- case Builtin::BI__builtin_elementwise_ceil:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::ceil, "elt.ceil"));
- case Builtin::BI__builtin_elementwise_exp:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::exp, "elt.exp"));
- case Builtin::BI__builtin_elementwise_exp2:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::exp2, "elt.exp2"));
- case Builtin::BI__builtin_elementwise_exp10:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::exp10, "elt.exp10"));
- case Builtin::BI__builtin_elementwise_ldexp: {
- Value *Src = EmitScalarExpr(E->getArg(0));
- Value *Exp = EmitScalarExpr(E->getArg(1));
- Value *Result = Builder.CreateLdexp(Src, Exp, {}, "elt.ldexp");
- return RValue::get(Result);
- }
- case Builtin::BI__builtin_elementwise_log:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::log, "elt.log"));
- case Builtin::BI__builtin_elementwise_log2:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::log2, "elt.log2"));
- case Builtin::BI__builtin_elementwise_log10:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::log10, "elt.log10"));
- case Builtin::BI__builtin_elementwise_pow: {
- return RValue::get(
- emitBuiltinWithOneOverloadedType<2>(*this, E, Intrinsic::pow));
- }
case Builtin::BI__builtin_elementwise_bitreverse:
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
*this, E, Intrinsic::bitreverse, "elt.bitreverse"));
- case Builtin::BI__builtin_elementwise_cos:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::cos, "elt.cos"));
- case Builtin::BI__builtin_elementwise_cosh:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::cosh, "elt.cosh"));
- case Builtin::BI__builtin_elementwise_floor:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::floor, "elt.floor"));
case Builtin::BI__builtin_elementwise_popcount:
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
*this, E, Intrinsic::ctpop, "elt.ctpop"));
- case Builtin::BI__builtin_elementwise_roundeven:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::roundeven, "elt.roundeven"));
- case Builtin::BI__builtin_elementwise_round:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::round, "elt.round"));
- case Builtin::BI__builtin_elementwise_rint:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::rint, "elt.rint"));
- case Builtin::BI__builtin_elementwise_nearbyint:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::nearbyint, "elt.nearbyint"));
- case Builtin::BI__builtin_elementwise_sin:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::sin, "elt.sin"));
- case Builtin::BI__builtin_elementwise_sinh:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::sinh, "elt.sinh"));
- case Builtin::BI__builtin_elementwise_tan:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::tan, "elt.tan"));
- case Builtin::BI__builtin_elementwise_tanh:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::tanh, "elt.tanh"));
- case Builtin::BI__builtin_elementwise_trunc:
- return RValue::get(emitBuiltinWithOneOverloadedType<1>(
- *this, E, Intrinsic::trunc, "elt.trunc"));
case Builtin::BI__builtin_elementwise_canonicalize:
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
*this, E, Intrinsic::canonicalize, "elt.canonicalize"));
case Builtin::BI__builtin_elementwise_copysign:
return RValue::get(
emitBuiltinWithOneOverloadedType<2>(*this, E, Intrinsic::copysign));
- case Builtin::BI__builtin_elementwise_fma:
- return RValue::get(
- emitBuiltinWithOneOverloadedType<3>(*this, E, Intrinsic::fma));
case Builtin::BI__builtin_elementwise_fshl:
return RValue::get(
emitBuiltinWithOneOverloadedType<3>(*this, E, Intrinsic::fshl));
diff --git a/clang/test/CodeGen/constrained-math-builtins.c b/clang/test/CodeGen/constrained-math-builtins.c
index 68b9e75283c54..30fd896bb6489 100644
--- a/clang/test/CodeGen/constrained-math-builtins.c
+++ b/clang/test/CodeGen/constrained-math-builtins.c
@@ -101,10 +101,10 @@ __builtin_atan2(f,f); __builtin_atan2f(f,f); __builtin_atan2l(f,f);
__builtin_exp10(f); __builtin_exp10f(f); __builtin_exp10l(f); __builtin_exp10f128(f);
-// CHECK: call double @exp10(double noundef %{{.*}})
-// CHECK: call float @exp10f(float noundef %{{.*}})
-// CHECK: call x86_fp80 @exp10l(x86_fp80 noundef %{{.*}})
-// CHECK: call fp128 @exp10f128(fp128 noundef %{{.*}})
+// CHECK: call double @llvm.exp10.f64(double %{{.*}})
+// CHECK: call float @llvm.exp10.f32(float %{{.*}})
+// CHECK: call x86_fp80 @llvm.exp10.f80(x86_fp80 %{{.*}})
+// CHECK: call fp128 @llvm.exp10.f128(fp128 %{{.*}})
__builtin_floor(f); __builtin_floorf(f); __builtin_floorl(f); __builtin_floorf128(f);
@@ -287,10 +287,10 @@ __builtin_atan2(f,f); __builtin_atan2f(f,f); __builtin_atan2l(f,f);
// CHECK: declare x86_fp80 @llvm.experimental.constrained.exp2.f80(x86_fp80, metadata, metadata)
// CHECK: declare fp128 @llvm.experimental.constrained.exp2.f128(fp128, metadata, metadata)
-// CHECK: declare double @exp10(double noundef)
-// CHECK: declare float @exp10f(float noundef)
-// CHECK: declare x86_fp80 @exp10l(x86_fp80 noundef)
-// CHECK: declare fp128 @exp10f128(fp128 noundef)
+// CHECK: declare double @llvm.exp10.f64(double)
+// CHECK: declare float @llvm.exp10.f32(float)
+// CHECK: declare x86_fp80 @llvm.exp10.f80(x86_fp80)
+// CHECK: declare fp128 @llvm.exp10.f128(fp128)
// CHECK: declare double @llvm.experimental.constrained.floor.f64(double, metadata)
// CHECK: declare float @llvm.experimental.constrained.floor.f32(float, metadata)
diff --git a/clang/test/CodeGen/strictfp-elementwise-builtins.cpp b/clang/test/CodeGen/strictfp-elementwise-builtins.cpp
index b250512efc5c7..cb5edb5744bbb 100644
--- a/clang/test/CodeGen/strictfp-elementwise-builtins.cpp
+++ b/clang/test/CodeGen/strictfp-elementwise-builtins.cpp
@@ -68,60 +68,60 @@...
[truncated]
|
| case Builtin::BI__builtin_elementwise_exp10: | ||
| // TODO: strictfp support | ||
| if (Builder.getIsFPConstrained()) | ||
| break; |
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.
Do we really want this to be removed? Here we want to break in constrained mode.
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.
Before this change, we generated standard intrinsic for __builtin_elementwise_exp10 and emitted error cannot compile this builtin function yet for __builtin_exp10 when FPConstrained is used, so I wanted to unify it. I'm not sure what is the better approach, but I see we break for other cases like __builtin_sincos, so I added break back in 3200deb.
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.
To keep your initial change you would have to call emitUnaryMaybeConstrainedFPBuiltin and add the intrinsic int_experimental_constrained_exp10 to Intrinsics.td for it to work.
But I think you can keep the condition and the break for now.
zahiraam
left a comment
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.
Looks good. Thanks.
|
Thanks @zahiraam. Can you help with merging this PR? |
Currently only __builtin_elementwise_sqrt emits contrained fp intrinsic and propagates fp options.
This commit adds this support for the rest of elementwise builtins.