diff options
| author | Johannes Doerfert <jdoerfert@anl.gov> | 2019-09-14 02:57:50 +0000 |
|---|---|---|
| committer | Johannes Doerfert <jdoerfert@anl.gov> | 2019-09-14 02:57:50 +0000 |
| commit | e7c6f97039a4c9acee583af9d0e7aac94762d8ac (patch) | |
| tree | 6caf4b3890624c62ee75c44c8aa4c1daf8aa167a /llvm | |
| parent | 2f519d7072bf48a81985fadc2dc145296d612223 (diff) | |
| download | bcm5719-llvm-e7c6f97039a4c9acee583af9d0e7aac94762d8ac.tar.gz bcm5719-llvm-e7c6f97039a4c9acee583af9d0e7aac94762d8ac.zip | |
[Attributor][Fix] Use right type to replace expressions
Summary: This should be obsolete once the functionality in D66967 is integrated.
Reviewers: uenoku, sstefan1
Subscribers: hiraditya, bollu, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D67231
llvm-svn: 371915
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/IPO/Attributor.cpp | 11 | ||||
| -rw-r--r-- | llvm/test/Transforms/FunctionAttrs/arg_returned.ll | 11 |
2 files changed, 19 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp index 94ed7003c96..b9f943e4772 100644 --- a/llvm/lib/Transforms/IPO/Attributor.cpp +++ b/llvm/lib/Transforms/IPO/Attributor.cpp @@ -874,12 +874,17 @@ ChangeStatus AAReturnedValuesImpl::manifest(Attributor &A) { if (Function *F = dyn_cast<Function>(&AnchorValue)) { for (const Use &U : F->uses()) if (CallBase *CB = dyn_cast<CallBase>(U.getUser())) - if (CB->isCallee(&U)) - Changed = ReplaceCallSiteUsersWith(*CB, *RVC) | Changed; + if (CB->isCallee(&U)) { + Constant *RVCCast = + ConstantExpr::getTruncOrBitCast(RVC, CB->getType()); + Changed = ReplaceCallSiteUsersWith(*CB, *RVCCast) | Changed; + } } else { assert(isa<CallBase>(AnchorValue) && "Expcected a function or call base anchor!"); - Changed = ReplaceCallSiteUsersWith(cast<CallBase>(AnchorValue), *RVC); + Constant *RVCCast = + ConstantExpr::getTruncOrBitCast(RVC, AnchorValue.getType()); + Changed = ReplaceCallSiteUsersWith(cast<CallBase>(AnchorValue), *RVCCast); } if (Changed == ChangeStatus::CHANGED) STATS_DECLTRACK(UniqueConstantReturnValue, FunctionReturn, diff --git a/llvm/test/Transforms/FunctionAttrs/arg_returned.ll b/llvm/test/Transforms/FunctionAttrs/arg_returned.ll index 6e57475c579..95871ff7d34 100644 --- a/llvm/test/Transforms/FunctionAttrs/arg_returned.ll +++ b/llvm/test/Transforms/FunctionAttrs/arg_returned.ll @@ -827,6 +827,17 @@ define i32 @exact(i32* %a) { ret i32 %add3 } +@G = external global i8 +define i32* @ret_const() #0 { + %bc = bitcast i8* @G to i32* + ret i32* %bc +} +define i32* @use_const() #0 { + %c = call i32* @ret_const() + ; CHECK: ret i32* bitcast (i8* @G to i32*) + ret i32* %c +} + attributes #0 = { noinline nounwind uwtable } ; BOTH-NOT: attributes # |

