r232747 - Ignore device-side asm constraint errors while compiling CUDA code for host and vice versa.
Artem Belevich
tra at google.com
Thu Mar 19 11:40:25 PDT 2015
Author: tra
Date: Thu Mar 19 13:40:25 2015
New Revision: 232747
URL: http://llvm.org/viewvc/llvm-project?rev=232747&view=rev
Log:
Ignore device-side asm constraint errors while compiling CUDA code for host and vice versa.
Differential Revision: http://reviews.llvm.org/D8392
Added:
cfe/trunk/test/SemaCUDA/asm-constraints-device.cu
cfe/trunk/test/SemaCUDA/asm-constraints-mixed.cu
Modified:
cfe/trunk/lib/Sema/SemaStmtAsm.cpp
Modified: cfe/trunk/lib/Sema/SemaStmtAsm.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmtAsm.cpp?rev=232747&r1=232746&r2=232747&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaStmtAsm.cpp (original)
+++ cfe/trunk/lib/Sema/SemaStmtAsm.cpp Thu Mar 19 13:40:25 2015
@@ -124,6 +124,17 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceL
// The parser verifies that there is a string literal here.
assert(AsmString->isAscii());
+ bool ValidateConstraints = true;
+ if (getLangOpts().CUDA) {
+ // In CUDA mode don't verify asm constraints in device functions during host
+ // compilation and vice versa.
+ bool InDeviceMode = getLangOpts().CUDAIsDevice;
+ FunctionDecl *FD = getCurFunctionDecl();
+ bool IsDeviceFunction =
+ FD && (FD->hasAttr<CUDADeviceAttr>() || FD->hasAttr<CUDAGlobalAttr>());
+ ValidateConstraints = IsDeviceFunction == InDeviceMode;
+ }
+
for (unsigned i = 0; i != NumOutputs; i++) {
StringLiteral *Literal = Constraints[i];
assert(Literal->isAscii());
@@ -133,7 +144,8 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceL
OutputName = Names[i]->getName();
TargetInfo::ConstraintInfo Info(Literal->getString(), OutputName);
- if (!Context.getTargetInfo().validateOutputConstraint(Info))
+ if (ValidateConstraints &&
+ !Context.getTargetInfo().validateOutputConstraint(Info))
return StmtError(Diag(Literal->getLocStart(),
diag::err_asm_invalid_output_constraint)
<< Info.getConstraintStr());
@@ -207,8 +219,9 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceL
InputName = Names[i]->getName();
TargetInfo::ConstraintInfo Info(Literal->getString(), InputName);
- if (!Context.getTargetInfo().validateInputConstraint(OutputConstraintInfos.data(),
- NumOutputs, Info)) {
+ if (ValidateConstraints &&
+ !Context.getTargetInfo().validateInputConstraint(
+ OutputConstraintInfos.data(), NumOutputs, Info)) {
return StmtError(Diag(Literal->getLocStart(),
diag::err_asm_invalid_input_constraint)
<< Info.getConstraintStr());
Added: cfe/trunk/test/SemaCUDA/asm-constraints-device.cu
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCUDA/asm-constraints-device.cu?rev=232747&view=auto
==============================================================================
--- cfe/trunk/test/SemaCUDA/asm-constraints-device.cu (added)
+++ cfe/trunk/test/SemaCUDA/asm-constraints-device.cu Thu Mar 19 13:40:25 2015
@@ -0,0 +1,24 @@
+// Verify that we do check for constraints in device-side inline
+// assembly. Passing an illegal input/output constraint and look
+// for corresponding error
+// RUN: %clang_cc1 -triple nvptx-unknown-cuda -fsyntax-only -fcuda-is-device -verify %s
+
+__attribute__((device)) void df() {
+ short h;
+ int a;
+ // asm with PTX constraints. Some of them are PTX-specific.
+ __asm__("output constraints"
+ : "=h"(h), // .u16 reg, OK
+ "=a"(a) // expected-error {{invalid output constraint '=a' in asm}}
+ : // None
+ );
+ __asm__("input constraints"
+ : // None
+ : "f"(0.0), // .f32 reg, OK
+ "d"(0.0), // .f64 reg, OK
+ "h"(0), // .u16 reg, OK
+ "r"(0), // .u32 reg, OK
+ "l"(0), // .u64 reg, OK
+ "a"(0) // expected-error {{invalid input constraint 'a' in asm}}
+ );
+}
Added: cfe/trunk/test/SemaCUDA/asm-constraints-mixed.cu
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCUDA/asm-constraints-mixed.cu?rev=232747&view=auto
==============================================================================
--- cfe/trunk/test/SemaCUDA/asm-constraints-mixed.cu (added)
+++ cfe/trunk/test/SemaCUDA/asm-constraints-mixed.cu Thu Mar 19 13:40:25 2015
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 -triple nvptx-unknown-cuda -fsyntax-only -fcuda-is-device -verify %s
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsyntax-only -verify %s
+// expected-no-diagnostics
+
+__attribute__((device)) void df() {
+ short h;
+ // asm with PTX constraints. Some of them are PTX-specific.
+ __asm__("dont care" : "=h"(h): "f"(0.0), "d"(0.0), "h"(0), "r"(0), "l"(0));
+}
+
+void hf() {
+ int a;
+ // Asm with x86 constraints that are not supported by PTX.
+ __asm__("dont care" : "=a"(a): "a"(0), "b"(0), "c"(0));
+}
More information about the cfe-commits
mailing list