Skip to content

Commit f55abd5

Browse files
authored
[NVPTX] Add Volta Atomic SequentiallyConsistent Load and Store Operations (#98551)
This PR Builds on #98022 . It adds support for Volta's SequentiallyConsistent Load and Store operations at system scope.
1 parent 85bf0a6 commit f55abd5

File tree

8 files changed

+1332
-1223
lines changed

8 files changed

+1332
-1223
lines changed

llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXInstPrinter.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@
1313
#include "MCTargetDesc/NVPTXInstPrinter.h"
1414
#include "MCTargetDesc/NVPTXBaseInfo.h"
1515
#include "NVPTX.h"
16+
#include "NVPTXUtilities.h"
1617
#include "llvm/MC/MCExpr.h"
1718
#include "llvm/MC/MCInst.h"
1819
#include "llvm/MC/MCInstrInfo.h"
1920
#include "llvm/MC/MCSubtargetInfo.h"
2021
#include "llvm/MC/MCSymbol.h"
2122
#include "llvm/Support/ErrorHandling.h"
23+
#include "llvm/Support/FormatVariadic.h"
2224
#include "llvm/Support/FormattedStream.h"
2325
#include <cctype>
2426
using namespace llvm;
@@ -228,31 +230,29 @@ void NVPTXInstPrinter::printLdStCode(const MCInst *MI, int OpNum,
228230
const MCOperand &MO = MI->getOperand(OpNum);
229231
int Imm = (int) MO.getImm();
230232
if (!strcmp(Modifier, "sem")) {
231-
switch (Imm) {
232-
case NVPTX::PTXLdStInstCode::NotAtomic:
233+
auto Ordering = NVPTX::Ordering(Imm);
234+
switch (Ordering) {
235+
case NVPTX::Ordering::NotAtomic:
233236
break;
234-
case NVPTX::PTXLdStInstCode::Volatile:
237+
case NVPTX::Ordering::Volatile:
235238
O << ".volatile";
236239
break;
237-
case NVPTX::PTXLdStInstCode::Relaxed:
240+
case NVPTX::Ordering::Relaxed:
238241
O << ".relaxed.sys";
239242
break;
240-
case NVPTX::PTXLdStInstCode::Acquire:
243+
case NVPTX::Ordering::Acquire:
241244
O << ".acquire.sys";
242245
break;
243-
case NVPTX::PTXLdStInstCode::Release:
246+
case NVPTX::Ordering::Release:
244247
O << ".release.sys";
245248
break;
246-
case NVPTX::PTXLdStInstCode::RelaxedMMIO:
249+
case NVPTX::Ordering::RelaxedMMIO:
247250
O << ".mmio.relaxed.sys";
248251
break;
249252
default:
250-
SmallString<256> Msg;
251-
raw_svector_ostream OS(Msg);
252-
OS << "NVPTX LdStCode Printer does not support \"" << Imm
253-
<< "\" sem modifier.";
254-
report_fatal_error(OS.str());
255-
break;
253+
report_fatal_error(formatv(
254+
"NVPTX LdStCode Printer does not support \"{}\" sem modifier.",
255+
OrderingToCString(Ordering)));
256256
}
257257
} else if (!strcmp(Modifier, "addsp")) {
258258
switch (Imm) {

llvm/lib/Target/NVPTX/NVPTX.h

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "llvm/IR/PassManager.h"
1818
#include "llvm/Pass.h"
19+
#include "llvm/Support/AtomicOrdering.h"
1920
#include "llvm/Support/CodeGen.h"
2021

2122
namespace llvm {
@@ -106,15 +107,25 @@ enum LoadStore {
106107
isStoreShift = 6
107108
};
108109

109-
namespace PTXLdStInstCode {
110-
enum MemorySemantic {
111-
NotAtomic = 0, // PTX calls these: "Weak"
112-
Volatile = 1,
113-
Relaxed = 2,
114-
Acquire = 3,
115-
Release = 4,
116-
RelaxedMMIO = 5
110+
// Extends LLVM AtomicOrdering with PTX Orderings:
111+
using OrderingUnderlyingType = unsigned int;
112+
enum Ordering : OrderingUnderlyingType {
113+
NotAtomic = (OrderingUnderlyingType)
114+
AtomicOrdering::NotAtomic, // PTX calls these: "Weak"
115+
// Unordered = 1, // NVPTX maps LLVM Unorderd to Relaxed
116+
Relaxed = (OrderingUnderlyingType)AtomicOrdering::Monotonic,
117+
// Consume = 3, // Unimplemented in LLVM; NVPTX would map to "Acquire"
118+
Acquire = (OrderingUnderlyingType)AtomicOrdering::Acquire,
119+
Release = (OrderingUnderlyingType)AtomicOrdering::Release,
120+
// AcquireRelease = 6, // TODO
121+
SequentiallyConsistent =
122+
(OrderingUnderlyingType)AtomicOrdering::SequentiallyConsistent,
123+
Volatile = SequentiallyConsistent + 1,
124+
RelaxedMMIO = Volatile + 1,
125+
LAST = RelaxedMMIO
117126
};
127+
128+
namespace PTXLdStInstCode {
118129
enum AddressSpace {
119130
GENERIC = 0,
120131
GLOBAL = 1,
@@ -134,7 +145,7 @@ enum VecType {
134145
V2 = 2,
135146
V4 = 4
136147
};
137-
}
148+
} // namespace PTXLdStInstCode
138149

139150
/// PTXCvtMode - Conversion code enumeration
140151
namespace PTXCvtMode {

0 commit comments

Comments
 (0)