@@ -334,13 +334,11 @@ bool StatelessToStatefull::getOffsetFromGEP(
334
334
return true ;
335
335
}
336
336
337
- const KernelArg* StatelessToStatefull::gepIsFromKernelArgument (const PointerType& ptrType, GetElementPtrInst* gep )
337
+ const KernelArg* StatelessToStatefull::getKernelArgFromPtr (const PointerType& ptrType, Value* pVal )
338
338
{
339
- // skip if no gep at all
340
- if (gep == nullptr )
339
+ if (pVal == nullptr )
341
340
return nullptr ;
342
-
343
- Value* base = gep->getPointerOperand ()->stripPointerCasts ();
341
+ Value* base = pVal;
344
342
345
343
// stripPointerCasts might skip addrSpaceCast, thus check if AS is still
346
344
// the original one.
@@ -364,10 +362,10 @@ bool StatelessToStatefull::pointerIsFromKernelArgument(Value& ptr)
364
362
base = gep->getPointerOperand ()->stripPointerCasts ();
365
363
}
366
364
367
- if (gep == nullptr )
365
+ if (!m_supportNonGEPPtr && gep == nullptr )
368
366
return false ;
369
367
370
- if (gepIsFromKernelArgument (*dyn_cast<PointerType>(ptr.getType ()), gep ) != nullptr )
368
+ if (getKernelArgFromPtr (*dyn_cast<PointerType>(ptr.getType ()), base ) != nullptr )
371
369
return true ;
372
370
return false ;
373
371
}
@@ -409,8 +407,13 @@ bool StatelessToStatefull::pointerIsPositiveOffsetFromKernelArgument(
409
407
base = gep->getPointerOperand ()->stripPointerCasts ();
410
408
}
411
409
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))
414
417
{
415
418
// base is the argument!
416
419
argNumber = arg->getAssociatedArgNo ();
@@ -430,6 +433,15 @@ bool StatelessToStatefull::pointerIsPositiveOffsetFromKernelArgument(
430
433
? true
431
434
: (getPointeeAlign (DL, base) >= 4 );
432
435
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
+
433
445
// If m_hasBufferOffsetArg is true, the offset argument is added to
434
446
// the final offset to make it definitely positive. Thus skip checking
435
447
// if an offset is positive.
0 commit comments