Skip to content

Commit 1b9e2ba

Browse files
committed
[AMDGPU] Enable OpenCL printf expansion at clang CodeGen
1 parent 62b5f5a commit 1b9e2ba

File tree

3 files changed

+31
-7
lines changed

3 files changed

+31
-7
lines changed

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5727,7 +5727,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
57275727
return EmitOpenMPDevicePrintfCallExpr(E);
57285728
if (getTarget().getTriple().isNVPTX())
57295729
return EmitNVPTXDevicePrintfCallExpr(E);
5730-
if (getTarget().getTriple().isAMDGCN() && getLangOpts().HIP)
5730+
if (getTarget().getTriple().isAMDGCN() &&
5731+
(getLangOpts().HIP || getLangOpts().OpenCL))
57315732
return EmitAMDGPUDevicePrintfCallExpr(E);
57325733
}
57335734

clang/lib/CodeGen/CGGPUBuiltin.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
#include "CodeGenFunction.h"
1515
#include "clang/Basic/Builtins.h"
16+
#include "clang/Basic/TargetBuiltins.h"
1617
#include "llvm/IR/DataLayout.h"
1718
#include "llvm/IR/Instruction.h"
1819
#include "llvm/Support/MathExtras.h"
@@ -178,17 +179,29 @@ RValue CodeGenFunction::EmitNVPTXDevicePrintfCallExpr(const CallExpr *E) {
178179
E, this, GetVprintfDeclaration(CGM.getModule()), false);
179180
}
180181

182+
// Deterimines if an argument is a string
183+
static bool isString(const clang::Type *argXTy) {
184+
if ((argXTy->isPointerType() || argXTy->isConstantArrayType()) &&
185+
argXTy->getPointeeOrArrayElementType()->isCharType())
186+
return true;
187+
else
188+
return false;
189+
}
190+
181191
RValue CodeGenFunction::EmitAMDGPUDevicePrintfCallExpr(const CallExpr *E) {
182192
assert(getTarget().getTriple().getArch() == llvm::Triple::amdgcn);
183193
assert(E->getBuiltinCallee() == Builtin::BIprintf ||
184-
E->getBuiltinCallee() == Builtin::BI__builtin_printf);
194+
E->getBuiltinCallee() == Builtin::BI__builtin_printf ||
195+
E->getBuiltinCallee() == AMDGPU::BIprintf);
185196
assert(E->getNumArgs() >= 1); // printf always has at least one arg.
186197

187198
CallArgList CallArgs;
188199
EmitCallArgs(CallArgs,
189200
E->getDirectCallee()->getType()->getAs<FunctionProtoType>(),
190201
E->arguments(), E->getDirectCallee(),
191202
/* ParamsToSkip = */ 0);
203+
llvm::IRBuilder<> IRB(Builder.GetInsertBlock(), Builder.GetInsertPoint());
204+
IRB.SetCurrentDebugLocation(Builder.getCurrentDebugLocation());
192205

193206
SmallVector<llvm::Value *, 8> Args;
194207
for (const auto &A : CallArgs) {
@@ -199,14 +212,14 @@ RValue CodeGenFunction::EmitAMDGPUDevicePrintfCallExpr(const CallExpr *E) {
199212
}
200213

201214
llvm::Value *Arg = A.getRValue(*this).getScalarVal();
215+
if (isString(A.getType().getTypePtr()) && CGM.getLangOpts().OpenCL)
216+
Arg = Builder.CreateAddrSpaceCast(Arg, CGM.Int8PtrTy);
202217
Args.push_back(Arg);
203218
}
204219

205-
llvm::IRBuilder<> IRB(Builder.GetInsertBlock(), Builder.GetInsertPoint());
206-
IRB.SetCurrentDebugLocation(Builder.getCurrentDebugLocation());
207-
208-
bool isBuffered = (CGM.getTarget().getTargetOpts().AMDGPUPrintfKindVal ==
209-
clang::TargetOptions::AMDGPUPrintfKind::Buffered);
220+
auto PFK = CGM.getTarget().getTargetOpts().AMDGPUPrintfKindVal;
221+
bool isBuffered =
222+
(PFK == clang::TargetOptions::AMDGPUPrintfKind::Buffered);
210223
auto Printf = llvm::emitAMDGPUPrintfCall(IRB, Args, isBuffered);
211224
Builder.SetInsertPoint(IRB.GetInsertBlock(), IRB.GetInsertPoint());
212225
return RValue::get(Printf);

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4757,6 +4757,16 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
47574757
Args.ClaimAllArgs(options::OPT_gen_cdb_fragment_path);
47584758
}
47594759

4760+
if (TC.getTriple().isAMDGPU() && types::isOpenCL(Input.getType())) {
4761+
if (Args.getLastArg(options::OPT_mprintf_kind_EQ)) {
4762+
CmdArgs.push_back(Args.MakeArgString(
4763+
"-mprintf-kind=" +
4764+
Args.getLastArgValue(options::OPT_mprintf_kind_EQ)));
4765+
// Force compiler error on invalid conversion specifiers
4766+
CmdArgs.push_back(Args.MakeArgString("-Werror=format-invalid-specifier"));
4767+
}
4768+
}
4769+
47604770
if (IsCuda || IsHIP) {
47614771
// We have to pass the triple of the host if compiling for a CUDA/HIP device
47624772
// and vice-versa.

0 commit comments

Comments
 (0)