Skip to content

Commit 4e1ffa0

Browse files
committed
[clang] Support constrained fp elementwise builtins
Currently only __builtin_elementwise_sqrt emits contrained fp intrinsic and propagates fp options. This commit adds this support for the rest of elementwise builtins.
1 parent bf1b866 commit 4e1ffa0

File tree

2 files changed

+72
-87
lines changed

2 files changed

+72
-87
lines changed

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 25 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -2727,6 +2727,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
27272727
case Builtin::BI__builtin_acosf16:
27282728
case Builtin::BI__builtin_acosl:
27292729
case Builtin::BI__builtin_acosf128:
2730+
case Builtin::BI__builtin_elementwise_acos:
27302731
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
27312732
*this, E, Intrinsic::acos, Intrinsic::experimental_constrained_acos));
27322733

@@ -2738,6 +2739,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
27382739
case Builtin::BI__builtin_asinf16:
27392740
case Builtin::BI__builtin_asinl:
27402741
case Builtin::BI__builtin_asinf128:
2742+
case Builtin::BI__builtin_elementwise_asin:
27412743
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
27422744
*this, E, Intrinsic::asin, Intrinsic::experimental_constrained_asin));
27432745

@@ -2749,6 +2751,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
27492751
case Builtin::BI__builtin_atanf16:
27502752
case Builtin::BI__builtin_atanl:
27512753
case Builtin::BI__builtin_atanf128:
2754+
case Builtin::BI__builtin_elementwise_atan:
27522755
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
27532756
*this, E, Intrinsic::atan, Intrinsic::experimental_constrained_atan));
27542757

@@ -2760,6 +2763,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
27602763
case Builtin::BI__builtin_atan2f16:
27612764
case Builtin::BI__builtin_atan2l:
27622765
case Builtin::BI__builtin_atan2f128:
2766+
case Builtin::BI__builtin_elementwise_atan2:
27632767
return RValue::get(emitBinaryMaybeConstrainedFPBuiltin(
27642768
*this, E, Intrinsic::atan2,
27652769
Intrinsic::experimental_constrained_atan2));
@@ -2772,6 +2776,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
27722776
case Builtin::BI__builtin_ceilf16:
27732777
case Builtin::BI__builtin_ceill:
27742778
case Builtin::BI__builtin_ceilf128:
2779+
case Builtin::BI__builtin_elementwise_ceil:
27752780
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
27762781
Intrinsic::ceil,
27772782
Intrinsic::experimental_constrained_ceil));
@@ -2795,6 +2800,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
27952800
case Builtin::BI__builtin_cosf16:
27962801
case Builtin::BI__builtin_cosl:
27972802
case Builtin::BI__builtin_cosf128:
2803+
case Builtin::BI__builtin_elementwise_cos:
27982804
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
27992805
Intrinsic::cos,
28002806
Intrinsic::experimental_constrained_cos));
@@ -2807,6 +2813,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
28072813
case Builtin::BI__builtin_coshf16:
28082814
case Builtin::BI__builtin_coshl:
28092815
case Builtin::BI__builtin_coshf128:
2816+
case Builtin::BI__builtin_elementwise_cosh:
28102817
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
28112818
*this, E, Intrinsic::cosh, Intrinsic::experimental_constrained_cosh));
28122819

