From: Eli Friedman Date: Thu, 15 Mar 2012 23:12:51 +0000 (+0000) Subject: When a variable has a specified asm name, but isn't using the register storage class... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a43ef3e0511dc48d98d61598163c9deddc09cb9c;p=clang When a variable has a specified asm name, but isn't using the register storage class, the asm name doesn't specify a register. PR12244. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152873 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index b2da32bb52..e65c5f468f 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/lib/CodeGen/CGStmt.cpp @@ -1295,6 +1295,8 @@ AddVariableConstraints(const std::string &Constraint, const Expr &AsmExpr, const VarDecl *Variable = dyn_cast(&Value); if (!Variable) return Constraint; + if (Variable->getStorageClass() != SC_Register) + return Constraint; AsmLabelAttr *Attr = Variable->getAttr(); if (!Attr) return Constraint; diff --git a/test/CodeGen/asm-variable.c b/test/CodeGen/asm-variable.c index a37132d16c..dc087bd9e2 100644 --- a/test/CodeGen/asm-variable.c +++ b/test/CodeGen/asm-variable.c @@ -57,3 +57,9 @@ unsigned long long foo2(unsigned long long addr, double a0, } // CHECK: call i64 asm "call *$1", "={rax},r,{xmm0},{xmm1},{xmm2},{xmm3},{xmm4},{xmm5},{xmm6},{xmm7},~{dirflag},~{fpsr},~{flags} + +int randomvar asm("randomvar"); +void foo3() { + asm("vartest %0" : : "r"(randomvar)); +} +// CHECK: call void asm sideeffect "vartest $0", "r,~{dirflag},~{fpsr},~{flags}"