summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2012-11-30 23:46:56 +0000
committerBill Wendling <isanbard@gmail.com>2012-11-30 23:46:56 +0000
commit0517508c005df2c8682312744214ea8f65a2d226 (patch)
tree3b8ea0521976b8db02daafe30febf9327f3c629c
parent47238dc057beb24f4c0d1fc25db954a7ee3861ca (diff)
downloadbcm5719-llvm-0517508c005df2c8682312744214ea8f65a2d226.tar.gz
bcm5719-llvm-0517508c005df2c8682312744214ea8f65a2d226.zip
Don't emit a warning with an input/output parameter. We assume the user knows what they're doing here.
llvm-svn: 169059
-rw-r--r--clang/lib/Basic/Targets.cpp4
-rw-r--r--clang/test/CodeGen/arm-asm-warn.c4
2 files changed, 7 insertions, 1 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 3c076ca4f03..6a30ca84764 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -3365,6 +3365,7 @@ public:
const char Modifier,
unsigned Size) const {
bool isOutput = (Constraint[0] == '=');
+ bool isInOut = (Constraint[0] == '+');
// Strip off constraint modifiers.
while (Constraint[0] == '=' ||
@@ -3377,7 +3378,8 @@ public:
case 'r': {
switch (Modifier) {
default:
- return (isOutput && Size >= 32) || Size <= 32;
+ return isInOut || (isOutput && Size >= 32) ||
+ (!isOutput && !isInOut && Size <= 32);
case 'q':
// A register of size 32 cannot fit a vector type.
return false;
diff --git a/clang/test/CodeGen/arm-asm-warn.c b/clang/test/CodeGen/arm-asm-warn.c
index 38d5345cbdc..9b52dd695a5 100644
--- a/clang/test/CodeGen/arm-asm-warn.c
+++ b/clang/test/CodeGen/arm-asm-warn.c
@@ -8,6 +8,10 @@ void t1(int x, char y) {
"mrc p15, 0, %0, c9, c13, 2;"
: "=r" (x)
: "r" (bar())); // no warning
+ __asm__ volatile("foo %0, %1"
+ : "+r" (x),
+ "+r" (y)
+ :);
}
// <rdar://problem/12284092>
OpenPOWER on IntegriCloud