[llvm] r369785 - [Attributor] Manifest constant return values
Johannes Doerfert via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 23 10:41:38 PDT 2019
Author: jdoerfert
Date: Fri Aug 23 10:41:37 2019
New Revision: 369785
URL: http://llvm.org/viewvc/llvm-project?rev=369785&view=rev
Log:
[Attributor] Manifest constant return values
Summary:
If the unique return value is a constant we now replace call uses with
that constant.
Reviewers: sstefan1, uenoku
Subscribers: hiraditya, bollu, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D66551
Modified:
llvm/trunk/lib/Transforms/IPO/Attributor.cpp
llvm/trunk/test/Transforms/FunctionAttrs/nounwind.ll
Modified: llvm/trunk/lib/Transforms/IPO/Attributor.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/Attributor.cpp?rev=369785&r1=369784&r2=369785&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/IPO/Attributor.cpp (original)
+++ llvm/trunk/lib/Transforms/IPO/Attributor.cpp Fri Aug 23 10:41:37 2019
@@ -807,10 +807,34 @@ ChangeStatus AAReturnedValuesImpl::manif
STATS_DECLTRACK(UniqueReturnValue, FunctionReturn,
"Number of function with unique return");
+ // Callback to replace the uses of CB with the constant C.
+ auto ReplaceCallSiteUsersWith = [](CallBase &CB, Constant &C) {
+ if (CB.getNumUses() == 0)
+ return ChangeStatus::UNCHANGED;
+ CB.replaceAllUsesWith(&C);
+ return ChangeStatus::CHANGED;
+ };
+
// If the assumed unique return value is an argument, annotate it.
if (auto *UniqueRVArg = dyn_cast<Argument>(UniqueRV.getValue())) {
getIRPosition() = IRPosition::argument(*UniqueRVArg);
- Changed = IRAttribute::manifest(A) | Changed;
+ Changed = IRAttribute::manifest(A);
+ } else if (auto *RVC = dyn_cast<Constant>(UniqueRV.getValue())) {
+ // We can replace the returned value with the unique returned constant.
+ Value &AnchorValue = getAnchorValue();
+ 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;
+ } else {
+ assert(isa<CallBase>(AnchorValue) &&
+ "Expcected a function or call base anchor!");
+ Changed = ReplaceCallSiteUsersWith(cast<CallBase>(AnchorValue), *RVC);
+ }
+ if (Changed == ChangeStatus::CHANGED)
+ STATS_DECLTRACK(UniqueConstantReturnValue, FunctionReturn,
+ "Number of function returns replaced by constant return");
}
return Changed;
Modified: llvm/trunk/test/Transforms/FunctionAttrs/nounwind.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/FunctionAttrs/nounwind.ll?rev=369785&r1=369784&r2=369785&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/FunctionAttrs/nounwind.ll (original)
+++ llvm/trunk/test/Transforms/FunctionAttrs/nounwind.ll Fri Aug 23 10:41:37 2019
@@ -92,6 +92,15 @@ define i32 @catch_thing() personality i8
ret i32 -1
}
+define i32 @catch_thing_user() {
+; ATTRIBUTOR: define i32 @catch_thing_user
+; ATTRIBUTOR-NEXT: %catch_thing_call = call
+; ATTRIBUTOR-NEXT: ret i32 -1
+ %catch_thing_call = call i32 @catch_thing()
+ ret i32 %catch_thing_call
+}
+
+
declare i32 @__gxx_personality_v0(...)
declare i8* @__cxa_begin_catch(i8*)
More information about the llvm-commits
mailing list