@@ -1145,6 +1145,26 @@ bool NVPTXDAGToDAGISel::tryLoad(SDNode *N) {
1145
1145
unsigned int PointerSize =
1146
1146
CurDAG->getDataLayout ().getPointerSizeInBits (LD->getAddressSpace ());
1147
1147
1148
+ // If a fence is required before the operation, insert it:
1149
+ SDValue Chain = N->getOperand (0 );
1150
+ switch (NVPTX::Ordering (FenceOrdering)) {
1151
+ case NVPTX::Ordering::NotAtomic:
1152
+ break ;
1153
+ case NVPTX::Ordering::SequentiallyConsistent: {
1154
+ unsigned Op = Subtarget->hasMemoryOrdering ()
1155
+ ? NVPTX::atomic_thread_fence_seq_cst_sys
1156
+ : NVPTX::atomic_thread_fence_seq_cst_sys_membar;
1157
+ Chain = SDValue (CurDAG->getMachineNode (Op, dl, MVT::Other, Chain), 0 );
1158
+ break ;
1159
+ }
1160
+ default :
1161
+ SmallString<256 > Msg;
1162
+ raw_svector_ostream OS (Msg);
1163
+ OS << " Unexpected fence ordering: \" " << NVPTX::Ordering (FenceOrdering)
1164
+ << " \" ." ;
1165
+ report_fatal_error (OS.str ());
1166
+ }
1167
+
1148
1168
// Type Setting: fromType + fromTypeWidth
1149
1169
//
1150
1170
// Sign : ISD::SEXTLOAD
@@ -1172,7 +1192,6 @@ bool NVPTXDAGToDAGISel::tryLoad(SDNode *N) {
1172
1192
fromType = getLdStRegType (ScalarVT);
1173
1193
1174
1194
// Create the machine instruction DAG
1175
- SDValue Chain = N->getOperand (0 );
1176
1195
SDValue N1 = N->getOperand (1 );
1177
1196
SDValue Addr;
1178
1197
SDValue Offset, Base;
@@ -1185,8 +1204,7 @@ bool NVPTXDAGToDAGISel::tryLoad(SDNode *N) {
1185
1204
NVPTX::LD_f32_avar, NVPTX::LD_f64_avar);
1186
1205
if (!Opcode)
1187
1206
return false ;
1188
- SDValue Ops[] = {getI32Imm (FenceOrdering, dl),
1189
- getI32Imm (InstructionOrdering, dl),
1207
+ SDValue Ops[] = {getI32Imm (InstructionOrdering, dl),
1190
1208
getI32Imm (CodeAddrSpace, dl),
1191
1209
getI32Imm (vecType, dl),
1192
1210
getI32Imm (fromType, dl),
@@ -1201,8 +1219,7 @@ bool NVPTXDAGToDAGISel::tryLoad(SDNode *N) {
1201
1219
NVPTX::LD_f32_asi, NVPTX::LD_f64_asi);
1202
1220
if (!Opcode)
1203
1221
return false ;
1204
- SDValue Ops[] = {getI32Imm (FenceOrdering, dl),
1205
- getI32Imm (InstructionOrdering, dl),
1222
+ SDValue Ops[] = {getI32Imm (InstructionOrdering, dl),
1206
1223
getI32Imm (CodeAddrSpace, dl),
1207
1224
getI32Imm (vecType, dl),
1208
1225
getI32Imm (fromType, dl),
@@ -1224,8 +1241,7 @@ bool NVPTXDAGToDAGISel::tryLoad(SDNode *N) {
1224
1241
NVPTX::LD_f32_ari, NVPTX::LD_f64_ari);
1225
1242
if (!Opcode)
1226
1243
return false ;
1227
- SDValue Ops[] = {getI32Imm (FenceOrdering, dl),
1228
- getI32Imm (InstructionOrdering, dl),
1244
+ SDValue Ops[] = {getI32Imm (InstructionOrdering, dl),
1229
1245
getI32Imm (CodeAddrSpace, dl),
1230
1246
getI32Imm (vecType, dl),
1231
1247
getI32Imm (fromType, dl),
@@ -1246,8 +1262,7 @@ bool NVPTXDAGToDAGISel::tryLoad(SDNode *N) {
1246
1262
NVPTX::LD_f32_areg, NVPTX::LD_f64_areg);
1247
1263
if (!Opcode)
1248
1264
return false ;
1249
- SDValue Ops[] = {getI32Imm (FenceOrdering, dl),
1250
- getI32Imm (InstructionOrdering, dl),
1265
+ SDValue Ops[] = {getI32Imm (InstructionOrdering, dl),
1251
1266
getI32Imm (CodeAddrSpace, dl),
1252
1267
getI32Imm (vecType, dl),
1253
1268
getI32Imm (fromType, dl),
@@ -1294,6 +1309,25 @@ bool NVPTXDAGToDAGISel::tryLoadVector(SDNode *N) {
1294
1309
auto [InstructionOrdering, FenceOrdering] =
1295
1310
getOperationOrderings (MemSD, Subtarget);
1296
1311
1312
+ // If a fence is required before the operation, insert it:
1313
+ switch (NVPTX::Ordering (FenceOrdering)) {
1314
+ case NVPTX::Ordering::NotAtomic:
1315
+ break ;
1316
+ case NVPTX::Ordering::SequentiallyConsistent: {
1317
+ unsigned Op = Subtarget->hasMemoryOrdering ()
1318
+ ? NVPTX::atomic_thread_fence_seq_cst_sys
1319
+ : NVPTX::atomic_thread_fence_seq_cst_sys_membar;
1320
+ Chain = SDValue (CurDAG->getMachineNode (Op, DL, MVT::Other, Chain), 0 );
1321
+ break ;
1322
+ }
1323
+ default :
1324
+ SmallString<256 > Msg;
1325
+ raw_svector_ostream OS (Msg);
1326
+ OS << " Unexpected fence ordering: \" " << NVPTX::Ordering (FenceOrdering)
1327
+ << " \" ." ;
1328
+ report_fatal_error (OS.str ());
1329
+ }
1330
+
1297
1331
// Vector Setting
1298
1332
MVT SimpleVT = LoadedVT.getSimpleVT ();
1299
1333
@@ -1359,8 +1393,7 @@ bool NVPTXDAGToDAGISel::tryLoadVector(SDNode *N) {
1359
1393
}
1360
1394
if (!Opcode)
1361
1395
return false ;
1362
- SDValue Ops[] = {getI32Imm (FenceOrdering, DL),
1363
- getI32Imm (InstructionOrdering, DL),
1396
+ SDValue Ops[] = {getI32Imm (InstructionOrdering, DL),
1364
1397
getI32Imm (CodeAddrSpace, DL),
1365
1398
getI32Imm (VecType, DL),
1366
1399
getI32Imm (FromType, DL),
@@ -1389,8 +1422,7 @@ bool NVPTXDAGToDAGISel::tryLoadVector(SDNode *N) {
1389
1422
}
1390
1423
if (!Opcode)
1391
1424
return false ;
1392
- SDValue Ops[] = {getI32Imm (FenceOrdering, DL),
1393
- getI32Imm (InstructionOrdering, DL),
1425
+ SDValue Ops[] = {getI32Imm (InstructionOrdering, DL),
1394
1426
getI32Imm (CodeAddrSpace, DL),
1395
1427
getI32Imm (VecType, DL),
1396
1428
getI32Imm (FromType, DL),
@@ -1440,8 +1472,7 @@ bool NVPTXDAGToDAGISel::tryLoadVector(SDNode *N) {
1440
1472
}
1441
1473
if (!Opcode)
1442
1474
return false ;
1443
- SDValue Ops[] = {getI32Imm (FenceOrdering, DL),
1444
- getI32Imm (InstructionOrdering, DL),
1475
+ SDValue Ops[] = {getI32Imm (InstructionOrdering, DL),
1445
1476
getI32Imm (CodeAddrSpace, DL),
1446
1477
getI32Imm (VecType, DL),
1447
1478
getI32Imm (FromType, DL),
@@ -1491,8 +1522,7 @@ bool NVPTXDAGToDAGISel::tryLoadVector(SDNode *N) {
1491
1522
}
1492
1523
if (!Opcode)
1493
1524
return false ;
1494
- SDValue Ops[] = {getI32Imm (FenceOrdering, DL),
1495
- getI32Imm (InstructionOrdering, DL),
1525
+ SDValue Ops[] = {getI32Imm (InstructionOrdering, DL),
1496
1526
getI32Imm (CodeAddrSpace, DL),
1497
1527
getI32Imm (VecType, DL),
1498
1528
getI32Imm (FromType, DL),
@@ -1950,6 +1980,26 @@ bool NVPTXDAGToDAGISel::tryStore(SDNode *N) {
1950
1980
auto [InstructionOrdering, FenceOrdering] =
1951
1981
getOperationOrderings (ST, Subtarget);
1952
1982
1983
+ // If a fence is required before the operation, insert it:
1984
+ SDValue Chain = ST->getChain ();
1985
+ switch (NVPTX::Ordering (FenceOrdering)) {
1986
+ case NVPTX::Ordering::NotAtomic:
1987
+ break ;
1988
+ case NVPTX::Ordering::SequentiallyConsistent: {
1989
+ unsigned Op = Subtarget->hasMemoryOrdering ()
1990
+ ? NVPTX::atomic_thread_fence_seq_cst_sys
1991
+ : NVPTX::atomic_thread_fence_seq_cst_sys_membar;
1992
+ Chain = SDValue (CurDAG->getMachineNode (Op, dl, MVT::Other, Chain), 0 );
1993
+ break ;
1994
+ }
1995
+ default :
1996
+ SmallString<256 > Msg;
1997
+ raw_svector_ostream OS (Msg);
1998
+ OS << " Unexpected fence ordering: \" " << NVPTX::Ordering (FenceOrdering)
1999
+ << " \" ." ;
2000
+ report_fatal_error (OS.str ());
2001
+ }
2002
+
1953
2003
// Vector Setting
1954
2004
MVT SimpleVT = StoreVT.getSimpleVT ();
1955
2005
unsigned vecType = NVPTX::PTXLdStInstCode::Scalar;
@@ -1969,7 +2019,6 @@ bool NVPTXDAGToDAGISel::tryStore(SDNode *N) {
1969
2019
unsigned int toType = getLdStRegType (ScalarVT);
1970
2020
1971
2021
// Create the machine instruction DAG
1972
- SDValue Chain = ST->getChain ();
1973
2022
SDValue Value = PlainStore ? PlainStore->getValue () : AtomicStore->getVal ();
1974
2023
SDValue BasePtr = ST->getBasePtr ();
1975
2024
SDValue Addr;
@@ -1985,7 +2034,6 @@ bool NVPTXDAGToDAGISel::tryStore(SDNode *N) {
1985
2034
if (!Opcode)
1986
2035
return false ;
1987
2036
SDValue Ops[] = {Value,
1988
- getI32Imm (FenceOrdering, dl),
1989
2037
getI32Imm (InstructionOrdering, dl),
1990
2038
getI32Imm (CodeAddrSpace, dl),
1991
2039
getI32Imm (vecType, dl),
@@ -2003,7 +2051,6 @@ bool NVPTXDAGToDAGISel::tryStore(SDNode *N) {
2003
2051
if (!Opcode)
2004
2052
return false ;
2005
2053
SDValue Ops[] = {Value,
2006
- getI32Imm (FenceOrdering, dl),
2007
2054
getI32Imm (InstructionOrdering, dl),
2008
2055
getI32Imm (CodeAddrSpace, dl),
2009
2056
getI32Imm (vecType, dl),
@@ -2029,7 +2076,6 @@ bool NVPTXDAGToDAGISel::tryStore(SDNode *N) {
2029
2076
return false ;
2030
2077
2031
2078
SDValue Ops[] = {Value,
2032
- getI32Imm (FenceOrdering, dl),
2033
2079
getI32Imm (InstructionOrdering, dl),
2034
2080
getI32Imm (CodeAddrSpace, dl),
2035
2081
getI32Imm (vecType, dl),
@@ -2052,7 +2098,6 @@ bool NVPTXDAGToDAGISel::tryStore(SDNode *N) {
2052
2098
if (!Opcode)
2053
2099
return false ;
2054
2100
SDValue Ops[] = {Value,
2055
- getI32Imm (FenceOrdering, dl),
2056
2101
getI32Imm (InstructionOrdering, dl),
2057
2102
getI32Imm (CodeAddrSpace, dl),
2058
2103
getI32Imm (vecType, dl),
@@ -2096,6 +2141,25 @@ bool NVPTXDAGToDAGISel::tryStoreVector(SDNode *N) {
2096
2141
auto [InstructionOrdering, FenceOrdering] =
2097
2142
getOperationOrderings (MemSD, Subtarget);
2098
2143
2144
+ // If a fence is required before the operation, insert it:
2145
+ switch (NVPTX::Ordering (FenceOrdering)) {
2146
+ case NVPTX::Ordering::NotAtomic:
2147
+ break ;
2148
+ case NVPTX::Ordering::SequentiallyConsistent: {
2149
+ unsigned Op = Subtarget->hasMemoryOrdering ()
2150
+ ? NVPTX::atomic_thread_fence_seq_cst_sys
2151
+ : NVPTX::atomic_thread_fence_seq_cst_sys_membar;
2152
+ Chain = SDValue (CurDAG->getMachineNode (Op, DL, MVT::Other, Chain), 0 );
2153
+ break ;
2154
+ }
2155
+ default :
2156
+ SmallString<256 > Msg;
2157
+ raw_svector_ostream OS (Msg);
2158
+ OS << " Unexpected fence ordering: \" " << NVPTX::Ordering (FenceOrdering)
2159
+ << " \" ." ;
2160
+ report_fatal_error (OS.str ());
2161
+ }
2162
+
2099
2163
// Type Setting: toType + toTypeWidth
2100
2164
// - for integer type, always use 'u'
2101
2165
assert (StoreVT.isSimple () && " Store value is not simple" );
@@ -2136,7 +2200,6 @@ bool NVPTXDAGToDAGISel::tryStoreVector(SDNode *N) {
2136
2200
ToTypeWidth = 32 ;
2137
2201
}
2138
2202
2139
- StOps.push_back (getI32Imm (FenceOrdering, DL));
2140
2203
StOps.push_back (getI32Imm (InstructionOrdering, DL));
2141
2204
StOps.push_back (getI32Imm (CodeAddrSpace, DL));
2142
2205
StOps.push_back (getI32Imm (VecType, DL));
0 commit comments