forked from OSchip/llvm-project
Fix dynamic alloca detection in CloneBasicBlock
Summary: Simply check AI->isStaticAlloca instead of reimplementing checks for static/dynamic allocas. Reviewers: efriedma Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D82328
This commit is contained in:
parent
516803dc86
commit
d335c1317b
|
@ -46,7 +46,7 @@ BasicBlock *llvm::CloneBasicBlock(const BasicBlock *BB, ValueToValueMapTy &VMap,
|
||||||
if (BB->hasName())
|
if (BB->hasName())
|
||||||
NewBB->setName(BB->getName() + NameSuffix);
|
NewBB->setName(BB->getName() + NameSuffix);
|
||||||
|
|
||||||
bool hasCalls = false, hasDynamicAllocas = false, hasStaticAllocas = false;
|
bool hasCalls = false, hasDynamicAllocas = false;
|
||||||
Module *TheModule = F ? F->getParent() : nullptr;
|
Module *TheModule = F ? F->getParent() : nullptr;
|
||||||
|
|
||||||
// Loop over all instructions, and copy them over.
|
// Loop over all instructions, and copy them over.
|
||||||
|
@ -62,18 +62,15 @@ BasicBlock *llvm::CloneBasicBlock(const BasicBlock *BB, ValueToValueMapTy &VMap,
|
||||||
|
|
||||||
hasCalls |= (isa<CallInst>(I) && !isa<DbgInfoIntrinsic>(I));
|
hasCalls |= (isa<CallInst>(I) && !isa<DbgInfoIntrinsic>(I));
|
||||||
if (const AllocaInst *AI = dyn_cast<AllocaInst>(&I)) {
|
if (const AllocaInst *AI = dyn_cast<AllocaInst>(&I)) {
|
||||||
if (isa<ConstantInt>(AI->getArraySize()))
|
if (!AI->isStaticAlloca()) {
|
||||||
hasStaticAllocas = true;
|
|
||||||
else
|
|
||||||
hasDynamicAllocas = true;
|
hasDynamicAllocas = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CodeInfo) {
|
if (CodeInfo) {
|
||||||
CodeInfo->ContainsCalls |= hasCalls;
|
CodeInfo->ContainsCalls |= hasCalls;
|
||||||
CodeInfo->ContainsDynamicAllocas |= hasDynamicAllocas;
|
CodeInfo->ContainsDynamicAllocas |= hasDynamicAllocas;
|
||||||
CodeInfo->ContainsDynamicAllocas |= hasStaticAllocas &&
|
|
||||||
BB != &BB->getParent()->getEntryBlock();
|
|
||||||
}
|
}
|
||||||
return NewBB;
|
return NewBB;
|
||||||
}
|
}
|
||||||
|
|
|
@ -659,6 +659,65 @@ static int GetDICompileUnitCount(const Module& M) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(CloneFunction, CloneEmptyFunction) {
|
||||||
|
StringRef ImplAssembly = R"(
|
||||||
|
define void @foo() {
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
declare void @bar()
|
||||||
|
)";
|
||||||
|
|
||||||
|
LLVMContext Context;
|
||||||
|
SMDiagnostic Error;
|
||||||
|
|
||||||
|
auto ImplModule = parseAssemblyString(ImplAssembly, Error, Context);
|
||||||
|
EXPECT_TRUE(ImplModule != nullptr);
|
||||||
|
auto *ImplFunction = ImplModule->getFunction("foo");
|
||||||
|
EXPECT_TRUE(ImplFunction != nullptr);
|
||||||
|
auto *DeclFunction = ImplModule->getFunction("bar");
|
||||||
|
EXPECT_TRUE(DeclFunction != nullptr);
|
||||||
|
|
||||||
|
ValueToValueMapTy VMap;
|
||||||
|
SmallVector<ReturnInst *, 8> Returns;
|
||||||
|
ClonedCodeInfo CCI;
|
||||||
|
CloneFunctionInto(DeclFunction, ImplFunction, VMap, true, Returns, "", &CCI);
|
||||||
|
|
||||||
|
EXPECT_FALSE(verifyModule(*ImplModule, &errs()));
|
||||||
|
EXPECT_FALSE(CCI.ContainsCalls);
|
||||||
|
EXPECT_FALSE(CCI.ContainsDynamicAllocas);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(CloneFunction, CloneFunctionWithInalloca) {
|
||||||
|
StringRef ImplAssembly = R"(
|
||||||
|
declare void @a(i32* inalloca)
|
||||||
|
define void @foo() {
|
||||||
|
%a = alloca inalloca i32
|
||||||
|
call void @a(i32* inalloca %a)
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
declare void @bar()
|
||||||
|
)";
|
||||||
|
|
||||||
|
LLVMContext Context;
|
||||||
|
SMDiagnostic Error;
|
||||||
|
|
||||||
|
auto ImplModule = parseAssemblyString(ImplAssembly, Error, Context);
|
||||||
|
EXPECT_TRUE(ImplModule != nullptr);
|
||||||
|
auto *ImplFunction = ImplModule->getFunction("foo");
|
||||||
|
EXPECT_TRUE(ImplFunction != nullptr);
|
||||||
|
auto *DeclFunction = ImplModule->getFunction("bar");
|
||||||
|
EXPECT_TRUE(DeclFunction != nullptr);
|
||||||
|
|
||||||
|
ValueToValueMapTy VMap;
|
||||||
|
SmallVector<ReturnInst *, 8> Returns;
|
||||||
|
ClonedCodeInfo CCI;
|
||||||
|
CloneFunctionInto(DeclFunction, ImplFunction, VMap, true, Returns, "", &CCI);
|
||||||
|
|
||||||
|
EXPECT_FALSE(verifyModule(*ImplModule, &errs()));
|
||||||
|
EXPECT_TRUE(CCI.ContainsCalls);
|
||||||
|
EXPECT_TRUE(CCI.ContainsDynamicAllocas);
|
||||||
|
}
|
||||||
|
|
||||||
TEST(CloneFunction, CloneFunctionToDifferentModule) {
|
TEST(CloneFunction, CloneFunctionToDifferentModule) {
|
||||||
StringRef ImplAssembly = R"(
|
StringRef ImplAssembly = R"(
|
||||||
define void @foo() {
|
define void @foo() {
|
||||||
|
|
Loading…
Reference in New Issue