@@ -6206,18 +6206,20 @@ void InsertBranchOpt::ThreeWayLoadSpiltOpt(Function &F) {
6206
6206
6207
6207
void InsertBranchOpt::atomicSplitOpt (Function &F, int mode) {
6208
6208
enum Mode {
6209
- Disable = 0x0 , // Disabled IGC\EnableAtomicBranch = 0x0
6210
- ZeroAdd = BIT (0 ), // Enabled IGC\EnableAtomicBranch = 0x1
6211
- UMax = BIT (1 ), // Enabled IGC\EnableAtomicBranch = 0x2
6212
- UMin = BIT (2 ), // Enabled IGC\EnableAtomicBranch = 0x4
6213
- UntypedUgmLoad = BIT (3 ) // Enabled IGC\EnableAtomicBranch = 0x8
6209
+ Disable = 0x0 , // Disabled IGC\EnableAtomicBranch = 0x0
6210
+ ZeroAdd = BIT (0 ), // Enabled IGC\EnableAtomicBranch = 0x1
6211
+ UMax = BIT (1 ), // Enabled IGC\EnableAtomicBranch = 0x2
6212
+ UMin = BIT (2 ), // Enabled IGC\EnableAtomicBranch = 0x4
6213
+ UntypedUgmLoad = BIT (3 ), // Enabled IGC\EnableAtomicBranch = 0x8
6214
+ StatelessAtomic = BIT (4 ) // Enabled IGC\EnableAtomicBranch = 0x10
6214
6215
};
6215
6216
6216
6217
// Allow several modes to be applied
6217
6218
const bool zeroAddMode = ((mode & ZeroAdd) == ZeroAdd);
6218
6219
const bool umaxMode = ((mode & UMax) == UMax);
6219
6220
const bool uminMode = ((mode & UMin) == UMin);
6220
6221
const bool untypedUgmLoadMode = ((mode & UntypedUgmLoad) == UntypedUgmLoad);
6222
+ const bool statelessMode = ((mode & StatelessAtomic ) == StatelessAtomic);
6221
6223
6222
6224
auto createReadFromAtomic = [=](IRBuilder<> &builder, Instruction *inst, bool isTyped) {
6223
6225
Constant *zero = ConstantInt::get (inst->getType (), 0 );
@@ -6234,7 +6236,15 @@ void InsertBranchOpt::atomicSplitOpt(Function &F, int mode) {
6234
6236
ld_FunctionArgList[3 ] = inst->getOperand (3 );
6235
6237
ld_FunctionArgList[4 ] = zero;
6236
6238
NewInst = builder.CreateCall (pLdIntrinsic, ld_FunctionArgList);
6237
- } else {
6239
+ }
6240
+ // Stateless atomic
6241
+ else if ( (dyn_cast<GenIntrinsicInst>(inst))->getIntrinsicID () == GenISAIntrinsic::GenISA_intatomicrawA64 )
6242
+ {
6243
+ NewInst = builder.CreateLoad ( inst->getType (), inst->getOperand ( 0 ) );
6244
+ return NewInst;
6245
+ }
6246
+ else
6247
+ {
6238
6248
std::vector<Type *> types;
6239
6249
std::vector<Value *> ld_FunctionArgList;
6240
6250
Function *pLdIntrinsic;
@@ -6306,7 +6316,9 @@ void InsertBranchOpt::atomicSplitOpt(Function &F, int mode) {
6306
6316
if (inst->getIntrinsicID () == GenISAIntrinsic::GenISA_intatomictyped) {
6307
6317
src = dyn_cast<Instruction>(inst->getOperand (4 ));
6308
6318
op = dyn_cast<ConstantInt>(inst->getOperand (5 ));
6309
- } else if (inst->getIntrinsicID () == GenISAIntrinsic::GenISA_intatomicraw) {
6319
+ } else if (inst->getIntrinsicID () == GenISAIntrinsic::GenISA_intatomicraw ||
6320
+ (statelessMode && (inst->getIntrinsicID () == GenISAIntrinsic::GenISA_intatomicrawA64)
6321
+ && (inst->getOperand (0 ) == inst->getOperand (1 )))) {
6310
6322
src = dyn_cast<Instruction>(inst->getOperand (2 ));
6311
6323
op = dyn_cast<ConstantInt>(inst->getOperand (3 ));
6312
6324
}
0 commit comments