[llvm-branch-commits] [llvm] dc041f7 - Revert "Revert "[MachinePipeliner] Fix constraints aren't considered in certa…"

2024-07-01 Thread via llvm-branch-commits

Author: Ryotaro KASUGA
Date: 2024-07-01T16:06:24+09:00
New Revision: dc041f77964ed3a93bae5568e18f9186acc265b4

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

LOG: Revert "Revert "[MachinePipeliner] Fix constraints aren't considered in 
certa…"

This reverts commit e6a961dbef773b16bda2cebc4bf9f3d1e0da42fc.

Added: 
llvm/test/CodeGen/AArch64/sms-instruction-scheduled-at-correct-cycle.mir

Modified: 
llvm/include/llvm/CodeGen/MachinePipeliner.h
llvm/lib/CodeGen/MachinePipeliner.cpp

Removed: 




diff  --git a/llvm/include/llvm/CodeGen/MachinePipeliner.h 
b/llvm/include/llvm/CodeGen/MachinePipeliner.h
index 94913f534fb77..7fe5581faa183 100644
--- a/llvm/include/llvm/CodeGen/MachinePipeliner.h
+++ b/llvm/include/llvm/CodeGen/MachinePipeliner.h
@@ -599,8 +599,8 @@ class SMSchedule {
   /// chain.
   int latestCycleInChain(const SDep &Dep);
 
-  void computeStart(SUnit *SU, int *MaxEarlyStart, int *MinLateStart,
-int *MinEnd, int *MaxStart, int II, SwingSchedulerDAG 
*DAG);
+  void computeStart(SUnit *SU, int *MaxEarlyStart, int *MinLateStart, int II,
+SwingSchedulerDAG *DAG);
   bool insert(SUnit *SU, int StartCycle, int EndCycle, int II);
 
   /// Iterators for the cycle to instruction map.
@@ -658,6 +658,9 @@ class SMSchedule {
   bool isLoopCarried(const SwingSchedulerDAG *SSD, MachineInstr &Phi) const;
   bool isLoopCarriedDefOfUse(const SwingSchedulerDAG *SSD, MachineInstr *Def,
  MachineOperand &MO) const;
+
+  bool onlyHasLoopCarriedOutputOrOrderPreds(SUnit *SU,
+SwingSchedulerDAG *DAG) const;
   void print(raw_ostream &os) const;
   void dump() const;
 };

diff  --git a/llvm/lib/CodeGen/MachinePipeliner.cpp 
b/llvm/lib/CodeGen/MachinePipeliner.cpp
index 7ff14a6cf36bf..515c7f89b4bed 100644
--- a/llvm/lib/CodeGen/MachinePipeliner.cpp
+++ b/llvm/lib/CodeGen/MachinePipeliner.cpp
@@ -2461,47 +2461,43 @@ bool SwingSchedulerDAG::schedulePipeline(SMSchedule 
&Schedule) {
   // upon the scheduled time for any predecessors/successors.
   int EarlyStart = INT_MIN;
   int LateStart = INT_MAX;
-  // These values are set when the size of the schedule window is limited
-  // due to chain dependences.
-  int SchedEnd = INT_MAX;
-  int SchedStart = INT_MIN;
-  Schedule.computeStart(SU, &EarlyStart, &LateStart, &SchedEnd, 
&SchedStart,
-II, this);
+  Schedule.computeStart(SU, &EarlyStart, &LateStart, II, this);
   LLVM_DEBUG({
 dbgs() << "\n";
 dbgs() << "Inst (" << SU->NodeNum << ") ";
 SU->getInstr()->dump();
 dbgs() << "\n";
   });
-  LLVM_DEBUG({
-dbgs() << format("\tes: %8x ls: %8x me: %8x ms: %8x\n", EarlyStart,
- LateStart, SchedEnd, SchedStart);
-  });
+  LLVM_DEBUG(
+  dbgs() << format("\tes: %8x ls: %8x\n", EarlyStart, LateStart));
 
-  if (EarlyStart > LateStart || SchedEnd < EarlyStart ||
-  SchedStart > LateStart)
+  if (EarlyStart > LateStart)
 scheduleFound = false;
-  else if (EarlyStart != INT_MIN && LateStart == INT_MAX) {
-SchedEnd = std::min(SchedEnd, EarlyStart + (int)II - 1);
-scheduleFound = Schedule.insert(SU, EarlyStart, SchedEnd, II);
-  } else if (EarlyStart == INT_MIN && LateStart != INT_MAX) {
-SchedStart = std::max(SchedStart, LateStart - (int)II + 1);
-scheduleFound = Schedule.insert(SU, LateStart, SchedStart, II);
-  } else if (EarlyStart != INT_MIN && LateStart != INT_MAX) {
-SchedEnd =
-std::min(SchedEnd, std::min(LateStart, EarlyStart + (int)II - 1));
-// When scheduling a Phi it is better to start at the late cycle and go
-// backwards. The default order may insert the Phi too far away from
-// its first dependence.
-if (SU->getInstr()->isPHI())
-  scheduleFound = Schedule.insert(SU, SchedEnd, EarlyStart, II);
+  else if (EarlyStart != INT_MIN && LateStart == INT_MAX)
+scheduleFound =
+Schedule.insert(SU, EarlyStart, EarlyStart + (int)II - 1, II);
+  else if (EarlyStart == INT_MIN && LateStart != INT_MAX)
+scheduleFound =
+Schedule.insert(SU, LateStart, LateStart - (int)II + 1, II);
+  else if (EarlyStart != INT_MIN && LateStart != INT_MAX) {
+LateStart = std::min(LateStart, EarlyStart + (int)II - 1);
+// When scheduling a Phi it is better to start at the late cycle and
+// go backwards. The default order may insert the Phi too far away
+// from its first dependence.
+// Also, do backward search when all scheduled predecessors are
+// loop-carried output/order depe

[llvm-branch-commits] [llvm] [AMDGPU] Enable atomic optimizer for 64 bit divergent values (PR #96934)

2024-07-01 Thread Vikram Hegde via llvm-branch-commits


@@ -178,6 +178,20 @@ bool AMDGPUAtomicOptimizerImpl::run(Function &F) {
   return Changed;
 }
 
+static bool shouldOptimizeForType(Type *Ty) {

vikramRH wrote:

Any better suggestions ?

https://github.com/llvm/llvm-project/pull/96934
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [AMDGPU] Enable atomic optimizer for divergent i64 and double values (PR #96934)

2024-07-01 Thread Vikram Hegde via llvm-branch-commits

https://github.com/vikramRH edited 
https://github.com/llvm/llvm-project/pull/96934
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [AMDGPU] Enable atomic optimizer for divergent i64 and double values (PR #96934)

2024-07-01 Thread Vikram Hegde via llvm-branch-commits


@@ -178,6 +178,20 @@ bool AMDGPUAtomicOptimizerImpl::run(Function &F) {
   return Changed;
 }
 
+static bool shouldOptimizeForType(Type *Ty) {
+  switch (Ty->getTypeID()) {
+  case Type::FloatTyID:
+  case Type::DoubleTyID:
+return true;
+  case Type::IntegerTyID: {
+if (Ty->getIntegerBitWidth() == 32 || Ty->getIntegerBitWidth() == 64)
+  return true;
+  default:

vikramRH wrote:

I feel pointers should be handled as a follow up too since I intend this patch 
to reflect current requirements (changed the title since it was misleading)

https://github.com/llvm/llvm-project/pull/96934
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [AMDGPU] Enable atomic optimizer for divergent i64 and double values (PR #96934)

2024-07-01 Thread Vikram Hegde via llvm-branch-commits


@@ -178,6 +178,20 @@ bool AMDGPUAtomicOptimizerImpl::run(Function &F) {
   return Changed;
 }
 
+static bool shouldOptimizeForType(Type *Ty) {
+  switch (Ty->getTypeID()) {
+  case Type::FloatTyID:
+  case Type::DoubleTyID:
+return true;
+  case Type::IntegerTyID: {
+if (Ty->getIntegerBitWidth() == 32 || Ty->getIntegerBitWidth() == 64)
+  return true;
+  default:

vikramRH wrote:

Also enabling for half, bfloat etc would require additional legalization 
support for intrinsics such as update.dpp , set.incactive.lane 

https://github.com/llvm/llvm-project/pull/96934
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [AMDGPU] Enable atomic optimizer for divergent i64 and double values (PR #96934)

2024-07-01 Thread Pravin Jagtap via llvm-branch-commits


@@ -178,6 +178,21 @@ bool AMDGPUAtomicOptimizerImpl::run(Function &F) {
   return Changed;
 }
 
+static bool isOptimizableAtomic(Type *Ty) {
+  switch (Ty->getTypeID()) {
+  case Type::FloatTyID:
+  case Type::DoubleTyID:
+return true;
+  case Type::IntegerTyID: {
+unsigned size = Ty->getIntegerBitWidth();
+if (size == 32 || size == 64)

pravinjagtap wrote:

just 
```
return (TyBitWidth == 32 || TyBitWidth == 64)
```
?

https://github.com/llvm/llvm-project/pull/96934
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [flang] [Flang][OpenMP] Update flang with changes to the OpenMP dialect (PR #92524)

2024-07-01 Thread Sergio Afonso via llvm-branch-commits

https://github.com/skatrak updated 
https://github.com/llvm/llvm-project/pull/92524

>From 95d6f3446201d2b3162b694887e3fd888b628e96 Mon Sep 17 00:00:00 2001
From: Sergio Afonso 
Date: Fri, 17 May 2024 11:38:36 +0100
Subject: [PATCH] [Flang][OpenMP] Update flang with changes to the OpenMP
 dialect

This patch applies fixes after the updates to OpenMP clause operands, as well
as updating some tests that were impacted by changes to the ordering or
assembly format of some clauses in MLIR.
---
 flang/lib/Lower/OpenMP/ClauseProcessor.cpp|  4 ++--
 flang/lib/Lower/OpenMP/ClauseProcessor.h  |  4 ++--
 flang/lib/Lower/OpenMP/OpenMP.cpp | 19 ---
 flang/test/Lower/OpenMP/atomic-capture.f90|  2 +-
 flang/test/Lower/OpenMP/copyin-order.f90  |  2 +-
 flang/test/Lower/OpenMP/parallel-wsloop.f90   |  2 +-
 flang/test/Lower/OpenMP/parallel.f90  | 24 +--
 flang/test/Lower/OpenMP/simd.f90  |  2 +-
 flang/test/Lower/OpenMP/target.f90| 24 +--
 .../use-device-ptr-to-use-device-addr.f90 |  2 +-
 10 files changed, 43 insertions(+), 42 deletions(-)

diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp 
b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
index f78cd0f9df1a1..d507e58b164dd 100644
--- a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
+++ b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
@@ -1073,7 +1073,7 @@ bool ClauseProcessor::processEnter(
 }
 
 bool ClauseProcessor::processUseDeviceAddr(
-mlir::omp::UseDeviceClauseOps &result,
+mlir::omp::UseDeviceAddrClauseOps &result,
 llvm::SmallVectorImpl &useDeviceTypes,
 llvm::SmallVectorImpl &useDeviceLocs,
 llvm::SmallVectorImpl &useDeviceSyms) const {
@@ -1085,7 +1085,7 @@ bool ClauseProcessor::processUseDeviceAddr(
 }
 
 bool ClauseProcessor::processUseDevicePtr(
-mlir::omp::UseDeviceClauseOps &result,
+mlir::omp::UseDevicePtrClauseOps &result,
 llvm::SmallVectorImpl &useDeviceTypes,
 llvm::SmallVectorImpl &useDeviceLocs,
 llvm::SmallVectorImpl &useDeviceSyms) const {
diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.h 
b/flang/lib/Lower/OpenMP/ClauseProcessor.h
index 53571ae5abc20..43795d5c25399 100644
--- a/flang/lib/Lower/OpenMP/ClauseProcessor.h
+++ b/flang/lib/Lower/OpenMP/ClauseProcessor.h
@@ -129,12 +129,12 @@ class ClauseProcessor {
 mlir::omp::ReductionClauseOps &result) const;
   bool processTo(llvm::SmallVectorImpl &result) 
const;
   bool processUseDeviceAddr(
-  mlir::omp::UseDeviceClauseOps &result,
+  mlir::omp::UseDeviceAddrClauseOps &result,
   llvm::SmallVectorImpl &useDeviceTypes,
   llvm::SmallVectorImpl &useDeviceLocs,
   llvm::SmallVectorImpl &useDeviceSyms) const;
   bool processUseDevicePtr(
-  mlir::omp::UseDeviceClauseOps &result,
+  mlir::omp::UseDevicePtrClauseOps &result,
   llvm::SmallVectorImpl &useDeviceTypes,
   llvm::SmallVectorImpl &useDeviceLocs,
   llvm::SmallVectorImpl &useDeviceSyms) const;
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp 
b/flang/lib/Lower/OpenMP/OpenMP.cpp
index 22c41fce31723..d8679fb693659 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -244,7 +244,8 @@ createAndSetPrivatizedLoopVar(lower::AbstractConverter 
&converter,
 //  clause. Support for such list items in a use_device_ptr clause
 //  is deprecated."
 static void promoteNonCPtrUseDevicePtrArgsToUseDeviceAddr(
-mlir::omp::UseDeviceClauseOps &clauseOps,
+llvm::SmallVectorImpl &useDeviceAddrVars,
+llvm::SmallVectorImpl &useDevicePtrVars,
 llvm::SmallVectorImpl &useDeviceTypes,
 llvm::SmallVectorImpl &useDeviceLocs,
 llvm::SmallVectorImpl &useDeviceSymbols) {
@@ -256,10 +257,9 @@ static void promoteNonCPtrUseDevicePtrArgsToUseDeviceAddr(
 
   // Iterate over our use_device_ptr list and shift all non-cptr arguments into
   // use_device_addr.
-  for (auto *it = clauseOps.useDevicePtrVars.begin();
-   it != clauseOps.useDevicePtrVars.end();) {
+  for (auto *it = useDevicePtrVars.begin(); it != useDevicePtrVars.end();) {
 if (!fir::isa_builtin_cptr_type(fir::unwrapRefType(it->getType( {
-  clauseOps.useDeviceAddrVars.push_back(*it);
+  useDeviceAddrVars.push_back(*it);
   // We have to shuffle the symbols around as well, to maintain
   // the correct Input -> BlockArg for use_device_ptr/use_device_addr.
   // NOTE: However, as map's do not seem to be included currently
@@ -267,11 +267,11 @@ static void promoteNonCPtrUseDevicePtrArgsToUseDeviceAddr(
   // future alterations. I believe the reason they are not currently
   // is that the BlockArg assign/lowering needs to be extended
   // to a greater set of types.
-  auto idx = std::distance(clauseOps.useDevicePtrVars.begin(), it);
+  auto idx = std::distance(useDevicePtrVars.begin(), it);
   moveElementToBack(idx, useDeviceTypes);
   moveElementToBack(idx, useDeviceLocs);
   moveEl

[llvm-branch-commits] [llvm] DAG: Call SimplifyDemandedBits on fcopysign sign value (PR #97151)

2024-07-01 Thread Jay Foad via llvm-branch-commits

https://github.com/jayfoad edited 
https://github.com/llvm/llvm-project/pull/97151
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] DAG: Call SimplifyDemandedBits on fcopysign sign value (PR #97151)

2024-07-01 Thread Jay Foad via llvm-branch-commits


@@ -17565,6 +17565,12 @@ SDValue DAGCombiner::visitFCOPYSIGN(SDNode *N) {
   if (CanCombineFCOPYSIGN_EXTEND_ROUND(N))
 return DAG.getNode(ISD::FCOPYSIGN, SDLoc(N), VT, N0, N1.getOperand(0));
 
+  // We only take the sign bit from the sign operand.
+  EVT SignVT = N1.getValueType();
+  if (SimplifyDemandedBits(N1,

jayfoad wrote:

I think this should be able to subsume some of the optimizations above, e.g. 
`copysign(x, abs(y)) -> abs(x)` would fall out if SimplifyDemandedBits knew 
about extracting the sign bit from `abs(x)`.

https://github.com/llvm/llvm-project/pull/97151
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] DAG: Call SimplifyDemandedBits on fcopysign sign value (PR #97151)

2024-07-01 Thread Jay Foad via llvm-branch-commits

https://github.com/jayfoad approved this pull request.

LGTM

https://github.com/llvm/llvm-project/pull/97151
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] DAG: Call SimplifyDemandedBits on fcopysign sign value (PR #97151)

2024-07-01 Thread Matt Arsenault via llvm-branch-commits

arsenm wrote:

### Merge activity

* **Jul 1, 6:08 AM EDT**: @arsenm started a stack merge that includes this pull 
request via 
[Graphite](https://app.graphite.dev/github/pr/llvm/llvm-project/97151).


https://github.com/llvm/llvm-project/pull/97151
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] DAG: Call SimplifyDemandedBits on copysign value operand (PR #97180)

2024-07-01 Thread Matt Arsenault via llvm-branch-commits

arsenm wrote:

### Merge activity

* **Jul 1, 6:08 AM EDT**: @arsenm started a stack merge that includes this pull 
request via 
[Graphite](https://app.graphite.dev/github/pr/llvm/llvm-project/97180).


https://github.com/llvm/llvm-project/pull/97180
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [AMDGPU] Enable atomic optimizer for divergent i64 and double values (PR #96934)

2024-07-01 Thread Jay Foad via llvm-branch-commits


@@ -313,8 +327,7 @@ void 
AMDGPUAtomicOptimizerImpl::visitIntrinsicInst(IntrinsicInst &I) {
   // value to the atomic calculation. We can only optimize divergent values if
   // we have DPP available on our subtarget, and the atomic operation is 32
   // bits.
-  if (ValDivergent &&
-  (!ST->hasDPP() || DL->getTypeSizeInBits(I.getType()) != 32)) {
+  if (ValDivergent && (!ST->hasDPP() || !isOptimizableAtomic(I.getType( {

jayfoad wrote:

Same here.

https://github.com/llvm/llvm-project/pull/96934
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [AMDGPU] Enable atomic optimizer for divergent i64 and double values (PR #96934)

2024-07-01 Thread Jay Foad via llvm-branch-commits


@@ -230,8 +245,7 @@ void 
AMDGPUAtomicOptimizerImpl::visitAtomicRMWInst(AtomicRMWInst &I) {
   // value to the atomic calculation. We can only optimize divergent values if
   // we have DPP available on our subtarget, and the atomic operation is 32
   // bits.
-  if (ValDivergent &&
-  (!ST->hasDPP() || DL->getTypeSizeInBits(I.getType()) != 32)) {
+  if (ValDivergent && (!ST->hasDPP() || !isOptimizableAtomic(I.getType( {

jayfoad wrote:

Pre-existing problem: this `hasDPP` check is in the wrong place. It should only 
be tested if we're using the DPP strategy.

https://github.com/llvm/llvm-project/pull/96934
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [AMDGPU] Enable atomic optimizer for divergent i64 and double values (PR #96934)

2024-07-01 Thread Jay Foad via llvm-branch-commits


@@ -178,6 +178,21 @@ bool AMDGPUAtomicOptimizerImpl::run(Function &F) {
   return Changed;
 }
 
+static bool isOptimizableAtomic(Type *Ty) {
+  switch (Ty->getTypeID()) {
+  case Type::FloatTyID:
+  case Type::DoubleTyID:
+return true;
+  case Type::IntegerTyID: {
+unsigned size = Ty->getIntegerBitWidth();

jayfoad wrote:

```suggestion
unsigned Size = Ty->getIntegerBitWidth();
```

https://github.com/llvm/llvm-project/pull/96934
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [AMDGPU] Enable atomic optimizer for divergent i64 and double values (PR #96934)

2024-07-01 Thread Jay Foad via llvm-branch-commits

jayfoad wrote:

> [AMDGPU] Enable atomic optimizer for divergent i64 and double values

Needs some i64 tests

https://github.com/llvm/llvm-project/pull/96934
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [AMDGPU][SILoadStoreOptimizer] Merge constrained sloads (PR #96162)

2024-07-01 Thread Jay Foad via llvm-branch-commits


@@ -1700,19 +1725,30 @@ unsigned SILoadStoreOptimizer::getNewOpcode(const 
CombineInfo &CI,
 case 8:
   return AMDGPU::S_BUFFER_LOAD_DWORDX8_SGPR_IMM;
 }
-  case S_LOAD_IMM:
+  case S_LOAD_IMM: {
+// If XNACK is enabled, use the constrained opcodes when the first load is
+// under-aligned.
+const MachineMemOperand *MMO = *CI.I->memoperands_begin();
+auto NeedsConstrainedOpc = [&MMO, Width](const GCNSubtarget &ST) {
+  return ST.isXNACKEnabled() && MMO->getAlign().value() < Width;

jayfoad wrote:

This doesn't look right since `Width` is in units of dwords here.

https://github.com/llvm/llvm-project/pull/96162
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [AMDGPU][SILoadStoreOptimizer] Merge constrained sloads (PR #96162)

2024-07-01 Thread Jay Foad via llvm-branch-commits


@@ -1212,8 +1228,17 @@ void SILoadStoreOptimizer::copyToDestRegs(
 
   // Copy to the old destination registers.
   const MCInstrDesc &CopyDesc = TII->get(TargetOpcode::COPY);
-  const auto *Dest0 = TII->getNamedOperand(*CI.I, OpName);
-  const auto *Dest1 = TII->getNamedOperand(*Paired.I, OpName);
+  auto *Dest0 = TII->getNamedOperand(*CI.I, OpName);
+  auto *Dest1 = TII->getNamedOperand(*Paired.I, OpName);
+
+  // The constrained sload instructions in S_LOAD_IMM class will have
+  // `early-clobber` flag in the dst operand. Remove the flag before using the
+  // MOs in copies.
+  if (Dest0->isEarlyClobber())
+Dest0->setIsEarlyClobber(false);
+
+  if (Dest1->isEarlyClobber())
+Dest1->setIsEarlyClobber(false);

jayfoad wrote:

```suggestion
  Dest0->setIsEarlyClobber(false);
  Dest1->setIsEarlyClobber(false);
```

https://github.com/llvm/llvm-project/pull/96162
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [AMDGPU][SILoadStoreOptimizer] Merge constrained sloads (PR #96162)

2024-07-01 Thread Jay Foad via llvm-branch-commits


@@ -1700,19 +1725,30 @@ unsigned SILoadStoreOptimizer::getNewOpcode(const 
CombineInfo &CI,
 case 8:
   return AMDGPU::S_BUFFER_LOAD_DWORDX8_SGPR_IMM;
 }
-  case S_LOAD_IMM:
+  case S_LOAD_IMM: {
+// If XNACK is enabled, use the constrained opcodes when the first load is
+// under-aligned.
+const MachineMemOperand *MMO = *CI.I->memoperands_begin();
+auto NeedsConstrainedOpc = [&MMO, Width](const GCNSubtarget &ST) {

jayfoad wrote:

This doesn't need to be a lambda. It is always called, with identical 
arguments. Just calculate the result as a `bool` here.

https://github.com/llvm/llvm-project/pull/96162
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [AMDGPU] Codegen support for constrained multi-dword sloads (PR #96163)

2024-07-01 Thread Jay Foad via llvm-branch-commits


@@ -867,13 +867,61 @@ def SMRDBufferImm   : ComplexPattern;
 def SMRDBufferImm32 : ComplexPattern;
 def SMRDBufferSgprImm : ComplexPattern;
 
+class SMRDAlignedLoadPat : PatFrag <(ops node:$ptr), (Op 
node:$ptr), [{
+  // Ignore the alignment check if XNACK support is disabled.
+  if (!Subtarget->isXNACKEnabled())
+return true;
+
+  // Returns true if it is a naturally aligned multi-dword load.
+  LoadSDNode *Ld = cast(N);
+  unsigned Size = Ld->getMemoryVT().getStoreSize();
+  return Size <= 4 || Ld->getAlign().value() >= Size;
+}]> {
+  let GISelPredicateCode = [{
+  if (!Subtarget->isXNACKEnabled())
+return true;
+
+  auto &Ld = cast(MI);
+  TypeSize Size = Ld.getMMO().getSize().getValue();
+  return Size <= 4 || Ld.getMMO().getAlign().value() >= Size;
+  }];
+}
+
+class SMRDUnalignedLoadPat : PatFrag <(ops node:$ptr), (Op 
node:$ptr), [{
+  // Do the alignment check if XNACK support is enabled.
+  if (!Subtarget->isXNACKEnabled())
+return false;
+
+  // Returns true if it is an under aligned multi-dword load.
+  LoadSDNode *Ld = cast(N);
+  unsigned Size = Ld->getMemoryVT().getStoreSize();
+  return Size > 4 && (Ld->getAlign().value() < Size);

jayfoad wrote:

Don't need the parens

https://github.com/llvm/llvm-project/pull/96163
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [AMDGPU] Codegen support for constrained multi-dword sloads (PR #96163)

2024-07-01 Thread Jay Foad via llvm-branch-commits


@@ -867,13 +867,61 @@ def SMRDBufferImm   : ComplexPattern;
 def SMRDBufferImm32 : ComplexPattern;
 def SMRDBufferSgprImm : ComplexPattern;
 
+class SMRDAlignedLoadPat : PatFrag <(ops node:$ptr), (Op 
node:$ptr), [{
+  // Ignore the alignment check if XNACK support is disabled.
+  if (!Subtarget->isXNACKEnabled())
+return true;
+
+  // Returns true if it is a naturally aligned multi-dword load.

jayfoad wrote:

... or if it's a non-multi-dword load.

https://github.com/llvm/llvm-project/pull/96163
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [AMDGPU] Codegen support for constrained multi-dword sloads (PR #96163)

2024-07-01 Thread Jay Foad via llvm-branch-commits


@@ -867,13 +867,61 @@ def SMRDBufferImm   : ComplexPattern;
 def SMRDBufferImm32 : ComplexPattern;
 def SMRDBufferSgprImm : ComplexPattern;
 
+class SMRDAlignedLoadPat : PatFrag <(ops node:$ptr), (Op 
node:$ptr), [{
+  // Ignore the alignment check if XNACK support is disabled.
+  if (!Subtarget->isXNACKEnabled())
+return true;
+
+  // Returns true if it is a naturally aligned multi-dword load.
+  LoadSDNode *Ld = cast(N);
+  unsigned Size = Ld->getMemoryVT().getStoreSize();
+  return Size <= 4 || Ld->getAlign().value() >= Size;
+}]> {
+  let GISelPredicateCode = [{
+  if (!Subtarget->isXNACKEnabled())
+return true;
+
+  auto &Ld = cast(MI);
+  TypeSize Size = Ld.getMMO().getSize().getValue();
+  return Size <= 4 || Ld.getMMO().getAlign().value() >= Size;
+  }];
+}
+
+class SMRDUnalignedLoadPat : PatFrag <(ops node:$ptr), (Op 
node:$ptr), [{
+  // Do the alignment check if XNACK support is enabled.
+  if (!Subtarget->isXNACKEnabled())
+return false;
+
+  // Returns true if it is an under aligned multi-dword load.
+  LoadSDNode *Ld = cast(N);
+  unsigned Size = Ld->getMemoryVT().getStoreSize();
+  return Size > 4 && (Ld->getAlign().value() < Size);
+}]> {
+  let GISelPredicateCode = [{
+  if (!Subtarget->isXNACKEnabled())
+return false;
+
+  auto &Ld = cast(MI);
+  TypeSize Size = Ld.getMMO().getSize().getValue();
+  return Size > 4 && (Ld.getMMO().getAlign().value() < Size);

jayfoad wrote:

Don't need the parens

https://github.com/llvm/llvm-project/pull/96163
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [mlir] [mlir][linalg] Implement TilingInterface for winograd operators (PR #96184)

2024-07-01 Thread Hsiangkai Wang via llvm-branch-commits


@@ -2760,6 +2760,89 @@ LogicalResult WinogradFilterTransformOp::verify() {
   return success();
 }
 
+SmallVector
+WinogradFilterTransformOp::getIterationDomain(OpBuilder &builder) {
+  Location loc = getLoc();
+  Value zero = builder.create(loc, 0);
+  Value one = builder.create(loc, 1);
+  Value output = getOutput();
+  SmallVector loopBounds(6);
+  for (unsigned dim = 0; dim < 6; ++dim) {
+loopBounds[dim].offset = zero;
+loopBounds[dim].size = getDimValue(builder, loc, output, dim);
+loopBounds[dim].stride = one;
+  }
+  return loopBounds;
+}
+
+SmallVector
+WinogradFilterTransformOp::getLoopIteratorTypes() {
+  SmallVector iteratorTypes(6,
+ 
utils::IteratorType::parallel);
+  return iteratorTypes;
+}
+
+Value getValueFromOpFoldResult(OpFoldResult opFoldResult, OpBuilder &builder,
+   Location loc) {
+  if (auto val = opFoldResult.dyn_cast()) {
+return val;
+  } else if (auto attr = opFoldResult.dyn_cast()) {
+auto intAttr = cast(attr);
+return builder.create(loc, intAttr);
+  }

Hsiangkai wrote:

I only find a similar one in `mlir/lib/Dialect/Vector/IR/VectorOps.cpp` under 
`vector` namespace. It is to convert an array of `OpFoldResult` to an array of 
`Value`.

https://github.com/llvm/llvm-project/pull/96184
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [mlir] [mlir][linalg] Implement TilingInterface for winograd operators (PR #96184)

2024-07-01 Thread Hsiangkai Wang via llvm-branch-commits


@@ -2638,4 +2638,41 @@ def WinogradConv2DOp : Op {
+  let description = [{
+Decompose winograd operators. It will convert filter, input and output
+transform operators into a combination of scf, tensor, and linalg

Hsiangkai wrote:

Done.

https://github.com/llvm/llvm-project/pull/96184
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [mlir] [mlir][linalg] Implement TilingInterface for winograd operators (PR #96184)

2024-07-01 Thread Hsiangkai Wang via llvm-branch-commits


@@ -2760,6 +2760,89 @@ LogicalResult WinogradFilterTransformOp::verify() {
   return success();
 }
 
+SmallVector
+WinogradFilterTransformOp::getIterationDomain(OpBuilder &builder) {
+  Location loc = getLoc();
+  Value zero = builder.create(loc, 0);
+  Value one = builder.create(loc, 1);

Hsiangkai wrote:

Done.

https://github.com/llvm/llvm-project/pull/96184
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [mlir] [mlir][linalg] Implement TilingInterface for winograd operators (PR #96184)

2024-07-01 Thread Hsiangkai Wang via llvm-branch-commits


@@ -2760,6 +2760,89 @@ LogicalResult WinogradFilterTransformOp::verify() {
   return success();
 }
 
+SmallVector
+WinogradFilterTransformOp::getIterationDomain(OpBuilder &builder) {
+  Location loc = getLoc();
+  Value zero = builder.create(loc, 0);
+  Value one = builder.create(loc, 1);
+  Value output = getOutput();
+  SmallVector loopBounds(6);
+  for (unsigned dim = 0; dim < 6; ++dim) {
+loopBounds[dim].offset = zero;
+loopBounds[dim].size = getDimValue(builder, loc, output, dim);
+loopBounds[dim].stride = one;
+  }
+  return loopBounds;
+}
+
+SmallVector
+WinogradFilterTransformOp::getLoopIteratorTypes() {
+  SmallVector iteratorTypes(6,
+ 
utils::IteratorType::parallel);
+  return iteratorTypes;
+}
+
+Value getValueFromOpFoldResult(OpFoldResult opFoldResult, OpBuilder &builder,
+   Location loc) {
+  if (auto val = opFoldResult.dyn_cast()) {
+return val;
+  } else if (auto attr = opFoldResult.dyn_cast()) {
+auto intAttr = cast(attr);
+return builder.create(loc, intAttr);
+  }
+  // This should never happen if OpFoldResult is correctly formed.

Hsiangkai wrote:

I updated the implementation.

https://github.com/llvm/llvm-project/pull/96184
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [AMDGPU] Enable atomic optimizer for divergent i64 and double values (PR #96934)

2024-07-01 Thread Matt Arsenault via llvm-branch-commits


@@ -178,6 +178,20 @@ bool AMDGPUAtomicOptimizerImpl::run(Function &F) {
   return Changed;
 }
 
+static bool shouldOptimizeForType(Type *Ty) {
+  switch (Ty->getTypeID()) {
+  case Type::FloatTyID:
+  case Type::DoubleTyID:
+return true;
+  case Type::IntegerTyID: {
+if (Ty->getIntegerBitWidth() == 32 || Ty->getIntegerBitWidth() == 64)
+  return true;
+  default:

arsenm wrote:

I thought those all supported 16-bit values already 

https://github.com/llvm/llvm-project/pull/96934
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [mlir] [mlir][linalg] Add transform operator for Winograd Conv2D algorithm (PR #96182)

2024-07-01 Thread Hsiangkai Wang via llvm-branch-commits


@@ -3480,6 +3480,31 @@ DiagnosedSilenceableFailure 
transform::MapCopyToThreadsOp::applyToOne(
   return DiagnosedSilenceableFailure::success();
 }
 
+//===--===//
+// WinogradConv2DOp
+//===--===//
+
+DiagnosedSilenceableFailure transform::WinogradConv2DOp::applyToOne(
+transform::TransformRewriter &rewriter, linalg::LinalgOp target,
+transform::ApplyToEachResultList &results,
+transform::TransformState &state) {
+  rewriter.setInsertionPoint(target);
+  auto maybeTransformed =
+  TypeSwitch>(target)
+  .Case([&](linalg::Conv2DNhwcFhwcOp op) {
+return winogradConv2D(rewriter, op, getM(), getR());
+  })
+  .Default([&](Operation *op) {
+return rewriter.notifyMatchFailure(op, "not supported");
+  });
+
+  if (failed(maybeTransformed))
+return emitDefaultSilenceableFailure(target);

Hsiangkai wrote:

I have avoided a default message here.

https://github.com/llvm/llvm-project/pull/96182
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [AMDGPU] Enable atomic optimizer for divergent i64 and double values (PR #96934)

2024-07-01 Thread Matt Arsenault via llvm-branch-commits


@@ -178,6 +178,21 @@ bool AMDGPUAtomicOptimizerImpl::run(Function &F) {
   return Changed;
 }
 
+static bool isOptimizableAtomic(Type *Ty) {

arsenm wrote:

How about isLegalCrossLaneType? 

https://github.com/llvm/llvm-project/pull/96934
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] [clang][OpenMP] Rewrite `getOpenMPCaptureRegions` in terms of leafs (PR #97110)

2024-07-01 Thread Krzysztof Parzyszek via llvm-branch-commits

https://github.com/kparzysz updated 
https://github.com/llvm/llvm-project/pull/97110

>From 2d25e0d32672ecae3dc3ad42c50446e651eceb06 Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek 
Date: Fri, 28 Jun 2024 15:27:42 -0500
Subject: [PATCH] [clang][OpenMP] Rewrite `getOpenMPCaptureRegions` in term of
 leafs

Replace the switch in `getOpenMPCaptureRegions` with a loop collecting
capture regions based on the constituent directives.
---
 clang/lib/Basic/OpenMPKinds.cpp | 170 ++--
 1 file changed, 72 insertions(+), 98 deletions(-)

diff --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp
index 30c34c207ae23..152891dfa27dc 100644
--- a/clang/lib/Basic/OpenMPKinds.cpp
+++ b/clang/lib/Basic/OpenMPKinds.cpp
@@ -747,105 +747,79 @@ void clang::getOpenMPCaptureRegions(
   assert(unsigned(DKind) < llvm::omp::Directive_enumSize);
   assert(isOpenMPCapturingDirective(DKind));
 
-  switch (DKind) {
-  case OMPD_metadirective:
-CaptureRegions.push_back(OMPD_metadirective);
-break;
-  case OMPD_parallel:
-  case OMPD_parallel_for:
-  case OMPD_parallel_for_simd:
-  case OMPD_parallel_master:
-  case OMPD_parallel_masked:
-  case OMPD_parallel_sections:
-  case OMPD_distribute_parallel_for:
-  case OMPD_distribute_parallel_for_simd:
-  case OMPD_parallel_loop:
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_target_teams:
-  case OMPD_target_teams_distribute:
-  case OMPD_target_teams_distribute_simd:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-CaptureRegions.push_back(OMPD_teams);
-break;
-  case OMPD_teams:
-  case OMPD_teams_distribute:
-  case OMPD_teams_distribute_simd:
-CaptureRegions.push_back(OMPD_teams);
-break;
-  case OMPD_target:
-  case OMPD_target_simd:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-break;
-  case OMPD_teams_loop:
-  case OMPD_teams_distribute_parallel_for:
-  case OMPD_teams_distribute_parallel_for_simd:
-CaptureRegions.push_back(OMPD_teams);
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_target_parallel:
-  case OMPD_target_parallel_for:
-  case OMPD_target_parallel_for_simd:
-  case OMPD_target_parallel_loop:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_task:
-  case OMPD_target_enter_data:
-  case OMPD_target_exit_data:
-  case OMPD_target_update:
-CaptureRegions.push_back(OMPD_task);
-break;
-  case OMPD_taskloop:
-  case OMPD_taskloop_simd:
-  case OMPD_master_taskloop:
-  case OMPD_master_taskloop_simd:
-  case OMPD_masked_taskloop:
-  case OMPD_masked_taskloop_simd:
-CaptureRegions.push_back(OMPD_taskloop);
-break;
-  case OMPD_parallel_masked_taskloop:
-  case OMPD_parallel_masked_taskloop_simd:
-  case OMPD_parallel_master_taskloop:
-  case OMPD_parallel_master_taskloop_simd:
-CaptureRegions.push_back(OMPD_parallel);
-CaptureRegions.push_back(OMPD_taskloop);
-break;
-  case OMPD_target_teams_loop:
-  case OMPD_target_teams_distribute_parallel_for:
-  case OMPD_target_teams_distribute_parallel_for_simd:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-CaptureRegions.push_back(OMPD_teams);
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_nothing:
-CaptureRegions.push_back(OMPD_nothing);
-break;
-  case OMPD_loop:
-// TODO: 'loop' may require different capture regions depending on the bind
-// clause or the parent directive when there is no bind clause. Use
-// OMPD_unknown for now.
-  case OMPD_simd:
-  case OMPD_for:
-  case OMPD_for_simd:
-  case OMPD_sections:
-  case OMPD_single:
-  case OMPD_taskgroup:
-  case OMPD_distribute:
-  case OMPD_ordered:
-  case OMPD_target_data:
-  case OMPD_distribute_simd:
-  case OMPD_scope:
-  case OMPD_dispatch:
+  auto getRegionsForLeaf = [&](OpenMPDirectiveKind LKind) {
+assert(isLeafConstruct(LKind) && "Epecting leaf directive");
+switch (LKind) {
+case OMPD_metadirective:
+  CaptureRegions.push_back(OMPD_metadirective);
+  break;
+case OMPD_nothing:
+  CaptureRegions.push_back(OMPD_nothing);
+  break;
+case OMPD_parallel:
+  CaptureRegions.push_back(OMPD_parallel);
+  break;
+case OMPD_target:
+  CaptureRegions.push_back(OMPD_task);
+  CaptureRegions.push_back(OMPD_target);
+  break;
+case OMPD_task:
+case OMPD_target_enter_data:
+case OMPD_target_exit_data:
+case OMPD_target_update:
+  CaptureRegions.push_back(OMPD_task);
+  break;
+case OMPD_teams:
+  CaptureRegions.push_back(OMPD_teams);
+  break;
+case OMPD_taskloop:
+  CaptureRegions.push_back(OMPD_taskloop);
+  break;
+case OMPD_loop:
+  // TODO: 'loop' may require different capture regions depending on the
+  // bind clause or the parent dire

[llvm-branch-commits] Reapply "[llvm][RISCV] Enable trailing fences for seq-cst stores by default (#87376)" (PR #90267)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/90267


___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] Reapply "[llvm][RISCV] Enable trailing fences for seq-cst stores by default (#87376)" (PR #90267)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/90267


___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [lld] [llvm] Reapply "[llvm][RISCV] Enable trailing fences for seq-cst stores by default (#87376)" (PR #90267)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/90267

>From 788f58b302f20a000db3a9741e54cc861c9dcb88 Mon Sep 17 00:00:00 2001
From: Paul Kirth 
Date: Mon, 1 Jul 2024 10:13:23 -0700
Subject: [PATCH] Fix mismerge

Created using spr 1.3.4
---
 lld/ELF/Arch/RISCV.cpp| 70 ---
 lld/test/ELF/riscv-attributes.s   |  4 +-
 llvm/include/llvm/Support/RISCVAttributes.h   |  4 +-
 .../MCTargetDesc/RISCVTargetStreamer.cpp  | 15 ++--
 4 files changed, 39 insertions(+), 54 deletions(-)

diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index 1d9be92601006..0d0ab5de9acc1 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -1088,65 +1088,51 @@ static void mergeAtomic(DenseMap::iterator it,
 const InputSectionBase *oldSection,
 const InputSectionBase *newSection, unsigned int 
oldTag,
 unsigned int newTag) {
-  using RISCVAttrs::RISCVAtomicAbiTag;
+  using RISCVAttrs::RISCVAtomicAbiTag::AtomicABI;
   // Same tags stay the same, and UNKNOWN is compatible with anything
-  if (oldTag == newTag ||
-  newTag == static_cast(RISCVAtomicAbiTag::UNKNOWN))
+  if (oldTag == newTag || newTag == AtomicABI::UNKNOWN)
 return;
 
-  auto reportAbiError = [&]() {
-errorOrWarn("atomic abi mismatch for " + oldSection->name + "\n>>> " +
-toString(oldSection) + ": atomic_abi=" + Twine(oldTag) +
-"\n>>> " + toString(newSection) +
-": atomic_abi=" + Twine(newTag));
-  };
-
-  switch (static_cast(oldTag)) {
-  case RISCVAtomicAbiTag::UNKNOWN:
+  switch (oldTag) {
+  case AtomicABI::UNKNOWN:
 it->getSecond() = newTag;
 return;
-  case RISCVAtomicAbiTag::A6C:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6C:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  reportAbiError();
+case AtomicABI::A7:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6C:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A6S:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6C:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6S:
+switch (newTag) {
+case AtomicABI::A6C:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+case AtomicABI::A7:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6S:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A7:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  case AtomicABI::A7:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAtomicAbiTag::A6C:
-  reportAbiError();
+case AtomicABI::A6C:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A7:
-  break;
 };
+  default:
+llvm_unreachable("unknown AtomicABI");
   };
-  llvm_unreachable("unknown AtomicABI");
 }
 
 static RISCVAttributesSection *
diff --git a/lld/test/ELF/riscv-attributes.s b/lld/test/ELF/riscv-attributes.s
index 38b0fe8e7797e..91321f33297aa 100644
--- a/lld/test/ELF/riscv-attributes.s
+++ b/lld/test/ELF/riscv-attributes.s
@@ -48,9 +48,7 @@
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6C.s -o 
atomic_abi_A6C.o
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A7.s -o 
atomic_abi_A7.o
 # RUN: not ld.lld atomic_abi_A6C.o atomic_abi_A7.o -o /dev/null 2>&1 | 
FileCheck %s --check-prefix=ATOMIC_ABI_ERROR --implicit-check-not=error:
-# ATOMIC_ABI_ERROR: error: atomic abi mismatch for .riscv.attributes
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A6C.o:(.riscv.attributes): atomic_abi=1
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A7.o:(.riscv.attributes): atomic_abi=3
+# ATOMIC_ABI_ERROR: error: atomic_abi_A6C.o:(.riscv.attributes) has 
atomic_abi=1 but atomic_abi_A7.o:(.riscv.attributes) has atomic_abi=3
 
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6S.s -o 
atomic_abi_A6S.o
 # RUN: ld.lld atomic_abi_A6S.o atomic_abi_A6C.o -o atomic_abi_A6C_A6S
diff --git a/llvm/include/llvm/Sup

[llvm-branch-commits] [lld] [llvm] Reapply "[llvm][RISCV] Enable trailing fences for seq-cst stores by default (#87376)" (PR #90267)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/90267

>From 788f58b302f20a000db3a9741e54cc861c9dcb88 Mon Sep 17 00:00:00 2001
From: Paul Kirth 
Date: Mon, 1 Jul 2024 10:13:23 -0700
Subject: [PATCH] Fix mismerge

Created using spr 1.3.4
---
 lld/ELF/Arch/RISCV.cpp| 70 ---
 lld/test/ELF/riscv-attributes.s   |  4 +-
 llvm/include/llvm/Support/RISCVAttributes.h   |  4 +-
 .../MCTargetDesc/RISCVTargetStreamer.cpp  | 15 ++--
 4 files changed, 39 insertions(+), 54 deletions(-)

diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index 1d9be92601006..0d0ab5de9acc1 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -1088,65 +1088,51 @@ static void mergeAtomic(DenseMap::iterator it,
 const InputSectionBase *oldSection,
 const InputSectionBase *newSection, unsigned int 
oldTag,
 unsigned int newTag) {
-  using RISCVAttrs::RISCVAtomicAbiTag;
+  using RISCVAttrs::RISCVAtomicAbiTag::AtomicABI;
   // Same tags stay the same, and UNKNOWN is compatible with anything
-  if (oldTag == newTag ||
-  newTag == static_cast(RISCVAtomicAbiTag::UNKNOWN))
+  if (oldTag == newTag || newTag == AtomicABI::UNKNOWN)
 return;
 
-  auto reportAbiError = [&]() {
-errorOrWarn("atomic abi mismatch for " + oldSection->name + "\n>>> " +
-toString(oldSection) + ": atomic_abi=" + Twine(oldTag) +
-"\n>>> " + toString(newSection) +
-": atomic_abi=" + Twine(newTag));
-  };
-
-  switch (static_cast(oldTag)) {
-  case RISCVAtomicAbiTag::UNKNOWN:
+  switch (oldTag) {
+  case AtomicABI::UNKNOWN:
 it->getSecond() = newTag;
 return;
-  case RISCVAtomicAbiTag::A6C:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6C:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  reportAbiError();
+case AtomicABI::A7:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6C:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A6S:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6C:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6S:
+switch (newTag) {
+case AtomicABI::A6C:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+case AtomicABI::A7:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6S:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A7:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  case AtomicABI::A7:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAtomicAbiTag::A6C:
-  reportAbiError();
+case AtomicABI::A6C:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A7:
-  break;
 };
+  default:
+llvm_unreachable("unknown AtomicABI");
   };
-  llvm_unreachable("unknown AtomicABI");
 }
 
 static RISCVAttributesSection *
diff --git a/lld/test/ELF/riscv-attributes.s b/lld/test/ELF/riscv-attributes.s
index 38b0fe8e7797e..91321f33297aa 100644
--- a/lld/test/ELF/riscv-attributes.s
+++ b/lld/test/ELF/riscv-attributes.s
@@ -48,9 +48,7 @@
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6C.s -o 
atomic_abi_A6C.o
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A7.s -o 
atomic_abi_A7.o
 # RUN: not ld.lld atomic_abi_A6C.o atomic_abi_A7.o -o /dev/null 2>&1 | 
FileCheck %s --check-prefix=ATOMIC_ABI_ERROR --implicit-check-not=error:
-# ATOMIC_ABI_ERROR: error: atomic abi mismatch for .riscv.attributes
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A6C.o:(.riscv.attributes): atomic_abi=1
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A7.o:(.riscv.attributes): atomic_abi=3
+# ATOMIC_ABI_ERROR: error: atomic_abi_A6C.o:(.riscv.attributes) has 
atomic_abi=1 but atomic_abi_A7.o:(.riscv.attributes) has atomic_abi=3
 
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6S.s -o 
atomic_abi_A6S.o
 # RUN: ld.lld atomic_abi_A6S.o atomic_abi_A6C.o -o atomic_abi_A6C_A6S
diff --git a/llvm/include/llvm/Sup

[llvm-branch-commits] [lld] [llvm] Reapply "[llvm][RISCV] Enable trailing fences for seq-cst stores by default (#87376)" (PR #90267)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/90267

>From 788f58b302f20a000db3a9741e54cc861c9dcb88 Mon Sep 17 00:00:00 2001
From: Paul Kirth 
Date: Mon, 1 Jul 2024 10:13:23 -0700
Subject: [PATCH] Fix mismerge

Created using spr 1.3.4
---
 lld/ELF/Arch/RISCV.cpp| 70 ---
 lld/test/ELF/riscv-attributes.s   |  4 +-
 llvm/include/llvm/Support/RISCVAttributes.h   |  4 +-
 .../MCTargetDesc/RISCVTargetStreamer.cpp  | 15 ++--
 4 files changed, 39 insertions(+), 54 deletions(-)

diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index 1d9be92601006..0d0ab5de9acc1 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -1088,65 +1088,51 @@ static void mergeAtomic(DenseMap::iterator it,
 const InputSectionBase *oldSection,
 const InputSectionBase *newSection, unsigned int 
oldTag,
 unsigned int newTag) {
-  using RISCVAttrs::RISCVAtomicAbiTag;
+  using RISCVAttrs::RISCVAtomicAbiTag::AtomicABI;
   // Same tags stay the same, and UNKNOWN is compatible with anything
-  if (oldTag == newTag ||
-  newTag == static_cast(RISCVAtomicAbiTag::UNKNOWN))
+  if (oldTag == newTag || newTag == AtomicABI::UNKNOWN)
 return;
 
-  auto reportAbiError = [&]() {
-errorOrWarn("atomic abi mismatch for " + oldSection->name + "\n>>> " +
-toString(oldSection) + ": atomic_abi=" + Twine(oldTag) +
-"\n>>> " + toString(newSection) +
-": atomic_abi=" + Twine(newTag));
-  };
-
-  switch (static_cast(oldTag)) {
-  case RISCVAtomicAbiTag::UNKNOWN:
+  switch (oldTag) {
+  case AtomicABI::UNKNOWN:
 it->getSecond() = newTag;
 return;
-  case RISCVAtomicAbiTag::A6C:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6C:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  reportAbiError();
+case AtomicABI::A7:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6C:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A6S:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6C:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6S:
+switch (newTag) {
+case AtomicABI::A6C:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+case AtomicABI::A7:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6S:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A7:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  case AtomicABI::A7:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAtomicAbiTag::A6C:
-  reportAbiError();
+case AtomicABI::A6C:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A7:
-  break;
 };
+  default:
+llvm_unreachable("unknown AtomicABI");
   };
-  llvm_unreachable("unknown AtomicABI");
 }
 
 static RISCVAttributesSection *
diff --git a/lld/test/ELF/riscv-attributes.s b/lld/test/ELF/riscv-attributes.s
index 38b0fe8e7797e..91321f33297aa 100644
--- a/lld/test/ELF/riscv-attributes.s
+++ b/lld/test/ELF/riscv-attributes.s
@@ -48,9 +48,7 @@
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6C.s -o 
atomic_abi_A6C.o
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A7.s -o 
atomic_abi_A7.o
 # RUN: not ld.lld atomic_abi_A6C.o atomic_abi_A7.o -o /dev/null 2>&1 | 
FileCheck %s --check-prefix=ATOMIC_ABI_ERROR --implicit-check-not=error:
-# ATOMIC_ABI_ERROR: error: atomic abi mismatch for .riscv.attributes
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A6C.o:(.riscv.attributes): atomic_abi=1
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A7.o:(.riscv.attributes): atomic_abi=3
+# ATOMIC_ABI_ERROR: error: atomic_abi_A6C.o:(.riscv.attributes) has 
atomic_abi=1 but atomic_abi_A7.o:(.riscv.attributes) has atomic_abi=3
 
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6S.s -o 
atomic_abi_A6S.o
 # RUN: ld.lld atomic_abi_A6S.o atomic_abi_A6C.o -o atomic_abi_A6C_A6S
diff --git a/llvm/include/llvm/Sup

[llvm-branch-commits] [lld] [llvm] Reapply "[llvm][RISCV] Enable trailing fences for seq-cst stores by default (#87376)" (PR #90267)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/90267

>From 788f58b302f20a000db3a9741e54cc861c9dcb88 Mon Sep 17 00:00:00 2001
From: Paul Kirth 
Date: Mon, 1 Jul 2024 10:13:23 -0700
Subject: [PATCH] Fix mismerge

Created using spr 1.3.4
---
 lld/ELF/Arch/RISCV.cpp| 70 ---
 lld/test/ELF/riscv-attributes.s   |  4 +-
 llvm/include/llvm/Support/RISCVAttributes.h   |  4 +-
 .../MCTargetDesc/RISCVTargetStreamer.cpp  | 15 ++--
 4 files changed, 39 insertions(+), 54 deletions(-)

diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index 1d9be92601006..0d0ab5de9acc1 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -1088,65 +1088,51 @@ static void mergeAtomic(DenseMap::iterator it,
 const InputSectionBase *oldSection,
 const InputSectionBase *newSection, unsigned int 
oldTag,
 unsigned int newTag) {
-  using RISCVAttrs::RISCVAtomicAbiTag;
+  using RISCVAttrs::RISCVAtomicAbiTag::AtomicABI;
   // Same tags stay the same, and UNKNOWN is compatible with anything
-  if (oldTag == newTag ||
-  newTag == static_cast(RISCVAtomicAbiTag::UNKNOWN))
+  if (oldTag == newTag || newTag == AtomicABI::UNKNOWN)
 return;
 
-  auto reportAbiError = [&]() {
-errorOrWarn("atomic abi mismatch for " + oldSection->name + "\n>>> " +
-toString(oldSection) + ": atomic_abi=" + Twine(oldTag) +
-"\n>>> " + toString(newSection) +
-": atomic_abi=" + Twine(newTag));
-  };
-
-  switch (static_cast(oldTag)) {
-  case RISCVAtomicAbiTag::UNKNOWN:
+  switch (oldTag) {
+  case AtomicABI::UNKNOWN:
 it->getSecond() = newTag;
 return;
-  case RISCVAtomicAbiTag::A6C:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6C:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  reportAbiError();
+case AtomicABI::A7:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6C:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A6S:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6C:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6S:
+switch (newTag) {
+case AtomicABI::A6C:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+case AtomicABI::A7:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6S:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A7:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  case AtomicABI::A7:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAtomicAbiTag::A6C:
-  reportAbiError();
+case AtomicABI::A6C:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A7:
-  break;
 };
+  default:
+llvm_unreachable("unknown AtomicABI");
   };
-  llvm_unreachable("unknown AtomicABI");
 }
 
 static RISCVAttributesSection *
diff --git a/lld/test/ELF/riscv-attributes.s b/lld/test/ELF/riscv-attributes.s
index 38b0fe8e7797e..91321f33297aa 100644
--- a/lld/test/ELF/riscv-attributes.s
+++ b/lld/test/ELF/riscv-attributes.s
@@ -48,9 +48,7 @@
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6C.s -o 
atomic_abi_A6C.o
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A7.s -o 
atomic_abi_A7.o
 # RUN: not ld.lld atomic_abi_A6C.o atomic_abi_A7.o -o /dev/null 2>&1 | 
FileCheck %s --check-prefix=ATOMIC_ABI_ERROR --implicit-check-not=error:
-# ATOMIC_ABI_ERROR: error: atomic abi mismatch for .riscv.attributes
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A6C.o:(.riscv.attributes): atomic_abi=1
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A7.o:(.riscv.attributes): atomic_abi=3
+# ATOMIC_ABI_ERROR: error: atomic_abi_A6C.o:(.riscv.attributes) has 
atomic_abi=1 but atomic_abi_A7.o:(.riscv.attributes) has atomic_abi=3
 
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6S.s -o 
atomic_abi_A6S.o
 # RUN: ld.lld atomic_abi_A6S.o atomic_abi_A6C.o -o atomic_abi_A6C_A6S
diff --git a/llvm/include/llvm/Sup

[llvm-branch-commits] [lld] [llvm] Reapply "[llvm][RISCV] Enable trailing fences for seq-cst stores by default (#87376)" (PR #90267)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/90267

>From 788f58b302f20a000db3a9741e54cc861c9dcb88 Mon Sep 17 00:00:00 2001
From: Paul Kirth 
Date: Mon, 1 Jul 2024 10:13:23 -0700
Subject: [PATCH] Fix mismerge

Created using spr 1.3.4
---
 lld/ELF/Arch/RISCV.cpp| 70 ---
 lld/test/ELF/riscv-attributes.s   |  4 +-
 llvm/include/llvm/Support/RISCVAttributes.h   |  4 +-
 .../MCTargetDesc/RISCVTargetStreamer.cpp  | 15 ++--
 4 files changed, 39 insertions(+), 54 deletions(-)

diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index 1d9be92601006..0d0ab5de9acc1 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -1088,65 +1088,51 @@ static void mergeAtomic(DenseMap::iterator it,
 const InputSectionBase *oldSection,
 const InputSectionBase *newSection, unsigned int 
oldTag,
 unsigned int newTag) {
-  using RISCVAttrs::RISCVAtomicAbiTag;
+  using RISCVAttrs::RISCVAtomicAbiTag::AtomicABI;
   // Same tags stay the same, and UNKNOWN is compatible with anything
-  if (oldTag == newTag ||
-  newTag == static_cast(RISCVAtomicAbiTag::UNKNOWN))
+  if (oldTag == newTag || newTag == AtomicABI::UNKNOWN)
 return;
 
-  auto reportAbiError = [&]() {
-errorOrWarn("atomic abi mismatch for " + oldSection->name + "\n>>> " +
-toString(oldSection) + ": atomic_abi=" + Twine(oldTag) +
-"\n>>> " + toString(newSection) +
-": atomic_abi=" + Twine(newTag));
-  };
-
-  switch (static_cast(oldTag)) {
-  case RISCVAtomicAbiTag::UNKNOWN:
+  switch (oldTag) {
+  case AtomicABI::UNKNOWN:
 it->getSecond() = newTag;
 return;
-  case RISCVAtomicAbiTag::A6C:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6C:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  reportAbiError();
+case AtomicABI::A7:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6C:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A6S:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6C:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6S:
+switch (newTag) {
+case AtomicABI::A6C:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+case AtomicABI::A7:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6S:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A7:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  case AtomicABI::A7:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAtomicAbiTag::A6C:
-  reportAbiError();
+case AtomicABI::A6C:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A7:
-  break;
 };
+  default:
+llvm_unreachable("unknown AtomicABI");
   };
-  llvm_unreachable("unknown AtomicABI");
 }
 
 static RISCVAttributesSection *
diff --git a/lld/test/ELF/riscv-attributes.s b/lld/test/ELF/riscv-attributes.s
index 38b0fe8e7797e..91321f33297aa 100644
--- a/lld/test/ELF/riscv-attributes.s
+++ b/lld/test/ELF/riscv-attributes.s
@@ -48,9 +48,7 @@
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6C.s -o 
atomic_abi_A6C.o
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A7.s -o 
atomic_abi_A7.o
 # RUN: not ld.lld atomic_abi_A6C.o atomic_abi_A7.o -o /dev/null 2>&1 | 
FileCheck %s --check-prefix=ATOMIC_ABI_ERROR --implicit-check-not=error:
-# ATOMIC_ABI_ERROR: error: atomic abi mismatch for .riscv.attributes
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A6C.o:(.riscv.attributes): atomic_abi=1
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A7.o:(.riscv.attributes): atomic_abi=3
+# ATOMIC_ABI_ERROR: error: atomic_abi_A6C.o:(.riscv.attributes) has 
atomic_abi=1 but atomic_abi_A7.o:(.riscv.attributes) has atomic_abi=3
 
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6S.s -o 
atomic_abi_A6S.o
 # RUN: ld.lld atomic_abi_A6S.o atomic_abi_A6C.o -o atomic_abi_A6C_A6S
diff --git a/llvm/include/llvm/Sup

[llvm-branch-commits] [lld] [llvm] Reapply "[llvm][RISCV] Enable trailing fences for seq-cst stores by default (#87376)" (PR #90267)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/90267

>From 788f58b302f20a000db3a9741e54cc861c9dcb88 Mon Sep 17 00:00:00 2001
From: Paul Kirth 
Date: Mon, 1 Jul 2024 10:13:23 -0700
Subject: [PATCH] Fix mismerge

Created using spr 1.3.4
---
 lld/ELF/Arch/RISCV.cpp| 70 ---
 lld/test/ELF/riscv-attributes.s   |  4 +-
 llvm/include/llvm/Support/RISCVAttributes.h   |  4 +-
 .../MCTargetDesc/RISCVTargetStreamer.cpp  | 15 ++--
 4 files changed, 39 insertions(+), 54 deletions(-)

diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index 1d9be92601006..0d0ab5de9acc1 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -1088,65 +1088,51 @@ static void mergeAtomic(DenseMap::iterator it,
 const InputSectionBase *oldSection,
 const InputSectionBase *newSection, unsigned int 
oldTag,
 unsigned int newTag) {
-  using RISCVAttrs::RISCVAtomicAbiTag;
+  using RISCVAttrs::RISCVAtomicAbiTag::AtomicABI;
   // Same tags stay the same, and UNKNOWN is compatible with anything
-  if (oldTag == newTag ||
-  newTag == static_cast(RISCVAtomicAbiTag::UNKNOWN))
+  if (oldTag == newTag || newTag == AtomicABI::UNKNOWN)
 return;
 
-  auto reportAbiError = [&]() {
-errorOrWarn("atomic abi mismatch for " + oldSection->name + "\n>>> " +
-toString(oldSection) + ": atomic_abi=" + Twine(oldTag) +
-"\n>>> " + toString(newSection) +
-": atomic_abi=" + Twine(newTag));
-  };
-
-  switch (static_cast(oldTag)) {
-  case RISCVAtomicAbiTag::UNKNOWN:
+  switch (oldTag) {
+  case AtomicABI::UNKNOWN:
 it->getSecond() = newTag;
 return;
-  case RISCVAtomicAbiTag::A6C:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6C:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  reportAbiError();
+case AtomicABI::A7:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6C:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A6S:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6C:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6S:
+switch (newTag) {
+case AtomicABI::A6C:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+case AtomicABI::A7:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6S:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A7:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  case AtomicABI::A7:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAtomicAbiTag::A6C:
-  reportAbiError();
+case AtomicABI::A6C:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A7:
-  break;
 };
+  default:
+llvm_unreachable("unknown AtomicABI");
   };
-  llvm_unreachable("unknown AtomicABI");
 }
 
 static RISCVAttributesSection *
diff --git a/lld/test/ELF/riscv-attributes.s b/lld/test/ELF/riscv-attributes.s
index 38b0fe8e7797e..91321f33297aa 100644
--- a/lld/test/ELF/riscv-attributes.s
+++ b/lld/test/ELF/riscv-attributes.s
@@ -48,9 +48,7 @@
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6C.s -o 
atomic_abi_A6C.o
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A7.s -o 
atomic_abi_A7.o
 # RUN: not ld.lld atomic_abi_A6C.o atomic_abi_A7.o -o /dev/null 2>&1 | 
FileCheck %s --check-prefix=ATOMIC_ABI_ERROR --implicit-check-not=error:
-# ATOMIC_ABI_ERROR: error: atomic abi mismatch for .riscv.attributes
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A6C.o:(.riscv.attributes): atomic_abi=1
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A7.o:(.riscv.attributes): atomic_abi=3
+# ATOMIC_ABI_ERROR: error: atomic_abi_A6C.o:(.riscv.attributes) has 
atomic_abi=1 but atomic_abi_A7.o:(.riscv.attributes) has atomic_abi=3
 
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6S.s -o 
atomic_abi_A6S.o
 # RUN: ld.lld atomic_abi_A6S.o atomic_abi_A6C.o -o atomic_abi_A6C_A6S
diff --git a/llvm/include/llvm/Sup

[llvm-branch-commits] [lld] [llvm] Reapply "[llvm][RISCV] Enable trailing fences for seq-cst stores by default (#87376)" (PR #90267)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/90267

>From 788f58b302f20a000db3a9741e54cc861c9dcb88 Mon Sep 17 00:00:00 2001
From: Paul Kirth 
Date: Mon, 1 Jul 2024 10:13:23 -0700
Subject: [PATCH] Fix mismerge

Created using spr 1.3.4
---
 lld/ELF/Arch/RISCV.cpp| 70 ---
 lld/test/ELF/riscv-attributes.s   |  4 +-
 llvm/include/llvm/Support/RISCVAttributes.h   |  4 +-
 .../MCTargetDesc/RISCVTargetStreamer.cpp  | 15 ++--
 4 files changed, 39 insertions(+), 54 deletions(-)

diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index 1d9be92601006..0d0ab5de9acc1 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -1088,65 +1088,51 @@ static void mergeAtomic(DenseMap::iterator it,
 const InputSectionBase *oldSection,
 const InputSectionBase *newSection, unsigned int 
oldTag,
 unsigned int newTag) {
-  using RISCVAttrs::RISCVAtomicAbiTag;
+  using RISCVAttrs::RISCVAtomicAbiTag::AtomicABI;
   // Same tags stay the same, and UNKNOWN is compatible with anything
-  if (oldTag == newTag ||
-  newTag == static_cast(RISCVAtomicAbiTag::UNKNOWN))
+  if (oldTag == newTag || newTag == AtomicABI::UNKNOWN)
 return;
 
-  auto reportAbiError = [&]() {
-errorOrWarn("atomic abi mismatch for " + oldSection->name + "\n>>> " +
-toString(oldSection) + ": atomic_abi=" + Twine(oldTag) +
-"\n>>> " + toString(newSection) +
-": atomic_abi=" + Twine(newTag));
-  };
-
-  switch (static_cast(oldTag)) {
-  case RISCVAtomicAbiTag::UNKNOWN:
+  switch (oldTag) {
+  case AtomicABI::UNKNOWN:
 it->getSecond() = newTag;
 return;
-  case RISCVAtomicAbiTag::A6C:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6C:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  reportAbiError();
+case AtomicABI::A7:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6C:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A6S:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6C:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6S:
+switch (newTag) {
+case AtomicABI::A6C:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+case AtomicABI::A7:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6S:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A7:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  case AtomicABI::A7:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAtomicAbiTag::A6C:
-  reportAbiError();
+case AtomicABI::A6C:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A7:
-  break;
 };
+  default:
+llvm_unreachable("unknown AtomicABI");
   };
-  llvm_unreachable("unknown AtomicABI");
 }
 
 static RISCVAttributesSection *
diff --git a/lld/test/ELF/riscv-attributes.s b/lld/test/ELF/riscv-attributes.s
index 38b0fe8e7797e..91321f33297aa 100644
--- a/lld/test/ELF/riscv-attributes.s
+++ b/lld/test/ELF/riscv-attributes.s
@@ -48,9 +48,7 @@
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6C.s -o 
atomic_abi_A6C.o
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A7.s -o 
atomic_abi_A7.o
 # RUN: not ld.lld atomic_abi_A6C.o atomic_abi_A7.o -o /dev/null 2>&1 | 
FileCheck %s --check-prefix=ATOMIC_ABI_ERROR --implicit-check-not=error:
-# ATOMIC_ABI_ERROR: error: atomic abi mismatch for .riscv.attributes
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A6C.o:(.riscv.attributes): atomic_abi=1
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A7.o:(.riscv.attributes): atomic_abi=3
+# ATOMIC_ABI_ERROR: error: atomic_abi_A6C.o:(.riscv.attributes) has 
atomic_abi=1 but atomic_abi_A7.o:(.riscv.attributes) has atomic_abi=3
 
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6S.s -o 
atomic_abi_A6S.o
 # RUN: ld.lld atomic_abi_A6S.o atomic_abi_A6C.o -o atomic_abi_A6C_A6S
diff --git a/llvm/include/llvm/Sup

[llvm-branch-commits] [lld] [llvm] Reapply "[llvm][RISCV] Enable trailing fences for seq-cst stores by default (#87376)" (PR #90267)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/90267

>From 788f58b302f20a000db3a9741e54cc861c9dcb88 Mon Sep 17 00:00:00 2001
From: Paul Kirth 
Date: Mon, 1 Jul 2024 10:13:23 -0700
Subject: [PATCH] Fix mismerge

Created using spr 1.3.4
---
 lld/ELF/Arch/RISCV.cpp| 70 ---
 lld/test/ELF/riscv-attributes.s   |  4 +-
 llvm/include/llvm/Support/RISCVAttributes.h   |  4 +-
 .../MCTargetDesc/RISCVTargetStreamer.cpp  | 15 ++--
 4 files changed, 39 insertions(+), 54 deletions(-)

diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index 1d9be92601006..0d0ab5de9acc1 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -1088,65 +1088,51 @@ static void mergeAtomic(DenseMap::iterator it,
 const InputSectionBase *oldSection,
 const InputSectionBase *newSection, unsigned int 
oldTag,
 unsigned int newTag) {
-  using RISCVAttrs::RISCVAtomicAbiTag;
+  using RISCVAttrs::RISCVAtomicAbiTag::AtomicABI;
   // Same tags stay the same, and UNKNOWN is compatible with anything
-  if (oldTag == newTag ||
-  newTag == static_cast(RISCVAtomicAbiTag::UNKNOWN))
+  if (oldTag == newTag || newTag == AtomicABI::UNKNOWN)
 return;
 
-  auto reportAbiError = [&]() {
-errorOrWarn("atomic abi mismatch for " + oldSection->name + "\n>>> " +
-toString(oldSection) + ": atomic_abi=" + Twine(oldTag) +
-"\n>>> " + toString(newSection) +
-": atomic_abi=" + Twine(newTag));
-  };
-
-  switch (static_cast(oldTag)) {
-  case RISCVAtomicAbiTag::UNKNOWN:
+  switch (oldTag) {
+  case AtomicABI::UNKNOWN:
 it->getSecond() = newTag;
 return;
-  case RISCVAtomicAbiTag::A6C:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6C:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  reportAbiError();
+case AtomicABI::A7:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6C:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A6S:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6C:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6S:
+switch (newTag) {
+case AtomicABI::A6C:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+case AtomicABI::A7:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6S:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A7:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  case AtomicABI::A7:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAtomicAbiTag::A6C:
-  reportAbiError();
+case AtomicABI::A6C:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A7:
-  break;
 };
+  default:
+llvm_unreachable("unknown AtomicABI");
   };
-  llvm_unreachable("unknown AtomicABI");
 }
 
 static RISCVAttributesSection *
diff --git a/lld/test/ELF/riscv-attributes.s b/lld/test/ELF/riscv-attributes.s
index 38b0fe8e7797e..91321f33297aa 100644
--- a/lld/test/ELF/riscv-attributes.s
+++ b/lld/test/ELF/riscv-attributes.s
@@ -48,9 +48,7 @@
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6C.s -o 
atomic_abi_A6C.o
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A7.s -o 
atomic_abi_A7.o
 # RUN: not ld.lld atomic_abi_A6C.o atomic_abi_A7.o -o /dev/null 2>&1 | 
FileCheck %s --check-prefix=ATOMIC_ABI_ERROR --implicit-check-not=error:
-# ATOMIC_ABI_ERROR: error: atomic abi mismatch for .riscv.attributes
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A6C.o:(.riscv.attributes): atomic_abi=1
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A7.o:(.riscv.attributes): atomic_abi=3
+# ATOMIC_ABI_ERROR: error: atomic_abi_A6C.o:(.riscv.attributes) has 
atomic_abi=1 but atomic_abi_A7.o:(.riscv.attributes) has atomic_abi=3
 
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6S.s -o 
atomic_abi_A6S.o
 # RUN: ld.lld atomic_abi_A6S.o atomic_abi_A6C.o -o atomic_abi_A6C_A6S
diff --git a/llvm/include/llvm/Sup

[llvm-branch-commits] [lld] [llvm] Reapply "[llvm][RISCV] Enable trailing fences for seq-cst stores by default (#87376)" (PR #90267)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/90267

>From 788f58b302f20a000db3a9741e54cc861c9dcb88 Mon Sep 17 00:00:00 2001
From: Paul Kirth 
Date: Mon, 1 Jul 2024 10:13:23 -0700
Subject: [PATCH] Fix mismerge

Created using spr 1.3.4
---
 lld/ELF/Arch/RISCV.cpp| 70 ---
 lld/test/ELF/riscv-attributes.s   |  4 +-
 llvm/include/llvm/Support/RISCVAttributes.h   |  4 +-
 .../MCTargetDesc/RISCVTargetStreamer.cpp  | 15 ++--
 4 files changed, 39 insertions(+), 54 deletions(-)

diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index 1d9be92601006..0d0ab5de9acc1 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -1088,65 +1088,51 @@ static void mergeAtomic(DenseMap::iterator it,
 const InputSectionBase *oldSection,
 const InputSectionBase *newSection, unsigned int 
oldTag,
 unsigned int newTag) {
-  using RISCVAttrs::RISCVAtomicAbiTag;
+  using RISCVAttrs::RISCVAtomicAbiTag::AtomicABI;
   // Same tags stay the same, and UNKNOWN is compatible with anything
-  if (oldTag == newTag ||
-  newTag == static_cast(RISCVAtomicAbiTag::UNKNOWN))
+  if (oldTag == newTag || newTag == AtomicABI::UNKNOWN)
 return;
 
-  auto reportAbiError = [&]() {
-errorOrWarn("atomic abi mismatch for " + oldSection->name + "\n>>> " +
-toString(oldSection) + ": atomic_abi=" + Twine(oldTag) +
-"\n>>> " + toString(newSection) +
-": atomic_abi=" + Twine(newTag));
-  };
-
-  switch (static_cast(oldTag)) {
-  case RISCVAtomicAbiTag::UNKNOWN:
+  switch (oldTag) {
+  case AtomicABI::UNKNOWN:
 it->getSecond() = newTag;
 return;
-  case RISCVAtomicAbiTag::A6C:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6C:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  reportAbiError();
+case AtomicABI::A7:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6C:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A6S:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6C:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6S:
+switch (newTag) {
+case AtomicABI::A6C:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+case AtomicABI::A7:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6S:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A7:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  case AtomicABI::A7:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAtomicAbiTag::A6C:
-  reportAbiError();
+case AtomicABI::A6C:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A7:
-  break;
 };
+  default:
+llvm_unreachable("unknown AtomicABI");
   };
-  llvm_unreachable("unknown AtomicABI");
 }
 
 static RISCVAttributesSection *
diff --git a/lld/test/ELF/riscv-attributes.s b/lld/test/ELF/riscv-attributes.s
index 38b0fe8e7797e..91321f33297aa 100644
--- a/lld/test/ELF/riscv-attributes.s
+++ b/lld/test/ELF/riscv-attributes.s
@@ -48,9 +48,7 @@
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6C.s -o 
atomic_abi_A6C.o
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A7.s -o 
atomic_abi_A7.o
 # RUN: not ld.lld atomic_abi_A6C.o atomic_abi_A7.o -o /dev/null 2>&1 | 
FileCheck %s --check-prefix=ATOMIC_ABI_ERROR --implicit-check-not=error:
-# ATOMIC_ABI_ERROR: error: atomic abi mismatch for .riscv.attributes
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A6C.o:(.riscv.attributes): atomic_abi=1
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A7.o:(.riscv.attributes): atomic_abi=3
+# ATOMIC_ABI_ERROR: error: atomic_abi_A6C.o:(.riscv.attributes) has 
atomic_abi=1 but atomic_abi_A7.o:(.riscv.attributes) has atomic_abi=3
 
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6S.s -o 
atomic_abi_A6S.o
 # RUN: ld.lld atomic_abi_A6S.o atomic_abi_A6C.o -o atomic_abi_A6C_A6S
diff --git a/llvm/include/llvm/Sup

[llvm-branch-commits] [llvm] [BOLT] Match functions with calls as anchors (PR #96596)

2024-07-01 Thread Shaw Young via llvm-branch-commits

https://github.com/shawbyoung updated 
https://github.com/llvm/llvm-project/pull/96596

>From 05d59574d6260b98a469921eb2fccf5398bfafb6 Mon Sep 17 00:00:00 2001
From: shawbyoung 
Date: Mon, 24 Jun 2024 23:00:59 -0700
Subject: [PATCH 1/6] Added call to matchWithCallsAsAnchors

Created using spr 1.3.4
---
 bolt/lib/Profile/YAMLProfileReader.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/bolt/lib/Profile/YAMLProfileReader.cpp 
b/bolt/lib/Profile/YAMLProfileReader.cpp
index aafffac3d4b1c..1a0e5d239d252 100644
--- a/bolt/lib/Profile/YAMLProfileReader.cpp
+++ b/bolt/lib/Profile/YAMLProfileReader.cpp
@@ -479,6 +479,9 @@ Error YAMLProfileReader::readProfile(BinaryContext &BC) {
 if (!YamlBF.Used && BF && !ProfiledFunctions.count(BF))
   matchProfileToFunction(YamlBF, *BF);
 
+  uint64_t MatchedWithCallsAsAnchors = 0;
+  matchWithCallsAsAnchors(BC,  MatchedWithCallsAsAnchors);
+
   for (yaml::bolt::BinaryFunctionProfile &YamlBF : YamlBP.Functions)
 if (!YamlBF.Used && opts::Verbosity >= 1)
   errs() << "BOLT-WARNING: profile ignored for function " << YamlBF.Name

>From 77ef0008f4f5987719555e6cc3e32da812ae0f31 Mon Sep 17 00:00:00 2001
From: shawbyoung 
Date: Mon, 24 Jun 2024 23:11:43 -0700
Subject: [PATCH 2/6] Changed CallHashToBF representation

Created using spr 1.3.4
---
 bolt/lib/Profile/YAMLProfileReader.cpp | 15 ++-
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/bolt/lib/Profile/YAMLProfileReader.cpp 
b/bolt/lib/Profile/YAMLProfileReader.cpp
index 1a0e5d239d252..91b01a99c7485 100644
--- a/bolt/lib/Profile/YAMLProfileReader.cpp
+++ b/bolt/lib/Profile/YAMLProfileReader.cpp
@@ -29,6 +29,10 @@ static llvm::cl::opt
cl::desc("ignore hash while reading function profile"),
cl::Hidden, cl::cat(BoltOptCategory));
 
+llvm::cl::opt MatchWithCallsAsAnchors("match-with-calls-as-anchors",
+  cl::desc("Matches with calls as anchors"),
+  cl::Hidden, cl::cat(BoltOptCategory));
+
 llvm::cl::opt ProfileUseDFS("profile-use-dfs",
   cl::desc("use DFS order for YAML profile"),
   cl::Hidden, cl::cat(BoltOptCategory));
@@ -353,7 +357,7 @@ void YAMLProfileReader::matchWithCallsAsAnchors(
 llvm_unreachable("Unhandled HashFunction");
   };
 
-  std::unordered_map CallHashToBF;
+  std::unordered_map CallHashToBF;
 
   for (BinaryFunction *BF : BC.getAllBinaryFunctions()) {
 if (ProfiledFunctions.count(BF))
@@ -375,12 +379,12 @@ void YAMLProfileReader::matchWithCallsAsAnchors(
   for (const std::string &FunctionName : FunctionNames)
 HashString.append(FunctionName);
 }
-CallHashToBF.emplace(ComputeCallHash(HashString), BF);
+CallHashToBF[ComputeCallHash(HashString)] = BF;
   }
 
   std::unordered_map ProfiledFunctionIdToName;
 
-  for (const yaml::bolt::BinaryFunctionProfile YamlBF : YamlBP.Functions)
+  for (const yaml::bolt::BinaryFunctionProfile &YamlBF : YamlBP.Functions)
 ProfiledFunctionIdToName[YamlBF.Id] = YamlBF.Name;
 
   for (yaml::bolt::BinaryFunctionProfile &YamlBF : YamlBP.Functions) {
@@ -401,7 +405,7 @@ void YAMLProfileReader::matchWithCallsAsAnchors(
 auto It = CallHashToBF.find(Hash);
 if (It == CallHashToBF.end())
   continue;
-matchProfileToFunction(YamlBF, It->second);
+matchProfileToFunction(YamlBF, *It->second);
 ++MatchedWithCallsAsAnchors;
   }
 }
@@ -480,7 +484,8 @@ Error YAMLProfileReader::readProfile(BinaryContext &BC) {
   matchProfileToFunction(YamlBF, *BF);
 
   uint64_t MatchedWithCallsAsAnchors = 0;
-  matchWithCallsAsAnchors(BC,  MatchedWithCallsAsAnchors);
+  if (opts::MatchWithCallsAsAnchors)
+matchWithCallsAsAnchors(BC,  MatchedWithCallsAsAnchors);
 
   for (yaml::bolt::BinaryFunctionProfile &YamlBF : YamlBP.Functions)
 if (!YamlBF.Used && opts::Verbosity >= 1)

>From ea7cb68ab9e8e158412c2e752986968968a60d93 Mon Sep 17 00:00:00 2001
From: shawbyoung 
Date: Tue, 25 Jun 2024 09:28:39 -0700
Subject: [PATCH 3/6] Changed BF called FunctionNames to multiset

Created using spr 1.3.4
---
 bolt/lib/Profile/YAMLProfileReader.cpp | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/bolt/lib/Profile/YAMLProfileReader.cpp 
b/bolt/lib/Profile/YAMLProfileReader.cpp
index 91b01a99c7485..3b3d73f7af023 100644
--- a/bolt/lib/Profile/YAMLProfileReader.cpp
+++ b/bolt/lib/Profile/YAMLProfileReader.cpp
@@ -365,7 +365,7 @@ void YAMLProfileReader::matchWithCallsAsAnchors(
 
 std::string HashString;
 for (const auto &BB : BF->blocks()) {
-  std::set FunctionNames;
+  std::multiset FunctionNames;
   for (const MCInst &Instr : BB) {
 // Skip non-call instructions.
 if (!BC.MIB->isCall(Instr))
@@ -397,9 +397,8 @@ void YAMLProfileReader::matchWithCallsAsAnchors(
 std::string &FunctionName = ProfiledFunctionIdToName[CallSite.DestId];
 FunctionNames.insert(FunctionName);
   

[llvm-branch-commits] [clang] [clang][OpenMP] Rewrite `getOpenMPCaptureRegions` in terms of leafs (PR #97110)

2024-07-01 Thread Alexey Bataev via llvm-branch-commits


@@ -747,105 +747,79 @@ void clang::getOpenMPCaptureRegions(
   assert(unsigned(DKind) < llvm::omp::Directive_enumSize);
   assert(isOpenMPCapturingDirective(DKind) && "Expecting capturing directive");
 
-  switch (DKind) {
-  case OMPD_metadirective:
-CaptureRegions.push_back(OMPD_metadirective);
-break;
-  case OMPD_parallel:
-  case OMPD_parallel_for:
-  case OMPD_parallel_for_simd:
-  case OMPD_parallel_master:
-  case OMPD_parallel_masked:
-  case OMPD_parallel_sections:
-  case OMPD_distribute_parallel_for:
-  case OMPD_distribute_parallel_for_simd:
-  case OMPD_parallel_loop:
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_target_teams:
-  case OMPD_target_teams_distribute:
-  case OMPD_target_teams_distribute_simd:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-CaptureRegions.push_back(OMPD_teams);
-break;
-  case OMPD_teams:
-  case OMPD_teams_distribute:
-  case OMPD_teams_distribute_simd:
-CaptureRegions.push_back(OMPD_teams);
-break;
-  case OMPD_target:
-  case OMPD_target_simd:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-break;
-  case OMPD_teams_loop:
-  case OMPD_teams_distribute_parallel_for:
-  case OMPD_teams_distribute_parallel_for_simd:
-CaptureRegions.push_back(OMPD_teams);
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_target_parallel:
-  case OMPD_target_parallel_for:
-  case OMPD_target_parallel_for_simd:
-  case OMPD_target_parallel_loop:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_task:
-  case OMPD_target_enter_data:
-  case OMPD_target_exit_data:
-  case OMPD_target_update:
-CaptureRegions.push_back(OMPD_task);
-break;
-  case OMPD_taskloop:
-  case OMPD_taskloop_simd:
-  case OMPD_master_taskloop:
-  case OMPD_master_taskloop_simd:
-  case OMPD_masked_taskloop:
-  case OMPD_masked_taskloop_simd:
-CaptureRegions.push_back(OMPD_taskloop);
-break;
-  case OMPD_parallel_masked_taskloop:
-  case OMPD_parallel_masked_taskloop_simd:
-  case OMPD_parallel_master_taskloop:
-  case OMPD_parallel_master_taskloop_simd:
-CaptureRegions.push_back(OMPD_parallel);
-CaptureRegions.push_back(OMPD_taskloop);
-break;
-  case OMPD_target_teams_loop:
-  case OMPD_target_teams_distribute_parallel_for:
-  case OMPD_target_teams_distribute_parallel_for_simd:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-CaptureRegions.push_back(OMPD_teams);
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_nothing:
-CaptureRegions.push_back(OMPD_nothing);
-break;
-  case OMPD_loop:
-// TODO: 'loop' may require different capture regions depending on the bind
-// clause or the parent directive when there is no bind clause. Use
-// OMPD_unknown for now.
-  case OMPD_simd:
-  case OMPD_for:
-  case OMPD_for_simd:
-  case OMPD_sections:
-  case OMPD_single:
-  case OMPD_taskgroup:
-  case OMPD_distribute:
-  case OMPD_ordered:
-  case OMPD_target_data:
-  case OMPD_distribute_simd:
-  case OMPD_scope:
-  case OMPD_dispatch:
+  auto getRegionsForLeaf = [&](OpenMPDirectiveKind LKind) {
+assert(isLeafConstruct(LKind) && "Epecting leaf directive");
+switch (LKind) {
+case OMPD_metadirective:
+  CaptureRegions.push_back(OMPD_metadirective);
+  break;
+case OMPD_nothing:
+  CaptureRegions.push_back(OMPD_nothing);
+  break;
+case OMPD_parallel:
+  CaptureRegions.push_back(OMPD_parallel);
+  break;
+case OMPD_target:
+  CaptureRegions.push_back(OMPD_task);
+  CaptureRegions.push_back(OMPD_target);
+  break;
+case OMPD_task:
+case OMPD_target_enter_data:
+case OMPD_target_exit_data:
+case OMPD_target_update:
+  CaptureRegions.push_back(OMPD_task);
+  break;
+case OMPD_teams:
+  CaptureRegions.push_back(OMPD_teams);
+  break;
+case OMPD_taskloop:
+  CaptureRegions.push_back(OMPD_taskloop);
+  break;
+case OMPD_loop:
+  // TODO: 'loop' may require different capture regions depending on the
+  // bind clause or the parent directive when there is no bind clause.
+  // If any of the directives that push regions here are parents of 'loop',
+  // assume 'parallel'. Otherwise do nothing.
+  if (!CaptureRegions.empty() &&
+  !llvm::is_contained(CaptureRegions, OMPD_parallel))
+CaptureRegions.push_back(OMPD_parallel);
+  break;
+case OMPD_dispatch:
+case OMPD_distribute:
+case OMPD_for:
+case OMPD_masked:
+case OMPD_master:
+case OMPD_ordered:
+case OMPD_scope:
+case OMPD_sections:
+case OMPD_simd:
+case OMPD_single:
+case OMPD_target_data:
+case OMPD_taskgroup:
+  // These directives (when standalone) use OMPD_unknown as the region,
+  //

[llvm-branch-commits] [clang] [clang][OpenMP] Rewrite `getOpenMPCaptureRegions` in terms of leafs (PR #97110)

2024-07-01 Thread Alexey Bataev via llvm-branch-commits


@@ -747,105 +747,79 @@ void clang::getOpenMPCaptureRegions(
   assert(unsigned(DKind) < llvm::omp::Directive_enumSize);
   assert(isOpenMPCapturingDirective(DKind) && "Expecting capturing directive");
 
-  switch (DKind) {
-  case OMPD_metadirective:
-CaptureRegions.push_back(OMPD_metadirective);
-break;
-  case OMPD_parallel:
-  case OMPD_parallel_for:
-  case OMPD_parallel_for_simd:
-  case OMPD_parallel_master:
-  case OMPD_parallel_masked:
-  case OMPD_parallel_sections:
-  case OMPD_distribute_parallel_for:
-  case OMPD_distribute_parallel_for_simd:
-  case OMPD_parallel_loop:
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_target_teams:
-  case OMPD_target_teams_distribute:
-  case OMPD_target_teams_distribute_simd:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-CaptureRegions.push_back(OMPD_teams);
-break;
-  case OMPD_teams:
-  case OMPD_teams_distribute:
-  case OMPD_teams_distribute_simd:
-CaptureRegions.push_back(OMPD_teams);
-break;
-  case OMPD_target:
-  case OMPD_target_simd:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-break;
-  case OMPD_teams_loop:
-  case OMPD_teams_distribute_parallel_for:
-  case OMPD_teams_distribute_parallel_for_simd:
-CaptureRegions.push_back(OMPD_teams);
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_target_parallel:
-  case OMPD_target_parallel_for:
-  case OMPD_target_parallel_for_simd:
-  case OMPD_target_parallel_loop:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_task:
-  case OMPD_target_enter_data:
-  case OMPD_target_exit_data:
-  case OMPD_target_update:
-CaptureRegions.push_back(OMPD_task);
-break;
-  case OMPD_taskloop:
-  case OMPD_taskloop_simd:
-  case OMPD_master_taskloop:
-  case OMPD_master_taskloop_simd:
-  case OMPD_masked_taskloop:
-  case OMPD_masked_taskloop_simd:
-CaptureRegions.push_back(OMPD_taskloop);
-break;
-  case OMPD_parallel_masked_taskloop:
-  case OMPD_parallel_masked_taskloop_simd:
-  case OMPD_parallel_master_taskloop:
-  case OMPD_parallel_master_taskloop_simd:
-CaptureRegions.push_back(OMPD_parallel);
-CaptureRegions.push_back(OMPD_taskloop);
-break;
-  case OMPD_target_teams_loop:
-  case OMPD_target_teams_distribute_parallel_for:
-  case OMPD_target_teams_distribute_parallel_for_simd:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-CaptureRegions.push_back(OMPD_teams);
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_nothing:
-CaptureRegions.push_back(OMPD_nothing);
-break;
-  case OMPD_loop:
-// TODO: 'loop' may require different capture regions depending on the bind
-// clause or the parent directive when there is no bind clause. Use
-// OMPD_unknown for now.
-  case OMPD_simd:
-  case OMPD_for:
-  case OMPD_for_simd:
-  case OMPD_sections:
-  case OMPD_single:
-  case OMPD_taskgroup:
-  case OMPD_distribute:
-  case OMPD_ordered:
-  case OMPD_target_data:
-  case OMPD_distribute_simd:
-  case OMPD_scope:
-  case OMPD_dispatch:
+  auto getRegionsForLeaf = [&](OpenMPDirectiveKind LKind) {

alexey-bataev wrote:

```suggestion
  auto GetRegionsForLeaf = [&](OpenMPDirectiveKind LKind) {
```


https://github.com/llvm/llvm-project/pull/97110
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] [clang][OpenMP] Rewrite `getOpenMPCaptureRegions` in terms of leafs (PR #97110)

2024-07-01 Thread Krzysztof Parzyszek via llvm-branch-commits

https://github.com/kparzysz updated 
https://github.com/llvm/llvm-project/pull/97110

>From 2d25e0d32672ecae3dc3ad42c50446e651eceb06 Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek 
Date: Fri, 28 Jun 2024 15:27:42 -0500
Subject: [PATCH 1/2] [clang][OpenMP] Rewrite `getOpenMPCaptureRegions` in term
 of leafs

Replace the switch in `getOpenMPCaptureRegions` with a loop collecting
capture regions based on the constituent directives.
---
 clang/lib/Basic/OpenMPKinds.cpp | 170 ++--
 1 file changed, 72 insertions(+), 98 deletions(-)

diff --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp
index 30c34c207ae23..152891dfa27dc 100644
--- a/clang/lib/Basic/OpenMPKinds.cpp
+++ b/clang/lib/Basic/OpenMPKinds.cpp
@@ -747,105 +747,79 @@ void clang::getOpenMPCaptureRegions(
   assert(unsigned(DKind) < llvm::omp::Directive_enumSize);
   assert(isOpenMPCapturingDirective(DKind));
 
-  switch (DKind) {
-  case OMPD_metadirective:
-CaptureRegions.push_back(OMPD_metadirective);
-break;
-  case OMPD_parallel:
-  case OMPD_parallel_for:
-  case OMPD_parallel_for_simd:
-  case OMPD_parallel_master:
-  case OMPD_parallel_masked:
-  case OMPD_parallel_sections:
-  case OMPD_distribute_parallel_for:
-  case OMPD_distribute_parallel_for_simd:
-  case OMPD_parallel_loop:
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_target_teams:
-  case OMPD_target_teams_distribute:
-  case OMPD_target_teams_distribute_simd:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-CaptureRegions.push_back(OMPD_teams);
-break;
-  case OMPD_teams:
-  case OMPD_teams_distribute:
-  case OMPD_teams_distribute_simd:
-CaptureRegions.push_back(OMPD_teams);
-break;
-  case OMPD_target:
-  case OMPD_target_simd:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-break;
-  case OMPD_teams_loop:
-  case OMPD_teams_distribute_parallel_for:
-  case OMPD_teams_distribute_parallel_for_simd:
-CaptureRegions.push_back(OMPD_teams);
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_target_parallel:
-  case OMPD_target_parallel_for:
-  case OMPD_target_parallel_for_simd:
-  case OMPD_target_parallel_loop:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_task:
-  case OMPD_target_enter_data:
-  case OMPD_target_exit_data:
-  case OMPD_target_update:
-CaptureRegions.push_back(OMPD_task);
-break;
-  case OMPD_taskloop:
-  case OMPD_taskloop_simd:
-  case OMPD_master_taskloop:
-  case OMPD_master_taskloop_simd:
-  case OMPD_masked_taskloop:
-  case OMPD_masked_taskloop_simd:
-CaptureRegions.push_back(OMPD_taskloop);
-break;
-  case OMPD_parallel_masked_taskloop:
-  case OMPD_parallel_masked_taskloop_simd:
-  case OMPD_parallel_master_taskloop:
-  case OMPD_parallel_master_taskloop_simd:
-CaptureRegions.push_back(OMPD_parallel);
-CaptureRegions.push_back(OMPD_taskloop);
-break;
-  case OMPD_target_teams_loop:
-  case OMPD_target_teams_distribute_parallel_for:
-  case OMPD_target_teams_distribute_parallel_for_simd:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-CaptureRegions.push_back(OMPD_teams);
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_nothing:
-CaptureRegions.push_back(OMPD_nothing);
-break;
-  case OMPD_loop:
-// TODO: 'loop' may require different capture regions depending on the bind
-// clause or the parent directive when there is no bind clause. Use
-// OMPD_unknown for now.
-  case OMPD_simd:
-  case OMPD_for:
-  case OMPD_for_simd:
-  case OMPD_sections:
-  case OMPD_single:
-  case OMPD_taskgroup:
-  case OMPD_distribute:
-  case OMPD_ordered:
-  case OMPD_target_data:
-  case OMPD_distribute_simd:
-  case OMPD_scope:
-  case OMPD_dispatch:
+  auto getRegionsForLeaf = [&](OpenMPDirectiveKind LKind) {
+assert(isLeafConstruct(LKind) && "Epecting leaf directive");
+switch (LKind) {
+case OMPD_metadirective:
+  CaptureRegions.push_back(OMPD_metadirective);
+  break;
+case OMPD_nothing:
+  CaptureRegions.push_back(OMPD_nothing);
+  break;
+case OMPD_parallel:
+  CaptureRegions.push_back(OMPD_parallel);
+  break;
+case OMPD_target:
+  CaptureRegions.push_back(OMPD_task);
+  CaptureRegions.push_back(OMPD_target);
+  break;
+case OMPD_task:
+case OMPD_target_enter_data:
+case OMPD_target_exit_data:
+case OMPD_target_update:
+  CaptureRegions.push_back(OMPD_task);
+  break;
+case OMPD_teams:
+  CaptureRegions.push_back(OMPD_teams);
+  break;
+case OMPD_taskloop:
+  CaptureRegions.push_back(OMPD_taskloop);
+  break;
+case OMPD_loop:
+  // TODO: 'loop' may require different capture regions depending on the
+  // bind clause or the parent 

[llvm-branch-commits] [clang] [clang][OpenMP] Rewrite `getOpenMPCaptureRegions` in terms of leafs (PR #97110)

2024-07-01 Thread Krzysztof Parzyszek via llvm-branch-commits


@@ -747,105 +747,79 @@ void clang::getOpenMPCaptureRegions(
   assert(unsigned(DKind) < llvm::omp::Directive_enumSize);
   assert(isOpenMPCapturingDirective(DKind) && "Expecting capturing directive");
 
-  switch (DKind) {
-  case OMPD_metadirective:
-CaptureRegions.push_back(OMPD_metadirective);
-break;
-  case OMPD_parallel:
-  case OMPD_parallel_for:
-  case OMPD_parallel_for_simd:
-  case OMPD_parallel_master:
-  case OMPD_parallel_masked:
-  case OMPD_parallel_sections:
-  case OMPD_distribute_parallel_for:
-  case OMPD_distribute_parallel_for_simd:
-  case OMPD_parallel_loop:
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_target_teams:
-  case OMPD_target_teams_distribute:
-  case OMPD_target_teams_distribute_simd:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-CaptureRegions.push_back(OMPD_teams);
-break;
-  case OMPD_teams:
-  case OMPD_teams_distribute:
-  case OMPD_teams_distribute_simd:
-CaptureRegions.push_back(OMPD_teams);
-break;
-  case OMPD_target:
-  case OMPD_target_simd:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-break;
-  case OMPD_teams_loop:
-  case OMPD_teams_distribute_parallel_for:
-  case OMPD_teams_distribute_parallel_for_simd:
-CaptureRegions.push_back(OMPD_teams);
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_target_parallel:
-  case OMPD_target_parallel_for:
-  case OMPD_target_parallel_for_simd:
-  case OMPD_target_parallel_loop:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_task:
-  case OMPD_target_enter_data:
-  case OMPD_target_exit_data:
-  case OMPD_target_update:
-CaptureRegions.push_back(OMPD_task);
-break;
-  case OMPD_taskloop:
-  case OMPD_taskloop_simd:
-  case OMPD_master_taskloop:
-  case OMPD_master_taskloop_simd:
-  case OMPD_masked_taskloop:
-  case OMPD_masked_taskloop_simd:
-CaptureRegions.push_back(OMPD_taskloop);
-break;
-  case OMPD_parallel_masked_taskloop:
-  case OMPD_parallel_masked_taskloop_simd:
-  case OMPD_parallel_master_taskloop:
-  case OMPD_parallel_master_taskloop_simd:
-CaptureRegions.push_back(OMPD_parallel);
-CaptureRegions.push_back(OMPD_taskloop);
-break;
-  case OMPD_target_teams_loop:
-  case OMPD_target_teams_distribute_parallel_for:
-  case OMPD_target_teams_distribute_parallel_for_simd:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-CaptureRegions.push_back(OMPD_teams);
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_nothing:
-CaptureRegions.push_back(OMPD_nothing);
-break;
-  case OMPD_loop:
-// TODO: 'loop' may require different capture regions depending on the bind
-// clause or the parent directive when there is no bind clause. Use
-// OMPD_unknown for now.
-  case OMPD_simd:
-  case OMPD_for:
-  case OMPD_for_simd:
-  case OMPD_sections:
-  case OMPD_single:
-  case OMPD_taskgroup:
-  case OMPD_distribute:
-  case OMPD_ordered:
-  case OMPD_target_data:
-  case OMPD_distribute_simd:
-  case OMPD_scope:
-  case OMPD_dispatch:
+  auto getRegionsForLeaf = [&](OpenMPDirectiveKind LKind) {

kparzysz wrote:

Done

https://github.com/llvm/llvm-project/pull/97110
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] [clang][OpenMP] Rewrite `getOpenMPCaptureRegions` in terms of leafs (PR #97110)

2024-07-01 Thread Krzysztof Parzyszek via llvm-branch-commits


@@ -747,105 +747,79 @@ void clang::getOpenMPCaptureRegions(
   assert(unsigned(DKind) < llvm::omp::Directive_enumSize);
   assert(isOpenMPCapturingDirective(DKind) && "Expecting capturing directive");
 
-  switch (DKind) {
-  case OMPD_metadirective:
-CaptureRegions.push_back(OMPD_metadirective);
-break;
-  case OMPD_parallel:
-  case OMPD_parallel_for:
-  case OMPD_parallel_for_simd:
-  case OMPD_parallel_master:
-  case OMPD_parallel_masked:
-  case OMPD_parallel_sections:
-  case OMPD_distribute_parallel_for:
-  case OMPD_distribute_parallel_for_simd:
-  case OMPD_parallel_loop:
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_target_teams:
-  case OMPD_target_teams_distribute:
-  case OMPD_target_teams_distribute_simd:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-CaptureRegions.push_back(OMPD_teams);
-break;
-  case OMPD_teams:
-  case OMPD_teams_distribute:
-  case OMPD_teams_distribute_simd:
-CaptureRegions.push_back(OMPD_teams);
-break;
-  case OMPD_target:
-  case OMPD_target_simd:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-break;
-  case OMPD_teams_loop:
-  case OMPD_teams_distribute_parallel_for:
-  case OMPD_teams_distribute_parallel_for_simd:
-CaptureRegions.push_back(OMPD_teams);
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_target_parallel:
-  case OMPD_target_parallel_for:
-  case OMPD_target_parallel_for_simd:
-  case OMPD_target_parallel_loop:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_task:
-  case OMPD_target_enter_data:
-  case OMPD_target_exit_data:
-  case OMPD_target_update:
-CaptureRegions.push_back(OMPD_task);
-break;
-  case OMPD_taskloop:
-  case OMPD_taskloop_simd:
-  case OMPD_master_taskloop:
-  case OMPD_master_taskloop_simd:
-  case OMPD_masked_taskloop:
-  case OMPD_masked_taskloop_simd:
-CaptureRegions.push_back(OMPD_taskloop);
-break;
-  case OMPD_parallel_masked_taskloop:
-  case OMPD_parallel_masked_taskloop_simd:
-  case OMPD_parallel_master_taskloop:
-  case OMPD_parallel_master_taskloop_simd:
-CaptureRegions.push_back(OMPD_parallel);
-CaptureRegions.push_back(OMPD_taskloop);
-break;
-  case OMPD_target_teams_loop:
-  case OMPD_target_teams_distribute_parallel_for:
-  case OMPD_target_teams_distribute_parallel_for_simd:
-CaptureRegions.push_back(OMPD_task);
-CaptureRegions.push_back(OMPD_target);
-CaptureRegions.push_back(OMPD_teams);
-CaptureRegions.push_back(OMPD_parallel);
-break;
-  case OMPD_nothing:
-CaptureRegions.push_back(OMPD_nothing);
-break;
-  case OMPD_loop:
-// TODO: 'loop' may require different capture regions depending on the bind
-// clause or the parent directive when there is no bind clause. Use
-// OMPD_unknown for now.
-  case OMPD_simd:
-  case OMPD_for:
-  case OMPD_for_simd:
-  case OMPD_sections:
-  case OMPD_single:
-  case OMPD_taskgroup:
-  case OMPD_distribute:
-  case OMPD_ordered:
-  case OMPD_target_data:
-  case OMPD_distribute_simd:
-  case OMPD_scope:
-  case OMPD_dispatch:
+  auto getRegionsForLeaf = [&](OpenMPDirectiveKind LKind) {
+assert(isLeafConstruct(LKind) && "Epecting leaf directive");
+switch (LKind) {
+case OMPD_metadirective:
+  CaptureRegions.push_back(OMPD_metadirective);
+  break;
+case OMPD_nothing:
+  CaptureRegions.push_back(OMPD_nothing);
+  break;
+case OMPD_parallel:
+  CaptureRegions.push_back(OMPD_parallel);
+  break;
+case OMPD_target:
+  CaptureRegions.push_back(OMPD_task);
+  CaptureRegions.push_back(OMPD_target);
+  break;
+case OMPD_task:
+case OMPD_target_enter_data:
+case OMPD_target_exit_data:
+case OMPD_target_update:
+  CaptureRegions.push_back(OMPD_task);
+  break;
+case OMPD_teams:
+  CaptureRegions.push_back(OMPD_teams);
+  break;
+case OMPD_taskloop:
+  CaptureRegions.push_back(OMPD_taskloop);
+  break;
+case OMPD_loop:
+  // TODO: 'loop' may require different capture regions depending on the
+  // bind clause or the parent directive when there is no bind clause.
+  // If any of the directives that push regions here are parents of 'loop',
+  // assume 'parallel'. Otherwise do nothing.
+  if (!CaptureRegions.empty() &&
+  !llvm::is_contained(CaptureRegions, OMPD_parallel))
+CaptureRegions.push_back(OMPD_parallel);
+  break;
+case OMPD_dispatch:
+case OMPD_distribute:
+case OMPD_for:
+case OMPD_masked:
+case OMPD_master:
+case OMPD_ordered:
+case OMPD_scope:
+case OMPD_sections:
+case OMPD_simd:
+case OMPD_single:
+case OMPD_target_data:
+case OMPD_taskgroup:
+  // These directives (when standalone) use OMPD_unknown as the region,
+  //

[llvm-branch-commits] [RISCV][lld] Support merging RISC-V Atomics ABI attributes (PR #97347)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi created 
https://github.com/llvm/llvm-project/pull/97347

This patch adds support for merging the atomic_abi attribute, specifid in
https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-elf.adoc#tag_riscv_atomic_abi-14-uleb128version,
to LLD.

The atomics_abi tag merging is conducted as follows:

UNKNOWN is safe to merge with all other values.
A6C is compatible with A6S, and results in the A6C ABI.
A6C is incompatible with A7, and results in an error.
A6S and A7 are compatible, and merging results in the A7 ABI.
Note: the A7 is not yet supported in either LLVM or in any current hardware,
and is therefore omitted from attribute generation in RISCVTargetStreamer.

LLD support was split from https://github.com/llvm/llvm-project/pull/90266



___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [RISCV][lld] Support merging RISC-V Atomics ABI attributes (PR #97347)

2024-07-01 Thread via llvm-branch-commits

llvmbot wrote:



@llvm/pr-subscribers-lld

@llvm/pr-subscribers-lld-elf

Author: Paul Kirth (ilovepi)


Changes

This patch adds support for merging the atomic_abi attribute, specifid in
https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-elf.adoc#tag_riscv_atomic_abi-14-uleb128version,
to LLD.

The atomics_abi tag merging is conducted as follows:

UNKNOWN is safe to merge with all other values.
A6C is compatible with A6S, and results in the A6C ABI.
A6C is incompatible with A7, and results in an error.
A6S and A7 are compatible, and merging results in the A7 ABI.
Note: the A7 is not yet supported in either LLVM or in any current hardware,
and is therefore omitted from attribute generation in RISCVTargetStreamer.

LLD support was split from https://github.com/llvm/llvm-project/pull/90266


---
Full diff: https://github.com/llvm/llvm-project/pull/97347.diff


2 Files Affected:

- (modified) lld/ELF/Arch/RISCV.cpp (+78) 
- (modified) lld/test/ELF/riscv-attributes.s (+203) 


``diff
diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index e4d63250135e0..aa11aaa61a532 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -1084,10 +1084,76 @@ static void 
mergeArch(RISCVISAUtils::OrderedExtensionMap &mergedExts,
   }
 }
 
+static void mergeAtomic(DenseMap::iterator it,
+const InputSectionBase *oldSection,
+const InputSectionBase *newSection,
+RISCVAttrs::RISCVAtomicAbiTag oldTag,
+RISCVAttrs::RISCVAtomicAbiTag newTag) {
+  using RISCVAttrs::RISCVAtomicAbiTag;
+  // Same tags stay the same, and UNKNOWN is compatible with anything
+  if (oldTag == newTag || newTag == RISCVAtomicAbiTag::UNKNOWN)
+return;
+
+  auto reportAbiError = [&]() {
+errorOrWarn("atomic abi mismatch for " + oldSection->name + "\n>>> " +
+toString(oldSection) +
+": atomic_abi=" + Twine(static_cast(oldTag)) +
+"\n>>> " + toString(newSection) +
+": atomic_abi=" + Twine(static_cast(newTag)));
+  };
+
+  switch (static_cast(oldTag)) {
+  case RISCVAtomicAbiTag::UNKNOWN:
+it->getSecond() = static_cast(newTag);
+return;
+  case RISCVAtomicAbiTag::A6C:
+switch (newTag) {
+case RISCVAtomicAbiTag::A6S:
+  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  return;
+case RISCVAtomicAbiTag::A7:
+  reportAbiError();
+  return;
+case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
+case RISCVAttrs::RISCVAtomicAbiTag::A6C:
+  return;
+};
+
+  case RISCVAtomicAbiTag::A6S:
+switch (newTag) {
+case RISCVAtomicAbiTag::A6C:
+  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  return;
+case RISCVAtomicAbiTag::A7:
+  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  return;
+case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
+case RISCVAttrs::RISCVAtomicAbiTag::A6S:
+  return;
+};
+
+  case RISCVAtomicAbiTag::A7:
+switch (newTag) {
+case RISCVAtomicAbiTag::A6S:
+  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  return;
+case RISCVAtomicAbiTag::A6C:
+  reportAbiError();
+  return;
+case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
+case RISCVAttrs::RISCVAtomicAbiTag::A7:
+  return;
+};
+  };
+  llvm_unreachable("unknown AtomicABI");
+}
+
 static RISCVAttributesSection *
 mergeAttributesSection(const SmallVector §ions) {
+  using RISCVAttrs::RISCVAtomicAbiTag;
   RISCVISAUtils::OrderedExtensionMap exts;
   const InputSectionBase *firstStackAlign = nullptr;
+  const InputSectionBase *firstAtomicAbi = nullptr;
   unsigned firstStackAlignValue = 0, xlen = 0;
   bool hasArch = false;
 
@@ -1134,6 +1200,18 @@ mergeAttributesSection(const 
SmallVector §ions) {
   case RISCVAttrs::PRIV_SPEC_MINOR:
   case RISCVAttrs::PRIV_SPEC_REVISION:
 break;
+
+  case llvm::RISCVAttrs::AttrType::ATOMIC_ABI:
+if (auto i = parser.getAttributeValue(tag.attr)) {
+  auto r = merged.intAttr.try_emplace(tag.attr, *i);
+  if (r.second)
+firstAtomicAbi = sec;
+  else
+mergeAtomic(r.first, firstAtomicAbi, sec,
+static_cast(r.first->getSecond()),
+static_cast(*i));
+}
+continue;
   }
 
   // Fallback for deprecated priv_spec* and other unknown attributes: 
retain
diff --git a/lld/test/ELF/riscv-attributes.s b/lld/test/ELF/riscv-attributes.s
index 68534d0fb6b75..38b0fe8e7797e 100644
--- a/lld/test/ELF/riscv-attributes.s
+++ b/lld/test/ELF/riscv-attributes.s
@@ -44,6 +44,40 @@
 # RUN: not ld.lld a.o b.o c.o diff_stack_align.o -o /dev/null 2>&1 | FileCheck 
%s --check-prefix=STACK_ALIGN --implicit-check-not=error:
 # STACK_ALIGN: error: diff_stack_align.o:(.riscv.attributes) has 
stack_align=32 but a.o:(.riscv.attributes) has stack_align=16
 
+## RISC-V tag merging for atomic_abi values A6

[llvm-branch-commits] [RISCV][lld] Support merging RISC-V Atomics ABI attributes (PR #97347)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/97347


___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [RISCV][lld] Support merging RISC-V Atomics ABI attributes (PR #97347)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/97347


___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [lld] [llvm] Reapply "[llvm][RISCV] Enable trailing fences for seq-cst stores by default (#87376)" (PR #90267)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/90267

>From 788f58b302f20a000db3a9741e54cc861c9dcb88 Mon Sep 17 00:00:00 2001
From: Paul Kirth 
Date: Mon, 1 Jul 2024 10:13:23 -0700
Subject: [PATCH] Fix mismerge

Created using spr 1.3.4
---
 lld/ELF/Arch/RISCV.cpp| 70 ---
 lld/test/ELF/riscv-attributes.s   |  4 +-
 llvm/include/llvm/Support/RISCVAttributes.h   |  4 +-
 .../MCTargetDesc/RISCVTargetStreamer.cpp  | 15 ++--
 4 files changed, 39 insertions(+), 54 deletions(-)

diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index 1d9be92601006..0d0ab5de9acc1 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -1088,65 +1088,51 @@ static void mergeAtomic(DenseMap::iterator it,
 const InputSectionBase *oldSection,
 const InputSectionBase *newSection, unsigned int 
oldTag,
 unsigned int newTag) {
-  using RISCVAttrs::RISCVAtomicAbiTag;
+  using RISCVAttrs::RISCVAtomicAbiTag::AtomicABI;
   // Same tags stay the same, and UNKNOWN is compatible with anything
-  if (oldTag == newTag ||
-  newTag == static_cast(RISCVAtomicAbiTag::UNKNOWN))
+  if (oldTag == newTag || newTag == AtomicABI::UNKNOWN)
 return;
 
-  auto reportAbiError = [&]() {
-errorOrWarn("atomic abi mismatch for " + oldSection->name + "\n>>> " +
-toString(oldSection) + ": atomic_abi=" + Twine(oldTag) +
-"\n>>> " + toString(newSection) +
-": atomic_abi=" + Twine(newTag));
-  };
-
-  switch (static_cast(oldTag)) {
-  case RISCVAtomicAbiTag::UNKNOWN:
+  switch (oldTag) {
+  case AtomicABI::UNKNOWN:
 it->getSecond() = newTag;
 return;
-  case RISCVAtomicAbiTag::A6C:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6C:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  reportAbiError();
+case AtomicABI::A7:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6C:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A6S:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6C:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6S:
+switch (newTag) {
+case AtomicABI::A6C:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+case AtomicABI::A7:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6S:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A7:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  case AtomicABI::A7:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAtomicAbiTag::A6C:
-  reportAbiError();
+case AtomicABI::A6C:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A7:
-  break;
 };
+  default:
+llvm_unreachable("unknown AtomicABI");
   };
-  llvm_unreachable("unknown AtomicABI");
 }
 
 static RISCVAttributesSection *
diff --git a/lld/test/ELF/riscv-attributes.s b/lld/test/ELF/riscv-attributes.s
index 38b0fe8e7797e..91321f33297aa 100644
--- a/lld/test/ELF/riscv-attributes.s
+++ b/lld/test/ELF/riscv-attributes.s
@@ -48,9 +48,7 @@
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6C.s -o 
atomic_abi_A6C.o
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A7.s -o 
atomic_abi_A7.o
 # RUN: not ld.lld atomic_abi_A6C.o atomic_abi_A7.o -o /dev/null 2>&1 | 
FileCheck %s --check-prefix=ATOMIC_ABI_ERROR --implicit-check-not=error:
-# ATOMIC_ABI_ERROR: error: atomic abi mismatch for .riscv.attributes
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A6C.o:(.riscv.attributes): atomic_abi=1
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A7.o:(.riscv.attributes): atomic_abi=3
+# ATOMIC_ABI_ERROR: error: atomic_abi_A6C.o:(.riscv.attributes) has 
atomic_abi=1 but atomic_abi_A7.o:(.riscv.attributes) has atomic_abi=3
 
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6S.s -o 
atomic_abi_A6S.o
 # RUN: ld.lld atomic_abi_A6S.o atomic_abi_A6C.o -o atomic_abi_A6C_A6S
diff --git a/llvm/include/llvm/Sup

[llvm-branch-commits] [lld] [llvm] Reapply "[llvm][RISCV] Enable trailing fences for seq-cst stores by default (#87376)" (PR #90267)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/90267

>From 788f58b302f20a000db3a9741e54cc861c9dcb88 Mon Sep 17 00:00:00 2001
From: Paul Kirth 
Date: Mon, 1 Jul 2024 10:13:23 -0700
Subject: [PATCH] Fix mismerge

Created using spr 1.3.4
---
 lld/ELF/Arch/RISCV.cpp| 70 ---
 lld/test/ELF/riscv-attributes.s   |  4 +-
 llvm/include/llvm/Support/RISCVAttributes.h   |  4 +-
 .../MCTargetDesc/RISCVTargetStreamer.cpp  | 15 ++--
 4 files changed, 39 insertions(+), 54 deletions(-)

diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index 1d9be92601006..0d0ab5de9acc1 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -1088,65 +1088,51 @@ static void mergeAtomic(DenseMap::iterator it,
 const InputSectionBase *oldSection,
 const InputSectionBase *newSection, unsigned int 
oldTag,
 unsigned int newTag) {
-  using RISCVAttrs::RISCVAtomicAbiTag;
+  using RISCVAttrs::RISCVAtomicAbiTag::AtomicABI;
   // Same tags stay the same, and UNKNOWN is compatible with anything
-  if (oldTag == newTag ||
-  newTag == static_cast(RISCVAtomicAbiTag::UNKNOWN))
+  if (oldTag == newTag || newTag == AtomicABI::UNKNOWN)
 return;
 
-  auto reportAbiError = [&]() {
-errorOrWarn("atomic abi mismatch for " + oldSection->name + "\n>>> " +
-toString(oldSection) + ": atomic_abi=" + Twine(oldTag) +
-"\n>>> " + toString(newSection) +
-": atomic_abi=" + Twine(newTag));
-  };
-
-  switch (static_cast(oldTag)) {
-  case RISCVAtomicAbiTag::UNKNOWN:
+  switch (oldTag) {
+  case AtomicABI::UNKNOWN:
 it->getSecond() = newTag;
 return;
-  case RISCVAtomicAbiTag::A6C:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6C:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  reportAbiError();
+case AtomicABI::A7:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6C:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A6S:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6C:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6S:
+switch (newTag) {
+case AtomicABI::A6C:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+case AtomicABI::A7:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6S:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A7:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  case AtomicABI::A7:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAtomicAbiTag::A6C:
-  reportAbiError();
+case AtomicABI::A6C:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A7:
-  break;
 };
+  default:
+llvm_unreachable("unknown AtomicABI");
   };
-  llvm_unreachable("unknown AtomicABI");
 }
 
 static RISCVAttributesSection *
diff --git a/lld/test/ELF/riscv-attributes.s b/lld/test/ELF/riscv-attributes.s
index 38b0fe8e7797e..91321f33297aa 100644
--- a/lld/test/ELF/riscv-attributes.s
+++ b/lld/test/ELF/riscv-attributes.s
@@ -48,9 +48,7 @@
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6C.s -o 
atomic_abi_A6C.o
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A7.s -o 
atomic_abi_A7.o
 # RUN: not ld.lld atomic_abi_A6C.o atomic_abi_A7.o -o /dev/null 2>&1 | 
FileCheck %s --check-prefix=ATOMIC_ABI_ERROR --implicit-check-not=error:
-# ATOMIC_ABI_ERROR: error: atomic abi mismatch for .riscv.attributes
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A6C.o:(.riscv.attributes): atomic_abi=1
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A7.o:(.riscv.attributes): atomic_abi=3
+# ATOMIC_ABI_ERROR: error: atomic_abi_A6C.o:(.riscv.attributes) has 
atomic_abi=1 but atomic_abi_A7.o:(.riscv.attributes) has atomic_abi=3
 
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6S.s -o 
atomic_abi_A6S.o
 # RUN: ld.lld atomic_abi_A6S.o atomic_abi_A6C.o -o atomic_abi_A6C_A6S
diff --git a/llvm/include/llvm/Sup

[llvm-branch-commits] [llvm] [BOLT] Match functions with calls as anchors (PR #96596)

2024-07-01 Thread Shaw Young via llvm-branch-commits

https://github.com/shawbyoung updated 
https://github.com/llvm/llvm-project/pull/96596

>From 05d59574d6260b98a469921eb2fccf5398bfafb6 Mon Sep 17 00:00:00 2001
From: shawbyoung 
Date: Mon, 24 Jun 2024 23:00:59 -0700
Subject: [PATCH 1/7] Added call to matchWithCallsAsAnchors

Created using spr 1.3.4
---
 bolt/lib/Profile/YAMLProfileReader.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/bolt/lib/Profile/YAMLProfileReader.cpp 
b/bolt/lib/Profile/YAMLProfileReader.cpp
index aafffac3d4b1c..1a0e5d239d252 100644
--- a/bolt/lib/Profile/YAMLProfileReader.cpp
+++ b/bolt/lib/Profile/YAMLProfileReader.cpp
@@ -479,6 +479,9 @@ Error YAMLProfileReader::readProfile(BinaryContext &BC) {
 if (!YamlBF.Used && BF && !ProfiledFunctions.count(BF))
   matchProfileToFunction(YamlBF, *BF);
 
+  uint64_t MatchedWithCallsAsAnchors = 0;
+  matchWithCallsAsAnchors(BC,  MatchedWithCallsAsAnchors);
+
   for (yaml::bolt::BinaryFunctionProfile &YamlBF : YamlBP.Functions)
 if (!YamlBF.Used && opts::Verbosity >= 1)
   errs() << "BOLT-WARNING: profile ignored for function " << YamlBF.Name

>From 77ef0008f4f5987719555e6cc3e32da812ae0f31 Mon Sep 17 00:00:00 2001
From: shawbyoung 
Date: Mon, 24 Jun 2024 23:11:43 -0700
Subject: [PATCH 2/7] Changed CallHashToBF representation

Created using spr 1.3.4
---
 bolt/lib/Profile/YAMLProfileReader.cpp | 15 ++-
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/bolt/lib/Profile/YAMLProfileReader.cpp 
b/bolt/lib/Profile/YAMLProfileReader.cpp
index 1a0e5d239d252..91b01a99c7485 100644
--- a/bolt/lib/Profile/YAMLProfileReader.cpp
+++ b/bolt/lib/Profile/YAMLProfileReader.cpp
@@ -29,6 +29,10 @@ static llvm::cl::opt
cl::desc("ignore hash while reading function profile"),
cl::Hidden, cl::cat(BoltOptCategory));
 
+llvm::cl::opt MatchWithCallsAsAnchors("match-with-calls-as-anchors",
+  cl::desc("Matches with calls as anchors"),
+  cl::Hidden, cl::cat(BoltOptCategory));
+
 llvm::cl::opt ProfileUseDFS("profile-use-dfs",
   cl::desc("use DFS order for YAML profile"),
   cl::Hidden, cl::cat(BoltOptCategory));
@@ -353,7 +357,7 @@ void YAMLProfileReader::matchWithCallsAsAnchors(
 llvm_unreachable("Unhandled HashFunction");
   };
 
-  std::unordered_map CallHashToBF;
+  std::unordered_map CallHashToBF;
 
   for (BinaryFunction *BF : BC.getAllBinaryFunctions()) {
 if (ProfiledFunctions.count(BF))
@@ -375,12 +379,12 @@ void YAMLProfileReader::matchWithCallsAsAnchors(
   for (const std::string &FunctionName : FunctionNames)
 HashString.append(FunctionName);
 }
-CallHashToBF.emplace(ComputeCallHash(HashString), BF);
+CallHashToBF[ComputeCallHash(HashString)] = BF;
   }
 
   std::unordered_map ProfiledFunctionIdToName;
 
-  for (const yaml::bolt::BinaryFunctionProfile YamlBF : YamlBP.Functions)
+  for (const yaml::bolt::BinaryFunctionProfile &YamlBF : YamlBP.Functions)
 ProfiledFunctionIdToName[YamlBF.Id] = YamlBF.Name;
 
   for (yaml::bolt::BinaryFunctionProfile &YamlBF : YamlBP.Functions) {
@@ -401,7 +405,7 @@ void YAMLProfileReader::matchWithCallsAsAnchors(
 auto It = CallHashToBF.find(Hash);
 if (It == CallHashToBF.end())
   continue;
-matchProfileToFunction(YamlBF, It->second);
+matchProfileToFunction(YamlBF, *It->second);
 ++MatchedWithCallsAsAnchors;
   }
 }
@@ -480,7 +484,8 @@ Error YAMLProfileReader::readProfile(BinaryContext &BC) {
   matchProfileToFunction(YamlBF, *BF);
 
   uint64_t MatchedWithCallsAsAnchors = 0;
-  matchWithCallsAsAnchors(BC,  MatchedWithCallsAsAnchors);
+  if (opts::MatchWithCallsAsAnchors)
+matchWithCallsAsAnchors(BC,  MatchedWithCallsAsAnchors);
 
   for (yaml::bolt::BinaryFunctionProfile &YamlBF : YamlBP.Functions)
 if (!YamlBF.Used && opts::Verbosity >= 1)

>From ea7cb68ab9e8e158412c2e752986968968a60d93 Mon Sep 17 00:00:00 2001
From: shawbyoung 
Date: Tue, 25 Jun 2024 09:28:39 -0700
Subject: [PATCH 3/7] Changed BF called FunctionNames to multiset

Created using spr 1.3.4
---
 bolt/lib/Profile/YAMLProfileReader.cpp | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/bolt/lib/Profile/YAMLProfileReader.cpp 
b/bolt/lib/Profile/YAMLProfileReader.cpp
index 91b01a99c7485..3b3d73f7af023 100644
--- a/bolt/lib/Profile/YAMLProfileReader.cpp
+++ b/bolt/lib/Profile/YAMLProfileReader.cpp
@@ -365,7 +365,7 @@ void YAMLProfileReader::matchWithCallsAsAnchors(
 
 std::string HashString;
 for (const auto &BB : BF->blocks()) {
-  std::set FunctionNames;
+  std::multiset FunctionNames;
   for (const MCInst &Instr : BB) {
 // Skip non-call instructions.
 if (!BC.MIB->isCall(Instr))
@@ -397,9 +397,8 @@ void YAMLProfileReader::matchWithCallsAsAnchors(
 std::string &FunctionName = ProfiledFunctionIdToName[CallSite.DestId];
 FunctionNames.insert(FunctionName);
   

[llvm-branch-commits] [RISCV][lld] Support merging RISC-V Atomics ABI attributes (PR #97347)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/97347


___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [RISCV][lld] Support merging RISC-V Atomics ABI attributes (PR #97347)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/97347


___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [lld] [llvm] Reapply "[llvm][RISCV] Enable trailing fences for seq-cst stores by default (#87376)" (PR #90267)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/90267

>From 788f58b302f20a000db3a9741e54cc861c9dcb88 Mon Sep 17 00:00:00 2001
From: Paul Kirth 
Date: Mon, 1 Jul 2024 10:13:23 -0700
Subject: [PATCH] Fix mismerge

Created using spr 1.3.4
---
 lld/ELF/Arch/RISCV.cpp| 70 ---
 lld/test/ELF/riscv-attributes.s   |  4 +-
 llvm/include/llvm/Support/RISCVAttributes.h   |  4 +-
 .../MCTargetDesc/RISCVTargetStreamer.cpp  | 15 ++--
 4 files changed, 39 insertions(+), 54 deletions(-)

diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index 1d9be92601006..0d0ab5de9acc1 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -1088,65 +1088,51 @@ static void mergeAtomic(DenseMap::iterator it,
 const InputSectionBase *oldSection,
 const InputSectionBase *newSection, unsigned int 
oldTag,
 unsigned int newTag) {
-  using RISCVAttrs::RISCVAtomicAbiTag;
+  using RISCVAttrs::RISCVAtomicAbiTag::AtomicABI;
   // Same tags stay the same, and UNKNOWN is compatible with anything
-  if (oldTag == newTag ||
-  newTag == static_cast(RISCVAtomicAbiTag::UNKNOWN))
+  if (oldTag == newTag || newTag == AtomicABI::UNKNOWN)
 return;
 
-  auto reportAbiError = [&]() {
-errorOrWarn("atomic abi mismatch for " + oldSection->name + "\n>>> " +
-toString(oldSection) + ": atomic_abi=" + Twine(oldTag) +
-"\n>>> " + toString(newSection) +
-": atomic_abi=" + Twine(newTag));
-  };
-
-  switch (static_cast(oldTag)) {
-  case RISCVAtomicAbiTag::UNKNOWN:
+  switch (oldTag) {
+  case AtomicABI::UNKNOWN:
 it->getSecond() = newTag;
 return;
-  case RISCVAtomicAbiTag::A6C:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6C:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  reportAbiError();
+case AtomicABI::A7:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6C:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A6S:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6C:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6S:
+switch (newTag) {
+case AtomicABI::A6C:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+case AtomicABI::A7:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6S:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A7:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  case AtomicABI::A7:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAtomicAbiTag::A6C:
-  reportAbiError();
+case AtomicABI::A6C:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A7:
-  break;
 };
+  default:
+llvm_unreachable("unknown AtomicABI");
   };
-  llvm_unreachable("unknown AtomicABI");
 }
 
 static RISCVAttributesSection *
diff --git a/lld/test/ELF/riscv-attributes.s b/lld/test/ELF/riscv-attributes.s
index 38b0fe8e7797e..91321f33297aa 100644
--- a/lld/test/ELF/riscv-attributes.s
+++ b/lld/test/ELF/riscv-attributes.s
@@ -48,9 +48,7 @@
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6C.s -o 
atomic_abi_A6C.o
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A7.s -o 
atomic_abi_A7.o
 # RUN: not ld.lld atomic_abi_A6C.o atomic_abi_A7.o -o /dev/null 2>&1 | 
FileCheck %s --check-prefix=ATOMIC_ABI_ERROR --implicit-check-not=error:
-# ATOMIC_ABI_ERROR: error: atomic abi mismatch for .riscv.attributes
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A6C.o:(.riscv.attributes): atomic_abi=1
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A7.o:(.riscv.attributes): atomic_abi=3
+# ATOMIC_ABI_ERROR: error: atomic_abi_A6C.o:(.riscv.attributes) has 
atomic_abi=1 but atomic_abi_A7.o:(.riscv.attributes) has atomic_abi=3
 
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6S.s -o 
atomic_abi_A6S.o
 # RUN: ld.lld atomic_abi_A6S.o atomic_abi_A6C.o -o atomic_abi_A6C_A6S
diff --git a/llvm/include/llvm/Sup

[llvm-branch-commits] [lld] [llvm] Reapply "[llvm][RISCV] Enable trailing fences for seq-cst stores by default (#87376)" (PR #90267)

2024-07-01 Thread Paul Kirth via llvm-branch-commits

https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/90267

>From 788f58b302f20a000db3a9741e54cc861c9dcb88 Mon Sep 17 00:00:00 2001
From: Paul Kirth 
Date: Mon, 1 Jul 2024 10:13:23 -0700
Subject: [PATCH] Fix mismerge

Created using spr 1.3.4
---
 lld/ELF/Arch/RISCV.cpp| 70 ---
 lld/test/ELF/riscv-attributes.s   |  4 +-
 llvm/include/llvm/Support/RISCVAttributes.h   |  4 +-
 .../MCTargetDesc/RISCVTargetStreamer.cpp  | 15 ++--
 4 files changed, 39 insertions(+), 54 deletions(-)

diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index 1d9be92601006..0d0ab5de9acc1 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -1088,65 +1088,51 @@ static void mergeAtomic(DenseMap::iterator it,
 const InputSectionBase *oldSection,
 const InputSectionBase *newSection, unsigned int 
oldTag,
 unsigned int newTag) {
-  using RISCVAttrs::RISCVAtomicAbiTag;
+  using RISCVAttrs::RISCVAtomicAbiTag::AtomicABI;
   // Same tags stay the same, and UNKNOWN is compatible with anything
-  if (oldTag == newTag ||
-  newTag == static_cast(RISCVAtomicAbiTag::UNKNOWN))
+  if (oldTag == newTag || newTag == AtomicABI::UNKNOWN)
 return;
 
-  auto reportAbiError = [&]() {
-errorOrWarn("atomic abi mismatch for " + oldSection->name + "\n>>> " +
-toString(oldSection) + ": atomic_abi=" + Twine(oldTag) +
-"\n>>> " + toString(newSection) +
-": atomic_abi=" + Twine(newTag));
-  };
-
-  switch (static_cast(oldTag)) {
-  case RISCVAtomicAbiTag::UNKNOWN:
+  switch (oldTag) {
+  case AtomicABI::UNKNOWN:
 it->getSecond() = newTag;
 return;
-  case RISCVAtomicAbiTag::A6C:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6C:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  reportAbiError();
+case AtomicABI::A7:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6C:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A6S:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6C:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  case AtomicABI::A6S:
+switch (newTag) {
+case AtomicABI::A6C:
+  it->getSecond() = AtomicABI::A6C;
   return;
-case RISCVAtomicAbiTag::A7:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+case AtomicABI::A7:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A6S:
-  break;
 };
-break;
 
-  case RISCVAtomicAbiTag::A7:
-switch (static_cast(newTag)) {
-case RISCVAtomicAbiTag::A6S:
-  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  case AtomicABI::A7:
+switch (newTag) {
+case AtomicABI::A6S:
+  it->getSecond() = AtomicABI::A7;
   return;
-case RISCVAtomicAbiTag::A6C:
-  reportAbiError();
+case AtomicABI::A6C:
+  errorOrWarn(toString(oldSection) + " has atomic_abi=" + Twine(oldTag) +
+  " but " + toString(newSection) +
+  " has atomic_abi=" + Twine(newTag));
   return;
-case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
-case RISCVAttrs::RISCVAtomicAbiTag::A7:
-  break;
 };
+  default:
+llvm_unreachable("unknown AtomicABI");
   };
-  llvm_unreachable("unknown AtomicABI");
 }
 
 static RISCVAttributesSection *
diff --git a/lld/test/ELF/riscv-attributes.s b/lld/test/ELF/riscv-attributes.s
index 38b0fe8e7797e..91321f33297aa 100644
--- a/lld/test/ELF/riscv-attributes.s
+++ b/lld/test/ELF/riscv-attributes.s
@@ -48,9 +48,7 @@
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6C.s -o 
atomic_abi_A6C.o
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A7.s -o 
atomic_abi_A7.o
 # RUN: not ld.lld atomic_abi_A6C.o atomic_abi_A7.o -o /dev/null 2>&1 | 
FileCheck %s --check-prefix=ATOMIC_ABI_ERROR --implicit-check-not=error:
-# ATOMIC_ABI_ERROR: error: atomic abi mismatch for .riscv.attributes
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A6C.o:(.riscv.attributes): atomic_abi=1
-# ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A7.o:(.riscv.attributes): atomic_abi=3
+# ATOMIC_ABI_ERROR: error: atomic_abi_A6C.o:(.riscv.attributes) has 
atomic_abi=1 but atomic_abi_A7.o:(.riscv.attributes) has atomic_abi=3
 
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6S.s -o 
atomic_abi_A6S.o
 # RUN: ld.lld atomic_abi_A6S.o atomic_abi_A6C.o -o atomic_abi_A6C_A6S
diff --git a/llvm/include/llvm/Sup

[llvm-branch-commits] [BOLT] Drop macro-fusion alignment (PR #97358)

2024-07-01 Thread Amir Ayupov via llvm-branch-commits

https://github.com/aaupov created 
https://github.com/llvm/llvm-project/pull/97358

9d0754ada5dbbc0c009bcc2f7824488419cc5530 dropped MC support required for
macro-fusion alignment in BOLT. Remove the support in BOLT.

Test Plan:
macro-fusion alignment was never upstreamed, so no upstream tests are
affected.



___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [RISCV][lld] Support merging RISC-V Atomics ABI attributes (PR #97347)

2024-07-01 Thread Fangrui Song via llvm-branch-commits


@@ -1084,10 +1084,76 @@ static void 
mergeArch(RISCVISAUtils::OrderedExtensionMap &mergedExts,
   }
 }
 
+static void mergeAtomic(DenseMap::iterator it,
+const InputSectionBase *oldSection,
+const InputSectionBase *newSection,
+RISCVAttrs::RISCVAtomicAbiTag oldTag,
+RISCVAttrs::RISCVAtomicAbiTag newTag) {
+  using RISCVAttrs::RISCVAtomicAbiTag;
+  // Same tags stay the same, and UNKNOWN is compatible with anything
+  if (oldTag == newTag || newTag == RISCVAtomicAbiTag::UNKNOWN)
+return;
+
+  auto reportAbiError = [&]() {
+errorOrWarn("atomic abi mismatch for " + oldSection->name + "\n>>> " +
+toString(oldSection) +
+": atomic_abi=" + Twine(static_cast(oldTag)) +
+"\n>>> " + toString(newSection) +
+": atomic_abi=" + Twine(static_cast(newTag)));
+  };
+
+  switch (static_cast(oldTag)) {

MaskRay wrote:

unneeded cast?

https://github.com/llvm/llvm-project/pull/97347
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [RISCV][lld] Support merging RISC-V Atomics ABI attributes (PR #97347)

2024-07-01 Thread Fangrui Song via llvm-branch-commits


@@ -1084,10 +1084,76 @@ static void 
mergeArch(RISCVISAUtils::OrderedExtensionMap &mergedExts,
   }
 }
 
+static void mergeAtomic(DenseMap::iterator it,
+const InputSectionBase *oldSection,
+const InputSectionBase *newSection,
+RISCVAttrs::RISCVAtomicAbiTag oldTag,
+RISCVAttrs::RISCVAtomicAbiTag newTag) {
+  using RISCVAttrs::RISCVAtomicAbiTag;
+  // Same tags stay the same, and UNKNOWN is compatible with anything
+  if (oldTag == newTag || newTag == RISCVAtomicAbiTag::UNKNOWN)
+return;
+
+  auto reportAbiError = [&]() {
+errorOrWarn("atomic abi mismatch for " + oldSection->name + "\n>>> " +
+toString(oldSection) +
+": atomic_abi=" + Twine(static_cast(oldTag)) +
+"\n>>> " + toString(newSection) +
+": atomic_abi=" + Twine(static_cast(newTag)));
+  };
+
+  switch (static_cast(oldTag)) {
+  case RISCVAtomicAbiTag::UNKNOWN:
+it->getSecond() = static_cast(newTag);
+return;
+  case RISCVAtomicAbiTag::A6C:
+switch (newTag) {
+case RISCVAtomicAbiTag::A6S:
+  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  return;
+case RISCVAtomicAbiTag::A7:
+  reportAbiError();
+  return;
+case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
+case RISCVAttrs::RISCVAtomicAbiTag::A6C:
+  return;
+};
+
+  case RISCVAtomicAbiTag::A6S:
+switch (newTag) {
+case RISCVAtomicAbiTag::A6C:
+  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  return;
+case RISCVAtomicAbiTag::A7:
+  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  return;
+case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
+case RISCVAttrs::RISCVAtomicAbiTag::A6S:
+  return;
+};
+
+  case RISCVAtomicAbiTag::A7:
+switch (newTag) {
+case RISCVAtomicAbiTag::A6S:
+  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  return;
+case RISCVAtomicAbiTag::A6C:
+  reportAbiError();
+  return;
+case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
+case RISCVAttrs::RISCVAtomicAbiTag::A7:
+  return;
+};
+  };
+  llvm_unreachable("unknown AtomicABI");

MaskRay wrote:

If a potentially-corrupted object file may contain an unknown tag, it's 
inappropriate to use unreachable. 

https://github.com/llvm/llvm-project/pull/97347
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [RISCV][lld] Support merging RISC-V Atomics ABI attributes (PR #97347)

2024-07-01 Thread Paul Kirth via llvm-branch-commits


@@ -1084,10 +1084,76 @@ static void 
mergeArch(RISCVISAUtils::OrderedExtensionMap &mergedExts,
   }
 }
 
+static void mergeAtomic(DenseMap::iterator it,
+const InputSectionBase *oldSection,
+const InputSectionBase *newSection,
+RISCVAttrs::RISCVAtomicAbiTag oldTag,
+RISCVAttrs::RISCVAtomicAbiTag newTag) {
+  using RISCVAttrs::RISCVAtomicAbiTag;
+  // Same tags stay the same, and UNKNOWN is compatible with anything
+  if (oldTag == newTag || newTag == RISCVAtomicAbiTag::UNKNOWN)
+return;
+
+  auto reportAbiError = [&]() {
+errorOrWarn("atomic abi mismatch for " + oldSection->name + "\n>>> " +
+toString(oldSection) +
+": atomic_abi=" + Twine(static_cast(oldTag)) +
+"\n>>> " + toString(newSection) +
+": atomic_abi=" + Twine(static_cast(newTag)));
+  };
+
+  switch (static_cast(oldTag)) {

ilovepi wrote:

yes. Looks like I missed one. Thanks.

https://github.com/llvm/llvm-project/pull/97347
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [RISCV][lld] Support merging RISC-V Atomics ABI attributes (PR #97347)

2024-07-01 Thread Paul Kirth via llvm-branch-commits


@@ -1084,10 +1084,76 @@ static void 
mergeArch(RISCVISAUtils::OrderedExtensionMap &mergedExts,
   }
 }
 
+static void mergeAtomic(DenseMap::iterator it,
+const InputSectionBase *oldSection,
+const InputSectionBase *newSection,
+RISCVAttrs::RISCVAtomicAbiTag oldTag,
+RISCVAttrs::RISCVAtomicAbiTag newTag) {
+  using RISCVAttrs::RISCVAtomicAbiTag;
+  // Same tags stay the same, and UNKNOWN is compatible with anything
+  if (oldTag == newTag || newTag == RISCVAtomicAbiTag::UNKNOWN)
+return;
+
+  auto reportAbiError = [&]() {
+errorOrWarn("atomic abi mismatch for " + oldSection->name + "\n>>> " +
+toString(oldSection) +
+": atomic_abi=" + Twine(static_cast(oldTag)) +
+"\n>>> " + toString(newSection) +
+": atomic_abi=" + Twine(static_cast(newTag)));
+  };
+
+  switch (static_cast(oldTag)) {
+  case RISCVAtomicAbiTag::UNKNOWN:
+it->getSecond() = static_cast(newTag);
+return;
+  case RISCVAtomicAbiTag::A6C:
+switch (newTag) {
+case RISCVAtomicAbiTag::A6S:
+  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  return;
+case RISCVAtomicAbiTag::A7:
+  reportAbiError();
+  return;
+case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
+case RISCVAttrs::RISCVAtomicAbiTag::A6C:
+  return;
+};
+
+  case RISCVAtomicAbiTag::A6S:
+switch (newTag) {
+case RISCVAtomicAbiTag::A6C:
+  it->getSecond() = static_cast(RISCVAtomicAbiTag::A6C);
+  return;
+case RISCVAtomicAbiTag::A7:
+  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  return;
+case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
+case RISCVAttrs::RISCVAtomicAbiTag::A6S:
+  return;
+};
+
+  case RISCVAtomicAbiTag::A7:
+switch (newTag) {
+case RISCVAtomicAbiTag::A6S:
+  it->getSecond() = static_cast(RISCVAtomicAbiTag::A7);
+  return;
+case RISCVAtomicAbiTag::A6C:
+  reportAbiError();
+  return;
+case RISCVAttrs::RISCVAtomicAbiTag::UNKNOWN:
+case RISCVAttrs::RISCVAtomicAbiTag::A7:
+  return;
+};
+  };
+  llvm_unreachable("unknown AtomicABI");

ilovepi wrote:

Ah, fair point. I'll update w/ an error instead.

https://github.com/llvm/llvm-project/pull/97347
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [BOLT] Drop macro-fusion alignment (PR #97358)

2024-07-01 Thread Amir Ayupov via llvm-branch-commits

https://github.com/aaupov ready_for_review 
https://github.com/llvm/llvm-project/pull/97358
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [BOLT] Drop macro-fusion alignment (PR #97358)

2024-07-01 Thread via llvm-branch-commits

llvmbot wrote:




@llvm/pr-subscribers-bolt

Author: Amir Ayupov (aaupov)


Changes

9d0754ada5dbbc0c009bcc2f7824488419cc5530 dropped MC support required for
macro-fusion alignment in BOLT. Remove the support in BOLT.

Test Plan:
macro-fusion alignment was never upstreamed, so no upstream tests are
affected.


---
Full diff: https://github.com/llvm/llvm-project/pull/97358.diff


11 Files Affected:

- (modified) bolt/include/bolt/Core/BinaryBasicBlock.h (-9) 
- (modified) bolt/include/bolt/Core/BinaryContext.h (-4) 
- (modified) bolt/include/bolt/Core/BinaryFunction.h (-4) 
- (modified) bolt/include/bolt/Core/MCPlusBuilder.h (-7) 
- (modified) bolt/lib/Core/BinaryBasicBlock.cpp (-39) 
- (modified) bolt/lib/Core/BinaryEmitter.cpp (-37) 
- (modified) bolt/lib/Core/BinaryFunction.cpp (-25) 
- (modified) bolt/lib/Passes/BinaryPasses.cpp (-20) 
- (modified) bolt/lib/Rewrite/RewriteInstance.cpp (-22) 
- (modified) bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp (-4) 
- (modified) bolt/lib/Target/X86/X86MCPlusBuilder.cpp (-34) 


``diff
diff --git a/bolt/include/bolt/Core/BinaryBasicBlock.h 
b/bolt/include/bolt/Core/BinaryBasicBlock.h
index a57b70714fe38..9a9d7b8735d71 100644
--- a/bolt/include/bolt/Core/BinaryBasicBlock.h
+++ b/bolt/include/bolt/Core/BinaryBasicBlock.h
@@ -842,15 +842,6 @@ class BinaryBasicBlock {
   bool analyzeBranch(const MCSymbol *&TBB, const MCSymbol *&FBB,
  MCInst *&CondBranch, MCInst *&UncondBranch);
 
-  /// Return true if iterator \p I is pointing to the first instruction in
-  /// a pair that could be macro-fused.
-  bool isMacroOpFusionPair(const_iterator I) const;
-
-  /// If the basic block has a pair of instructions suitable for macro-fusion,
-  /// return iterator to the first instruction of the pair.
-  /// Otherwise return end().
-  const_iterator getMacroOpFusionPair() const;
-
   /// Printer required for printing dominator trees.
   void printAsOperand(raw_ostream &OS, bool PrintType = true) {
 if (PrintType)
diff --git a/bolt/include/bolt/Core/BinaryContext.h 
b/bolt/include/bolt/Core/BinaryContext.h
index 4ec3de3da1bf8..73932c4ca2fb3 100644
--- a/bolt/include/bolt/Core/BinaryContext.h
+++ b/bolt/include/bolt/Core/BinaryContext.h
@@ -698,10 +698,6 @@ class BinaryContext {
 
   /// Binary-wide aggregated stats.
   struct BinaryStats {
-/// Stats for macro-fusion.
-uint64_t MissedMacroFusionPairs{0};
-uint64_t MissedMacroFusionExecCount{0};
-
 /// Stats for stale profile matching:
 ///   the total number of basic blocks in the profile
 uint32_t NumStaleBlocks{0};
diff --git a/bolt/include/bolt/Core/BinaryFunction.h 
b/bolt/include/bolt/Core/BinaryFunction.h
index 3c641581e247a..d318dfbcbabe7 100644
--- a/bolt/include/bolt/Core/BinaryFunction.h
+++ b/bolt/include/bolt/Core/BinaryFunction.h
@@ -835,10 +835,6 @@ class BinaryFunction {
   /// them.
   void calculateLoopInfo();
 
-  /// Calculate missed macro-fusion opportunities and update BinaryContext
-  /// stats.
-  void calculateMacroOpFusionStats();
-
   /// Returns if BinaryDominatorTree has been constructed for this function.
   bool hasDomTree() const { return BDT != nullptr; }
 
diff --git a/bolt/include/bolt/Core/MCPlusBuilder.h 
b/bolt/include/bolt/Core/MCPlusBuilder.h
index a5fb3901428d9..584848a8601fd 100644
--- a/bolt/include/bolt/Core/MCPlusBuilder.h
+++ b/bolt/include/bolt/Core/MCPlusBuilder.h
@@ -917,13 +917,6 @@ class MCPlusBuilder {
   /// Return true if the instruction is encoded using EVEX (AVX-512).
   virtual bool hasEVEXEncoding(const MCInst &Inst) const { return false; }
 
-  /// Return true if a pair of instructions represented by \p Insts
-  /// could be fused into a single uop.
-  virtual bool isMacroOpFusionPair(ArrayRef Insts) const {
-llvm_unreachable("not implemented");
-return false;
-  }
-
   struct X86MemOperand {
 unsigned BaseRegNum;
 int64_t ScaleImm;
diff --git a/bolt/lib/Core/BinaryBasicBlock.cpp 
b/bolt/lib/Core/BinaryBasicBlock.cpp
index a4b9a7f558cd8..2a2192b79bb4b 100644
--- a/bolt/lib/Core/BinaryBasicBlock.cpp
+++ b/bolt/lib/Core/BinaryBasicBlock.cpp
@@ -404,45 +404,6 @@ bool BinaryBasicBlock::analyzeBranch(const MCSymbol *&TBB, 
const MCSymbol *&FBB,
 CondBranch, UncondBranch);
 }
 
-bool BinaryBasicBlock::isMacroOpFusionPair(const_iterator I) const {
-  auto &MIB = Function->getBinaryContext().MIB;
-  ArrayRef Insts = Instructions;
-  return MIB->isMacroOpFusionPair(Insts.slice(I - begin()));
-}
-
-BinaryBasicBlock::const_iterator
-BinaryBasicBlock::getMacroOpFusionPair() const {
-  if (!Function->getBinaryContext().isX86())
-return end();
-
-  if (getNumNonPseudos() < 2 || succ_size() != 2)
-return end();
-
-  auto RI = getLastNonPseudo();
-  assert(RI != rend() && "cannot have an empty block with 2 successors");
-
-  BinaryContext &BC = Function->getBinaryContext();
-
-  // Skip instruction if it's an unconditional branch following
-  // a conditional one.
-  if (BC.MIB->is

[llvm-branch-commits] [llvm-objdump] -r: support CREL (PR #97382)

2024-07-01 Thread Fangrui Song via llvm-branch-commits

https://github.com/MaskRay created 
https://github.com/llvm/llvm-project/pull/97382

The decoder code is similar to that for llvm-readelf -r (#91280).

Because the section representation of LLVMObject (`SectionRef`) is
64-bit, insufficient to hold all decoder states, `section_rel_begin` is
modified to decode CREL eagerly and hold the decoded relocations inside
ELFObjectFile.

The test is adapted from llvm/test/tools/llvm-readobj/ELF/crel.test.



___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm-objdump] -r: support CREL (PR #97382)

2024-07-01 Thread via llvm-branch-commits

llvmbot wrote:




@llvm/pr-subscribers-llvm-binary-utilities

Author: Fangrui Song (MaskRay)


Changes

The decoder code is similar to that for llvm-readelf -r (#91280).

Because the section representation of LLVMObject (`SectionRef`) is
64-bit, insufficient to hold all decoder states, `section_rel_begin` is
modified to decode CREL eagerly and hold the decoded relocations inside
ELFObjectFile.

The test is adapted from llvm/test/tools/llvm-readobj/ELF/crel.test.


---
Full diff: https://github.com/llvm/llvm-project/pull/97382.diff


6 Files Affected:

- (modified) llvm/include/llvm/Object/ELFObjectFile.h (+87-6) 
- (modified) llvm/lib/Object/ELFObjectFile.cpp (+11) 
- (added) llvm/test/tools/llvm-objdump/ELF/crel.test (+213) 
- (modified) llvm/test/tools/llvm-objdump/X86/elf-disassemble-relocs.test (+4) 
- (modified) llvm/tools/llvm-objdump/ELFDump.cpp (+5-1) 
- (modified) llvm/tools/llvm-objdump/llvm-objdump.cpp (+9) 


``diff
diff --git a/llvm/include/llvm/Object/ELFObjectFile.h 
b/llvm/include/llvm/Object/ELFObjectFile.h
index 8cc09e7fd7d55..665d848d5b607 100644
--- a/llvm/include/llvm/Object/ELFObjectFile.h
+++ b/llvm/include/llvm/Object/ELFObjectFile.h
@@ -29,6 +29,7 @@
 #include "llvm/Support/ELFAttributes.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/LEB128.h"
 #include "llvm/Support/MemoryBufferRef.h"
 #include "llvm/Support/ScopedPrinter.h"
 #include "llvm/TargetParser/SubtargetFeature.h"
@@ -122,6 +123,8 @@ class ELFObjectFileBase : public ObjectFile {
   Expected>
   readBBAddrMap(std::optional TextSectionIndex = std::nullopt,
 std::vector *PGOAnalyses = nullptr) const;
+
+  StringRef getCrelError(SectionRef Sec) const;
 };
 
 class ELFSectionRef : public SectionRef {
@@ -292,6 +295,11 @@ template  class ELFObjectFile : public 
ELFObjectFileBase {
   const Elf_Shdr *DotSymtabSec = nullptr; // Symbol table section.
   const Elf_Shdr *DotSymtabShndxSec = nullptr; // SHT_SYMTAB_SHNDX section.
 
+  // Hold CREL relocations for SectionRef::relocations().
+  mutable SmallVector, 0> Crels;
+  // Hold CREL decoding errors.
+  mutable SmallVector CrelErrs;
+
   Error initContent() override;
 
   void moveSymbolNext(DataRefImpl &Symb) const override;
@@ -446,6 +454,7 @@ template  class ELFObjectFile : public 
ELFObjectFileBase {
 
   const Elf_Rel *getRel(DataRefImpl Rel) const;
   const Elf_Rela *getRela(DataRefImpl Rela) const;
+  Elf_Crel getCrel(DataRefImpl Crel) const;
 
   Expected getSymbol(DataRefImpl Sym) const {
 return EF.template getEntry(Sym.d.a, Sym.d.b);
@@ -499,6 +508,8 @@ template  class ELFObjectFile : public 
ELFObjectFileBase {
   bool isRelocatableObject() const override;
 
   void createFakeSections() { EF.createFakeSections(); }
+
+  StringRef getCrelError(DataRefImpl Sec) const;
 };
 
 using ELF32LEObjectFile = ELFObjectFile;
@@ -1022,6 +1033,47 @@ ELFObjectFile::section_rel_begin(DataRefImpl Sec) 
const {
   uintptr_t SHT = reinterpret_cast((*SectionsOrErr).begin());
   RelData.d.a = (Sec.p - SHT) / EF.getHeader().e_shentsize;
   RelData.d.b = 0;
+  if (reinterpret_cast(Sec.p)->sh_type == ELF::SHT_CREL) {
+if (RelData.d.a + 1 > Crels.size()) {
+  Crels.resize(RelData.d.a + 1);
+  CrelErrs.resize(RelData.d.a + 1);
+}
+if (Crels[RelData.d.a].empty()) {
+  // Decode SHT_CREL. See ELFFile::decodeCrel.
+  ArrayRef Content = cantFail(getSectionContents(Sec));
+  DataExtractor Data(Content, ELFT::Endianness == endianness::little,
+ sizeof(typename ELFT::Addr));
+  DataExtractor::Cursor Cur(0);
+  const uint64_t Hdr = Data.getULEB128(Cur);
+  const size_t Count = Hdr / 8;
+  const size_t FlagBits = Hdr & ELF::CREL_HDR_ADDEND ? 3 : 2;
+  const size_t Shift = Hdr % ELF::CREL_HDR_ADDEND;
+  uintX_t Offset = 0, Addend = 0;
+  uint32_t Symidx = 0, Type = 0;
+  for (size_t i = 0; i != Count; ++i) {
+const uint8_t B = Data.getU8(Cur);
+Offset += B >> FlagBits;
+if (B >= 0x80)
+  Offset +=
+  (Data.getULEB128(Cur) << (7 - FlagBits)) - (0x80 >> FlagBits);
+if (B & 1)
+  Symidx += Data.getSLEB128(Cur);
+if (B & 2)
+  Type += Data.getSLEB128(Cur);
+if (B & 4 && FlagBits == 3)
+  Addend += Data.getSLEB128(Cur);
+if (!Cur)
+  break;
+Crels[RelData.d.a].push_back(
+Elf_Crel{Offset << Shift, uint32_t(Symidx), Type,
+ std::make_signed_t(Addend)});
+  }
+  if (!Cur) {
+Crels[RelData.d.a].assign(1, Elf_Crel{0, 0, 0, 0});
+CrelErrs[RelData.d.a] = toString(Cur.takeError());
+  }
+}
+  }
   return relocation_iterator(RelocationRef(RelData, this));
 }
 
@@ -1030,9 +1082,13 @@ relocation_iterator
 ELFObjectFile::section_rel_end(DataRefImpl Sec) const {
   const Elf_Shdr *S = reinterpret_cast(Sec.p);
   relocation_iterator Begin = section_rel_begin(Sec);
+  Da

[llvm-branch-commits] [NFC][RISCV] Simplify the dynamic linker construction logic (PR #97383)

2024-07-01 Thread Pengcheng Wang via llvm-branch-commits

https://github.com/wangpc-pp created 
https://github.com/llvm/llvm-project/pull/97383

The format of dynamic linker is `ld-linux-{arch}-{abi}.so.1`, so
we can just get the arch name from arch type.



___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [NFC][RISCV] Simplify the dynamic linker construction logic (PR #97383)

2024-07-01 Thread via llvm-branch-commits

llvmbot wrote:



@llvm/pr-subscribers-clang

@llvm/pr-subscribers-clang-driver

Author: Pengcheng Wang (wangpc-pp)


Changes

The format of dynamic linker is `ld-linux-{arch}-{abi}.so.1`, so
we can just get the arch name from arch type.


---
Full diff: https://github.com/llvm/llvm-project/pull/97383.diff


1 Files Affected:

- (modified) clang/lib/Driver/ToolChains/Linux.cpp (+3-7) 


``diff
diff --git a/clang/lib/Driver/ToolChains/Linux.cpp 
b/clang/lib/Driver/ToolChains/Linux.cpp
index 49e029e7c9ab7..98a878e1d764d 100644
--- a/clang/lib/Driver/ToolChains/Linux.cpp
+++ b/clang/lib/Driver/ToolChains/Linux.cpp
@@ -568,16 +568,12 @@ std::string Linux::getDynamicLinker(const ArgList &Args) 
const {
 Loader =
 (tools::ppc::hasPPCAbiArg(Args, "elfv1")) ? "ld64.so.1" : "ld64.so.2";
 break;
-  case llvm::Triple::riscv32: {
-StringRef ABIName = tools::riscv::getRISCVABI(Args, Triple);
-LibDir = "lib";
-Loader = ("ld-linux-riscv32-" + ABIName + ".so.1").str();
-break;
-  }
+  case llvm::Triple::riscv32:
   case llvm::Triple::riscv64: {
+StringRef ArchName = llvm::Triple::getArchTypeName(Arch);
 StringRef ABIName = tools::riscv::getRISCVABI(Args, Triple);
 LibDir = "lib";
-Loader = ("ld-linux-riscv64-" + ABIName + ".so.1").str();
+Loader = ("ld-linux-" + ArchName + "-" + ABIName + ".so.1").str();
 break;
   }
   case llvm::Triple::sparc:

``




https://github.com/llvm/llvm-project/pull/97383
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [NFC][RISCV] Simplify the dynamic linker construction logic (PR #97383)

2024-07-01 Thread Fangrui Song via llvm-branch-commits

https://github.com/MaskRay approved this pull request.


https://github.com/llvm/llvm-project/pull/97383
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits