Skip to content

Commit d52ed1b

Browse files
dlei6gigcbot
authored andcommitted
Clean up code triplication for getArgInFunc(), getImplicitArg() and WIFuncResolution::getImplicitArg()
Clean up code triplication for getArgInFunc(), getImplicitArg() and WIFuncResolution::getImplicitArg(). Fixed a bug in WIFuncResolution that checks the stackcall attribute of the callee instead of the caller.
1 parent 8e4a8b7 commit d52ed1b

File tree

9 files changed

+35
-66
lines changed

9 files changed

+35
-66
lines changed

IGC/AdaptorCommon/ImplicitArgs.cpp

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -587,16 +587,6 @@ int32_t ImplicitArgs::getStructArgOffset(unsigned int index) const
587587
return -1;
588588
}
589589

590-
591-
TODO("Refactor code to avoid code triplication for getArgInFunc(), getImplicitArg() and WIFuncResolution::getImplicitArg()")
592-
Argument* ImplicitArgs::getArgInFunc(llvm::Function& F, ImplicitArg::ArgType argType) const {
593-
IGC_ASSERT_MESSAGE((F.arg_size() >= size()), "Invalid number of argumnents in the function!");
594-
595-
unsigned int argIndex = getArgIndex(argType);
596-
unsigned int argIndexInFunc = F.arg_size() - size() + argIndex;
597-
return F.arg_begin() + argIndexInFunc;
598-
}
599-
600590
Argument* ImplicitArgs::getImplicitArg(llvm::Function& F, ImplicitArg::ArgType argType) const
601591
{
602592
if (!isImplicitArgExist(argType))

IGC/Compiler/Optimizer/OpenCLPasses/ExtenstionFuncs/ExtensionFuncResolution.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ void ExtensionFuncsResolution::visitCallInst(CallInst& CI)
103103
return;
104104
}
105105

106-
Value* vmeRes = m_implicitArgs.getArgInFunc(F, argType);
106+
Value* vmeRes = m_implicitArgs.getImplicitArg(F, argType);
107107

108108
// Replace original VME call instruction with the appropriate argument, example:
109109

IGC/Compiler/Optimizer/OpenCLPasses/OpenCLPrintf/OpenCLPrintfResolution.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ void OpenCLPrintfResolution::expandPrintfCall(CallInst& printfCall, Function& F)
496496
preprocessPrintfArgs(printfCall);
497497

498498
// writeOffset = atomic_add(bufferPtr, dataSize)
499-
Value* basebufferPtr = implicitArgs.getArgInFunc(F, ImplicitArg::PRINTF_BUFFER);
499+
Value* basebufferPtr = implicitArgs.getImplicitArg(F, ImplicitArg::PRINTF_BUFFER);
500500
Value* dataSizeVal = ConstantInt::get(m_int32Type, getTotalDataSize());
501501
Instruction* writeOffsetStart = genAtomicAdd(basebufferPtr, dataSizeVal, printfCall, "write_offset");
502502
writeOffsetStart->setDebugLoc(m_DL);

IGC/Compiler/Optimizer/OpenCLPasses/PrivateMemory/PrivateMemoryResolution.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -931,7 +931,7 @@ bool PrivateMemoryResolution::resolveAllocaInstructions(bool privateOnStack)
931931
Value* privateBase = nullptr;
932932
if (modMD->compOpt.UseScratchSpacePrivateMemory)
933933
{
934-
Argument* r0Arg = implicitArgs.getArgInFunc(*m_currFunction, ImplicitArg::R0);
934+
Argument* r0Arg = implicitArgs.getImplicitArg(*m_currFunction, ImplicitArg::R0);
935935
Value* r0_5 = entryBuilder.CreateExtractElement(r0Arg, ConstantInt::get(typeInt32, 5), VALUE_NAME("r0.5"));
936936
privateBase = entryBuilder.CreateAnd(r0_5, ConstantInt::get(typeInt32, 0xFFFFFC00), VALUE_NAME("privateBase"));
937937
}
@@ -1051,8 +1051,8 @@ bool PrivateMemoryResolution::resolveAllocaInstructions(bool privateOnStack)
10511051
}
10521052

