summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2013-06-05 03:00:09 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2013-06-05 03:00:09 +0000
commita3661146ea15bcdf71a1d962b3c301fb1167bad6 (patch)
treebdc7ac2d18cd29ffb7e28eadab48d026999735e6 /clang
parent811d259bb1535916d3ade11123fda22a664c2669 (diff)
downloadbcm5719-llvm-a3661146ea15bcdf71a1d962b3c301fb1167bad6.tar.gz
bcm5719-llvm-a3661146ea15bcdf71a1d962b3c301fb1167bad6.zip
Heed ABIArgInfo::getInReg() for return values.
The 'inreg' attribute can also be applied to function return values in LLVM IR. The SPARC v9 backend is using the flag when returning structs containing 32-bit floats. llvm-svn: 183290
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/CodeGen/CGCall.cpp5
-rw-r--r--clang/test/CodeGen/sparcv9-abi.c3
2 files changed, 5 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp
index 9a8edccdef0..3c079cd58bb 100644
--- a/clang/lib/CodeGen/CGCall.cpp
+++ b/clang/lib/CodeGen/CGCall.cpp
@@ -1054,8 +1054,11 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
RetAttrs.addAttribute(llvm::Attribute::SExt);
else if (RetTy->hasUnsignedIntegerRepresentation())
RetAttrs.addAttribute(llvm::Attribute::ZExt);
- break;
+ // FALL THROUGH
case ABIArgInfo::Direct:
+ if (RetAI.getInReg())
+ RetAttrs.addAttribute(llvm::Attribute::InReg);
+ break;
case ABIArgInfo::Ignore:
break;
diff --git a/clang/test/CodeGen/sparcv9-abi.c b/clang/test/CodeGen/sparcv9-abi.c
index 41b06dd01dc..b4c7d685498 100644
--- a/clang/test/CodeGen/sparcv9-abi.c
+++ b/clang/test/CodeGen/sparcv9-abi.c
@@ -73,8 +73,7 @@ struct mixed {
float b;
};
-// CHECK: @f_mixed(i32 inreg %x.coerce0, float inreg %x.coerce1)
-// FIXME: The return value should also be 'inreg'.
+// CHECK: define inreg %struct.mixed @f_mixed(i32 inreg %x.coerce0, float inreg %x.coerce1)
struct mixed f_mixed(struct mixed x) {
x.a += 1;
return x;
OpenPOWER on IntegriCloud