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