https://github.com/tbaederr updated https://github.com/llvm/llvm-project/pull/68679
>From 9598f33926ede7a35a431bebc3ed6f8ce20b03ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Tue, 10 Oct 2023 08:52:43 +0200 Subject: [PATCH] [clang][Interp] Support AddOffset with 128bit offsets --- clang/lib/AST/Interp/Integral.h | 3 +++ clang/lib/AST/Interp/IntegralAP.h | 3 +++ clang/lib/AST/Interp/Interp.h | 4 ++-- clang/lib/AST/Interp/Opcodes.td | 13 +++++++++---- clang/test/AST/Interp/intap.cpp | 10 ++++++++++ 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/clang/lib/AST/Interp/Integral.h b/clang/lib/AST/Interp/Integral.h index 4dbe9c9bcb14b43..cc1cab8f39fb1e5 100644 --- a/clang/lib/AST/Interp/Integral.h +++ b/clang/lib/AST/Interp/Integral.h @@ -88,6 +88,9 @@ template <unsigned Bits, bool Signed> class Integral final { } Integral operator-() const { return Integral(-V); } + Integral operator-(const Integral &Other) const { + return Integral(V - Other.V); + } Integral operator~() const { return Integral(~V); } template <unsigned DstBits, bool DstSign> diff --git a/clang/lib/AST/Interp/IntegralAP.h b/clang/lib/AST/Interp/IntegralAP.h index f9a33bbcd7bd7fa..f17fb8e484415d2 100644 --- a/clang/lib/AST/Interp/IntegralAP.h +++ b/clang/lib/AST/Interp/IntegralAP.h @@ -59,6 +59,9 @@ template <bool Signed> class IntegralAP final { IntegralAP() : V(APSInt::getMaxValue(1024, Signed)) {} IntegralAP operator-() const { return IntegralAP(-V); } + IntegralAP operator-(const IntegralAP &Other) const { + return IntegralAP(V - Other.V); + } bool operator>(IntegralAP RHS) const { return V > RHS.V; } bool operator>=(IntegralAP RHS) const { return V >= RHS.V; } bool operator<(IntegralAP RHS) const { return V < RHS.V; } diff --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h index 1ad3b8bfc7711d3..e3e6a4cec63b194 100644 --- a/clang/lib/AST/Interp/Interp.h +++ b/clang/lib/AST/Interp/Interp.h @@ -1421,7 +1421,7 @@ bool OffsetHelper(InterpState &S, CodePtr OpPC, const T &Offset, // Get a version of the index comparable to the type. T Index = T::from(Ptr.getIndex(), Offset.bitWidth()); // Compute the largest index into the array. - unsigned MaxIndex = Ptr.getNumElems(); + T MaxIndex = T::from(Ptr.getNumElems(), Offset.bitWidth()); // Helper to report an invalid offset, computed as APSInt. auto InvalidOffset = [&]() { @@ -1437,7 +1437,7 @@ bool OffsetHelper(InterpState &S, CodePtr OpPC, const T &Offset, return false; }; - unsigned MaxOffset = MaxIndex - Ptr.getIndex(); + T MaxOffset = T::from(MaxIndex - Index, Offset.bitWidth()); if constexpr (Op == ArithOp::Add) { // If the new offset would be negative, bail out. if (Offset.isNegative() && (Offset.isMin() || -Offset > Index)) diff --git a/clang/lib/AST/Interp/Opcodes.td b/clang/lib/AST/Interp/Opcodes.td index 9d390fed152417f..12f14597d518a99 100644 --- a/clang/lib/AST/Interp/Opcodes.td +++ b/clang/lib/AST/Interp/Opcodes.td @@ -128,6 +128,11 @@ class AluOpcode : Opcode { let HasGroup = 1; } +class OffsetOpcode : Opcode { + let Types = [IntegerTypeClass]; + let HasGroup = 1; +} + class FloatOpcode : Opcode { let Types = []; let Args = [ArgRoundingMode]; @@ -338,8 +343,8 @@ def NarrowPtr : Opcode; // [Pointer] -> [Pointer] def ExpandPtr : Opcode; // [Pointer, Offset] -> [Pointer] -def ArrayElemPtr : AluOpcode; -def ArrayElemPtrPop : AluOpcode; +def ArrayElemPtr : OffsetOpcode; +def ArrayElemPtrPop : OffsetOpcode; //===----------------------------------------------------------------------===// // Direct field accessors @@ -465,9 +470,9 @@ def InitElemPop : Opcode { //===----------------------------------------------------------------------===// // [Pointer, Integral] -> [Pointer] -def AddOffset : AluOpcode; +def AddOffset : OffsetOpcode; // [Pointer, Integral] -> [Pointer] -def SubOffset : AluOpcode; +def SubOffset : OffsetOpcode; // [Pointer, Pointer] -> [Integral] def SubPtr : Opcode { diff --git a/clang/test/AST/Interp/intap.cpp b/clang/test/AST/Interp/intap.cpp index 8fe65a69a4fee8d..f9cbc698a3290d8 100644 --- a/clang/test/AST/Interp/intap.cpp +++ b/clang/test/AST/Interp/intap.cpp @@ -90,4 +90,14 @@ namespace i128 { // expected-error {{must be initialized by a constant expression}} \ // expected-note {{is outside the range of representable values of type}} } + +namespace AddSubOffset { + constexpr __int128 A = 1; + constexpr int arr[] = {1,2,3}; + constexpr const int *P = arr + A; + static_assert(*P == 2, ""); + constexpr const int *P2 = P - A; + static_assert(*P2 == 1,""); +} + #endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits