llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clangir Author: disservin (Disservin) <details> <summary>Changes</summary> Add support for __builtin_bswap128. Hide the builtin on targets without __int128 support, for that purpose adds a new attribute, which in the future can also be used for __builtin_bitreverse128 which gcc now has too. Aligns clang with gcc. Took inspiration from https://reviews.llvm.org/D114425 --- Full diff: https://github.com/llvm/llvm-project/pull/198172.diff 14 Files Affected: - (modified) clang/include/clang/Basic/Builtins.h (+5) - (modified) clang/include/clang/Basic/Builtins.td (+6) - (modified) clang/include/clang/Basic/BuiltinsBase.td (+2) - (modified) clang/lib/AST/ASTContext.cpp (+5) - (modified) clang/lib/AST/ByteCode/InterpBuiltin.cpp (+1) - (modified) clang/lib/AST/ExprConstant.cpp (+2-1) - (modified) clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp (+1) - (modified) clang/lib/CodeGen/CGBuiltin.cpp (+1) - (modified) clang/test/AST/ByteCode/builtin-functions.cpp (+3) - (added) clang/test/CodeGen/builtin-bswap128.c (+18) - (modified) clang/test/CodeGen/builtins.cpp (+4) - (added) clang/test/Sema/builtin-bswap128.c (+5) - (modified) clang/test/Sema/constant-builtins-2.c (+3) - (modified) clang/test/Sema/constant-builtins.c (+3) ``````````diff diff --git a/clang/include/clang/Basic/Builtins.h b/clang/include/clang/Basic/Builtins.h index 9054f9415ce67..ef26e2240cdec 100644 --- a/clang/include/clang/Basic/Builtins.h +++ b/clang/include/clang/Basic/Builtins.h @@ -466,6 +466,11 @@ class Context { return strchr(getAttributesString(ID), 'G') != nullptr; } + /// Returns true if this builtin requires target support for __int128. + bool requiresInt128Type(unsigned ID) const { + return strchr(getAttributesString(ID), 'H') != nullptr; + } + private: std::pair<const InfosShard &, const Info &> getShardAndInfo(unsigned ID) const; diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 40ec94ab75046..afacceb3ca671 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -760,6 +760,12 @@ def BSwap : Builtin, Template<["unsigned short", "uint32_t", "uint64_t"], let Prototype = "T(T)"; } +def BSwap128 : Builtin { + let Spellings = ["__builtin_bswap128"]; + let Attributes = [NoThrow, Const, Constexpr, RequireInt128]; + let Prototype = "__uint128_t(__uint128_t)"; +} + def BSwapg : Builtin { let Spellings = ["__builtin_bswapg"]; let Attributes = [NoThrow, Const, Constexpr, CustomTypeChecking]; diff --git a/clang/include/clang/Basic/BuiltinsBase.td b/clang/include/clang/Basic/BuiltinsBase.td index 1f34374148363..189f29c2c0060 100644 --- a/clang/include/clang/Basic/BuiltinsBase.td +++ b/clang/include/clang/Basic/BuiltinsBase.td @@ -95,6 +95,8 @@ class VScanfFormat<int I> : IndexedAttribute<"S", I>; def Constexpr : Attribute<"E">; // Builtin is immediate and must be constant evaluated. Implies Constexpr, and will only be supported in C++20 mode. def Consteval : Attribute<"EG">; +// Builtin requires the target to support __int128. +def RequireInt128 : Attribute<"H">; // Callback behavior: the first index argument is called with the arguments // indicated by the remaining indices. diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index bc4771aec77d1..9349914e3f5ac 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -12916,6 +12916,11 @@ QualType ASTContext::GetBuiltinType(unsigned Id, return {}; } + if (BuiltinInfo.requiresInt128Type(Id) && !getTargetInfo().hasInt128Type()) { + Error = GE_Missing_type; + return {}; + } + SmallVector<QualType, 8> ArgTypes; bool RequiresICE = false; diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp index 3e9ce902427eb..9838e9fe7d8c5 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp +++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp @@ -4953,6 +4953,7 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call, case Builtin::BI__builtin_bswap16: case Builtin::BI__builtin_bswap32: case Builtin::BI__builtin_bswap64: + case Builtin::BI__builtin_bswap128: return interp__builtin_bswap(S, OpPC, Frame, Call); case Builtin::BI__atomic_always_lock_free: diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 38aa5798cfeb9..d620c55394f55 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -16519,7 +16519,8 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, case Builtin::BI__builtin_bswapg: case Builtin::BI__builtin_bswap16: case Builtin::BI__builtin_bswap32: - case Builtin::BI__builtin_bswap64: { + case Builtin::BI__builtin_bswap64: + case Builtin::BI__builtin_bswap128: { APSInt Val; if (!EvaluateInteger(E->getArg(0), Val, Info)) return false; diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp index b9daacfc9d4cb..bd7bd0aa3dfa6 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp @@ -1251,6 +1251,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl &gd, unsigned builtinID, case Builtin::BI__builtin_bswap16: case Builtin::BI__builtin_bswap32: case Builtin::BI__builtin_bswap64: + case Builtin::BI__builtin_bswap128: case Builtin::BI_byteswap_ushort: case Builtin::BI_byteswap_ulong: case Builtin::BI_byteswap_uint64: { diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index cac1628e68721..1053e0478c52c 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -3713,6 +3713,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, case Builtin::BI__builtin_bswap16: case Builtin::BI__builtin_bswap32: case Builtin::BI__builtin_bswap64: + case Builtin::BI__builtin_bswap128: case Builtin::BI_byteswap_ushort: case Builtin::BI_byteswap_ulong: case Builtin::BI_byteswap_uint64: { diff --git a/clang/test/AST/ByteCode/builtin-functions.cpp b/clang/test/AST/ByteCode/builtin-functions.cpp index 97fa1760ee167..e8d4d72ec0484 100644 --- a/clang/test/AST/ByteCode/builtin-functions.cpp +++ b/clang/test/AST/ByteCode/builtin-functions.cpp @@ -875,6 +875,9 @@ namespace bswap { int h3 = __builtin_bswap16(0x1234) == 0x3412 ? 1 : f(); int h4 = __builtin_bswap32(0x1234) == 0x34120000 ? 1 : f(); int h5 = __builtin_bswap64(0x1234) == 0x3412000000000000 ? 1 : f(); +#ifdef __SIZEOF_INT128__ + int h5b = __builtin_bswap128(0x1234) == (((__int128)0x3412) << 112) ? 1 : f(); +#endif int h6 = __builtin_bswapg(0x12) == 0x12 ? 1 : f(); int h7 = __builtin_bswapg(0x1234) == 0x3412 ? 1 : f(); int h8 = __builtin_bswapg(0x00001234) == 0x34120000 ? 1 : f(); diff --git a/clang/test/CodeGen/builtin-bswap128.c b/clang/test/CodeGen/builtin-bswap128.c new file mode 100644 index 0000000000000..c1304e3dd90fe --- /dev/null +++ b/clang/test/CodeGen/builtin-bswap128.c @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -triple x86_64-linux-gnu -no-enable-noundef-analysis -emit-llvm -o - %s | FileCheck %s + +#ifdef __SIZEOF_INT128__ +__uint128_t test_constexpr(void) { + return __builtin_bswap128(0x1234); +} + +// CHECK-LABEL: define{{.*}} i128 @test_constexpr() +// CHECK: ret i128 69213317124269252288311516068503879680 + +__uint128_t test_non_const(__uint128_t x) { + return __builtin_bswap128(x); +} + +// CHECK-LABEL: define{{.*}} i128 @test_non_const(i128 %x) +// CHECK: call i128 @llvm.bswap.i128(i128 %{{.*}}) +// CHECK: ret i128 +#endif diff --git a/clang/test/CodeGen/builtins.cpp b/clang/test/CodeGen/builtins.cpp index 575a8a11ca5b6..c0111b696a896 100644 --- a/clang/test/CodeGen/builtins.cpp +++ b/clang/test/CodeGen/builtins.cpp @@ -20,6 +20,10 @@ extern uint32_t bswap32; decltype(__builtin_bswap32(0)) bswap32 = 42; extern uint64_t bswap64; decltype(__builtin_bswap64(0)) bswap64 = 42; +#ifdef __SIZEOF_INT128__ +extern __uint128_t bswap128; +decltype(__builtin_bswap128(0)) bswap128 = 42; +#endif #ifdef __clang__ extern uint8_t bitrev8; diff --git a/clang/test/Sema/builtin-bswap128.c b/clang/test/Sema/builtin-bswap128.c new file mode 100644 index 0000000000000..f260341b0ade2 --- /dev/null +++ b/clang/test/Sema/builtin-bswap128.c @@ -0,0 +1,5 @@ +// RUN: %clang_cc1 -triple i686-linux-gnu -fsyntax-only -verify %s + +void test(void) { + __builtin_bswap128(1); // expected-error {{use of unknown builtin '__builtin_bswap128'}} +} diff --git a/clang/test/Sema/constant-builtins-2.c b/clang/test/Sema/constant-builtins-2.c index fd3643bbdb7c8..571fb6a2f17e5 100644 --- a/clang/test/Sema/constant-builtins-2.c +++ b/clang/test/Sema/constant-builtins-2.c @@ -479,6 +479,9 @@ int h0 = __builtin_types_compatible_p(int, float); int h3 = __builtin_bswap16(0x1234) == 0x3412 ? 1 : f(); int h4 = __builtin_bswap32(0x1234) == 0x34120000 ? 1 : f(); int h5 = __builtin_bswap64(0x1234) == 0x3412000000000000 ? 1 : f(); +#ifdef __SIZEOF_INT128__ +int h5b = __builtin_bswap128(0x1234) == (((__int128)0x3412) << 112) ? 1 : f(); +#endif int h5a = __builtin_bswapg((_Bool)(0x0)) == (_Bool)(0x0) ? 1 : f(); int h6 = __builtin_bswapg((char)(0x12)) == (char)(0x12) ? 1 : f(); int h7 = __builtin_bswapg((short)(0x1234)) == (short)(0x3412) ? 1 : f(); diff --git a/clang/test/Sema/constant-builtins.c b/clang/test/Sema/constant-builtins.c index 565547a16dde5..e63828970417e 100644 --- a/clang/test/Sema/constant-builtins.c +++ b/clang/test/Sema/constant-builtins.c @@ -25,6 +25,9 @@ int h0 = __builtin_types_compatible_p(int,float); int h3 = __builtin_bswap16(0x1234) == 0x3412 ? 1 : f(); int h4 = __builtin_bswap32(0x1234) == 0x34120000 ? 1 : f(); int h5 = __builtin_bswap64(0x1234) == 0x3412000000000000 ? 1 : f(); +#ifdef __SIZEOF_INT128__ +int h5b = __builtin_bswap128(0x1234) == (((__int128)0x3412) << 112) ? 1 : f(); +#endif int h5a = __builtin_bswapg((_Bool)1) == (_Bool)1 ? 1 : f(); int h6 = __builtin_bswapg((char)0x12) == (char)0x12 ? 1 : f(); int h7 = __builtin_bswapg((short)(0x1234)) == (short)(0x3412) ? 1 : f(); `````````` </details> https://github.com/llvm/llvm-project/pull/198172 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