10531053
// Find the implicit argument representing r0 and the private memory base.
1054-
Argument* r0Arg = implicitArgs.getArgInFunc(*m_currFunction, ImplicitArg::R0);
1055-
Argument* privateMemArg = implicitArgs.getArgInFunc(*m_currFunction, ImplicitArg::PRIVATE_BASE);
1054+
Argument* r0Arg = implicitArgs.getImplicitArg(*m_currFunction, ImplicitArg::R0);
1055+
Argument* privateMemArg = implicitArgs.getImplicitArg(*m_currFunction, ImplicitArg::PRIVATE_BASE);
10561056
// Note: for debugging purposes privateMemArg will be marked as Output to keep its liveness all time
10571057

10581058
// Resolve the call

IGC/Compiler/Optimizer/OpenCLPasses/PrivateMemory/PrivateMemoryToSLM.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -309,21 +309,21 @@ namespace IGC
309309
{
310310
localIdX =
311311
ZExtInst::CreateIntegerCast(
312-
implicitArgs.getArgInFunc(*F, ImplicitArg::LOCAL_ID_X),
312+
implicitArgs.getImplicitArg(*F, ImplicitArg::LOCAL_ID_X),
313313
typeInt32,
314314
false,
315315
VALUE_NAME("localIdX"),
316316
pEntryPoint);
317317
localIdY =
318318
ZExtInst::CreateIntegerCast(
319-
implicitArgs.getArgInFunc(*F, ImplicitArg::LOCAL_ID_Y),
319+
implicitArgs.getImplicitArg(*F, ImplicitArg::LOCAL_ID_Y),
320320
typeInt32,
321321
false,
322322
VALUE_NAME("localIdY"),
323323
pEntryPoint);
324324
localIdZ =
325325
ZExtInst::CreateIntegerCast(
326-
implicitArgs.getArgInFunc(*F, ImplicitArg::LOCAL_ID_Z),
326+
implicitArgs.getImplicitArg(*F, ImplicitArg::LOCAL_ID_Z),
327327
typeInt32,
328328
false,
329329
VALUE_NAME("localIdZ"),
@@ -336,7 +336,7 @@ namespace IGC
336336
// R0.1 31:0 Thread Group ID X
337337
// R0.6 31:0 Thread Group ID Y
338338
// R0.7 31:0 Thread Group ID Z
339-
Argument* r0Arg = implicitArgs.getArgInFunc(*F, ImplicitArg::R0);
339+
Argument* r0Arg = implicitArgs.getImplicitArg(*F, ImplicitArg::R0);
340340
localIdX =
341341
builder.CreateExtractElement(
342342
r0Arg,

IGC/Compiler/Optimizer/OpenCLPasses/WIFuncs/WIFuncResolution.cpp

Lines changed: 24 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ Value* WIFuncResolution::getLocalId(CallInst& CI, ImplicitArg::ArgType argType)
321321
// %localIdX
322322

323323
Value* V = nullptr;
324-
auto F = CI.getFunction();
324+
auto F = CI.getParent()->getParent();
325325
if (hasStackCallAttr(*F))
326326
{
327327
// LocalIDBase = oword_ld
@@ -396,7 +396,7 @@ Value* WIFuncResolution::getLocalId(CallInst& CI, ImplicitArg::ArgType argType)
396396
}
397397
else
398398
{
399-
Argument* localId = getImplicitArg(CI, argType);
399+
Argument* localId = m_implicitArgs.getImplicitArg(*F, argType);
400400
V = localId;
401401
}
402402

@@ -420,7 +420,7 @@ Value* WIFuncResolution::getGroupId(CallInst& CI)
420420
// if dim = 2 then we need to access R0.7
421421

422422
Value* V = nullptr;
423-
auto F = CI.getFunction();
423+
auto F = CI.getParent()->getParent();
424424
if (hasStackCallAttr(*F))
425425
{
426426
auto Ctx = getAnalysis<CodeGenContextWrapper>().getCodeGenContext();
@@ -433,7 +433,7 @@ Value* WIFuncResolution::getGroupId(CallInst& CI)
433433
}
434434
else
435435
{
436-
Argument* arg = getImplicitArg(CI, ImplicitArg::R0);
436+
Argument* arg = m_implicitArgs.getImplicitArg(*F, ImplicitArg::R0);
437437
V = arg;
438438
}
439439

@@ -461,7 +461,7 @@ Value* WIFuncResolution::getLocalThreadId(CallInst &CI)
461461
// we need to access R0.2 bits 0 to 7, which contain HW local thread ID on XeHP_SDV+
462462

463463
Value* V = nullptr;
464-
auto F = CI.getFunction();
464+
auto F = CI.getParent()->getParent();
465465
if (hasStackCallAttr(*F))
466466
{
467467
auto Ctx = getAnalysis<CodeGenContextWrapper>().getCodeGenContext();
@@ -474,7 +474,7 @@ Value* WIFuncResolution::getLocalThreadId(CallInst &CI)
474474
}
475475
else
476476
{
477-
Argument* arg = getImplicitArg(CI, ImplicitArg::R0);
477+
Argument* arg = m_implicitArgs.getImplicitArg(*F, ImplicitArg::R0);
478478
V = arg;
479479
}
480480

@@ -495,7 +495,7 @@ Value* WIFuncResolution::getGlobalSize(CallInst& CI)
495495
// %globalSize1 = extractelement <3 x i32> %globalSize, i32 %dim
496496

497497
Value* V = nullptr;
498-
auto F = CI.getFunction();
498+
auto F = CI.getParent()->getParent();
499499
if (hasStackCallAttr(*F))
500500
{
501501
llvm::IRBuilder<> Builder(&CI);
@@ -516,7 +516,7 @@ Value* WIFuncResolution::getGlobalSize(CallInst& CI)
516516
}
517517
else
518518
{
519-
Argument* arg = getImplicitArg(CI, ImplicitArg::GLOBAL_SIZE);
519+
Argument* arg = m_implicitArgs.getImplicitArg(*F, ImplicitArg::GLOBAL_SIZE);
520520
V = arg;
521521
}
522522

@@ -536,7 +536,7 @@ Value* WIFuncResolution::getLocalSize(CallInst& CI)
536536
// %localSize = extractelement <3 x i32> %localSize, i32 %dim
537537

538538
Value* V = nullptr;
539-
auto F = CI.getFunction();
539+
auto F = CI.getParent()->getParent();
540540
if (hasStackCallAttr(*F))
541541
{
542542
llvm::IRBuilder<> Builder(&CI);
@@ -548,7 +548,7 @@ Value* WIFuncResolution::getLocalSize(CallInst& CI)
548548
}
549549
else
550550
{
551-
Argument* arg = getImplicitArg(CI, ImplicitArg::LOCAL_SIZE);
551+
Argument* arg = m_implicitArgs.getImplicitArg(*F, ImplicitArg::LOCAL_SIZE);
552552
V = arg;
553553
}
554554

@@ -567,7 +567,7 @@ Value* WIFuncResolution::getEnqueuedLocalSize(CallInst& CI) {
567567
// %enqueuedLocalSize1 = extractelement <3 x i32> %enqueuedLocalSize, %dim
568568

569569
Value* V = nullptr;
570-
auto F = CI.getFunction();
570+
auto F = CI.getParent()->getParent();
571571
if (hasStackCallAttr(*F))
572572
{
573573
// Assume that enqueued local size is same as local size
@@ -580,7 +580,7 @@ Value* WIFuncResolution::getEnqueuedLocalSize(CallInst& CI) {
580580
}
581581
else
582582
{
583-
Argument* arg = getImplicitArg(CI, ImplicitArg::ENQUEUED_LOCAL_WORK_SIZE);
583+
Argument* arg = m_implicitArgs.getImplicitArg(*F, ImplicitArg::ENQUEUED_LOCAL_WORK_SIZE);
584584
V = arg;
585585
}
586586

@@ -600,7 +600,7 @@ Value* WIFuncResolution::getGlobalOffset(CallInst& CI)
600600
// %globalOffset = extractelement <8 x i32> %payloadHeader, i32 %dim
601601

602602
Value* V = nullptr;
603-
auto F = CI.getFunction();
603+
auto F = CI.getParent()->getParent();
604604
if (hasStackCallAttr(*F))
605605
{
606606
llvm::IRBuilder<> Builder(&CI);
@@ -621,7 +621,7 @@ Value* WIFuncResolution::getGlobalOffset(CallInst& CI)
621621
}
622622
else
623623
{
624-
Argument* arg = getImplicitArg(CI, ImplicitArg::PAYLOAD_HEADER);
624+
Argument* arg = m_implicitArgs.getImplicitArg(*F, ImplicitArg::PAYLOAD_HEADER);
625625
V = arg;
626626
}
627627

@@ -641,7 +641,7 @@ Value* WIFuncResolution::getWorkDim(CallInst& CI)
641641
// %workDim
642642

643643
Value* V = nullptr;
644-
auto F = CI.getFunction();
644+
auto F = CI.getParent()->getParent();
645645
if (hasStackCallAttr(*F))
646646
{
647647
llvm::IRBuilder<> Builder(&CI);
@@ -654,7 +654,7 @@ Value* WIFuncResolution::getWorkDim(CallInst& CI)
654654
}
655655
else
656656
{
657-
Argument* workDim = getImplicitArg(CI, ImplicitArg::WORK_DIM);
657+
Argument* workDim = m_implicitArgs.getImplicitArg(*F, ImplicitArg::WORK_DIM);
658658
V = workDim;
659659
}
660660

@@ -670,7 +670,7 @@ Value* WIFuncResolution::getNumGroups(CallInst& CI)
670670
// %numGroups1 = extractelement <3 x i32> %numGroups, i32 %dim
671671

672672
Value* V = nullptr;
673-
auto F = CI.getFunction();
673+
auto F = CI.getParent()->getParent();
674674
if (hasStackCallAttr(*F))
675675
{
676676
llvm::IRBuilder<> Builder(&CI);
@@ -682,7 +682,7 @@ Value* WIFuncResolution::getNumGroups(CallInst& CI)
682682
}
683683
else
684684
{
685-
Argument* arg = getImplicitArg(CI, ImplicitArg::NUM_GROUPS);
685+
Argument* arg = m_implicitArgs.getImplicitArg(*F, ImplicitArg::NUM_GROUPS);
686686
V = arg;
687687
}
688688

@@ -700,8 +700,8 @@ Value* WIFuncResolution::getStageInGridOrigin(CallInst& CI)
700700

701701
// Creates:
702702
// %grid_origin1 = extractelement <3 x i32> %globalSize, i32 %dim
703-
704-
Argument* arg = getImplicitArg(CI, ImplicitArg::STAGE_IN_GRID_ORIGIN);
703+
auto F = CI.getParent()->getParent();
704+
Argument* arg = m_implicitArgs.getImplicitArg(*F, ImplicitArg::STAGE_IN_GRID_ORIGIN);
705705

706706
Value* dim = CI.getArgOperand(0);
707707
Instruction* globalSize = ExtractElementInst::Create(arg, dim, "grid_origin", &CI);
@@ -719,7 +719,7 @@ Value* WIFuncResolution::getStageInGridSize(CallInst& CI)
719719
// %grid_size1 = extractelement <3 x i32> %globalSize, i32 %dim
720720

721721
Value* V = nullptr;
722-
auto F = CI.getFunction();
722+
auto F = CI.getParent()->getParent();
723723
if (hasStackCallAttr(*F))
724724
{
725725
llvm::IRBuilder<> Builder(&CI);
@@ -740,7 +740,7 @@ Value* WIFuncResolution::getStageInGridSize(CallInst& CI)
740740
}
741741
else
742742
{
743-
Argument* arg = getImplicitArg(CI, ImplicitArg::STAGE_IN_GRID_SIZE);
743+
Argument* arg = m_implicitArgs.getImplicitArg(*F, ImplicitArg::STAGE_IN_GRID_SIZE);
744744
V = arg;
745745
}
746746

@@ -758,23 +758,9 @@ Value* WIFuncResolution::getSyncBufferPtr(CallInst& CI)
758758

759759
// Creates:
760760
// i8 addrspace(1)* %syncBuffer
761-
762-
Argument* syncBuffer = getImplicitArg(CI, ImplicitArg::SYNC_BUFFER);
761+
auto F = CI.getParent()->getParent();
762+
Argument* syncBuffer = m_implicitArgs.getImplicitArg(*F, ImplicitArg::SYNC_BUFFER);
763763

764764
return syncBuffer;
765765
}
766766

767-
Argument* WIFuncResolution::getImplicitArg(CallInst& CI, ImplicitArg::ArgType argType)
768-
{
769-
unsigned int numImplicitArgs = m_implicitArgs.size();
770-
unsigned int implicitArgIndex = m_implicitArgs.getArgIndex(argType);
771-
772-
Function* pFunc = CI.getParent()->getParent();
773-
IGC_ASSERT_MESSAGE(pFunc->arg_size() >= numImplicitArgs, "Function arg size does not match meta data args.");
774-
unsigned int implicitArgIndexInFunc = pFunc->arg_size() - numImplicitArgs + implicitArgIndex;
775-
776-
Function::arg_iterator arg = pFunc->arg_begin();
777-
for (unsigned int i = 0; i < implicitArgIndexInFunc; ++i, ++arg);
778-
779-
return &(*arg);
780-
}

IGC/Compiler/Optimizer/OpenCLPasses/WIFuncs/WIFuncResolution.hpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,6 @@ namespace IGC
113113
/// @return A value representing the number of work groups
114114
llvm::Value* getNumGroups(llvm::CallInst& CI);
115115

116-
/// @brief Returns the appropriate implicit argument of the function
117-
/// containing the given call instruction, based on the given argument type
118-
/// @param CI The call instruction.
119-
/// @param argType The argument type.
120-
/// @return The function argument associated with the given implicit arg type
121-
llvm::Argument* getImplicitArg(llvm::CallInst& CI, ImplicitArg::ArgType argType);
122-
123116
/// @brief Resolves get_stage_in_grid_origin().
124117
/// Adds the appropriate sequence of code before the given call instruction
125118
/// @param CI The call instruction.

IGC/Compiler/Optimizer/PreCompiledFuncImport.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2025,7 +2025,7 @@ void PreCompiledFuncImport::replaceFunc(Function* old_func, Function* new_func)
20252025
{
20262026
ArgInfoMetaDataHandle argInfo = newFH->getImplicitArgInfoListItem(cImpCount);
20272027
ImplicitArg::ArgType argId = (ImplicitArg::ArgType)argInfo->getArgId();
2028-
Argument* iArgVal = parentIA->getArgInFunc(*parent_func, argId);
2028+
Argument* iArgVal = parentIA->getImplicitArg(*parent_func, argId);
20292029

20302030
new_args.push_back(iArgVal);
20312031
++new_arg_iter;

IGC/Compiler/PromoteStatelessToBindless.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ void PromoteStatelessToBindless::CheckPrintfBuffer(Function& F)
7474

7575
if (implicitArgs.isImplicitArgExist(ImplicitArg::PRINTF_BUFFER))
7676
{
77-
m_PrintfBuffer = implicitArgs.getArgInFunc(F, ImplicitArg::PRINTF_BUFFER);
77+
m_PrintfBuffer = implicitArgs.getImplicitArg(F, ImplicitArg::PRINTF_BUFFER);
7878
}
7979
else
8080
{

0 commit comments

Comments
 (0)