@@ -2818,6 +2825,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
28182825
case Builtin::BI__builtin_expf16:
28192826
case Builtin::BI__builtin_expl:
28202827
case Builtin::BI__builtin_expf128:
2828+
case Builtin::BI__builtin_elementwise_exp:
28212829
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
28222830
Intrinsic::exp,
28232831
Intrinsic::experimental_constrained_exp));
@@ -2830,6 +2838,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
28302838
case Builtin::BI__builtin_exp2f16:
28312839
case Builtin::BI__builtin_exp2l:
28322840
case Builtin::BI__builtin_exp2f128:
2841+
case Builtin::BI__builtin_elementwise_exp2:
28332842
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
28342843
Intrinsic::exp2,
28352844
Intrinsic::experimental_constrained_exp2));
@@ -2838,6 +2847,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
28382847
case Builtin::BI__builtin_exp10f16:
28392848
case Builtin::BI__builtin_exp10l:
28402849
case Builtin::BI__builtin_exp10f128: {
2850+
case Builtin::BI__builtin_elementwise_exp10:
28412851
// TODO: strictfp support
28422852
if (Builder.getIsFPConstrained())
28432853
break;
@@ -2863,6 +2873,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
28632873
case Builtin::BI__builtin_floorf16:
28642874
case Builtin::BI__builtin_floorl:
28652875
case Builtin::BI__builtin_floorf128:
2876+
case Builtin::BI__builtin_elementwise_floor:
28662877
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
28672878
Intrinsic::floor,
28682879
Intrinsic::experimental_constrained_floor));
@@ -2875,6 +2886,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
28752886
case Builtin::BI__builtin_fmaf16:
28762887
case Builtin::BI__builtin_fmal:
28772888
case Builtin::BI__builtin_fmaf128:
2889+
case Builtin::BI__builtin_elementwise_fma:
28782890
return RValue::get(emitTernaryMaybeConstrainedFPBuiltin(*this, E,
28792891
Intrinsic::fma,
28802892
Intrinsic::experimental_constrained_fma));
@@ -2950,6 +2962,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
29502962
case Builtin::BI__builtin_logf16:
29512963
case Builtin::BI__builtin_logl:
29522964
case Builtin::BI__builtin_logf128:
2965+
case Builtin::BI__builtin_elementwise_log:
29532966
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
29542967
Intrinsic::log,
29552968
Intrinsic::experimental_constrained_log));
@@ -2962,6 +2975,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
29622975
case Builtin::BI__builtin_log10f16:
29632976
case Builtin::BI__builtin_log10l:
29642977
case Builtin::BI__builtin_log10f128:
2978+
case Builtin::BI__builtin_elementwise_log10:
29652979
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
29662980
Intrinsic::log10,
29672981
Intrinsic::experimental_constrained_log10));
@@ -2974,6 +2988,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
29742988
case Builtin::BI__builtin_log2f16:
29752989
case Builtin::BI__builtin_log2l:
29762990
case Builtin::BI__builtin_log2f128:
2991+
case Builtin::BI__builtin_elementwise_log2:
29772992
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
29782993
Intrinsic::log2,
29792994
Intrinsic::experimental_constrained_log2));
@@ -2985,6 +3000,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
29853000
case Builtin::BI__builtin_nearbyintf:
29863001
case Builtin::BI__builtin_nearbyintl:
29873002
case Builtin::BI__builtin_nearbyintf128:
3003+
case Builtin::BI__builtin_elementwise_nearbyint:
29883004
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
29893005
Intrinsic::nearbyint,
29903006
Intrinsic::experimental_constrained_nearbyint));
@@ -2997,6 +3013,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
29973013
case Builtin::BI__builtin_powf16:
29983014
case Builtin::BI__builtin_powl:
29993015
case Builtin::BI__builtin_powf128:
3016+
case Builtin::BI__builtin_elementwise_pow:
30003017
return RValue::get(emitBinaryMaybeConstrainedFPBuiltin(*this, E,
30013018
Intrinsic::pow,
30023019
Intrinsic::experimental_constrained_pow));
@@ -3009,6 +3026,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
30093026
case Builtin::BI__builtin_rintf16:
30103027
case Builtin::BI__builtin_rintl:
30113028
case Builtin::BI__builtin_rintf128:
3029+
case Builtin::BI__builtin_elementwise_rint:
30123030
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
30133031
Intrinsic::rint,
30143032
Intrinsic::experimental_constrained_rint));
@@ -3021,6 +3039,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
30213039
case Builtin::BI__builtin_roundf16:
30223040
case Builtin::BI__builtin_roundl:
30233041
case Builtin::BI__builtin_roundf128:
3042+
case Builtin::BI__builtin_elementwise_round:
30243043
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
30253044
Intrinsic::round,
30263045
Intrinsic::experimental_constrained_round));
@@ -3033,6 +3052,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
30333052
case Builtin::BI__builtin_roundevenf16:
30343053
case Builtin::BI__builtin_roundevenl:
30353054
case Builtin::BI__builtin_roundevenf128:
3055+
case Builtin::BI__builtin_elementwise_roundeven:
30363056
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
30373057
Intrinsic::roundeven,
30383058
Intrinsic::experimental_constrained_roundeven));
@@ -3045,6 +3065,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
30453065
case Builtin::BI__builtin_sinf16:
30463066
case Builtin::BI__builtin_sinl:
30473067
case Builtin::BI__builtin_sinf128:
3068+
case Builtin::BI__builtin_elementwise_sin:
30483069
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
30493070
Intrinsic::sin,
30503071
Intrinsic::experimental_constrained_sin));
@@ -3057,6 +3078,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
30573078
case Builtin::BI__builtin_sinhf16:
30583079
case Builtin::BI__builtin_sinhl:
30593080
case Builtin::BI__builtin_sinhf128:
3081+
case Builtin::BI__builtin_elementwise_sinh:
30603082
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
30613083
*this, E, Intrinsic::sinh, Intrinsic::experimental_constrained_sinh));
30623084

