Skip to content

Commit dbae9c5

Browse files
eternastudentoigcbot
authored andcommitted
Support stateless atomic predication
Support stateless atomics predication for performance experiments.
1 parent 6caf55d commit dbae9c5

File tree

1 file changed

+19
-7
lines changed

1 file changed

+19
-7
lines changed

IGC/Compiler/CustomSafeOptPass.cpp

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6206,18 +6206,20 @@ void InsertBranchOpt::ThreeWayLoadSpiltOpt(Function &F) {
62066206

62076207
void InsertBranchOpt::atomicSplitOpt(Function &F, int mode) {
62086208
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
62146215
};
62156216

62166217
// Allow several modes to be applied
62176218
const bool zeroAddMode = ((mode & ZeroAdd) == ZeroAdd);
62186219
const bool umaxMode = ((mode & UMax) == UMax);
62196220
const bool uminMode = ((mode & UMin) == UMin);
62206221
const bool untypedUgmLoadMode = ((mode & UntypedUgmLoad) == UntypedUgmLoad);
6222+
const bool statelessMode = ((mode & StatelessAtomic ) == StatelessAtomic);
62216223

62226224
auto createReadFromAtomic = [=](IRBuilder<> &builder, Instruction *inst, bool isTyped) {
62236225
Constant *zero = ConstantInt::get(inst->getType(), 0);
@@ -6234,7 +6236,15 @@ void InsertBranchOpt::atomicSplitOpt(Function &F, int mode) {
62346236
ld_FunctionArgList[3] = inst->getOperand(3);
62356237
ld_FunctionArgList[4] = zero;
62366238
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+
{
62386248
std::vector<Type *> types;
62396249
std::vector<Value *> ld_FunctionArgList;
62406250
Function *pLdIntrinsic;
@@ -6306,7 +6316,9 @@ void InsertBranchOpt::atomicSplitOpt(Function &F, int mode) {
63066316
if (inst->getIntrinsicID() == GenISAIntrinsic::GenISA_intatomictyped) {
63076317
src = dyn_cast<Instruction>(inst->getOperand(4));
63086318
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)))) {
63106322
src = dyn_cast<Instruction>(inst->getOperand(2));
63116323
op = dyn_cast<ConstantInt>(inst->getOperand(3));
63126324
}

0 commit comments

Comments
 (0)