@@ -14,9 +14,11 @@ SPDX-License-Identifier: MIT
1414#include  " Compiler/CISACodeGen/OpenCLKernelCodeGen.hpp" 
1515#include  " Compiler/IGCPassSupport.h" 
1616#include  " Compiler/MetaDataUtilsWrapper.h" 
17+ 
1718#include  " common/LLVMWarningsPush.hpp" 
1819#include  " llvmWrapper/Support/Alignment.h" 
1920#include  " llvmWrapper/IR/DerivedTypes.h" 
21+ #include  < llvm/ADT/SmallVector.h> 
2022#include  < llvm/IR/Module.h> 
2123#include  < llvm/IR/Instructions.h> 
2224#include  < llvm/IR/DataLayout.h> 
@@ -32,34 +34,33 @@ namespace {
3234    class  GenericAddressDynamicResolution  : public  FunctionPass  {
3335    public: 
3436        static  char  ID;
35-         Module* m_module = nullptr ;
36-         CodeGenContext* m_ctx = nullptr ;
3737
3838        GenericAddressDynamicResolution ()
3939            : FunctionPass(ID)
4040        {
4141        }
4242        ~GenericAddressDynamicResolution () = default ;
4343
44-         virtual   StringRef getPassName () const  override 
44+         StringRef getPassName () const  override 
4545        {
4646            return  " GenericAddressDynamicResolution" 
4747        }
4848
49-         virtual   void  getAnalysisUsage (AnalysisUsage& AU) const  override 
49+         void  getAnalysisUsage (AnalysisUsage& AU) const  override 
5050        {
5151            AU.addRequired <MetaDataUtilsWrapper>();
5252            AU.addRequired <CodeGenContextWrapper>();
5353            AU.addRequired <CastToGASAnalysis>();
5454        }
5555
56-         virtual   bool  runOnFunction (Function& F) override ;
57- 
56+         bool  runOnFunction (Function& F) override ;
57+      private: 
5858        bool  visitLoadStoreInst (Instruction& I);
5959        bool  visitIntrinsicCall (CallInst& I);
60-         Module* getModule () { return  m_module; }
6160
62-     private: 
61+         Module* m_module = nullptr ;
62+         CodeGenContext* m_ctx = nullptr ;
63+         llvm::SmallVector<Instruction*, 32 > generatedLoadStores;
6364        bool  m_needPrivateBranches = false ;
6465        bool  m_needLocalBranches = false ;
6566
@@ -96,43 +97,37 @@ bool GenericAddressDynamicResolution::runOnFunction(Function& F)
9697    m_needLocalBranches = !GI.isNoLocalToGenericOptionEnabled () && GI.canGenericPointToLocal (F);
9798
9899    bool  modified = false ;
99-     bool  changed = false ;
100100
101-     //  iterate for all the intrinisics used by to_local, to_global, and to_private
102-     do  {
103-         changed = false ;
104- 
105-         for  (inst_iterator i = inst_begin (F); i != inst_end (F); ++i) {
106-             Instruction& instruction = (*i);
101+     llvm::SmallVector<Instruction*, 32 > callInstructions;
102+     llvm::SmallVector<Instruction*, 32 > loadStoreInstructions;
107103
108-             if  (CallInst * intrinsic = dyn_cast<CallInst>(&instruction)) {
109-                 changed = visitIntrinsicCall (*intrinsic);
110-             }
104+     for  (auto & instruction: llvm::instructions (F)) {
111105
112-             if  (changed) {
113-                 modified = true ;
114-                 break ;
115-             }
106+         if  (isa<CallInst>(&instruction)) {
107+             callInstructions.push_back (&instruction);
108+         }
109+         if  (isa<LoadInst, StoreInst>(instruction)) {
110+             loadStoreInstructions.push_back (&instruction);
116111        }
117-     } while  (changed);
112+     }
113+     //  iterate for all the intrinisics used by to_local, to_global, and to_private
114+     for  (auto * callInst : callInstructions) {
115+         modified |= visitIntrinsicCall (cast<CallInst>(*callInst));
116+     }
118117
119118    //  iterate over all loads/stores with generic address space pointers
120-     do  {
121-         changed = false ;
122- 
123-         for  (inst_iterator i = inst_begin (F); i != inst_end (F); ++i) {
124-             Instruction& instruction = (*i);
125- 
126-             if  (isa<LoadInst>(instruction) || isa<StoreInst>(instruction)) {
127-                 changed = visitLoadStoreInst (instruction);
128-             }
119+     for  (auto * loadStoreInst : loadStoreInstructions) {
120+         modified |= visitLoadStoreInst (*loadStoreInst);
121+     }
129122
130-             if  (changed) {
131-                 modified = true ;
132-                 break ;
133-             }
123+     //  iterate over all newly generated load/stores
124+     while  (!generatedLoadStores.empty ()) {
125+         llvm::SmallVector<Instruction*, 32 > newInstructions = generatedLoadStores;
126+         generatedLoadStores.clear ();
127+         for  (auto * loadStoreInst : newInstructions) {
128+             modified |= visitLoadStoreInst (*loadStoreInst);
134129        }
135-     }  while  (changed); 
130+     }
136131
137132    if  (m_numAdditionalControlFlows)
138133    {
@@ -155,8 +150,7 @@ bool GenericAddressDynamicResolution::runOnFunction(Function& F)
155150
156151Type* GenericAddressDynamicResolution::getPointerAsIntType (LLVMContext& ctx, const  unsigned  AS)
157152{
158-     Module* pModule = getModule ();
159-     DataLayout dataLayout = pModule->getDataLayout ();
153+     DataLayout dataLayout = m_module->getDataLayout ();
160154    unsigned  ptrBits (dataLayout.getPointerSizeInBits (AS));
161155    return  IntegerType::get (ctx, ptrBits);
162156}
@@ -168,11 +162,11 @@ bool GenericAddressDynamicResolution::visitLoadStoreInst(Instruction& I)
168162    Value* pointerOperand = nullptr ;
169163    unsigned  int  pointerAddressSpace = ADDRESS_SPACE_NUM_ADDRESSES;
170164
171-     if  (LoadInst  * load = dyn_cast<LoadInst>(&I)) {
165+     if  (auto * load = dyn_cast<LoadInst>(&I)) {
172166        pointerOperand = load->getPointerOperand ();
173167        pointerAddressSpace = load->getPointerAddressSpace ();
174168    }
175-     else  if  (StoreInst  * store = dyn_cast<StoreInst>(&I)) {
169+     else  if  (auto * store = dyn_cast<StoreInst>(&I)) {
176170        pointerOperand = store->getPointerOperand ();
177171        pointerAddressSpace = store->getPointerAddressSpace ();
178172    }
@@ -241,7 +235,7 @@ void GenericAddressDynamicResolution::resolveGAS(Instruction& I, Value* pointerO
241235    //  with the corresponding address space.
242236
243237    IGCLLVM::IRBuilder<> builder (&I);
244-     PointerType * pointerType = dyn_cast<PointerType>(pointerOperand->getType ());
238+     auto * pointerType = dyn_cast<PointerType>(pointerOperand->getType ());
245239    IGC_ASSERT ( pointerType != nullptr  );
246240    ConstantInt* privateTag = builder.getInt64 (1 ); //  tag 001
247241    ConstantInt* localTag = builder.getInt64 (2 );   //  tag 010
@@ -275,15 +269,18 @@ void GenericAddressDynamicResolution::resolveGAS(Instruction& I, Value* pointerO
275269        builder.SetInsertPoint (BB);
276270        PointerType* ptrType = IGCLLVM::getWithSamePointeeType (pointerType, addressSpace);
277271        Value* ptr = builder.CreateAddrSpaceCast (pointerOperand, ptrType);
272+         Instruction* generatedLoadStore = nullptr ;
278273
279-         if  (LoadInst * LI = dyn_cast<LoadInst>(&I))
274+         if  (auto * LI = dyn_cast<LoadInst>(&I))
280275        {
281276            load = builder.CreateAlignedLoad (LI->getType (), ptr, getAlign (*LI), LI->isVolatile (), LoadName);
277+             generatedLoadStore = cast<Instruction>(load);
282278        }
283-         else  if  (StoreInst * SI = dyn_cast<StoreInst>(&I))
279+         else  if  (auto * SI = dyn_cast<StoreInst>(&I))
284280        {
285-             builder.CreateAlignedStore (I.getOperand (0 ), ptr, getAlign (*SI), SI->isVolatile ());
281+             generatedLoadStore =  builder.CreateAlignedStore (I.getOperand (0 ), ptr, getAlign (*SI), SI->isVolatile ());
286282        }
283+         generatedLoadStores.push_back (generatedLoadStore);
287284
288285        builder.CreateBr (convergeBlock);
289286        return  BB;
@@ -345,22 +342,25 @@ void GenericAddressDynamicResolution::resolveGAS(Instruction& I, Value* pointerO
345342void  GenericAddressDynamicResolution::resolveGASWithoutBranches (Instruction& I, Value* pointerOperand)
346343{
347344    IGCLLVM::IRBuilder<> builder (&I);
348-     PointerType * pointerType = dyn_cast<PointerType>(pointerOperand->getType ());
345+     auto * pointerType = dyn_cast<PointerType>(pointerOperand->getType ());
349346    IGC_ASSERT ( pointerType != nullptr  );
350347
351348    Value* nonLocalLoad = nullptr ;
349+     Instruction* generatedLoadStore = nullptr ;
352350
353351    PointerType* ptrType = IGCLLVM::getWithSamePointeeType (pointerType, ADDRESS_SPACE_GLOBAL);
354352    Value* globalPtr = builder.CreateAddrSpaceCast (pointerOperand, ptrType);
355353
356-     if  (LoadInst * LI = dyn_cast<LoadInst>(&I))
354+     if  (auto * LI = dyn_cast<LoadInst>(&I))
357355    {
358356        nonLocalLoad = builder.CreateAlignedLoad (LI->getType (), globalPtr, getAlign (*LI), LI->isVolatile (), " globalOrPrivateLoad" 
357+         generatedLoadStore = cast<Instruction>(nonLocalLoad);
359358    }
360-     else  if  (StoreInst * SI = dyn_cast<StoreInst>(&I))
359+     else  if  (auto * SI = dyn_cast<StoreInst>(&I))
361360    {
362-         builder.CreateAlignedStore (I.getOperand (0 ), globalPtr, getAlign (*SI), SI->isVolatile ());
361+         generatedLoadStore =  builder.CreateAlignedStore (I.getOperand (0 ), globalPtr, getAlign (*SI), SI->isVolatile ());
363362    }
363+     generatedLoadStores.push_back (generatedLoadStore);
364364
365365    if  (nonLocalLoad != nullptr )
366366    {
@@ -386,12 +386,12 @@ bool GenericAddressDynamicResolution::visitIntrinsicCall(CallInst& I)
386386    {
387387        IGC_ASSERT (IGCLLVM::getNumArgOperands (&I) == 1 );
388388        Value* arg = I.getArgOperand (0 );
389-         PointerType * dstType = dyn_cast<PointerType>(I.getType ());
389+         auto * dstType = dyn_cast<PointerType>(I.getType ());
390390        IGC_ASSERT ( dstType != nullptr  );
391391        const  unsigned  targetAS = cast<PointerType>(I.getType ())->getAddressSpace ();
392392
393393        IGCLLVM::IRBuilder<> builder (&I);
394-         PointerType * pointerType = dyn_cast<PointerType>(arg->getType ());
394+         auto * pointerType = dyn_cast<PointerType>(arg->getType ());
395395        IGC_ASSERT ( pointerType != nullptr  );
396396        ConstantInt* globalTag = builder.getInt64 (0 );  //  tag 000/111
397397        ConstantInt* privateTag = builder.getInt64 (1 ); //  tag 001
@@ -411,7 +411,7 @@ bool GenericAddressDynamicResolution::visitIntrinsicCall(CallInst& I)
411411            //  Force distinguishing private and global pointers if a kernel uses explicit casts.
412412            //  For more details please refer to section "Generic Address Space Explicit Casts" in
413413            //  documentation directory under igc/generic-pointers/generic-pointers.md
414-             auto  ClContext = static_cast <OpenCLProgramContext*>(m_ctx);
414+             auto *  ClContext = static_cast <OpenCLProgramContext*>(m_ctx);
415415            ClContext->setDistinguishBetweenPrivateAndGlobalPtr (true );
416416        }
417417
0 commit comments