summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/IPO
diff options
context:
space:
mode:
authorDavide Italiano <davide@freebsd.org>2017-02-04 19:44:14 +0000
committerDavide Italiano <davide@freebsd.org>2017-02-04 19:44:14 +0000
commitec49313b113bb1086ab250e4d83be250ee010ea0 (patch)
tree7bec1895018b1262f271bd80d018f2e6d7133a9a /llvm/lib/Transforms/IPO
parentd29bcbbb3bdfbe5f7fb00aa99f4be435c9400712 (diff)
downloadbcm5719-llvm-ec49313b113bb1086ab250e4d83be250ee010ea0.tar.gz
bcm5719-llvm-ec49313b113bb1086ab250e4d83be250ee010ea0.zip
[IPCP] Don't propagate return value for naked functions.
This is pretty much the same change made in SCCP. llvm-svn: 294098
Diffstat (limited to 'llvm/lib/Transforms/IPO')
-rw-r--r--llvm/lib/Transforms/IPO/IPConstantPropagation.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/IPO/IPConstantPropagation.cpp b/llvm/lib/Transforms/IPO/IPConstantPropagation.cpp
index 916135e33cd..349807496dc 100644
--- a/llvm/lib/Transforms/IPO/IPConstantPropagation.cpp
+++ b/llvm/lib/Transforms/IPO/IPConstantPropagation.cpp
@@ -136,7 +136,13 @@ static bool PropagateConstantReturn(Function &F) {
// For more details, see GlobalValue::mayBeDerefined.
if (!F.isDefinitionExact())
return false;
-
+
+ // Don't touch naked functions. The may contain asm returning
+ // value we don't see, so we may end up interprocedurally propagating
+ // the return value incorrectly.
+ if (F.hasFnAttribute(Attribute::Naked))
+ return false;
+
// Check to see if this function returns a constant.
SmallVector<Value *,4> RetVals;
StructType *STy = dyn_cast<StructType>(F.getReturnType());
OpenPOWER on IntegriCloud