[llvm-branch-commits] [llvm] [AllocToken, Clang] Implement __builtin_alloc_token_infer() and llvm.alloc.token.id (PR #156842)

2025-09-11 Thread Marco Elver via llvm-branch-commits

https://github.com/melver updated 
https://github.com/llvm/llvm-project/pull/156842

>From 48227c8f7712b2dc807b252d18353c91905b1fb5 Mon Sep 17 00:00:00 2001
From: Marco Elver 
Date: Mon, 8 Sep 2025 17:19:04 +0200
Subject: [PATCH] fixup!

Created using spr 1.3.8-beta.1
---
 llvm/lib/Transforms/Instrumentation/AllocToken.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Transforms/Instrumentation/AllocToken.cpp 
b/llvm/lib/Transforms/Instrumentation/AllocToken.cpp
index d5ac3035df71b..3a28705d87523 100644
--- a/llvm/lib/Transforms/Instrumentation/AllocToken.cpp
+++ b/llvm/lib/Transforms/Instrumentation/AllocToken.cpp
@@ -151,7 +151,8 @@ STATISTIC(NumAllocations, "Allocations found");
 /// Expected format is: !{, }
 MDNode *getAllocTokenHintMetadata(const CallBase &CB) {
   MDNode *Ret = nullptr;
-  if (auto *II = dyn_cast(&CB)) {
+  if (auto *II = dyn_cast(&CB);
+  II && II->getIntrinsicID() == Intrinsic::alloc_token_id) {
 auto *MDV = cast(II->getArgOperand(0));
 Ret = cast(MDV->getMetadata());
 // If the intrinsic has an empty MDNode, type inference failed.
@@ -358,7 +359,7 @@ bool AllocToken::instrumentFunction(Function &F) {
   // Collect all allocation calls to avoid iterator invalidation.
   for (Instruction &I : instructions(F)) {
 // Collect all alloc_token_* intrinsics.
-if (IntrinsicInst *II = dyn_cast(&I);
+if (auto *II = dyn_cast(&I);
 II && II->getIntrinsicID() == Intrinsic::alloc_token_id) {
   IntrinsicInsts.emplace_back(II);
   continue;

___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [not] Update disable-symbolization.test to work with internal shell (PR #157236)

2025-09-11 Thread Aiden Grossman via llvm-branch-commits

https://github.com/boomanaiden154 updated 
https://github.com/llvm/llvm-project/pull/157236


___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [InstCombine] Set !prof metadata on selects (PR #157599)

2025-09-11 Thread Mircea Trofin via llvm-branch-commits

mtrofin wrote:

> TBH I don't think selects should be validated by profcheck at all, only 
> branches.

Some get lowered to branches later on - otherwise, yes, I'd also love to not 
worry about them.

https://github.com/llvm/llvm-project/pull/157599
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] release/21.x: [X86] Only fold AND/ANDNP back to VSELECT if we know the predicated mask select is legal (#156663) (PR #157047)

2025-09-11 Thread Tobias Hieta via llvm-branch-commits

https://github.com/tru updated https://github.com/llvm/llvm-project/pull/157047

>From 81d3b6ee82bfa49e4d7b7a03c0785fca4e820894 Mon Sep 17 00:00:00 2001
From: Simon Pilgrim 
Date: Wed, 3 Sep 2025 15:01:12 +0100
Subject: [PATCH] [X86] Only fold AND/ANDNP back to VSELECT if we know the
 predicated mask select is legal (#156663)

By only checking type legality we didn't account for 128/256-bit ops
being run on non-AVX512VL targets, or vXi8/i16 ops being run on
non-AVX512BW targets

This check is cropping up in several places now and I intend to hoist it
out into a common helper, but this initial fix needs to be as clean as
possible to be back ported to 21.X

Fixes #156256

(cherry picked from commit 86879d46f6476386dc07772ede83cd43b6ddd739)
---
 llvm/lib/Target/X86/X86ISelLowering.cpp |  4 
 llvm/test/CodeGen/X86/pr156256.ll   | 25 +
 2 files changed, 29 insertions(+)
 create mode 100644 llvm/test/CodeGen/X86/pr156256.ll

diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp 
b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 578519b1cc3c9..86877be48eca8 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -51775,6 +51775,8 @@ static SDValue combineAnd(SDNode *N, SelectionDAG &DAG,
 SDValue X, Y;
 EVT CondVT = VT.changeVectorElementType(MVT::i1);
 if (TLI.isTypeLegal(VT) && TLI.isTypeLegal(CondVT) &&
+(VT.is512BitVector() || Subtarget.hasVLX()) &&
+(VT.getScalarSizeInBits() >= 32 || Subtarget.hasBWI()) &&
 sd_match(N, m_And(m_Value(X),
   m_OneUse(m_SExt(m_AllOf(
   m_Value(Y), m_SpecificVT(CondVT),
@@ -55329,6 +55331,8 @@ static SDValue combineAndnp(SDNode *N, SelectionDAG 
&DAG,
 SDValue Src = N0.getOperand(0);
 EVT SrcVT = Src.getValueType();
 if (Src.getOpcode() == ISD::SETCC && SrcVT.getScalarType() == MVT::i1 &&
+(VT.is512BitVector() || Subtarget.hasVLX()) &&
+(VT.getScalarSizeInBits() >= 32 || Subtarget.hasBWI()) &&
 TLI.isTypeLegal(SrcVT) && N0.hasOneUse() && Src.hasOneUse())
   return DAG.getSelect(DL, VT, DAG.getNOT(DL, Src, SrcVT), N1,
getZeroVector(VT, Subtarget, DAG, DL));
diff --git a/llvm/test/CodeGen/X86/pr156256.ll 
b/llvm/test/CodeGen/X86/pr156256.ll
new file mode 100644
index 0..13caa6fee5878
--- /dev/null
+++ b/llvm/test/CodeGen/X86/pr156256.ll
@@ -0,0 +1,25 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 
UTC_ARGS: --version 5
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512dq | FileCheck %s 
--check-prefix=AVX512
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512dq,+avx512vl | 
FileCheck %s --check-prefix=AVX512VL
+
+define <16 x i16> @PR156256(<16 x i32> %a, <16 x i32> %b) {
+; AVX512-LABEL: PR156256:
+; AVX512:   # %bb.0:
+; AVX512-NEXT:vpcmpnleud %zmm1, %zmm0, %k0
+; AVX512-NEXT:vpmovm2d %k0, %zmm0
+; AVX512-NEXT:vpmovdw %zmm0, %ymm0
+; AVX512-NEXT:vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
+; AVX512-NEXT:retq
+;
+; AVX512VL-LABEL: PR156256:
+; AVX512VL:   # %bb.0:
+; AVX512VL-NEXT:vpcmpnleud %zmm1, %zmm0, %k0
+; AVX512VL-NEXT:vpmovm2d %k0, %zmm0
+; AVX512VL-NEXT:vpmovdw %zmm0, %ymm0
+; AVX512VL-NEXT:vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0
+; AVX512VL-NEXT:retq
+  %icmp = icmp ugt <16 x i32> %a, %b
+  %sext = sext <16 x i1> %icmp to <16 x i16>
+  %and = and <16 x i16> %sext, splat (i16 16256)
+  ret <16 x i16> %and
+}

___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] Add llvm.protected.field.ptr intrinsic and pre-ISel lowering. (PR #151647)

2025-09-11 Thread Peter Collingbourne via llvm-branch-commits

https://github.com/pcc updated https://github.com/llvm/llvm-project/pull/151647


___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [libcxx] 0bbb936 - [libc++] Fix broken precondition of __bit_log2 (#155476)

2025-09-11 Thread Tobias Hieta via llvm-branch-commits

Author: Louis Dionne
Date: 2025-09-09T10:33:32+02:00
New Revision: 0bbb93672952ea6d7fa7c06d084a69ffd623d7c8

URL: 
https://github.com/llvm/llvm-project/commit/0bbb93672952ea6d7fa7c06d084a69ffd623d7c8
DIFF: 
https://github.com/llvm/llvm-project/commit/0bbb93672952ea6d7fa7c06d084a69ffd623d7c8.diff

LOG: [libc++] Fix broken precondition of __bit_log2 (#155476)

In #135303, we started using `__bit_log2` instead of `__log2i` inside
`std::sort`. However, `__bit_log2` has a precondition that `__log2i`
didn't have, which is that the input is non-zero. While it technically
makes no sense to request the logarithm of 0, `__log2i` handled that
case and returned 0 without issues.

After switching to `__bit_log2`, passing 0 as an input results in an
unsigned integer overflow which can trigger
`-fsanitize=unsigned-integer-overflow`. While not technically UB in
itself, it's clearly not intended either.

To fix this, we add an internal assertion to `__bit_log2` which catches
the issue in our test suite, and we make sure not to violate
`__bit_log2`'s preconditions before we call it from `std::sort`.

(cherry picked from commit 2ae4b92a1cf01b7d09f70ccc919eca2b5d02b080)

Added: 


Modified: 
libcxx/include/__algorithm/sort.h
libcxx/include/__bit/bit_log2.h
libcxx/src/algorithm.cpp

Removed: 




diff  --git a/libcxx/include/__algorithm/sort.h 
b/libcxx/include/__algorithm/sort.h
index 06cb5b8ce7057..8aa894e9228c6 100644
--- a/libcxx/include/__algorithm/sort.h
+++ b/libcxx/include/__algorithm/sort.h
@@ -860,6 +860,9 @@ __sort<__less&, long double*>(long double*, 
long double*, __less
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void
 __sort_dispatch(_RandomAccessIterator __first, _RandomAccessIterator __last, 
_Comp& __comp) {
+  if (__first == __last) // log(0) is undefined, so don't try computing the 
depth
+return;
+
   typedef typename iterator_traits<_RandomAccessIterator>::
diff erence_type 
diff erence_type;
   
diff erence_type __depth_limit = 2 * 
std::__bit_log2(std::__to_unsigned_like(__last - __first));
 

diff  --git a/libcxx/include/__bit/bit_log2.h b/libcxx/include/__bit/bit_log2.h
index 8077cd91d6fd7..9ceeec1b2bc94 100644
--- a/libcxx/include/__bit/bit_log2.h
+++ b/libcxx/include/__bit/bit_log2.h
@@ -9,6 +9,7 @@
 #ifndef _LIBCPP___BIT_BIT_LOG2_H
 #define _LIBCPP___BIT_BIT_LOG2_H
 
+#include <__assert>
 #include <__bit/countl.h>
 #include <__config>
 #include <__type_traits/integer_traits.h>
@@ -23,6 +24,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
 template 
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp __bit_log2(_Tp __t) 
_NOEXCEPT {
   static_assert(__is_unsigned_integer_v<_Tp>, "__bit_log2 requires an unsigned 
integer type");
+  _LIBCPP_ASSERT_INTERNAL(__t != 0, "logarithm of 0 is undefined");
   return numeric_limits<_Tp>::digits - 1 - std::__countl_zero(__t);
 }
 

diff  --git a/libcxx/src/algorithm.cpp b/libcxx/src/algorithm.cpp
index d388fee5f99cc..8157be6f7406e 100644
--- a/libcxx/src/algorithm.cpp
+++ b/libcxx/src/algorithm.cpp
@@ -13,6 +13,9 @@ _LIBCPP_BEGIN_NAMESPACE_STD
 
 template 
 void __sort(RandomAccessIterator first, RandomAccessIterator last, Comp comp) {
+  if (first == last) // log(0) is undefined, so don't try computing the depth
+return;
+
   auto depth_limit = 2 * std::__bit_log2(static_cast(last - first));
 
   // Only use bitset partitioning for arithmetic types.  We should also check



___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [Xtensa] Fix lowering FP compare operations. (PR #157520)

2025-09-11 Thread Andrei Safronov via llvm-branch-commits

https://github.com/andreisfr created 
https://github.com/llvm/llvm-project/pull/157520

Implement lowering of the SETONE/SETOGT/SETOGE/SETUGT/SETUGE operations. This 
fixes f32 "copysign" and "ueq" tests.

>From dddc4b6181658586dcb8b56d9be8bdc4b2dca7ba Mon Sep 17 00:00:00 2001
From: Andrei Safronov 
Date: Wed, 3 Sep 2025 22:31:32 +0300
Subject: [PATCH] [Xtensa] Fix lowering FP compare operations.

Impelement lowering of the SETONE/SETOGT/SETOGE/SETUGT/SETUGE operations.
This fixes f32 "copysign" and "ueq" tests.
---
 llvm/lib/Target/Xtensa/XtensaISelLowering.cpp | 16 +
 llvm/test/CodeGen/Xtensa/select-cc-fp.ll  | 33 ++-
 2 files changed, 34 insertions(+), 15 deletions(-)

diff --git a/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp 
b/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp
index fd42fd2e010ba..f847ddb46af76 100644
--- a/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp
+++ b/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp
@@ -232,12 +232,6 @@ XtensaTargetLowering::XtensaTargetLowering(const 
TargetMachine &TM,
 setOperationAction(ISD::SINT_TO_FP, MVT::i32, Legal);
 setOperationAction(ISD::FP_TO_UINT, MVT::i32, Legal);
 setOperationAction(ISD::FP_TO_SINT, MVT::i32, Legal);
-
-setCondCodeAction(ISD::SETOGT, MVT::f32, Expand);
-setCondCodeAction(ISD::SETOGE, MVT::f32, Expand);
-setCondCodeAction(ISD::SETONE, MVT::f32, Expand);
-setCondCodeAction(ISD::SETUGE, MVT::f32, Expand);
-setCondCodeAction(ISD::SETUGT, MVT::f32, Expand);
   } else {
 setOperationAction(ISD::BITCAST, MVT::i32, Expand);
 setOperationAction(ISD::BITCAST, MVT::f32, Expand);
@@ -877,6 +871,16 @@ static std::pair 
getFPBranchKind(ISD::CondCode Cond) {
 return std::make_pair(Xtensa::BF, Xtensa::OLT_S);
   case ISD::SETGT:
 return std::make_pair(Xtensa::BF, Xtensa::OLE_S);
+  case ISD::SETOGT:
+return std::make_pair(Xtensa::BF, Xtensa::ULE_S);
+  case ISD::SETOGE:
+return std::make_pair(Xtensa::BF, Xtensa::ULT_S);
+  case ISD::SETONE:
+return std::make_pair(Xtensa::BF, Xtensa::UEQ_S);
+  case ISD::SETUGT:
+return std::make_pair(Xtensa::BF, Xtensa::OLE_S);
+  case ISD::SETUGE:
+return std::make_pair(Xtensa::BF, Xtensa::OLT_S);
   default:
 llvm_unreachable("Invalid condition!");
   }
diff --git a/llvm/test/CodeGen/Xtensa/select-cc-fp.ll 
b/llvm/test/CodeGen/Xtensa/select-cc-fp.ll
index ee45ef006123c..742770de23f37 100644
--- a/llvm/test/CodeGen/Xtensa/select-cc-fp.ll
+++ b/llvm/test/CodeGen/Xtensa/select-cc-fp.ll
@@ -103,8 +103,8 @@ define float @brcc_olt(float %a, float %b) nounwind {
 ; CHECK:   # %bb.0:
 ; CHECK-NEXT:wfr f8, a3
 ; CHECK-NEXT:wfr f9, a2
-; CHECK-NEXT:ule.s b0, f8, f9
-; CHECK-NEXT:bt b0, .LBB3_2
+; CHECK-NEXT:olt.s b0, f9, f8
+; CHECK-NEXT:bf b0, .LBB3_2
 ; CHECK-NEXT:  # %bb.1: # %t1
 ; CHECK-NEXT:l32r a8, .LCPI3_1
 ; CHECK-NEXT:wfr f8, a8
@@ -135,8 +135,8 @@ define float @brcc_ole(float %a, float %b) nounwind {
 ; CHECK:   # %bb.0:
 ; CHECK-NEXT:wfr f8, a3
 ; CHECK-NEXT:wfr f9, a2
-; CHECK-NEXT:ult.s b0, f8, f9
-; CHECK-NEXT:bt b0, .LBB4_2
+; CHECK-NEXT:ole.s b0, f9, f8
+; CHECK-NEXT:bf b0, .LBB4_2
 ; CHECK-NEXT:  # %bb.1: # %t1
 ; CHECK-NEXT:l32r a8, .LCPI4_1
 ; CHECK-NEXT:wfr f8, a8
@@ -232,7 +232,7 @@ define float @brcc_ueq(float %a, float %b) nounwind {
 ; CHECK-NEXT:wfr f8, a3
 ; CHECK-NEXT:wfr f9, a2
 ; CHECK-NEXT:ueq.s b0, f9, f8
-; CHECK-NEXT:bt b0, .LBB7_2
+; CHECK-NEXT:bf b0, .LBB7_2
 ; CHECK-NEXT:  # %bb.1: # %t1
 ; CHECK-NEXT:l32r a8, .LCPI7_1
 ; CHECK-NEXT:wfr f8, a8
@@ -327,8 +327,8 @@ define float @brcc_ult(float %a, float %b) nounwind {
 ; CHECK:   # %bb.0:
 ; CHECK-NEXT:wfr f8, a3
 ; CHECK-NEXT:wfr f9, a2
-; CHECK-NEXT:ole.s b0, f8, f9
-; CHECK-NEXT:bt b0, .LBB10_2
+; CHECK-NEXT:ult.s b0, f9, f8
+; CHECK-NEXT:bf b0, .LBB10_2
 ; CHECK-NEXT:  # %bb.1: # %t1
 ; CHECK-NEXT:l32r a8, .LCPI10_1
 ; CHECK-NEXT:wfr f8, a8
@@ -359,8 +359,8 @@ define float @brcc_ule(float %a, float %b) nounwind {
 ; CHECK:   # %bb.0:
 ; CHECK-NEXT:wfr f8, a3
 ; CHECK-NEXT:wfr f9, a2
-; CHECK-NEXT:olt.s b0, f8, f9
-; CHECK-NEXT:bt b0, .LBB11_2
+; CHECK-NEXT:ule.s b0, f9, f8
+; CHECK-NEXT:bf b0, .LBB11_2
 ; CHECK-NEXT:  # %bb.1: # %t1
 ; CHECK-NEXT:l32r a8, .LCPI11_1
 ; CHECK-NEXT:wfr f8, a8
@@ -451,6 +451,21 @@ exit:
 }
 
 define float @copysign_f32(float %a, float %b) {
+; CHECK-LABEL: copysign_f32:
+; CHECK: .cfi_startproc
+; CHECK-NEXT:  # %bb.0: # %entry
+; CHECK-NEXT:l32r a8, .LCPI14_0
+; CHECK-NEXT:and a8, a3, a8
+; CHECK-NEXT:l32r a9, .LCPI14_1
+; CHECK-NEXT:and a9, a2, a9
+; CHECK-NEXT:wfr f8, a9
+; CHECK-NEXT:movi a9, 0
+; CHECK-NEXT:beq a8, a9, .LBB14_2
+; CHECK-NEXT:  # %bb.1:
+; CHECK-NEXT:neg.s f8, f8
+; CHECK-NEXT:  .LBB14_2: # %entry
+; CHECK-NEXT:rfr a2, f8
+; CHECK-NEXT:ret
 entry:
   %c = call float @llvm.

[llvm-branch-commits] [llvm] [Offload] Add GenericPluginTy::get_mem_info (PR #157484)

2025-09-11 Thread Jan Patrick Lehr via llvm-branch-commits

https://github.com/jplehr commented:

I thought that the allocation would be done via the `MemoryManager` thing but I 
can be completely wrong.

https://github.com/llvm/llvm-project/pull/157484
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] release/21.x: [CMake][AIX] Enable CMP0182: Create shared library archives by default (#155686) (PR #156504)

2025-09-11 Thread Hubert Tong via llvm-branch-commits

https://github.com/hubert-reinterpretcast approved this pull request.

LGTM!

https://github.com/llvm/llvm-project/pull/156504
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [flang][do concurent] Add saxpy offload tests for OpenMP mapping (PR #155993)

2025-09-11 Thread Kareem Ergawy via llvm-branch-commits

https://github.com/ergawy edited 
https://github.com/llvm/llvm-project/pull/155993
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] [LifetimeSafety] Add support for GSL Pointer types (PR #154009)

2025-09-11 Thread Utkarsh Saxena via llvm-branch-commits

https://github.com/usx95 updated 
https://github.com/llvm/llvm-project/pull/154009

>From c41c73755ec7863d5fb90e3ff1eb62f0425e374e Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena 
Date: Thu, 4 Sep 2025 14:27:37 +
Subject: [PATCH 1/2] all-lvalues-have-origin


>From 9702347310809f432644b76b36668f2e5587d939 Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena 
Date: Sun, 17 Aug 2025 10:10:18 +
Subject: [PATCH 2/2] [LifetimeSafety] Track gsl::Pointer types

---
 clang/lib/Analysis/LifetimeSafety.cpp |  94 -
 clang/test/Sema/warn-lifetime-safety.cpp  | 120 +++-
 .../unittests/Analysis/LifetimeSafetyTest.cpp | 182 +-
 3 files changed, 381 insertions(+), 15 deletions(-)

diff --git a/clang/lib/Analysis/LifetimeSafety.cpp 
b/clang/lib/Analysis/LifetimeSafety.cpp
index e687e5419c50a..0dd5716d93fb6 100644
--- a/clang/lib/Analysis/LifetimeSafety.cpp
+++ b/clang/lib/Analysis/LifetimeSafety.cpp
@@ -478,6 +478,25 @@ class FactGenerator : public 
ConstStmtVisitor {
 }
   }
 
+  void VisitCXXConstructExpr(const CXXConstructExpr *CCE) {
+if (isGslPointerType(CCE->getType())) {
+  handleGSLPointerConstruction(CCE);
+  return;
+}
+  }
+
+  void VisitCXXMemberCallExpr(const CXXMemberCallExpr *MCE) {
+// Specifically for conversion operators,
+// like `std::string_view p = std::string{};`
+if (isGslPointerType(MCE->getType()) &&
+isa(MCE->getCalleeDecl())) {
+  // The argument is the implicit object itself.
+  handleFunctionCall(MCE, MCE->getMethodDecl(),
+ {MCE->getImplicitObjectArgument()});
+}
+// FIXME: A more general VisitCallExpr could also be used here.
+  }
+
   void VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *N) {
 /// TODO: Handle nullptr expr as a special 'null' loan. Uninitialized
 /// pointers can use the same type of loan.
@@ -530,8 +549,27 @@ class FactGenerator : public 
ConstStmtVisitor {
   void VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *FCE) {
 // Check if this is a test point marker. If so, we are done with this
 // expression.
-if (VisitTestPoint(FCE))
+if (handleTestPoint(FCE))
   return;
+if (isGslPointerType(FCE->getType()))
+  addAssignOriginFact(*FCE, *FCE->getSubExpr());
+  }
+
+  void VisitInitListExpr(const InitListExpr *ILE) {
+if (!hasOrigin(ILE))
+  return;
+// For list initialization with a single element, like `View{...}`, the
+// origin of the list itself is the origin of its single element.
+if (ILE->getNumInits() == 1)
+  addAssignOriginFact(*ILE, *ILE->getInit(0));
+  }
+
+  void VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *MTE) {
+if (!hasOrigin(MTE))
+  return;
+// A temporary object's origin is the same as the origin of the
+// expression that initializes it.
+addAssignOriginFact(*MTE, *MTE->getSubExpr());
   }
 
   void handleDestructor(const CFGAutomaticObjDtor &DtorOpt) {
@@ -557,10 +595,21 @@ class FactGenerator : public 
ConstStmtVisitor {
   }
 
 private:
-  static bool isPointerType(QualType QT) {
-return QT->isPointerOrReferenceType();
+  static bool isGslPointerType(QualType QT) {
+if (const auto *RD = QT->getAsCXXRecordDecl()) {
+  // We need to check the template definition for specializations.
+  if (auto *CTSD = dyn_cast(RD))
+return CTSD->getSpecializedTemplate()
+->getTemplatedDecl()
+->hasAttr();
+  return RD->hasAttr();
+}
+return false;
   }
 
+  static bool isPointerType(QualType QT) {
+return QT->isPointerOrReferenceType() || isGslPointerType(QT);
+  }
   // Check if a type has an origin.
   static bool hasOrigin(const Expr *E) {
 return E->isGLValue() || isPointerType(E->getType());
@@ -570,6 +619,41 @@ class FactGenerator : public 
ConstStmtVisitor {
 return isPointerType(VD->getType());
   }
 
+  void handleGSLPointerConstruction(const CXXConstructExpr *CCE) {
+assert(isGslPointerType(CCE->getType()));
+if (CCE->getNumArgs() != 1)
+  return;
+if (hasOrigin(CCE->getArg(0)))
+  addAssignOriginFact(*CCE, *CCE->getArg(0));
+else
+  // This could be a new borrow.
+  handleFunctionCall(CCE, CCE->getConstructor(),
+ {CCE->getArgs(), CCE->getNumArgs()});
+  }
+
+  /// Checks if a call-like expression creates a borrow by passing a value to a
+  /// reference parameter, creating an IssueFact if it does.
+  void handleFunctionCall(const Expr *Call, const FunctionDecl *FD,
+  ArrayRef Args) {
+if (!FD)
+  return;
+// TODO: Handle more than one arguments.
+for (unsigned I = 0; I <= 0 /*Args.size()*/; ++I) {
+  const Expr *ArgExpr = Args[I];
+
+  // Propagate origins for CXX this.
+  if (FD->isCXXClassMember() && I == 0) {
+addAssignOriginFact(*Call, *ArgExpr);
+continue;
+  }
+  // The parameter is a pointer, reference, or gsl::Pointe

[llvm-branch-commits] [llvm] [Offload] Add GenericPluginTy::get_mem_info (PR #157484)

2025-09-11 Thread Jan Patrick Lehr via llvm-branch-commits


@@ -517,6 +517,11 @@ struct GenELF64PluginTy final : public GenericPluginTy {
 #endif
   }
 
+  Expected get_memory_info(const void *TgtPtr) override {

jplehr wrote:

```suggestion
  Expected getMemoryInfo(const void *TgtPtr) override {
```

https://github.com/llvm/llvm-project/pull/157484
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [MC] Rewrite stdin.s to use python (PR #157232)

2025-09-11 Thread Petr Hosek via llvm-branch-commits


@@ -0,0 +1,17 @@
+# RUN: echo "// comment" > %t.input
+# RUN: which llvm-mc | %python %s %t
+
+import subprocess
+import sys
+
+llvm_mc_binary = sys.stdin.readlines()[0].strip()
+temp_file = sys.argv[1]

petrhosek wrote:

Shouldn't this be `sys.argv[2]`? `sys.argv[1]` is this file.

I'd consider making all arguments explicit and use `argparse` to avoid any 
confusion.

https://github.com/llvm/llvm-project/pull/157232
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits