From ac1263cd54ffaa50d692e1d99c34f16759126cae Mon Sep 17 00:00:00 2001 From: Yaxun Liu Date: Fri, 23 Mar 2018 19:43:42 +0000 Subject: [PATCH] [AMDGPU] Fix codegen for inline assembly Need to override convertConstraint to recognise amdgpu specific register names. Differential Revision: https://reviews.llvm.org/D44533 llvm-svn: 328359 --- clang/lib/Basic/Targets/AMDGPU.h | 13 +++++++++++++ clang/lib/CodeGen/CGStmt.cpp | 2 +- clang/test/CodeGenOpenCL/inline-asm-amdgcn.cl | 8 ++++++++ clang/test/Sema/inline-asm-validate-amdgpu.cl | 5 +++++ 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 clang/test/CodeGenOpenCL/inline-asm-amdgcn.cl diff --git a/clang/lib/Basic/Targets/AMDGPU.h b/clang/lib/Basic/Targets/AMDGPU.h index 603c9b2..f7c4776 100644 --- a/clang/lib/Basic/Targets/AMDGPU.h +++ b/clang/lib/Basic/Targets/AMDGPU.h @@ -285,6 +285,19 @@ public: return true; } + // \p Constraint will be left pointing at the last character of + // the constraint. In practice, it won't be changed unless the + // constraint is longer than one character. + std::string convertConstraint(const char *&Constraint) const override { + const char *Begin = Constraint; + TargetInfo::ConstraintInfo Info("", ""); + if (validateAsmConstraint(Constraint, Info)) + return std::string(Begin).substr(0, Constraint - Begin + 1); + + Constraint = Begin; + return std::string(1, *Constraint); + } + bool initFeatureMap(llvm::StringMap &Features, DiagnosticsEngine &Diags, StringRef CPU, diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp index b1d1bf8..b89d9f0 100644 --- a/clang/lib/CodeGen/CGStmt.cpp +++ b/clang/lib/CodeGen/CGStmt.cpp @@ -1926,7 +1926,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) { // Simplify the output constraint. std::string OutputConstraint(S.getOutputConstraint(i)); OutputConstraint = SimplifyConstraint(OutputConstraint.c_str() + 1, - getTarget()); + getTarget(), &OutputConstraintInfos); const Expr *OutExpr = S.getOutputExpr(i); OutExpr = OutExpr->IgnoreParenNoopCasts(getContext()); diff --git a/clang/test/CodeGenOpenCL/inline-asm-amdgcn.cl b/clang/test/CodeGenOpenCL/inline-asm-amdgcn.cl new file mode 100644 index 0000000..ccd9821 --- /dev/null +++ b/clang/test/CodeGenOpenCL/inline-asm-amdgcn.cl @@ -0,0 +1,8 @@ +// REQUIRES: amdgpu-registered-target +// RUN: %clang_cc1 -emit-llvm -o - -triple amdgcn %s | FileCheck %s + +kernel void test_long(int arg0) { + long v15_16; + // CHECK: tail call i64 asm sideeffect "v_lshlrev_b64 v[15:16], 0, $0", "={v[15:16]},v"(i32 %arg0) + __asm volatile("v_lshlrev_b64 v[15:16], 0, %0" : "={v[15:16]}"(v15_16) : "v"(arg0)); +} diff --git a/clang/test/Sema/inline-asm-validate-amdgpu.cl b/clang/test/Sema/inline-asm-validate-amdgpu.cl index bc2580c..51009ec 100644 --- a/clang/test/Sema/inline-asm-validate-amdgpu.cl +++ b/clang/test/Sema/inline-asm-validate-amdgpu.cl @@ -74,3 +74,8 @@ test_double(const __global double *a, const __global double *b, __global double c[i] = ci; } + +void test_long(int arg0) { + long v15_16; + __asm volatile("v_lshlrev_b64 v[15:16], 0, %0" : "={v[15:16]}"(v15_16) : "v"(arg0)); +} -- 2.7.4