diff options
| author | Davide Italiano <davide@freebsd.org> | 2017-02-04 19:44:14 +0000 |
|---|---|---|
| committer | Davide Italiano <davide@freebsd.org> | 2017-02-04 19:44:14 +0000 |
| commit | ec49313b113bb1086ab250e4d83be250ee010ea0 (patch) | |
| tree | 7bec1895018b1262f271bd80d018f2e6d7133a9a /llvm/lib/Transforms/IPO | |
| parent | d29bcbbb3bdfbe5f7fb00aa99f4be435c9400712 (diff) | |
| download | bcm5719-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.cpp | 8 |
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()); |

