summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2012-03-15 23:12:51 +0000
committerEli Friedman <eli.friedman@gmail.com>2012-03-15 23:12:51 +0000
commit6f87b44fe378184316b9e7bfdd2316d3ce80eac7 (patch)
tree351cdd76e07f220ce85e891cac968b068ee412bc
parentdbe27e70a5ff2db4ace58d2631f4e23570a4423b (diff)
downloadbcm5719-llvm-6f87b44fe378184316b9e7bfdd2316d3ce80eac7.tar.gz
bcm5719-llvm-6f87b44fe378184316b9e7bfdd2316d3ce80eac7.zip
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.
llvm-svn: 152873
-rw-r--r--clang/lib/CodeGen/CGStmt.cpp2
-rw-r--r--clang/test/CodeGen/asm-variable.c6
2 files changed, 8 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp
index b2da32bb529..e65c5f468f5 100644
--- a/clang/lib/CodeGen/CGStmt.cpp
+++ b/clang/lib/CodeGen/CGStmt.cpp
@@ -1295,6 +1295,8 @@ AddVariableConstraints(const std::string &Constraint, const Expr &AsmExpr,
const VarDecl *Variable = dyn_cast<VarDecl>(&Value);
if (!Variable)
return Constraint;
+ if (Variable->getStorageClass() != SC_Register)
+ return Constraint;
AsmLabelAttr *Attr = Variable->getAttr<AsmLabelAttr>();
if (!Attr)
return Constraint;
diff --git a/clang/test/CodeGen/asm-variable.c b/clang/test/CodeGen/asm-variable.c
index a37132d16c2..dc087bd9e21 100644
--- a/clang/test/CodeGen/asm-variable.c
+++ b/clang/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}"
OpenPOWER on IntegriCloud