14dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky//===- Cloning.cpp - Unit tests for the Cloner ----------------------------===// 24dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky// 34dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky// The LLVM Compiler Infrastructure 44dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky// 54dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky// This file is distributed under the University of Illinois Open Source 64dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky// License. See LICENSE.TXT for details. 74dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky// 84dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky//===----------------------------------------------------------------------===// 94dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky 1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Transforms/Utils/Cloning.h" 1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/ArrayRef.h" 125a88dda4be791426ab4d20a6a6c9c65d66614a27Chandler Carruth#include "llvm/ADT/STLExtras.h" 135a88dda4be791426ab4d20a6a6c9c65d66614a27Chandler Carruth#include "llvm/ADT/SmallPtrSet.h" 140b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Argument.h" 150b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constant.h" 1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/DebugInfo.h" 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/DIBuilder.h" 180f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly#include "llvm/IR/Function.h" 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/IRBuilder.h" 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/InstIterator.h" 210f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly#include "llvm/IR/Instructions.h" 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/IntrinsicInst.h" 230f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly#include "llvm/IR/IRBuilder.h" 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Module.h" 250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h" 265a88dda4be791426ab4d20a6a6c9c65d66614a27Chandler Carruth#include "gtest/gtest.h" 274dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky 284dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewyckyusing namespace llvm; 294dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky 302d24e2a396a1d211baaeedf32148a3b657240170David Blaikienamespace { 311880e2d34458f67a92e26953c257f2feb334ceefChandler Carruth 3206e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewyckyclass CloneInstruction : public ::testing::Test { 3306e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewyckyprotected: 3406e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky virtual void SetUp() { 35cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines V = nullptr; 3606e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky } 3706e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky 3806e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky template <typename T> 3906e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky T *clone(T *V1) { 4006e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky Value *V2 = V1->clone(); 4106e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky Orig.insert(V1); 4206e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky Clones.insert(V2); 4306e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky return cast<T>(V2); 4406e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky } 4506e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky 4606e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky void eraseClones() { 4706e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky DeleteContainerPointers(Clones); 4806e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky } 4906e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky 5006e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky virtual void TearDown() { 5106e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky eraseClones(); 5206e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky DeleteContainerPointers(Orig); 5306e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky delete V; 5406e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky } 5506e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky 5606e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky SmallPtrSet<Value *, 4> Orig; // Erase on exit 5706e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky SmallPtrSet<Value *, 4> Clones; // Erase in eraseClones 5806e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky 594dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky LLVMContext context; 6006e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky Value *V; 6106e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky}; 6206e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky 6306e59e738c45840b039b5caa8a46d7d0066b89a6Nick LewyckyTEST_F(CloneInstruction, OverflowBits) { 6406e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky V = new Argument(Type::getInt32Ty(context)); 654dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky 664dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky BinaryOperator *Add = BinaryOperator::Create(Instruction::Add, V, V); 674dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky BinaryOperator *Sub = BinaryOperator::Create(Instruction::Sub, V, V); 684dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky BinaryOperator *Mul = BinaryOperator::Create(Instruction::Mul, V, V); 694dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky 7006e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky BinaryOperator *AddClone = this->clone(Add); 7106e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky BinaryOperator *SubClone = this->clone(Sub); 7206e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky BinaryOperator *MulClone = this->clone(Mul); 7306e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky 7406e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_FALSE(AddClone->hasNoUnsignedWrap()); 7506e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_FALSE(AddClone->hasNoSignedWrap()); 7606e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_FALSE(SubClone->hasNoUnsignedWrap()); 7706e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_FALSE(SubClone->hasNoSignedWrap()); 7806e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_FALSE(MulClone->hasNoUnsignedWrap()); 7906e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_FALSE(MulClone->hasNoSignedWrap()); 8006e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky 8106e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky eraseClones(); 824dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky 834dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky Add->setHasNoUnsignedWrap(); 844dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky Sub->setHasNoUnsignedWrap(); 854dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky Mul->setHasNoUnsignedWrap(); 864dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky 8706e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky AddClone = this->clone(Add); 8806e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky SubClone = this->clone(Sub); 8906e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky MulClone = this->clone(Mul); 9006e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky 9106e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_TRUE(AddClone->hasNoUnsignedWrap()); 9206e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_FALSE(AddClone->hasNoSignedWrap()); 9306e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_TRUE(SubClone->hasNoUnsignedWrap()); 9406e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_FALSE(SubClone->hasNoSignedWrap()); 9506e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_TRUE(MulClone->hasNoUnsignedWrap()); 9606e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_FALSE(MulClone->hasNoSignedWrap()); 9706e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky 9806e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky eraseClones(); 994dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky 1004dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky Add->setHasNoSignedWrap(); 1014dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky Sub->setHasNoSignedWrap(); 1024dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky Mul->setHasNoSignedWrap(); 1034dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky 10406e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky AddClone = this->clone(Add); 10506e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky SubClone = this->clone(Sub); 10606e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky MulClone = this->clone(Mul); 10706e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky 10806e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_TRUE(AddClone->hasNoUnsignedWrap()); 10906e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_TRUE(AddClone->hasNoSignedWrap()); 11006e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_TRUE(SubClone->hasNoUnsignedWrap()); 11106e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_TRUE(SubClone->hasNoSignedWrap()); 11206e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_TRUE(MulClone->hasNoUnsignedWrap()); 11306e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_TRUE(MulClone->hasNoSignedWrap()); 11406e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky 11506e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky eraseClones(); 1164dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky 1174dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky Add->setHasNoUnsignedWrap(false); 1184dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky Sub->setHasNoUnsignedWrap(false); 1194dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky Mul->setHasNoUnsignedWrap(false); 1204dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky 12106e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky AddClone = this->clone(Add); 12206e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky SubClone = this->clone(Sub); 12306e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky MulClone = this->clone(Mul); 12406e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky 12506e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_FALSE(AddClone->hasNoUnsignedWrap()); 12606e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_TRUE(AddClone->hasNoSignedWrap()); 12706e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_FALSE(SubClone->hasNoUnsignedWrap()); 12806e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_TRUE(SubClone->hasNoSignedWrap()); 12906e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_FALSE(MulClone->hasNoUnsignedWrap()); 13006e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_TRUE(MulClone->hasNoSignedWrap()); 1314dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky} 1324dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky 13306e59e738c45840b039b5caa8a46d7d0066b89a6Nick LewyckyTEST_F(CloneInstruction, Inbounds) { 13406e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky V = new Argument(Type::getInt32PtrTy(context)); 13506e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky 1364dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky Constant *Z = Constant::getNullValue(Type::getInt32Ty(context)); 1374dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky std::vector<Value *> ops; 1384dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky ops.push_back(Z); 139a9203109f4ac95aa7e9624f2838e3d89623ec902Jay Foad GetElementPtrInst *GEP = GetElementPtrInst::Create(V, ops); 14006e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_FALSE(this->clone(GEP)->isInBounds()); 1414dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky 1424dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky GEP->setIsInBounds(); 14306e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_TRUE(this->clone(GEP)->isInBounds()); 1444dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky} 1454dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky 14606e59e738c45840b039b5caa8a46d7d0066b89a6Nick LewyckyTEST_F(CloneInstruction, Exact) { 14706e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky V = new Argument(Type::getInt32Ty(context)); 1484dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky 1494dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky BinaryOperator *SDiv = BinaryOperator::Create(Instruction::SDiv, V, V); 15006e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_FALSE(this->clone(SDiv)->isExact()); 1514dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky 1524dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky SDiv->setIsExact(true); 15306e59e738c45840b039b5caa8a46d7d0066b89a6Nick Lewycky EXPECT_TRUE(this->clone(SDiv)->isExact()); 1544dd68242f106f047f80a5e0fdd96e19cb0ac5eedNick Lewycky} 1551880e2d34458f67a92e26953c257f2feb334ceefChandler Carruth 1560f57a98a65df5e617ed0adcf0ca0877745c84a79Joey GoulyTEST_F(CloneInstruction, Attributes) { 1570f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly Type *ArgTy1[] = { Type::getInt32PtrTy(context) }; 1580f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly FunctionType *FT1 = FunctionType::get(Type::getVoidTy(context), ArgTy1, false); 1590f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly 1600f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly Function *F1 = Function::Create(FT1, Function::ExternalLinkage); 1610f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly BasicBlock *BB = BasicBlock::Create(context, "", F1); 1620f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly IRBuilder<> Builder(BB); 1630f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly Builder.CreateRetVoid(); 1640f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly 1650f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly Function *F2 = Function::Create(FT1, Function::ExternalLinkage); 1660f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly 1670f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly Attribute::AttrKind AK[] = { Attribute::NoCapture }; 1680f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly AttributeSet AS = AttributeSet::get(context, 0, AK); 1690f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly Argument *A = F1->arg_begin(); 1700f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly A->addAttr(AS); 1710f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly 1720f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly SmallVector<ReturnInst*, 4> Returns; 1730f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly ValueToValueMapTy VMap; 1740f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly VMap[A] = UndefValue::get(A->getType()); 1750f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly 1760f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly CloneFunctionInto(F2, F1, VMap, false, Returns); 1770f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly EXPECT_FALSE(F2->arg_begin()->hasNoCaptureAttr()); 178bb5cbd86a4add5944c869836c507d419255d98dcJoey Gouly 179bb5cbd86a4add5944c869836c507d419255d98dcJoey Gouly delete F1; 180bb5cbd86a4add5944c869836c507d419255d98dcJoey Gouly delete F2; 1810f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly} 1820f57a98a65df5e617ed0adcf0ca0877745c84a79Joey Gouly 18336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST_F(CloneInstruction, CallingConvention) { 18436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Type *ArgTy1[] = { Type::getInt32PtrTy(context) }; 18536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FunctionType *FT1 = FunctionType::get(Type::getVoidTy(context), ArgTy1, false); 18636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 18736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Function *F1 = Function::Create(FT1, Function::ExternalLinkage); 18836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines F1->setCallingConv(CallingConv::Cold); 18936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines BasicBlock *BB = BasicBlock::Create(context, "", F1); 19036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines IRBuilder<> Builder(BB); 19136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Builder.CreateRetVoid(); 19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 19336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Function *F2 = Function::Create(FT1, Function::ExternalLinkage); 19436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 19536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVector<ReturnInst*, 4> Returns; 19636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ValueToValueMapTy VMap; 19736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines VMap[F1->arg_begin()] = F2->arg_begin(); 19836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 19936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines CloneFunctionInto(F2, F1, VMap, false, Returns); 20036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_EQ(CallingConv::Cold, F2->getCallingConv()); 20136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 20236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines delete F1; 20336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines delete F2; 20436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 20536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 20636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass CloneFunc : public ::testing::Test { 20736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesprotected: 20836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void SetUp() { 20936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SetupModule(); 21036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines CreateOldFunc(); 21136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines CreateNewFunc(); 21236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SetupFinder(); 21336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 21436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 21536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void TearDown() { 21636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines delete Finder; 21736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 21836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 21936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void SetupModule() { 22036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines M = new Module("", C); 22136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 22236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 22336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void CreateOldFunc() { 22436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FunctionType* FuncType = FunctionType::get(Type::getVoidTy(C), false); 22536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OldFunc = Function::Create(FuncType, GlobalValue::PrivateLinkage, "f", M); 22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines CreateOldFunctionBodyAndDI(); 22736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 22836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 22936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void CreateOldFunctionBodyAndDI() { 23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIBuilder DBuilder(*M); 23136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines IRBuilder<> IBuilder(C); 23236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 23336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Function DI 23436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIFile File = DBuilder.createFile("filename.c", "/file/dir/"); 23536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIArray ParamTypes = DBuilder.getOrCreateArray(ArrayRef<Value*>()); 23636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DICompositeType FuncType = DBuilder.createSubroutineType(File, ParamTypes); 23736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DICompileUnit CU = DBuilder.createCompileUnit(dwarf::DW_LANG_C99, 23836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "filename.c", "/file/dir", "CloneFunc", false, "", 0); 23936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 24036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DISubprogram Subprogram = DBuilder.createFunction(CU, "f", "f", File, 4, 24136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FuncType, true, true, 3, 0, false, OldFunc); 24236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 24336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Function body 24436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines BasicBlock* Entry = BasicBlock::Create(C, "", OldFunc); 24536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines IBuilder.SetInsertPoint(Entry); 24636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DebugLoc Loc = DebugLoc::get(3, 2, Subprogram); 24736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines IBuilder.SetCurrentDebugLocation(Loc); 24836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AllocaInst* Alloca = IBuilder.CreateAlloca(IntegerType::getInt32Ty(C)); 24936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines IBuilder.SetCurrentDebugLocation(DebugLoc::get(4, 2, Subprogram)); 25036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Value* AllocaContent = IBuilder.getInt32(1); 25136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Instruction* Store = IBuilder.CreateStore(AllocaContent, Alloca); 25236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines IBuilder.SetCurrentDebugLocation(DebugLoc::get(5, 2, Subprogram)); 25336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Instruction* Terminator = IBuilder.CreateRetVoid(); 25436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 25536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Create a local variable around the alloca 25636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIType IntType = DBuilder.createBasicType("int", 32, 0, 25736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines dwarf::DW_ATE_signed); 25836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIVariable Variable = DBuilder.createLocalVariable( 25936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines dwarf::DW_TAG_auto_variable, Subprogram, "x", File, 5, IntType, true); 26036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DBuilder.insertDeclare(Alloca, Variable, Store); 26136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DBuilder.insertDbgValueIntrinsic(AllocaContent, 0, Variable, Terminator); 26236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Finalize the debug info 26336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DBuilder.finalize(); 26436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 26536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 26636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Create another, empty, compile unit 26736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIBuilder DBuilder2(*M); 26836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DBuilder2.createCompileUnit(dwarf::DW_LANG_C99, 26936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "extra.c", "/file/dir", "CloneFunc", false, "", 0); 27036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DBuilder2.finalize(); 27136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 27236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 27336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void CreateNewFunc() { 27436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ValueToValueMapTy VMap; 275cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines NewFunc = CloneFunction(OldFunc, VMap, true, nullptr); 27636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines M->getFunctionList().push_back(NewFunc); 27736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 27836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 27936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void SetupFinder() { 28036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Finder = new DebugInfoFinder(); 28136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Finder->processModule(*M); 28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 28336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 28436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines LLVMContext C; 28536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Function* OldFunc; 28636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Function* NewFunc; 28736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Module* M; 28836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DebugInfoFinder* Finder; 28936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 29036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 29136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Test that a new, distinct function was created. 29236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST_F(CloneFunc, NewFunctionCreated) { 29336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_NE(OldFunc, NewFunc); 29436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 29536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 29636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Test that a new subprogram entry was added and is pointing to the new 29736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// function, while the original subprogram still points to the old one. 29836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST_F(CloneFunc, Subprogram) { 29936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned SubprogramCount = Finder->subprogram_count(); 30036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_EQ(2U, SubprogramCount); 30136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 30236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines auto Iter = Finder->subprograms().begin(); 30336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DISubprogram Sub1(*Iter); 30436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_TRUE(Sub1.Verify()); 30536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Iter++; 30636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DISubprogram Sub2(*Iter); 30736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_TRUE(Sub2.Verify()); 30836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 30936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_TRUE((Sub1.getFunction() == OldFunc && Sub2.getFunction() == NewFunc) 31036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines || (Sub1.getFunction() == NewFunc && Sub2.getFunction() == OldFunc)); 31136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 31236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 31336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Test that the new subprogram entry was not added to the CU which doesn't 31436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// contain the old subprogram entry. 31536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST_F(CloneFunc, SubprogramInRightCU) { 31636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_EQ(2U, Finder->compile_unit_count()); 31736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 31836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines auto Iter = Finder->compile_units().begin(); 31936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DICompileUnit CU1(*Iter); 32036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_TRUE(CU1.Verify()); 32136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Iter++; 32236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DICompileUnit CU2(*Iter); 32336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_TRUE(CU2.Verify()); 32436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_TRUE(CU1.getSubprograms().getNumElements() == 0 32536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines || CU2.getSubprograms().getNumElements() == 0); 32636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 32736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 32836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Test that instructions in the old function still belong to it in the 32936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// metadata, while instruction in the new function belong to the new one. 33036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST_F(CloneFunc, InstructionOwnership) { 33136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines inst_iterator OldIter = inst_begin(OldFunc); 33236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines inst_iterator OldEnd = inst_end(OldFunc); 33336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines inst_iterator NewIter = inst_begin(NewFunc); 33436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines inst_iterator NewEnd = inst_end(NewFunc); 33536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines while (OldIter != OldEnd && NewIter != NewEnd) { 33636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Instruction& OldI = *OldIter; 33736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Instruction& NewI = *NewIter; 33836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_NE(&OldI, &NewI); 33936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 34036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_EQ(OldI.hasMetadata(), NewI.hasMetadata()); 34136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (OldI.hasMetadata()) { 34236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const DebugLoc& OldDL = OldI.getDebugLoc(); 34336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const DebugLoc& NewDL = NewI.getDebugLoc(); 34436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 34536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Verify that the debug location data is the same 34636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_EQ(OldDL.getLine(), NewDL.getLine()); 34736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_EQ(OldDL.getCol(), NewDL.getCol()); 34836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 34936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // But that they belong to different functions 35036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DISubprogram OldSubprogram(OldDL.getScope(C)); 35136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DISubprogram NewSubprogram(NewDL.getScope(C)); 35236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_TRUE(OldSubprogram.Verify()); 35336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_TRUE(NewSubprogram.Verify()); 35436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_EQ(OldFunc, OldSubprogram.getFunction()); 35536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_EQ(NewFunc, NewSubprogram.getFunction()); 35636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 35736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 35836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ++OldIter; 35936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ++NewIter; 36036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 36136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_EQ(OldEnd, OldIter); 36236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_EQ(NewEnd, NewIter); 36336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 36436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 36536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Test that the arguments for debug intrinsics in the new function were 36636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// properly cloned 36736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST_F(CloneFunc, DebugIntrinsics) { 36836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines inst_iterator OldIter = inst_begin(OldFunc); 36936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines inst_iterator OldEnd = inst_end(OldFunc); 37036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines inst_iterator NewIter = inst_begin(NewFunc); 37136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines inst_iterator NewEnd = inst_end(NewFunc); 37236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines while (OldIter != OldEnd && NewIter != NewEnd) { 37336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Instruction& OldI = *OldIter; 37436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Instruction& NewI = *NewIter; 37536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (DbgDeclareInst* OldIntrin = dyn_cast<DbgDeclareInst>(&OldI)) { 37636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DbgDeclareInst* NewIntrin = dyn_cast<DbgDeclareInst>(&NewI); 37736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_TRUE(NewIntrin); 37836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 37936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Old address must belong to the old function 38036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_EQ(OldFunc, cast<AllocaInst>(OldIntrin->getAddress())-> 38136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getParent()->getParent()); 38236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // New address must belong to the new function 38336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_EQ(NewFunc, cast<AllocaInst>(NewIntrin->getAddress())-> 38436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getParent()->getParent()); 38536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 38636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Old variable must belong to the old function 38736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_EQ(OldFunc, DISubprogram(DIVariable(OldIntrin->getVariable()) 38836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines .getContext()).getFunction()); 38936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // New variable must belong to the New function 39036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_EQ(NewFunc, DISubprogram(DIVariable(NewIntrin->getVariable()) 39136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines .getContext()).getFunction()); 39236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } else if (DbgValueInst* OldIntrin = dyn_cast<DbgValueInst>(&OldI)) { 39336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DbgValueInst* NewIntrin = dyn_cast<DbgValueInst>(&NewI); 39436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_TRUE(NewIntrin); 39536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 39636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Old variable must belong to the old function 39736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_EQ(OldFunc, DISubprogram(DIVariable(OldIntrin->getVariable()) 39836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines .getContext()).getFunction()); 39936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // New variable must belong to the New function 40036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_EQ(NewFunc, DISubprogram(DIVariable(NewIntrin->getVariable()) 40136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines .getContext()).getFunction()); 40236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 40336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 40436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ++OldIter; 40536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ++NewIter; 40636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 40736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 40836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4091880e2d34458f67a92e26953c257f2feb334ceefChandler Carruth} 410