Skip to content

Commit ddb62d2

Browse files
authored
[clang] constexpr built-in reduce or and xor function. (#116976)
Part of #51787. Follow up of #116822. This patch adds constexpr support for the built-in reduce `or` and `xor` functions.
1 parent 2e60048 commit ddb62d2

File tree

5 files changed

+38
-3
lines changed

5 files changed

+38
-3
lines changed

clang/docs/LanguageExtensions.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,10 @@ at the end to the next power of 2.
732732

733733
These reductions support both fixed-sized and scalable vector types.
734734

735+
The integer reduction intrinsics, including ``__builtin_reduce_add``,
736+
``__builtin_reduce_mul``, ``__builtin_reduce_and``, ``__builtin_reduce_or``,
737+
and ``__builtin_reduce_xor``, can be called in a ``constexpr`` context.
738+
735739
Example:
736740

737741
.. code-block:: c++

clang/docs/ReleaseNotes.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,7 @@ Non-comprehensive list of changes in this release
358358
- ``__builtin_reduce_add`` function can now be used in constant expressions.
359359
- ``__builtin_reduce_mul`` function can now be used in constant expressions.
360360
- ``__builtin_reduce_and`` function can now be used in constant expressions.
361+
- ``__builtin_reduce_or`` and ``__builtin_reduce_xor`` functions can now be used in constant expressions.
361362

362363
New Compiler Flags
363364
------------------

clang/include/clang/Basic/Builtins.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1486,13 +1486,13 @@ def ReduceMinimum : Builtin {
14861486

14871487
def ReduceXor : Builtin {
14881488
let Spellings = ["__builtin_reduce_xor"];
1489-
let Attributes = [NoThrow, Const, CustomTypeChecking];
1489+
let Attributes = [NoThrow, Const, CustomTypeChecking, Constexpr];
14901490
let Prototype = "void(...)";
14911491
}
14921492

14931493
def ReduceOr : Builtin {
14941494
let Spellings = ["__builtin_reduce_or"];
1495-
let Attributes = [NoThrow, Const, CustomTypeChecking];
1495+
let Attributes = [NoThrow, Const, CustomTypeChecking, Constexpr];
14961496
let Prototype = "void(...)";
14971497
}
14981498

clang/lib/AST/ExprConstant.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13529,7 +13529,9 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
1352913529

1353013530
case Builtin::BI__builtin_reduce_add:
1353113531
case Builtin::BI__builtin_reduce_mul:
13532-
case Builtin::BI__builtin_reduce_and: {
13532+
case Builtin::BI__builtin_reduce_and:
13533+
case Builtin::BI__builtin_reduce_or:
13534+
case Builtin::BI__builtin_reduce_xor: {
1353313535
APValue Source;
1353413536
if (!EvaluateAsRValue(Info, E->getArg(0), Source))
1353513537
return false;
@@ -13558,6 +13560,14 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
1355813560
Reduced &= Source.getVectorElt(EltNum).getInt();
1355913561
break;
1356013562
}
13563+
case Builtin::BI__builtin_reduce_or: {
13564+
Reduced |= Source.getVectorElt(EltNum).getInt();
13565+
break;
13566+
}
13567+
case Builtin::BI__builtin_reduce_xor: {
13568+
Reduced ^= Source.getVectorElt(EltNum).getInt();
13569+
break;
13570+
}
1356113571
}
1356213572
}
1356313573

clang/test/Sema/constant_builtins_vector.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -777,3 +777,23 @@ static_assert(__builtin_reduce_and((vector4int){(int)~0x11111111, (int)~0x222222
777777
static_assert(__builtin_reduce_and((vector4long){(long long)~0x1111111111111111L, (long long)~0x2222222222222222L, (long long)~0x4444444444444444L, (long long)-1}) == 0x8888888888888888L);
778778
static_assert(__builtin_reduce_and((vector4uint){0x11111111U, 0x22222222U, 0x44444444U, 0x88888888U}) == 0U);
779779
static_assert(__builtin_reduce_and((vector4ulong){0x1111111111111111UL, 0x2222222222222222UL, 0x4444444444444444UL, 0x8888888888888888UL}) == 0L);
780+
781+
static_assert(__builtin_reduce_or((vector4char){}) == 0);
782+
static_assert(__builtin_reduce_or((vector4char){(char)0x11, (char)0x22, (char)0x44, (char)0x88}) == (char)0xFF);
783+
static_assert(__builtin_reduce_or((vector4short){(short)0x1111, (short)0x2222, (short)0x4444, (short)0x8888}) == (short)0xFFFF);
784+
static_assert(__builtin_reduce_or((vector4int){(int)0x11111111, (int)0x22222222, (int)0x44444444, (int)0x88888888}) == (int)0xFFFFFFFF);
785+
static_assert(__builtin_reduce_or((vector4long){(long long)0x1111111111111111L, (long long)0x2222222222222222L, (long long)0x4444444444444444L, (long long)0x8888888888888888L}) == (long long)0xFFFFFFFFFFFFFFFFL);
786+
static_assert(__builtin_reduce_or((vector4char){(char)0, (char)0x22, (char)0x44, (char)0x88}) == ~0x11);
787+
static_assert(__builtin_reduce_or((vector4short){(short)0x1111, (short)0, (short)0x4444, (short)0x8888}) == ~0x2222);
788+
static_assert(__builtin_reduce_or((vector4int){(int)0x11111111, (int)0x22222222, (int)0, (int)0x88888888}) == ~0x44444444);
789+
static_assert(__builtin_reduce_or((vector4long){(long long)0x1111111111111111L, (long long)0x2222222222222222L, (long long)0x4444444444444444L, (long long)0}) == ~0x8888888888888888L);
790+
static_assert(__builtin_reduce_or((vector4uint){0x11111111U, 0x22222222U, 0x44444444U, 0x88888888U}) == 0xFFFFFFFFU);
791+
static_assert(__builtin_reduce_or((vector4ulong){0x1111111111111111UL, 0x2222222222222222UL, 0x4444444444444444UL, 0x8888888888888888UL}) == 0xFFFFFFFFFFFFFFFFL);
792+
793+
static_assert(__builtin_reduce_xor((vector4char){}) == 0);
794+
static_assert(__builtin_reduce_xor((vector4char){(char)0x11, (char)0x22, (char)0x44, (char)0x88}) == (char)0xFF);
795+
static_assert(__builtin_reduce_xor((vector4short){(short)0x1111, (short)0x2222, (short)0x4444, (short)0x8888}) == (short)0xFFFF);
796+
static_assert(__builtin_reduce_xor((vector4int){(int)0x11111111, (int)0x22222222, (int)0x44444444, (int)0x88888888}) == (int)0xFFFFFFFF);
797+
static_assert(__builtin_reduce_xor((vector4long){(long long)0x1111111111111111L, (long long)0x2222222222222222L, (long long)0x4444444444444444L, (long long)0x8888888888888888L}) == (long long)0xFFFFFFFFFFFFFFFFL);
798+
static_assert(__builtin_reduce_xor((vector4uint){0x11111111U, 0x22222222U, 0x44444444U, 0x88888888U}) == 0xFFFFFFFFU);
799+
static_assert(__builtin_reduce_xor((vector4ulong){0x1111111111111111UL, 0x2222222222222222UL, 0x4444444444444444UL, 0x8888888888888888UL}) == 0xFFFFFFFFFFFFFFFFUL);

0 commit comments

Comments
 (0)