1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

Use WeakVH to keep track of calls with operand bundles in CloneCodeInfo

`CloneAndPruneIntoFromInst` can DCE instructions after cloning them into
the new function, and so an AssertingVH is too strong.  This change
switches CloneCodeInfo to use a std::vector<WeakVH>.

llvm-svn: 255148
This commit is contained in:
Sanjoy Das 2015-12-09 20:33:52 +00:00
parent f1615f5295
commit f3ba629c4d
3 changed files with 37 additions and 3 deletions

View File

@ -75,8 +75,9 @@ struct ClonedCodeInfo {
bool ContainsDynamicAllocas;
/// All cloned call sites that have operand bundles attached are appended to
/// this vector.
std::vector<AssertingVH<Instruction>> OperandBundleCallSites;
/// this vector. This vector may contain nulls if some of the originally
/// inserted callsites were DCE'ed after they were cloned.
std::vector<WeakVH> OperandBundleCallSites;
ClonedCodeInfo() : ContainsCalls(false), ContainsDynamicAllocas(false) {}
};

View File

@ -1162,7 +1162,9 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI,
SmallVector<OperandBundleDef, 2> OpDefs;
for (auto &VH : InlinedFunctionInfo.OperandBundleCallSites) {
Instruction *I = VH;
if (!VH) continue; // instruction was DCE'd after being cloned
Instruction *I = cast<Instruction>(VH);
OpDefs.clear();

View File

@ -131,6 +131,37 @@ define i32 @caller_6() {
ret i32 %x
}
define i32 @callee_7(i1 %val) alwaysinline personality i8 3 {
; We want something that PruningFunctionCloner is not smart enough to
; recognize, but can be recognized by recursivelySimplifyInstruction.
entry:
br i1 %val, label %check, label %precheck
precheck:
br label %check
check:
%p = phi i1 [ %val, %entry ], [ true, %precheck ]
br i1 %p, label %do.not, label %do
do.not:
ret i32 0
do:
%v = call fastcc i32 @g.fastcc() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ]
ret i32 %v
}
define i32 @caller_7() {
; CHECK-LABEL: @caller_7(
entry:
; CHECK-NOT: call fastcc i32 @g.fastcc() #[[FOO_BAR_ATTR_IDX]] [ "deopt"(i32 7, i32 0, i32 1), "foo"(double 0.000000e+00) ]
; CHECK: ret i32 0
%x = call i32 @callee_7(i1 true) [ "deopt"(i32 7) ]
ret i32 %x
}
attributes #0 = { "foo"="bar" }
; CHECK: attributes #[[FOO_BAR_ATTR_IDX]] = { "foo"="bar" }