[llvm] r296948 - WholeProgramDevirt: Implement exporting for uniform ret val opt.
Peter Collingbourne via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 3 17:34:54 PST 2017
Author: pcc
Date: Fri Mar 3 19:34:53 2017
New Revision: 296948
URL: http://llvm.org/viewvc/llvm-project?rev=296948&view=rev
Log:
WholeProgramDevirt: Implement exporting for uniform ret val opt.
Differential Revision: https://reviews.llvm.org/D29846
Added:
llvm/trunk/test/Transforms/WholeProgramDevirt/export-uniform-ret-val.ll
Modified:
llvm/trunk/lib/Transforms/IPO/WholeProgramDevirt.cpp
Modified: llvm/trunk/lib/Transforms/IPO/WholeProgramDevirt.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/WholeProgramDevirt.cpp?rev=296948&r1=296947&r2=296948&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/IPO/WholeProgramDevirt.cpp (original)
+++ llvm/trunk/lib/Transforms/IPO/WholeProgramDevirt.cpp Fri Mar 3 19:34:53 2017
@@ -428,7 +428,8 @@ struct DevirtModule {
void applyUniformRetValOpt(CallSiteInfo &CSInfo, StringRef FnName,
uint64_t TheRetVal);
bool tryUniformRetValOpt(MutableArrayRef<VirtualCallTarget> TargetsForSlot,
- CallSiteInfo &CSInfo);
+ CallSiteInfo &CSInfo,
+ WholeProgramDevirtResolution::ByArg *Res);
void applyUniqueRetValOpt(CallSiteInfo &CSInfo, StringRef FnName, bool IsOne,
Constant *UniqueMemberAddr);
@@ -439,7 +440,8 @@ struct DevirtModule {
void applyVirtualConstProp(CallSiteInfo &CSInfo, StringRef FnName,
Constant *Byte, Constant *Bit);
bool tryVirtualConstProp(MutableArrayRef<VirtualCallTarget> TargetsForSlot,
- VTableSlotInfo &SlotInfo);
+ VTableSlotInfo &SlotInfo,
+ WholeProgramDevirtResolution *Res);
void rebuildGlobal(VTableBits &B);
@@ -727,10 +729,12 @@ void DevirtModule::applyUniformRetValOpt
Call.replaceAndErase(
"uniform-ret-val", FnName, RemarksEnabled,
ConstantInt::get(cast<IntegerType>(Call.CS.getType()), TheRetVal));
+ CSInfo.TypeCheckedLoadUsers.clear();
}
bool DevirtModule::tryUniformRetValOpt(
- MutableArrayRef<VirtualCallTarget> TargetsForSlot, CallSiteInfo &CSInfo) {
+ MutableArrayRef<VirtualCallTarget> TargetsForSlot, CallSiteInfo &CSInfo,
+ WholeProgramDevirtResolution::ByArg *Res) {
// Uniform return value optimization. If all functions return the same
// constant, replace all calls with that constant.
uint64_t TheRetVal = TargetsForSlot[0].RetVal;
@@ -738,6 +742,11 @@ bool DevirtModule::tryUniformRetValOpt(
if (Target.RetVal != TheRetVal)
return false;
+ if (CSInfo.isExported()) {
+ Res->TheKind = WholeProgramDevirtResolution::ByArg::UniformRetVal;
+ Res->Info = TheRetVal;
+ }
+
applyUniformRetValOpt(CSInfo, TargetsForSlot[0].Fn->getName(), TheRetVal);
if (RemarksEnabled)
for (auto &&Target : TargetsForSlot)
@@ -824,7 +833,7 @@ void DevirtModule::applyVirtualConstProp
bool DevirtModule::tryVirtualConstProp(
MutableArrayRef<VirtualCallTarget> TargetsForSlot,
- VTableSlotInfo &SlotInfo) {
+ VTableSlotInfo &SlotInfo, WholeProgramDevirtResolution *Res) {
// This only works if the function returns an integer.
auto RetType = dyn_cast<IntegerType>(TargetsForSlot[0].Fn->getReturnType());
if (!RetType)
@@ -856,7 +865,11 @@ bool DevirtModule::tryVirtualConstProp(
if (!tryEvaluateFunctionsWithArgs(TargetsForSlot, CSByConstantArg.first))
continue;
- if (tryUniformRetValOpt(TargetsForSlot, CSByConstantArg.second))
+ WholeProgramDevirtResolution::ByArg *ResByArg = nullptr;
+ if (Res)
+ ResByArg = &Res->ResByArg[CSByConstantArg.first];
+
+ if (tryUniformRetValOpt(TargetsForSlot, CSByConstantArg.second, ResByArg))
continue;
if (tryUniqueRetValOpt(BitWidth, TargetsForSlot, CSByConstantArg.second))
@@ -1175,7 +1188,7 @@ bool DevirtModule::run() {
.WPDRes[S.first.ByteOffset];
if (!trySingleImplDevirt(TargetsForSlot, S.second, Res) &&
- tryVirtualConstProp(TargetsForSlot, S.second))
+ tryVirtualConstProp(TargetsForSlot, S.second, Res))
DidVirtualConstProp = true;
// Collect functions devirtualized at least for one call site for stats.
Added: llvm/trunk/test/Transforms/WholeProgramDevirt/export-uniform-ret-val.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/WholeProgramDevirt/export-uniform-ret-val.ll?rev=296948&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/WholeProgramDevirt/export-uniform-ret-val.ll (added)
+++ llvm/trunk/test/Transforms/WholeProgramDevirt/export-uniform-ret-val.ll Fri Mar 3 19:34:53 2017
@@ -0,0 +1,36 @@
+; RUN: opt -wholeprogramdevirt -wholeprogramdevirt-summary-action=export -wholeprogramdevirt-read-summary=%S/Inputs/export.yaml -wholeprogramdevirt-write-summary=%t -S -o - %s | FileCheck %s
+; RUN: FileCheck --check-prefix=SUMMARY %s < %t
+
+; SUMMARY: - TypeTests:
+; SUMMARY-NEXT: TypeTestAssumeVCalls:
+
+; SUMMARY: TypeIdMap:
+; SUMMARY-NEXT: typeid4:
+; SUMMARY-NEXT: TTRes:
+; SUMMARY-NEXT: Kind: Unsat
+; SUMMARY-NEXT: SizeM1BitWidth: 0
+; SUMMARY-NEXT: WPDRes:
+; SUMMARY-NEXT: 0:
+; SUMMARY-NEXT: Kind: Indir
+; SUMMARY-NEXT: SingleImplName: ''
+; SUMMARY-NEXT: ResByArg:
+; SUMMARY-NEXT: 24,12:
+; SUMMARY-NEXT: Kind: UniformRetVal
+; SUMMARY-NEXT: Info: 36
+
+; CHECK: @vt4a = constant i32 (i8*, i32, i32)* @vf4a
+ at vt4a = constant i32 (i8*, i32, i32)* @vf4a, !type !0
+
+; CHECK: @vt4b = constant i32 (i8*, i32, i32)* @vf4b
+ at vt4b = constant i32 (i8*, i32, i32)* @vf4b, !type !0
+
+define i32 @vf4a(i8*, i32 %x, i32 %y) {
+ %z = add i32 %x, %y
+ ret i32 %z
+}
+
+define i32 @vf4b(i8*, i32 %x, i32 %y) {
+ ret i32 36
+}
+
+!0 = !{i32 0, !"typeid4"}
More information about the llvm-commits
mailing list