@@ -1147,6 +1147,26 @@ bool NVPTXDAGToDAGISel::tryLoad(SDNode *N) {
1147
1147
unsigned int PointerSize =
1148
1148
CurDAG->getDataLayout ().getPointerSizeInBits (LD->getAddressSpace ());
1149
1149
1150
+ // If a fence is required before the operation, insert it:
1151
+ SDValue Chain = N->getOperand (0 );
1152
+ switch (NVPTX::Ordering (FenceOrdering)) {
1153
+ case NVPTX::Ordering::NotAtomic:
1154
+ break ;
1155
+ case NVPTX::Ordering::SequentiallyConsistent: {
1156
+ unsigned Op = Subtarget->hasMemoryOrdering ()
1157
+ ? NVPTX::atomic_thread_fence_seq_cst_sys
1158
+ : NVPTX::atomic_thread_fence_seq_cst_sys_membar;
1159
+ Chain = SDValue (CurDAG->getMachineNode (Op, dl, MVT::Other, Chain), 0 );
1160
+ break ;
1161
+ }
1162
+ default :
1163
+ SmallString<256 > Msg;
1164
+ raw_svector_ostream OS (Msg);
1165
+ OS << " Unexpected fence ordering: \" " << NVPTX::Ordering (FenceOrdering)
1166
+ << " \" ." ;
1167
+ report_fatal_error (OS.str ());
1168
+ }
1169
+
1150
1170
// Type Setting: fromType + fromTypeWidth
1151
1171
//
1152
1172
// Sign : ISD::SEXTLOAD
@@ -1174,7 +1194,6 @@ bool NVPTXDAGToDAGISel::tryLoad(SDNode *N) {
1174
1194
fromType = getLdStRegType (ScalarVT);
1175
1195
1176
1196
// Create the machine instruction DAG
1177
- SDValue Chain = N->getOperand (0 );
1178
1197
SDValue N1 = N->getOperand (1 );
1179
1198
SDValue Addr;
1180
1199
SDValue Offset, Base;
@@ -1187,8 +1206,7 @@ bool NVPTXDAGToDAGISel::tryLoad(SDNode *N) {
1187
1206
NVPTX::LD_f32_avar, NVPTX::LD_f64_avar);
1188
1207
if (!Opcode)
1189
1208
return false ;
1190
- SDValue Ops[] = {getI32Imm (FenceOrdering, dl),
1191
- getI32Imm (InstructionOrdering, dl),
1209
+ SDValue Ops[] = {getI32Imm (InstructionOrdering, dl),
1192
1210
getI32Imm (CodeAddrSpace, dl),
1193
1211
getI32Imm (vecType, dl),
1194
1212
getI32Imm (fromType, dl),
@@ -1203,8 +1221,7 @@ bool NVPTXDAGToDAGISel::tryLoad(SDNode *N) {
1203
1221
NVPTX::LD_f32_asi, NVPTX::LD_f64_asi);
1204
1222
if (!Opcode)
1205
1223
return false ;
1206
- SDValue Ops[] = {getI32Imm (FenceOrdering, dl),
1207
- getI32Imm (InstructionOrdering, dl),
1224
+ SDValue Ops[] = {getI32Imm (InstructionOrdering, dl),
1208
1225
getI32Imm (CodeAddrSpace, dl),
1209
1226
getI32Imm (vecType, dl),
1210
1227
getI32Imm (fromType, dl),
@@ -1226,8 +1243,7 @@ bool NVPTXDAGToDAGISel::tryLoad(SDNode *N) {
1226
1243
NVPTX::LD_f32_ari, NVPTX::LD_f64_ari);
1227
1244
if (!Opcode)
1228
1245
return false ;
1229
- SDValue Ops[] = {getI32Imm (FenceOrdering, dl),
1230
- getI32Imm (InstructionOrdering, dl),
1246
+ SDValue Ops[] = {getI32Imm (InstructionOrdering, dl),
1231
1247
getI32Imm (CodeAddrSpace, dl),
1232
1248
getI32Imm (vecType, dl),
1233
1249
getI32Imm (fromType, dl),
@@ -1248,8 +1264,7 @@ bool NVPTXDAGToDAGISel::tryLoad(SDNode *N) {
1248
1264
NVPTX::LD_f32_areg, NVPTX::LD_f64_areg);
1249
1265
if (!Opcode)
1250
1266
return false ;
1251
- SDValue Ops[] = {getI32Imm (FenceOrdering, dl),
1252
- getI32Imm (InstructionOrdering, dl),
1267
+ SDValue Ops[] = {getI32Imm (InstructionOrdering, dl),
1253
1268
getI32Imm (CodeAddrSpace, dl),
1254
1269
getI32Imm (vecType, dl),
1255
1270
getI32Imm (fromType, dl),
@@ -1296,6 +1311,25 @@ bool NVPTXDAGToDAGISel::tryLoadVector(SDNode *N) {
1296
1311
auto [InstructionOrdering, FenceOrdering] =
1297
1312
getOperationOrderings (MemSD, Subtarget);
1298
1313
1314
+ // If a fence is required before the operation, insert it:
1315
+ switch (NVPTX::Ordering (FenceOrdering)) {
1316
+ case NVPTX::Ordering::NotAtomic:
1317
+ break ;
1318
+ case NVPTX::Ordering::SequentiallyConsistent: {
1319
+ unsigned Op = Subtarget->hasMemoryOrdering ()
1320
+ ? NVPTX::atomic_thread_fence_seq_cst_sys
1321
+ : NVPTX::atomic_thread_fence_seq_cst_sys_membar;
1322
+ Chain = SDValue (CurDAG->getMachineNode (Op, DL, MVT::Other, Chain), 0 );
1323
+ break ;
1324
+ }
1325
+ default :
1326
+ SmallString<256 > Msg;
1327
+ raw_svector_ostream OS (Msg);
1328
+ OS << " Unexpected fence ordering: \" " << NVPTX::Ordering (FenceOrdering)
1329
+ << " \" ." ;
1330
+ report_fatal_error (OS.str ());
1331
+ }
1332
+
1299
1333
// Vector Setting
1300
1334
MVT SimpleVT = LoadedVT.getSimpleVT ();
1301
1335
@@ -1361,8 +1395,7 @@ bool NVPTXDAGToDAGISel::tryLoadVector(SDNode *N) {
1361
1395
}
1362
1396
if (!Opcode)
1363
1397
return false ;
1364
- SDValue Ops[] = {getI32Imm (FenceOrdering, DL),
1365
- getI32Imm (InstructionOrdering, DL),
1398
+ SDValue Ops[] = {getI32Imm (InstructionOrdering, DL),
1366
1399
getI32Imm (CodeAddrSpace, DL),
1367
1400
getI32Imm (VecType, DL),
1368
1401
getI32Imm (FromType, DL),
@@ -1391,8 +1424,7 @@ bool NVPTXDAGToDAGISel::tryLoadVector(SDNode *N) {
1391
1424
}
1392
1425
if (!Opcode)
1393
1426
return false ;
1394
- SDValue Ops[] = {getI32Imm (FenceOrdering, DL),
1395
- getI32Imm (InstructionOrdering, DL),
1427
+ SDValue Ops[] = {getI32Imm (InstructionOrdering, DL),
1396
1428
getI32Imm (CodeAddrSpace, DL),
1397
1429
getI32Imm (VecType, DL),
1398
1430
getI32Imm (FromType, DL),
@@ -1442,8 +1474,7 @@ bool NVPTXDAGToDAGISel::tryLoadVector(SDNode *N) {
1442
1474
}
1443
1475
if (!Opcode)
1444
1476
return false ;
1445
- SDValue Ops[] = {getI32Imm (FenceOrdering, DL),
1446
- getI32Imm (InstructionOrdering, DL),
1477
+ SDValue Ops[] = {getI32Imm (InstructionOrdering, DL),
1447
1478
getI32Imm (CodeAddrSpace, DL),
1448
1479
getI32Imm (VecType, DL),
1449
1480
getI32Imm (FromType, DL),
@@ -1493,8 +1524,7 @@ bool NVPTXDAGToDAGISel::tryLoadVector(SDNode *N) {
1493
1524
}
1494
1525
if (!Opcode)
1495
1526
return false ;
1496
- SDValue Ops[] = {getI32Imm (FenceOrdering, DL),
1497
- getI32Imm (InstructionOrdering, DL),
1527
+ SDValue Ops[] = {getI32Imm (InstructionOrdering, DL),
1498
1528
getI32Imm (CodeAddrSpace, DL),
1499
1529
getI32Imm (VecType, DL),
1500
1530
getI32Imm (FromType, DL),
@@ -1952,6 +1982,26 @@ bool NVPTXDAGToDAGISel::tryStore(SDNode *N) {
1952
1982
auto [InstructionOrdering, FenceOrdering] =
1953
1983
getOperationOrderings (ST, Subtarget);
1954
1984
1985
+ // If a fence is required before the operation, insert it:
1986
+ SDValue Chain = ST->getChain ();
1987
+ switch (NVPTX::Ordering (FenceOrdering)) {
1988
+ case NVPTX::Ordering::NotAtomic:
1989
+ break ;
1990
+ case NVPTX::Ordering::SequentiallyConsistent: {
1991
+ unsigned Op = Subtarget->hasMemoryOrdering ()
1992
+ ? NVPTX::atomic_thread_fence_seq_cst_sys
1993
+ : NVPTX::atomic_thread_fence_seq_cst_sys_membar;
1994
+ Chain = SDValue (CurDAG->getMachineNode (Op, dl, MVT::Other, Chain), 0 );
1995
+ break ;
1996
+ }
1997
+ default :
1998
+ SmallString<256 > Msg;
1999
+ raw_svector_ostream OS (Msg);
2000
+ OS << " Unexpected fence ordering: \" " << NVPTX::Ordering (FenceOrdering)
2001
+ << " \" ." ;
2002
+ report_fatal_error (OS.str ());
2003
+ }
2004
+
1955
2005
// Vector Setting
1956
2006
MVT SimpleVT = StoreVT.getSimpleVT ();
1957
2007
unsigned vecType = NVPTX::PTXLdStInstCode::Scalar;
@@ -1971,7 +2021,6 @@ bool NVPTXDAGToDAGISel::tryStore(SDNode *N) {
1971
2021
unsigned int toType = getLdStRegType (ScalarVT);
1972
2022
1973
2023
// Create the machine instruction DAG
1974
- SDValue Chain = ST->getChain ();
1975
2024
SDValue Value = PlainStore ? PlainStore->getValue () : AtomicStore->getVal ();
1976
2025
SDValue BasePtr = ST->getBasePtr ();
1977
2026
SDValue Addr;
@@ -1987,7 +2036,6 @@ bool NVPTXDAGToDAGISel::tryStore(SDNode *N) {
1987
2036
if (!Opcode)
1988
2037
return false ;
1989
2038
SDValue Ops[] = {Value,
1990
- getI32Imm (FenceOrdering, dl),
1991
2039
getI32Imm (InstructionOrdering, dl),
1992
2040
getI32Imm (CodeAddrSpace, dl),
1993
2041
getI32Imm (vecType, dl),
@@ -2005,7 +2053,6 @@ bool NVPTXDAGToDAGISel::tryStore(SDNode *N) {
2005
2053
if (!Opcode)
2006
2054
return false ;
2007
2055
SDValue Ops[] = {Value,
2008
- getI32Imm (FenceOrdering, dl),
2009
2056
getI32Imm (InstructionOrdering, dl),
2010
2057
getI32Imm (CodeAddrSpace, dl),
2011
2058
getI32Imm (vecType, dl),
@@ -2031,7 +2078,6 @@ bool NVPTXDAGToDAGISel::tryStore(SDNode *N) {
2031
2078
return false ;
2032
2079
2033
2080
SDValue Ops[] = {Value,
2034
- getI32Imm (FenceOrdering, dl),
2035
2081
getI32Imm (InstructionOrdering, dl),
2036
2082
getI32Imm (CodeAddrSpace, dl),
2037
2083
getI32Imm (vecType, dl),
@@ -2054,7 +2100,6 @@ bool NVPTXDAGToDAGISel::tryStore(SDNode *N) {
2054
2100
if (!Opcode)
2055
2101
return false ;
2056
2102
SDValue Ops[] = {Value,
2057
- getI32Imm (FenceOrdering, dl),
2058
2103
getI32Imm (InstructionOrdering, dl),
2059
2104
getI32Imm (CodeAddrSpace, dl),
2060
2105
getI32Imm (vecType, dl),
@@ -2098,6 +2143,25 @@ bool NVPTXDAGToDAGISel::tryStoreVector(SDNode *N) {
2098
2143
auto [InstructionOrdering, FenceOrdering] =
2099
2144
getOperationOrderings (MemSD, Subtarget);
2100
2145
2146
+ // If a fence is required before the operation, insert it:
2147
+ switch (NVPTX::Ordering (FenceOrdering)) {
2148
+ case NVPTX::Ordering::NotAtomic:
2149
+ break ;
2150
+ case NVPTX::Ordering::SequentiallyConsistent: {
2151
+ unsigned Op = Subtarget->hasMemoryOrdering ()
2152
+ ? NVPTX::atomic_thread_fence_seq_cst_sys
2153
+ : NVPTX::atomic_thread_fence_seq_cst_sys_membar;
2154
+ Chain = SDValue (CurDAG->getMachineNode (Op, DL, MVT::Other, Chain), 0 );
2155
+ break ;
2156
+ }
2157
+ default :
2158
+ SmallString<256 > Msg;
2159
+ raw_svector_ostream OS (Msg);
2160
+ OS << " Unexpected fence ordering: \" " << NVPTX::Ordering (FenceOrdering)
2161
+ << " \" ." ;
2162
+ report_fatal_error (OS.str ());
2163
+ }
2164
+
2101
2165
// Type Setting: toType + toTypeWidth
2102
2166
// - for integer type, always use 'u'
2103
2167
assert (StoreVT.isSimple () && " Store value is not simple" );
@@ -2138,7 +2202,6 @@ bool NVPTXDAGToDAGISel::tryStoreVector(SDNode *N) {
2138
2202
ToTypeWidth = 32 ;
2139
2203
}
2140
2204
2141
- StOps.push_back (getI32Imm (FenceOrdering, DL));
2142
2205
StOps.push_back (getI32Imm (InstructionOrdering, DL));
2143
2206
StOps.push_back (getI32Imm (CodeAddrSpace, DL));
2144
2207
StOps.push_back (getI32Imm (VecType, DL));
0 commit comments