@@ -36,6 +36,7 @@ SPDX-License-Identifier: MIT
36
36
// / samplers can be easily added here.
37
37
38
38
#include " GenX.h"
39
+ #include " GenXSubtarget.h"
39
40
#include " GenXTargetMachine.h"
40
41
41
42
#include " vc/Support/BackendConfig.h"
@@ -46,16 +47,20 @@ SPDX-License-Identifier: MIT
46
47
#include " llvm/GenXIntrinsics/GenXIntrinsics.h"
47
48
#include " llvm/GenXIntrinsics/GenXMetadata.h"
48
49
50
+ #include " visa_igc_common_header.h"
51
+
49
52
#include " Probe/Assertion.h"
50
53
51
54
#include < llvm/ADT/SmallVector.h>
52
55
#include < llvm/ADT/StringRef.h>
53
56
#include < llvm/ADT/Twine.h>
57
+ #include < llvm/CodeGen/TargetPassConfig.h>
54
58
#include < llvm/IR/Function.h>
55
59
#include < llvm/IR/GlobalVariable.h>
56
60
#include < llvm/IR/IRBuilder.h>
57
61
#include < llvm/IR/InstIterator.h>
58
62
#include < llvm/IR/Module.h>
63
+ #include < llvm/InitializePasses.h>
59
64
#include < llvm/Pass.h>
60
65
#include < llvm/Support/ErrorHandling.h>
61
66
@@ -69,10 +74,12 @@ class PromoteToBindless {
69
74
Module &M;
70
75
const GenXBackendConfig &BC;
71
76
GlobalVariable *BSS = nullptr ;
77
+ const GenXSubtarget &ST;
72
78
73
79
public:
74
- PromoteToBindless (Module &InM, const GenXBackendConfig &InBC)
75
- : M{InM}, BC{InBC} {}
80
+ PromoteToBindless (Module &InM, const GenXBackendConfig &InBC,
81
+ const GenXSubtarget &InST)
82
+ : M{InM}, BC{InBC}, ST(InST) {}
76
83
77
84
bool run ();
78
85
@@ -97,6 +104,7 @@ class GenXPromoteStatefulToBindless final : public ModulePass {
97
104
GenXPromoteStatefulToBindless () : ModulePass(ID) {}
98
105
99
106
void getAnalysisUsage (AnalysisUsage &AU) const override {
107
+ AU.addRequired <TargetPassConfig>();
100
108
AU.addRequired <GenXBackendConfig>();
101
109
}
102
110
@@ -114,6 +122,7 @@ INITIALIZE_PASS_BEGIN(GenXPromoteStatefulToBindless,
114
122
" GenXPromoteStatefulToBindless" ,
115
123
" GenXPromoteStatefulToBindless" , false , false );
116
124
INITIALIZE_PASS_DEPENDENCY (GenXBackendConfig)
125
+ INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
117
126
INITIALIZE_PASS_END(GenXPromoteStatefulToBindless,
118
127
" GenXPromoteStatefulToBindless" ,
119
128
" GenXPromoteStatefulToBindless" , false , false );
@@ -128,7 +137,11 @@ ModulePass *createGenXPromoteStatefulToBindlessPass() {
128
137
bool GenXPromoteStatefulToBindless::runOnModule (Module &M) {
129
138
auto &BC = getAnalysis<GenXBackendConfig>();
130
139
131
- PromoteToBindless PTM{M, BC};
140
+ const GenXSubtarget &ST = getAnalysis<TargetPassConfig>()
141
+ .getTM <GenXTargetMachine>()
142
+ .getGenXSubtarget ();
143
+
144
+ PromoteToBindless PTM{M, BC, ST};
132
145
133
146
return PTM.run ();
134
147
}
@@ -441,7 +454,9 @@ PromoteToBindless::createBindlessSurfaceDataportIntrinsicChain(CallInst &CI) {
441
454
442
455
// Get bindless version of given bti lsc intrinsic.
443
456
static vc::InternalIntrinsic::ID
444
- getBindlessLscIntrinsicID (vc::InternalIntrinsic::ID IID) {
457
+ getBindlessLscIntrinsicID (vc::InternalIntrinsic::ID IID,
458
+ const GenXSubtarget &ST) {
459
+
445
460
#define MAP (INTR ) \
446
461
case vc::InternalIntrinsic::INTR##_bti: \
447
462
return vc::InternalIntrinsic::INTR##_bss
@@ -468,15 +483,18 @@ getBindlessLscIntrinsicID(vc::InternalIntrinsic::ID IID) {
468
483
// intrinsics. Lsc intrinsics have special addressing mode operand so
469
484
// there is no need to use %bss variable and SSO goes directly to lsc
470
485
// instruction.
471
- static CallInst *createBindlessLscIntrinsic (CallInst &CI) {
486
+ static CallInst *createBindlessLscIntrinsic (CallInst &CI,
487
+ const GenXSubtarget &ST) {
472
488
const auto ID = vc::InternalIntrinsic::getInternalIntrinsicID (&CI);
473
- const auto NewId = getBindlessLscIntrinsicID (ID);
489
+ const auto NewId = getBindlessLscIntrinsicID (ID, ST );
474
490
475
- auto *Decl = vc::getInternalDeclarationForIdFromArgs (CI.getType (), CI.args (),
491
+ SmallVector<Value *, 16 > Args{CI.args ()};
492
+ IRBuilder<> IRB{&CI};
493
+
494
+
495
+ auto *Decl = vc::getInternalDeclarationForIdFromArgs (CI.getType (), Args,
476
496
NewId, *CI.getModule ());
477
497
478
- IRBuilder<> IRB{&CI};
479
- SmallVector<Value *, 16 > Args{CI.args ()};
480
498
return IRB.CreateCall (Decl->getFunctionType (), Decl, Args, CI.getName ());
481
499
}
482
500
@@ -521,7 +539,7 @@ void PromoteToBindless::rewriteBufferIntrinsic(CallInst &CI) {
521
539
case vc::InternalIntrinsic::lsc_prefetch_quad_bti:
522
540
case vc::InternalIntrinsic::lsc_store_bti:
523
541
case vc::InternalIntrinsic::lsc_store_quad_bti:
524
- BindlessCI = createBindlessLscIntrinsic (CI);
542
+ BindlessCI = createBindlessLscIntrinsic (CI, ST );
525
543
break ;
526
544
}
527
545
0 commit comments