Skip to content

Commit e5d89df

Browse files
jgu222igcbot
authored andcommitted
This is a minor change to allow stateful transformation for non-gep
pointer. This change should have not functional change yet. The next one will enable this change.
1 parent f92cd74 commit e5d89df

File tree

2 files changed

+28
-12
lines changed

2 files changed

+28
-12
lines changed

IGC/Compiler/Optimizer/OpenCLPasses/StatelessToStatefull/StatelessToStatefull.cpp

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -334,13 +334,11 @@ bool StatelessToStatefull::getOffsetFromGEP(
334334
return true;
335335
}
336336

337-
const KernelArg* StatelessToStatefull::gepIsFromKernelArgument(const PointerType& ptrType, GetElementPtrInst* gep)
337+
const KernelArg* StatelessToStatefull::getKernelArgFromPtr(const PointerType& ptrType, Value* pVal)
338338
{
339-
// skip if no gep at all
340-
if (gep == nullptr)
339+
if (pVal == nullptr)
341340
return nullptr;
342-
343-
Value* base = gep->getPointerOperand()->stripPointerCasts();
341+
Value* base = pVal;
344342

345343
// stripPointerCasts might skip addrSpaceCast, thus check if AS is still
346344
// the original one.
@@ -364,10 +362,10 @@ bool StatelessToStatefull::pointerIsFromKernelArgument(Value& ptr)
364362
base = gep->getPointerOperand()->stripPointerCasts();
365363
}
366364

367-
if (gep == nullptr)
365+
if (!m_supportNonGEPPtr && gep == nullptr)
368366
return false;
369367

370-
if (gepIsFromKernelArgument(*dyn_cast<PointerType>(ptr.getType()), gep) != nullptr)
368+
if (getKernelArgFromPtr(*dyn_cast<PointerType>(ptr.getType()), base) != nullptr)
371369
return true;
372370
return false;
373371
}
@@ -409,8 +407,13 @@ bool StatelessToStatefull::pointerIsPositiveOffsetFromKernelArgument(
409407
base = gep->getPointerOperand()->stripPointerCasts();
410408
}
411409

412-
// if the last gep is from kerenl argument
413-
if (const KernelArg * arg = gepIsFromKernelArgument(*ptrType, gep))
410+
if (!m_supportNonGEPPtr && gep == nullptr)
411+
{
412+
return false;
413+
}
414+
415+
// if the base is from kerenl argument
416+
if (const KernelArg * arg = getKernelArgFromPtr(*ptrType, base))
414417
{
415418
// base is the argument!
416419
argNumber = arg->getAssociatedArgNo();
@@ -430,6 +433,15 @@ bool StatelessToStatefull::pointerIsPositiveOffsetFromKernelArgument(
430433
? true
431434
: (getPointeeAlign(DL, base) >= 4);
432435

436+
// special handling
437+
if (m_supportNonGEPPtr && gep == nullptr && !arg->isImplicitArg())
438+
{
439+
// For NonGEP ptr, do stateful only if arg isn't char*/short*
440+
// (We hit bugs when allowing stateful for char*/short* arg without GEP.
441+
// Here, we simply avoid doing stateful for char*/short*.)
442+
isAlignedPointee = (getPointeeAlign(DL, base) >= 4);
443+
}
444+
433445
// If m_hasBufferOffsetArg is true, the offset argument is added to
434446
// the final offset to make it definitely positive. Thus skip checking
435447
// if an offset is positive.

IGC/Compiler/Optimizer/OpenCLPasses/StatelessToStatefull/StatelessToStatefull.hpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,9 @@ namespace IGC
7878
bool pointerIsPositiveOffsetFromKernelArgument(
7979
llvm::Function* F, llvm::Value* V, llvm::Value*& offset, unsigned int& argNumber, const KernelArg*& kernelArg);
8080

81-
// Check if the given gep can be traced back to any kernel argument.
81+
// Check if the given pointer value can be traced back to any kernel argument.
8282
// return the kernel argument if found, otherwise return nullptr.
83-
// lastGep - the last gep of pointer address, nullptr if no GEP
84-
const KernelArg* gepIsFromKernelArgument(const llvm::PointerType& ptrType, llvm::GetElementPtrInst* gep);
83+
const KernelArg* getKernelArgFromPtr(const llvm::PointerType& ptrType, llvm::Value* pVal);
8584

8685
// check if the given pointer can be traced back to any kernel argument
8786
bool pointerIsFromKernelArgument(llvm::Value& ptr);
@@ -134,6 +133,11 @@ namespace IGC
134133
// When true, every messages that are in ptrArg + offset will have offset >= 0.
135134
bool m_hasPositivePointerOffset;
136135

136+
// Handle non-gep pointer
137+
// For historic reason (probably non-DW aligned arg), non-gep ptr isn't handled.
138+
// If this field is true, non-gep ptr shall be handled.
139+
const bool m_supportNonGEPPtr = false;
140+
137141
llvm::AssumptionCacheTracker* m_ACT;
138142
llvm::AssumptionCache* getAC(llvm::Function* F)
139143
{

0 commit comments

Comments
 (0)