Skip to content

Commit 6552fba

Browse files
Jay-Jiewu-Luigcbot
authored andcommitted
Fix printf 64bit pointertype
Given example like: %ptrBC = bitcast i8 addrspace(1)* %printfBuffer to i32 addrspace(1)* %write_offset = call i32 @__builtin_IB_atomic_add_global_i32(i32 addrspace(1)* %ptrBC, i32 12) Whether ptrBC is 64bit should depends on its type instead of PointerSize of DataLayout.
1 parent 59d8631 commit 6552fba

File tree

2 files changed

+15
-18
lines changed

2 files changed

+15
-18
lines changed

IGC/Compiler/Optimizer/OpenCLPasses/Atomics/ResolveOCLAtomics.cpp

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ using namespace IGC;
2626
#define PASS_CFG_ONLY false
2727
#define PASS_ANALYSIS false
2828
IGC_INITIALIZE_PASS_BEGIN(ResolveOCLAtomics, PASS_FLAG, PASS_DESCRIPTION, PASS_CFG_ONLY, PASS_ANALYSIS)
29+
IGC_INITIALIZE_PASS_DEPENDENCY(CodeGenContextWrapper)
2930
IGC_INITIALIZE_PASS_END(ResolveOCLAtomics, PASS_FLAG, PASS_DESCRIPTION, PASS_CFG_ONLY, PASS_ANALYSIS)
3031

3132
char ResolveOCLAtomics::ID = 0;
@@ -77,24 +78,13 @@ void ResolveOCLAtomics::initOCLAtomicsMap()
7778

7879
bool ResolveOCLAtomics::runOnModule(Module& M)
7980
{
81+
m_CGCtx = getAnalysis<CodeGenContextWrapper>().getCodeGenContext();
8082
m_pModule = (IGCLLVM::Module*)&M;
8183
m_Int32Ty = Type::getInt32Ty(m_pModule->getContext());
8284

8385
llvm::IGCIRBuilder<> builder(M.getContext());
8486
m_builder = &builder;
8587

86-
int pointerSize = M.getDataLayout().getPointerSizeInBits();
87-
IGC_ASSERT(pointerSize == 64 || pointerSize == 32);
88-
89-
if (pointerSize == 64)
90-
{
91-
m_64bitPointer = true;
92-
}
93-
else
94-
{
95-
m_64bitPointer = false;
96-
}
97-
9888
m_changed = false;
9989

10090
// Visit all call instructions in the function F.
@@ -147,7 +137,10 @@ void ResolveOCLAtomics::processOCLAtomic(CallInst& callInst, AtomicOp op, Buffer
147137
callInst.getOperand(1);
148138

149139
const bool floatArgs = !noSources && src0->getType()->isFloatingPointTy();
150-
const bool is64bit = m_64bitPointer && bufType != SLM;
140+
141+
Value* dstBuffer = callInst.getOperand(0);
142+
PointerType* PtrTy = dyn_cast<PointerType>(dstBuffer->getType());
143+
const bool is64bit = PtrTy && isA64Ptr(PtrTy, m_CGCtx) && bufType != SLM;
151144

152145
// Cmpxchg intrinsic has 2 sources.
153146
if (op == EATOMIC_CMPXCHG ||
@@ -188,7 +181,6 @@ void ResolveOCLAtomics::processOCLAtomic(CallInst& callInst, AtomicOp op, Buffer
188181
}
189182
}
190183

191-
Value* dstBuffer = callInst.getOperand(0);
192184
Value* dst = callInst.getOperand(0);
193185

194186
// We will use 64-bit dst only for 64-bit global pointers.

IGC/Compiler/Optimizer/OpenCLPasses/Atomics/ResolveOCLAtomics.hpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ namespace IGC
5252
return "ResolveOCLAtomics";
5353
}
5454

55+
virtual void getAnalysisUsage(llvm::AnalysisUsage& AU) const override
56+
{
57+
AU.addRequired<CodeGenContextWrapper>();
58+
}
59+
5560
// Entry point of the pass.
5661
virtual bool runOnModule(llvm::Module& M) override;
5762

@@ -61,10 +66,10 @@ namespace IGC
6166
static const unsigned int ATTR_BUFFER_TYPE_SHIFT = 8;
6267

6368
protected:
64-
IGCLLVM::Module* m_pModule;
65-
llvm::IGCIRBuilder<>* m_builder;
66-
llvm::IntegerType* m_Int32Ty;
67-
bool m_64bitPointer;
69+
CodeGenContext* m_CGCtx = nullptr;
70+
IGCLLVM::Module* m_pModule = nullptr;
71+
llvm::IGCIRBuilder<>* m_builder = nullptr;
72+
llvm::IntegerType* m_Int32Ty = nullptr;
6873

6974
// A map that keeps attributes for each "__builtin_IB_atomic_*" function name.
7075
std::map<llvm::StringRef, OCLAtomicAttrs> m_AtomicDescMap;

0 commit comments

Comments
 (0)