Skip to content

Commit 7665f0d

Browse files
committed
[Clang] Allow __builtin_fma/fmaf/fmal to be used in a constant expression
1 parent 96d5567 commit 7665f0d

File tree

3 files changed

+17
-5
lines changed

3 files changed

+17
-5
lines changed

clang/include/clang/Basic/Builtins.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ def FloorF16F128 : Builtin, F16F128MathTemplate {
199199

200200
def FmaF16F128 : Builtin, F16F128MathTemplate {
201201
let Spellings = ["__builtin_fma"];
202-
let Attributes = [FunctionWithBuiltinPrefix, NoThrow, ConstIgnoringErrnoAndExceptions];
202+
let Attributes = [FunctionWithBuiltinPrefix, NoThrow, ConstIgnoringErrnoAndExceptions, Constexpr];
203203
let Prototype = "T(T, T, T)";
204204
}
205205

clang/lib/AST/ByteCode/InterpBuiltin.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3411,6 +3411,14 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
34113411
case clang::X86::BI__builtin_ia32_pmuludq512:
34123412
return interp__builtin_ia32_pmul(S, OpPC, Call, BuiltinID);
34133413

3414+
case Builtin::BIfma:
3415+
case Builtin::BIfmal:
3416+
case Builtin::BIfmaf:
3417+
case Builtin::BI__builtin_fma:
3418+
case Builtin::BI__builtin_fmal:
3419+
case Builtin::BI__builtin_fmaf:
3420+
case Builtin::BI__builtin_fmaf16:
3421+
case Builtin::BI__builtin_fmaf128:
34143422
case Builtin::BI__builtin_elementwise_fma:
34153423
return interp__builtin_elementwise_triop_fp(
34163424
S, OpPC, Call,

clang/lib/AST/ExprConstant.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16346,11 +16346,15 @@ bool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
1634616346
return true;
1634716347
}
1634816348

16349+
case Builtin::BIfma:
16350+
case Builtin::BIfmal:
16351+
case Builtin::BIfmaf:
16352+
case Builtin::BI__builtin_fma:
16353+
case Builtin::BI__builtin_fmal:
16354+
case Builtin::BI__builtin_fmaf:
16355+
case Builtin::BI__builtin_fmaf16:
16356+
case Builtin::BI__builtin_fmaf128:
1634916357
case Builtin::BI__builtin_elementwise_fma: {
16350-
if (!E->getArg(0)->isPRValue() || !E->getArg(1)->isPRValue() ||
16351-
!E->getArg(2)->isPRValue()) {
16352-
return false;
16353-
}
1635416358
APFloat SourceY(0.), SourceZ(0.);
1635516359
if (!EvaluateFloat(E->getArg(0), Result, Info) ||
1635616360
!EvaluateFloat(E->getArg(1), SourceY, Info) ||

0 commit comments

Comments
 (0)