summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/Transforms/Utils/Cloning.cpp
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2015-11-05 22:03:56 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2015-11-05 22:03:56 +0000
commitd4bff30370db9f2cb13838897012768739cf1ee0 (patch)
treef6c80f666794291c78575617d326207f57939b61 /llvm/unittests/Transforms/Utils/Cloning.cpp
parent18da38edb315fe9e063348c4d785b26111b6d7ec (diff)
downloadbcm5719-llvm-d4bff30370db9f2cb13838897012768739cf1ee0.tar.gz
bcm5719-llvm-d4bff30370db9f2cb13838897012768739cf1ee0.zip
DI: Reverse direction of subprogram -> function edge.
Previously, subprograms contained a metadata reference to the function they described. Because most clients need to get or set a subprogram for a given function rather than the other way around, this created unneeded inefficiency. For example, many passes needed to call the function llvm::makeSubprogramMap() to build a mapping from functions to subprograms, and the IR linker needed to fix up function references in a way that caused quadratic complexity in the IR linking phase of LTO. This change reverses the direction of the edge by storing the subprogram as function-level metadata and removing DISubprogram's function field. Since this is an IR change, a bitcode upgrade has been provided. Fixes PR23367. An upgrade script for textual IR for out-of-tree clients is attached to the PR. Differential Revision: http://reviews.llvm.org/D14265 llvm-svn: 252219
Diffstat (limited to 'llvm/unittests/Transforms/Utils/Cloning.cpp')
-rw-r--r--llvm/unittests/Transforms/Utils/Cloning.cpp31
1 files changed, 14 insertions, 17 deletions
diff --git a/llvm/unittests/Transforms/Utils/Cloning.cpp b/llvm/unittests/Transforms/Utils/Cloning.cpp
index ab782ada292..e22573f886c 100644
--- a/llvm/unittests/Transforms/Utils/Cloning.cpp
+++ b/llvm/unittests/Transforms/Utils/Cloning.cpp
@@ -237,7 +237,8 @@ protected:
"/file/dir", "CloneFunc", false, "", 0);
auto *Subprogram = DBuilder.createFunction(
- CU, "f", "f", File, 4, FuncType, true, true, 3, 0, false, OldFunc);
+ CU, "f", "f", File, 4, FuncType, true, true, 3, 0, false);
+ OldFunc->setSubprogram(Subprogram);
// Function body
BasicBlock* Entry = BasicBlock::Create(C, "", OldFunc);
@@ -309,8 +310,8 @@ TEST_F(CloneFunc, Subprogram) {
auto *Sub2 = cast<DISubprogram>(*Iter);
EXPECT_TRUE(
- (Sub1->getFunction() == OldFunc && Sub2->getFunction() == NewFunc) ||
- (Sub1->getFunction() == NewFunc && Sub2->getFunction() == OldFunc));
+ (Sub1 == OldFunc->getSubprogram() && Sub2 == NewFunc->getSubprogram()) ||
+ (Sub1 == NewFunc->getSubprogram() && Sub2 == OldFunc->getSubprogram()));
}
// Test that the new subprogram entry was not added to the CU which doesn't
@@ -354,8 +355,8 @@ TEST_F(CloneFunc, InstructionOwnership) {
// But that they belong to different functions
auto *OldSubprogram = cast<DISubprogram>(OldDL.getScope());
auto *NewSubprogram = cast<DISubprogram>(NewDL.getScope());
- EXPECT_EQ(OldFunc, OldSubprogram->getFunction());
- EXPECT_EQ(NewFunc, NewSubprogram->getFunction());
+ EXPECT_EQ(OldFunc->getSubprogram(), OldSubprogram);
+ EXPECT_EQ(NewFunc->getSubprogram(), NewSubprogram);
}
++OldIter;
@@ -389,25 +390,21 @@ TEST_F(CloneFunc, DebugIntrinsics) {
getParent()->getParent());
// Old variable must belong to the old function
- EXPECT_EQ(OldFunc,
- cast<DISubprogram>(OldIntrin->getVariable()->getScope())
- ->getFunction());
+ EXPECT_EQ(OldFunc->getSubprogram(),
+ cast<DISubprogram>(OldIntrin->getVariable()->getScope()));
// New variable must belong to the New function
- EXPECT_EQ(NewFunc,
- cast<DISubprogram>(NewIntrin->getVariable()->getScope())
- ->getFunction());
+ EXPECT_EQ(NewFunc->getSubprogram(),
+ cast<DISubprogram>(NewIntrin->getVariable()->getScope()));
} else if (DbgValueInst* OldIntrin = dyn_cast<DbgValueInst>(&OldI)) {
DbgValueInst* NewIntrin = dyn_cast<DbgValueInst>(&NewI);
EXPECT_TRUE(NewIntrin);
// Old variable must belong to the old function
- EXPECT_EQ(OldFunc,
- cast<DISubprogram>(OldIntrin->getVariable()->getScope())
- ->getFunction());
+ EXPECT_EQ(OldFunc->getSubprogram(),
+ cast<DISubprogram>(OldIntrin->getVariable()->getScope()));
// New variable must belong to the New function
- EXPECT_EQ(NewFunc,
- cast<DISubprogram>(NewIntrin->getVariable()->getScope())
- ->getFunction());
+ EXPECT_EQ(NewFunc->getSubprogram(),
+ cast<DISubprogram>(NewIntrin->getVariable()->getScope()));
}
++OldIter;
OpenPOWER on IntegriCloud