@@ -3104,6 +3126,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
31043126
case Builtin::BI__builtin_tanf16:
31053127
case Builtin::BI__builtin_tanl:
31063128
case Builtin::BI__builtin_tanf128:
3129+
case Builtin::BI__builtin_elementwise_tan:
31073130
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
31083131
*this, E, Intrinsic::tan, Intrinsic::experimental_constrained_tan));
31093132

@@ -3115,6 +3138,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
31153138
case Builtin::BI__builtin_tanhf16:
31163139
case Builtin::BI__builtin_tanhl:
31173140
case Builtin::BI__builtin_tanhf128:
3141+
case Builtin::BI__builtin_elementwise_tanh:
31183142
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
31193143
*this, E, Intrinsic::tanh, Intrinsic::experimental_constrained_tanh));
31203144

@@ -3126,6 +3150,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
31263150
case Builtin::BI__builtin_truncf16:
31273151
case Builtin::BI__builtin_truncl:
31283152
case Builtin::BI__builtin_truncf128:
3153+
case Builtin::BI__builtin_elementwise_trunc:
31293154
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E,
31303155
Intrinsic::trunc,
31313156
Intrinsic::experimental_constrained_trunc));
@@ -3964,100 +3989,18 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
39643989

39653990
return RValue::get(Result);
39663991
}
3967-
case Builtin::BI__builtin_elementwise_acos:
3968-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
3969-
*this, E, Intrinsic::acos, "elt.acos"));
3970-
case Builtin::BI__builtin_elementwise_asin:
3971-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
3972-
*this, E, Intrinsic::asin, "elt.asin"));
3973-
case Builtin::BI__builtin_elementwise_atan:
3974-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
3975-
*this, E, Intrinsic::atan, "elt.atan"));
3976-
case Builtin::BI__builtin_elementwise_atan2:
3977-
return RValue::get(emitBuiltinWithOneOverloadedType<2>(
3978-
*this, E, Intrinsic::atan2, "elt.atan2"));
3979-
case Builtin::BI__builtin_elementwise_ceil:
3980-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
3981-
*this, E, Intrinsic::ceil, "elt.ceil"));
3982-
case Builtin::BI__builtin_elementwise_exp:
3983-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
3984-
*this, E, Intrinsic::exp, "elt.exp"));
3985-
case Builtin::BI__builtin_elementwise_exp2:
3986-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
3987-
*this, E, Intrinsic::exp2, "elt.exp2"));
3988-
case Builtin::BI__builtin_elementwise_exp10:
3989-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
3990-
*this, E, Intrinsic::exp10, "elt.exp10"));
3991-
case Builtin::BI__builtin_elementwise_ldexp: {
3992-
Value *Src = EmitScalarExpr(E->getArg(0));
3993-
Value *Exp = EmitScalarExpr(E->getArg(1));
3994-
Value *Result = Builder.CreateLdexp(Src, Exp, {}, "elt.ldexp");
3995-
return RValue::get(Result);
3996-
}
3997-
case Builtin::BI__builtin_elementwise_log:
3998-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
3999-
*this, E, Intrinsic::log, "elt.log"));
4000-
case Builtin::BI__builtin_elementwise_log2:
4001-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4002-
*this, E, Intrinsic::log2, "elt.log2"));
4003-
case Builtin::BI__builtin_elementwise_log10:
4004-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4005-
*this, E, Intrinsic::log10, "elt.log10"));
4006-
case Builtin::BI__builtin_elementwise_pow: {
4007-
return RValue::get(
4008-
emitBuiltinWithOneOverloadedType<2>(*this, E, Intrinsic::pow));
4009-
}
40103992
case Builtin::BI__builtin_elementwise_bitreverse:
40113993
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
40123994
*this, E, Intrinsic::bitreverse, "elt.bitreverse"));
4013-
case Builtin::BI__builtin_elementwise_cos:
4014-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4015-
*this, E, Intrinsic::cos, "elt.cos"));
4016-
case Builtin::BI__builtin_elementwise_cosh:
4017-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4018-
*this, E, Intrinsic::cosh, "elt.cosh"));
4019-
case Builtin::BI__builtin_elementwise_floor:
4020-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4021-
*this, E, Intrinsic::floor, "elt.floor"));
40223995
case Builtin::BI__builtin_elementwise_popcount:
40233996
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
40243997
*this, E, Intrinsic::ctpop, "elt.ctpop"));
4025-
case Builtin::BI__builtin_elementwise_roundeven:
4026-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4027-
*this, E, Intrinsic::roundeven, "elt.roundeven"));
4028-
case Builtin::BI__builtin_elementwise_round:
4029-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4030-
*this, E, Intrinsic::round, "elt.round"));
4031-
case Builtin::BI__builtin_elementwise_rint:
4032-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4033-
*this, E, Intrinsic::rint, "elt.rint"));
4034-
case Builtin::BI__builtin_elementwise_nearbyint:
4035-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4036-
*this, E, Intrinsic::nearbyint, "elt.nearbyint"));
4037-
case Builtin::BI__builtin_elementwise_sin:
4038-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4039-
*this, E, Intrinsic::sin, "elt.sin"));
4040-
case Builtin::BI__builtin_elementwise_sinh:
4041-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4042-
*this, E, Intrinsic::sinh, "elt.sinh"));
4043-
case Builtin::BI__builtin_elementwise_tan:
4044-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4045-
*this, E, Intrinsic::tan, "elt.tan"));
4046-
case Builtin::BI__builtin_elementwise_tanh:
4047-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4048-
*this, E, Intrinsic::tanh, "elt.tanh"));
4049-
case Builtin::BI__builtin_elementwise_trunc:
4050-
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
4051-
*this, E, Intrinsic::trunc, "elt.trunc"));
40523998
case Builtin::BI__builtin_elementwise_canonicalize:
40533999
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
40544000
*this, E, Intrinsic::canonicalize, "elt.canonicalize"));
40554001
case Builtin::BI__builtin_elementwise_copysign:
40564002
return RValue::get(
40574003
emitBuiltinWithOneOverloadedType<2>(*this, E, Intrinsic::copysign));
4058-
case Builtin::BI__builtin_elementwise_fma:
4059-
return RValue::get(
4060-
emitBuiltinWithOneOverloadedType<3>(*this, E, Intrinsic::fma));
40614004
case Builtin::BI__builtin_elementwise_fshl:
40624005
return RValue::get(
40634006
emitBuiltinWithOneOverloadedType<3>(*this, E, Intrinsic::fshl));

0 commit comments

Comments
 (0)